)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"b2af52a6f7fe540813eebee889fa6f96f42e6f9d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"          nexthop: 10.0.0.11"},{"line_number":40,"context_line":"  ..."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"TODO tests"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Change-Id: Ic1fe593d9821d844fd124b0212d444f6e3a0015e"},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/675900"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_2785eccf","line":42,"updated":"2019-08-13 14:01:56.000000000","message":"TODO release note","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"3a080c3da2629ed45289ca7975be4e86b45b9b1b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"          nexthop: 10.0.0.11"},{"line_number":40,"context_line":"  ..."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"TODO tests"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Change-Id: Ic1fe593d9821d844fd124b0212d444f6e3a0015e"},{"line_number":45,"context_line":"Depends-On: https://review.opendev.org/675900"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_b65d7b7a","line":42,"in_reply_to":"7faddb67_2785eccf","updated":"2019-08-14 13:48:12.000000000","message":"Done","commit_id":"6cf6912f474d1d5d071198df00231419281644de"}],"heat/engine/resources/openstack/neutron/extrarouteset.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6cb9b24e4d7e07df12597cfd8086d4f55e2ddb1c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        ),"},{"line_number":106,"context_line":"    }"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def add_dependencies(self, deps):"},{"line_number":109,"context_line":"        super(ExtraRouteSet, self).add_dependencies(deps)"},{"line_number":110,"context_line":"        for resource in six.itervalues(self.stack):"},{"line_number":111,"context_line":"            # depend on any RouterInterface in this template with the same"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_0756b007","line":108,"range":{"start_line":108,"start_character":8,"end_line":108,"end_character":24},"updated":"2019-08-13 13:29:31.000000000","message":"The plugin guide says this is frowned upon. How to do this better?","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"3a080c3da2629ed45289ca7975be4e86b45b9b1b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        ),"},{"line_number":106,"context_line":"    }"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def add_dependencies(self, deps):"},{"line_number":109,"context_line":"        super(ExtraRouteSet, self).add_dependencies(deps)"},{"line_number":110,"context_line":"        for resource in six.itervalues(self.stack):"},{"line_number":111,"context_line":"            # depend on any RouterInterface in this template with the same"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b6849bd4","line":108,"range":{"start_line":108,"start_character":8,"end_line":108,"end_character":24},"in_reply_to":"7faddb67_0756b007","updated":"2019-08-14 13:48:12.000000000","message":"One option I guess is to leave dependency management to the template user with explicit depends_on. However that does not sound particularly user friendly to me.","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"36a7fd491cd8b6a1f9d912ccd753e96e9d6e5efd","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        ),"},{"line_number":106,"context_line":"    }"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def add_dependencies(self, deps):"},{"line_number":109,"context_line":"        super(ExtraRouteSet, self).add_dependencies(deps)"},{"line_number":110,"context_line":"        for resource in six.itervalues(self.stack):"},{"line_number":111,"context_line":"            # depend on any RouterInterface in this template with the same"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ec000203","line":108,"range":{"start_line":108,"start_character":8,"end_line":108,"end_character":24},"in_reply_to":"7faddb67_b6849bd4","updated":"2019-08-14 14:32:36.000000000","message":"According to our IRC chat I deleted the deprecated RouterGateway stuff, but left the RouterInterface part as it was.","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7301750be9c4400810ea75fec2284fcaa03009af","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                    dep_router_id \u003d resource.properties.get("},{"line_number":117,"context_line":"                        router.RouterInterface.ROUTER)"},{"line_number":118,"context_line":"                except (ValueError, TypeError):"},{"line_number":119,"context_line":"                    # Properties errors will be caught later in validation,"},{"line_number":120,"context_line":"                    # where we can report them in their proper context."},{"line_number":121,"context_line":"                    continue"},{"line_number":122,"context_line":"                if dep_router_id \u003d\u003d router_id:"},{"line_number":123,"context_line":"                    deps +\u003d (self, resource)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_e267d8e9","line":120,"range":{"start_line":119,"start_character":0,"end_line":120,"end_character":71},"updated":"2019-08-12 14:40:25.000000000","message":"I took add_dependencies() from OS::Neutron::ExtraRoute. Honestly I don\u0027t understand this comment.","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7301750be9c4400810ea75fec2284fcaa03009af","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    return [dict(r) for r in diffable]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"def _generate_id(router_id, routes):"},{"line_number":209,"context_line":"    \"\"\"Generate composite id for an extra route set on a router."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    Output format: router_id:dst1\u003dnexthop1:dst2\u003dnexthop2:..."}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_8285c45b","line":208,"range":{"start_line":208,"start_character":28,"end_line":208,"end_character":34},"updated":"2019-08-12 14:40:25.000000000","message":"Do we want to canonicalize destination cidrs and nexthop IPs? Do we want to delete duplicates? These could theoretically cause some problems.","commit_id":"6cf6912f474d1d5d071198df00231419281644de"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"ff4491f845c55fb3c64176e8157a6ee613857197","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    from multiple stacks (or between Heat and non-Heat managed Neutron extra"},{"line_number":55,"context_line":"    routes)."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    required_service_extension \u003d \u0027extraroute-atomic\u0027"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    PROPERTIES \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_1e2293a5","line":57,"updated":"2019-09-20 07:03:15.000000000","message":"please add `support_status \u003d support.SupportStatus(version\u003d\u002714.0.0\u0027)` here. Note that 13.0.0 is Train release but I think we better target Ussuri (14.0.0) here","commit_id":"d17b15cdddf0a0b31d368c5d53d188a2e3345ba7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"43c37e08e26c9f631734f9df8dd4c0e46e6b7a55","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    from multiple stacks (or between Heat and non-Heat managed Neutron extra"},{"line_number":55,"context_line":"    routes)."},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    required_service_extension \u003d \u0027extraroute-atomic\u0027"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    PROPERTIES \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_a92204a3","line":57,"in_reply_to":"3fa7e38b_1e2293a5","updated":"2019-09-23 13:24:07.000000000","message":"Done","commit_id":"d17b15cdddf0a0b31d368c5d53d188a2e3345ba7"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"251ab7bdffb586f673d47ec60945c59411bcf2bf","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    return [dict(r) for r in diffable]"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"def _generate_id(router, routes):"},{"line_number":196,"context_line":"    \"\"\"Generate composite id for an extra route set on a router."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    Output format: router:dst1\u003dnexthop1:dst2\u003dnexthop2:..."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    Produce the same id without regard to the order of routes."},{"line_number":201,"context_line":"    \"\"\""},{"line_number":202,"context_line":"    return \u0027:\u0027.join("},{"line_number":203,"context_line":"        [\u0027%s\u0027 % router] +"},{"line_number":204,"context_line":"        [\u0027%(destination)s\u003d%(nexthop)s\u0027 % r for r in sorted("},{"line_number":205,"context_line":"            # sort by destination as primary key and"},{"line_number":206,"context_line":"            # by nexthop as secondary key"},{"line_number":207,"context_line":"            routes, key\u003ditemgetter(\u0027destination\u0027, \u0027nexthop\u0027))])"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def _parse_id(id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5faad753_d9e5353a","line":207,"range":{"start_line":195,"start_character":0,"end_line":207,"end_character":63},"updated":"2019-09-06 15:18:24.000000000","message":"In the corner case of zero routes this generates the same physical id for the ExtraRouteSet as it was for the router. Is that a problem? Can it collide with the router or are physical ids typed?","commit_id":"d17b15cdddf0a0b31d368c5d53d188a2e3345ba7"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"e939cc16dea75050bb3476d5fdddf5ec4bcc2ba3","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def handle_create(self):"},{"line_number":131,"context_line":"        router \u003d self.properties[self.ROUTER]"},{"line_number":132,"context_line":"        routes \u003d self.properties[self.ROUTES]"},{"line_number":133,"context_line":"        self.client().add_extra_routes_to_router("},{"line_number":134,"context_line":"            router, {\u0027router\u0027: {\u0027routes\u0027: routes}})"},{"line_number":135,"context_line":"        self.resource_id_set(_generate_id(router, routes))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_402141b5","line":132,"updated":"2019-11-07 06:55:34.000000000","message":"Since there might be race condition, maybe we should add list check before create to reduce the chance for that","commit_id":"367929cf76120d3be98f3d630f03fe2605ad1279"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"f713fd6f7dfe3cb452c619edad1577844e622e26","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def handle_create(self):"},{"line_number":131,"context_line":"        router \u003d self.properties[self.ROUTER]"},{"line_number":132,"context_line":"        routes \u003d self.properties[self.ROUTES]"},{"line_number":133,"context_line":"        self.client().add_extra_routes_to_router("},{"line_number":134,"context_line":"            router, {\u0027router\u0027: {\u0027routes\u0027: routes}})"},{"line_number":135,"context_line":"        self.resource_id_set(_generate_id(router, routes))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_8759c18d","line":132,"in_reply_to":"3fa7e38b_402141b5","updated":"2019-12-12 15:49:53.000000000","message":"Done","commit_id":"367929cf76120d3be98f3d630f03fe2605ad1279"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"bfd8eea63c900f845b9ee6e4569acca05b5802a6","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        add \u003d _set_to_routes(_routes_to_set(new) - _routes_to_set(old))"},{"line_number":167,"context_line":"        remove \u003d _set_to_routes(_routes_to_set(old) - _routes_to_set(new))"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        router \u003d _parse_id(self.resource_id)[0]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        _raise_if_duplicate(self.client().show_router(router), add)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_00585722","line":169,"updated":"2020-01-09 19:11:15.000000000","message":"Why not just use self.properties[self.ROUTER]?","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"22ba67c19c310032469b899fded2ef884e76740a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        add \u003d _set_to_routes(_routes_to_set(new) - _routes_to_set(old))"},{"line_number":167,"context_line":"        remove \u003d _set_to_routes(_routes_to_set(old) - _routes_to_set(new))"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        router \u003d _parse_id(self.resource_id)[0]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        _raise_if_duplicate(self.client().show_router(router), add)"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_13a2c140","line":169,"in_reply_to":"3fa7e38b_00585722","updated":"2020-01-14 17:11:11.000000000","message":"Done","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"bfd8eea63c900f845b9ee6e4569acca05b5802a6","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.client().remove_extra_routes_from_router("},{"line_number":179,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: remove}})"},{"line_number":180,"context_line":"            self.client().add_extra_routes_to_router("},{"line_number":181,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: add}})"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.resource_id_set(_generate_id(router, new))"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_60ecab27","line":181,"updated":"2020-01-09 19:11:15.000000000","message":"Should this be outside the ignore_not_found block? At a glance, it looks like this will ignore the problem of the router no longer existing.","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"22ba67c19c310032469b899fded2ef884e76740a","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.client().remove_extra_routes_from_router("},{"line_number":179,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: remove}})"},{"line_number":180,"context_line":"            self.client().add_extra_routes_to_router("},{"line_number":181,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: add}})"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.resource_id_set(_generate_id(router, new))"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ae7d7f1f","line":181,"in_reply_to":"3fa7e38b_60ecab27","updated":"2020-01-14 17:11:11.000000000","message":"Done","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"bfd8eea63c900f845b9ee6e4569acca05b5802a6","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            self.client().add_extra_routes_to_router("},{"line_number":181,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: add}})"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.resource_id_set(_generate_id(router, new))"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def _routes_to_set(route_list):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_e0b89b12","line":183,"updated":"2020-01-09 19:11:15.000000000","message":"The resource_id field is limited to 255 chars (not sure how that interacts with unicode, but it\u0027s a good bet that the actual limit is a fraction of that). I don\u0027t think we should attempt to use it for this purpose.","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"22ba67c19c310032469b899fded2ef884e76740a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            self.client().add_extra_routes_to_router("},{"line_number":181,"context_line":"                router, {\u0027router\u0027: {\u0027routes\u0027: add}})"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self.resource_id_set(_generate_id(router, new))"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def _routes_to_set(route_list):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_b192be49","line":183,"in_reply_to":"3fa7e38b_e0b89b12","updated":"2020-01-14 17:11:11.000000000","message":"Good catch.","commit_id":"1197ef84b00efa18524e6b47cf1343f2434f555f"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"baf3c0003f6a34286372f021d8365c0cbfa4514f","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def _generate_name(router, routes):"},{"line_number":206,"context_line":"    return \u0027:\u0027.join("},{"line_number":207,"context_line":"        [\u0027%s\u0027 % router] +"},{"line_number":208,"context_line":"        [\u0027%(destination)s\u003d%(nexthop)s\u0027 % r for r in sorted("},{"line_number":209,"context_line":"            # sort by destination as primary key and"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_c653e5dd","line":206,"range":{"start_line":206,"start_character":11,"end_line":206,"end_character":14},"updated":"2020-01-15 20:48:46.000000000","message":"Pavlo discovered this week that this format tends to go poorly when you have IPv6 routes (see https://storyboard.openstack.org/#!/story/2007085). Maybe we should take this opportunity to do something different.","commit_id":"e21dfd140b60d7d04f2ca9d37ae3069696e3febc"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"1e550a8ed3a3e4b7a2ce7f3a21bb2df2814cee65","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def _generate_name(router, routes):"},{"line_number":206,"context_line":"    return \u0027:\u0027.join("},{"line_number":207,"context_line":"        [\u0027%s\u0027 % router] +"},{"line_number":208,"context_line":"        [\u0027%(destination)s\u003d%(nexthop)s\u0027 % r for r in sorted("},{"line_number":209,"context_line":"            # sort by destination as primary key and"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_48084a7f","line":206,"range":{"start_line":206,"start_character":11,"end_line":206,"end_character":14},"in_reply_to":"3fa7e38b_c653e5dd","updated":"2020-01-17 09:43:12.000000000","message":"At this point this \"name\" is only used in an error message, so we can format it as freely as we like.","commit_id":"e21dfd140b60d7d04f2ca9d37ae3069696e3febc"}],"releasenotes/notes/neutron-extrarouteset-379c5354e1ac7795.yaml":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"5e8b731ac0e864d4664543414a55c94ab2c8ff0b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New resource ``OS::Neutron::ExtraRouteSet`` is added to manage extra"},{"line_number":5,"context_line":"    routes of a Neutron router."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Unsupported contrib resource ``OS::Neutron::ExtraRoute`` is deprecated"},{"line_number":9,"context_line":"    in favor of ``OS::Neutron::ExtraRouteSet`` on all OpenStack clouds where"},{"line_number":10,"context_line":"    Neutron extension ``extraroute-atomic`` is available."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7faddb67_162d6fa7","line":10,"range":{"start_line":6,"start_character":0,"end_line":10,"end_character":57},"updated":"2019-08-14 13:59:15.000000000","message":"I\u0027m not sure if this was the consensus about OS::Neutron::ExtraRoute. Let me know if my memory failed me.","commit_id":"d6f201ea8e014dcc64e2646d64c3082ad92647bf"}]}
