)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"80ff0b837ac7eae467977ece20c81a688760e274","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5a3905b3_fae9de7f","updated":"2017-01-24 17:07:15.000000000","message":"As per [1] the topic should be \u0027stadium-implosion\u0027.\n\n\n[1] https://review.openstack.org/#/c/389397/16/specs/stadium/ocata.rst@247","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ae4f328de7a698492847964c5597b654647ac381","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3a461143_edc88c24","in_reply_to":"5a3905b3_fae9de7f","updated":"2017-01-30 22:17:55.000000000","message":"Done","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"}],"neutron_lib/api/definitions/bgpvpn.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e5e2a9f9a597d33408b0e5ec5ebbc2056f67887b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    },"},{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":112,"context_line":"    NETWORK_ASSOCIATIONS: {"},{"line_number":113,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: COLLECTION_NAME,"},{"line_number":114,"context_line":"                   \u0027member_name\u0027: RESOURCE_NAME},"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6eadb0_2a40cba4","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":26},"updated":"2016-12-21 16:07:13.000000000","message":"I know we\u0027ve been discussing this over in [1], but I still don\u0027t think we have a story for SUB_RESOURCE_ATTRIBUTE_MAP. One option is to break into 2 extensions, like in [2]. However I\u0027m not sure if [2] is kosher yet; waiting for core review feedback.\n\n\n[1] https://review.openstack.org/#/c/390196\n[2] https://review.openstack.org/#/c/411974/","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"0591e0e930ef677da958e757ba400f8de99f543c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    },"},{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":112,"context_line":"    NETWORK_ASSOCIATIONS: {"},{"line_number":113,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: COLLECTION_NAME,"},{"line_number":114,"context_line":"                   \u0027member_name\u0027: RESOURCE_NAME},"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_24231cbf","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":26},"in_reply_to":"1a6eadb0_2a40cba4","updated":"2017-01-02 16:25:23.000000000","message":"Since that would be a redesign of an extension that is already working, I don\u0027t think it should be part of this commit under any circumstances. It would be cleaner to migrate the API definition first, then if there\u0027s absolutely compelling reason for a redesign, that should be a separate change. This commit is supposed to be mostly cut and paste to move code from the networking-bgpvpn repo to the neutron-lib repo. Redesigning the extension mid-flight is a bad idea.","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"1ba03d8694b0be64edd5964a390bde126407729b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    },"},{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":112,"context_line":"    NETWORK_ASSOCIATIONS: {"},{"line_number":113,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: COLLECTION_NAME,"},{"line_number":114,"context_line":"                   \u0027member_name\u0027: RESOURCE_NAME},"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_395b2889","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":26},"in_reply_to":"ba5201f7_24231cbf","updated":"2017-01-03 17:03:09.000000000","message":"I understand your perspective. However IMHO some refactoring is kosher in the rehome phase (see [1] item #3). In either case I\u0027d prefer to get a core such as Armando to give the final word on how we want to handle SUB_RESOURCE_ATTRIBUTE_MAP in this respect.\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/doc/source/contributing.rst#phase-1-rehome","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"982bd01310d982c7ce01f3fdab726bffe36b851c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    },"},{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":112,"context_line":"    NETWORK_ASSOCIATIONS: {"},{"line_number":113,"context_line":"        \u0027parent\u0027: {\u0027collection_name\u0027: COLLECTION_NAME,"},{"line_number":114,"context_line":"                   \u0027member_name\u0027: RESOURCE_NAME},"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_d98f7cca","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":26},"updated":"2017-01-03 17:16:15.000000000","message":"Please see my response on PS1 about SUB_RESOURCE_ATTRIBUTE_MAP.","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"982bd01310d982c7ce01f3fdab726bffe36b851c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":"    }"},{"line_number":150,"context_line":"}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# The list of required extensions."},{"line_number":153,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":154,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_59a9ccde","line":151,"updated":"2017-01-03 17:16:15.000000000","message":"To be explicit, maybe we should define the action map [1]::\n\n    ACTION_MAP \u003d {\n    }\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/_dummy.py#L73","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3db7d1b50dda4a129eedb3b2037dfc1f07b32c88","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        }"},{"line_number":149,"context_line":"    }"},{"line_number":150,"context_line":"}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"# The list of required extensions."},{"line_number":153,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":154,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_96011e6d","line":151,"in_reply_to":"ba5201f7_59a9ccde","updated":"2017-01-11 10:10:36.000000000","message":"Yes, I agree.","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8794fa38cba44ff11913d06bd0613d646df7a2a8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \u0027route_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                          \u0027default\u0027: [],"},{"line_number":80,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_list,"},{"line_number":81,"context_line":"                          \u0027validate\u0027: {\u0027type:route_target_list\u0027: None},"},{"line_number":82,"context_line":"                          \u0027is_visible\u0027: True,"},{"line_number":83,"context_line":"                          \u0027enforce_policy\u0027: True},"},{"line_number":84,"context_line":"        \u0027import_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_36086791","line":81,"updated":"2017-01-20 22:38:27.000000000","message":"this is not defined as validator. Where is it in neutron_lib/api/validators.py? Don\u0027t see it.","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"28345d64bcf783744181d84dc50f9a78e366adef","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \u0027route_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                          \u0027default\u0027: [],"},{"line_number":80,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_list,"},{"line_number":81,"context_line":"                          \u0027validate\u0027: {\u0027type:route_target_list\u0027: None},"},{"line_number":82,"context_line":"                          \u0027is_visible\u0027: True,"},{"line_number":83,"context_line":"                          \u0027enforce_policy\u0027: True},"},{"line_number":84,"context_line":"        \u0027import_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_e28dd0d3","line":81,"in_reply_to":"5a3905b3_36086791","updated":"2017-01-24 09:28:13.000000000","message":"Good catch.\n\nThis hasn\u0027t been moved from networking_bgpvpn[1] yet, but indeed moving it should be done in this change.\n\nArmax,do you think we should call api.validators.add_validator(\u0027type:route_target_list\u0027, _validate_rt_list)  in this file, or that we should add the validator in the validators module ?\n\n[1] http://git.openstack.org/cgit/openstack/networking-bgpvpn/tree/networking_bgpvpn/neutron/extensions/bgpvpn.py#n103","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"f23ee9167a0693213542868863ead59f6efceece","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \u0027route_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                          \u0027default\u0027: [],"},{"line_number":80,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_list,"},{"line_number":81,"context_line":"                          \u0027validate\u0027: {\u0027type:route_target_list\u0027: None},"},{"line_number":82,"context_line":"                          \u0027is_visible\u0027: True,"},{"line_number":83,"context_line":"                          \u0027enforce_policy\u0027: True},"},{"line_number":84,"context_line":"        \u0027import_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_caeb7d11","line":81,"in_reply_to":"5a3905b3_e28dd0d3","updated":"2017-01-24 13:33:39.000000000","message":"I\u0027ll copy it in. If it needs to be done differently I\u0027ll change it.","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0b683997cd99a4a2d4ecadc9cbff3ee07b54a02f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        LOG.debug(msg)"},{"line_number":60,"context_line":"        return msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"api.validators.add_validator(\u0027type:route_target_list\u0027, _validate_rt_list)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# The alias of the extension."},{"line_number":65,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_16593035","line":62,"range":{"start_line":62,"start_character":35,"end_line":62,"end_character":47},"updated":"2017-01-24 14:40:17.000000000","message":"Let\u0027s take the opportunity of cleaning up a little more: this is actually used to validate both Route Targets and Route Distinguishers, so \"rtrd_list\" would be a better name.\n\nSimilarly \"validate_rtrd_list\" and \"RTRD_REGEX\".","commit_id":"68acae08b0ea8f0363aa3efb5394e74219aca416"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"e5456a9ff83eba396d67487af883ed91993a119e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        LOG.debug(msg)"},{"line_number":60,"context_line":"        return msg"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"api.validators.add_validator(\u0027type:route_target_list\u0027, _validate_rt_list)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# The alias of the extension."},{"line_number":65,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_56f6588f","line":62,"range":{"start_line":62,"start_character":35,"end_line":62,"end_character":47},"in_reply_to":"5a3905b3_16593035","updated":"2017-01-24 14:49:42.000000000","message":"Done","commit_id":"68acae08b0ea8f0363aa3efb5394e74219aca416"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"50a32b40c002bece0e38324204e377bd8b528f1f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib import api"},{"line_number":16,"context_line":"from neutron_lib.api import converters"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Regular expression to validate 32 bits unsigned int"},{"line_number":21,"context_line":"UINT32_REGEX \u003d (r\u0027(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_fe7ae6bb","line":18,"range":{"start_line":15,"start_character":0,"end_line":18,"end_character":24},"updated":"2017-01-31 09:33:11.000000000","message":"There are some rules about import[1]. The oslo_log is third-patry lib so we should put above neutron_lib.\n\n[1]: http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"fb0c301d575debc806efdb35b0ecd880523d3ee9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib import api"},{"line_number":16,"context_line":"from neutron_lib.api import converters"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Regular expression to validate 32 bits unsigned int"},{"line_number":21,"context_line":"UINT32_REGEX \u003d (r\u0027(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_7b5a79f3","line":18,"range":{"start_line":15,"start_character":0,"end_line":18,"end_character":24},"in_reply_to":"3a461143_fe7ae6bb","updated":"2017-01-31 14:30:15.000000000","message":"Done","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c0a5ca941fabb88b4e30200f8e942e207ae953d4","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib import api"},{"line_number":16,"context_line":"from neutron_lib.api import converters"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Regular expression to validate 32 bits unsigned int"},{"line_number":21,"context_line":"UINT32_REGEX \u003d (r\u0027(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_6fe71bac","line":18,"range":{"start_line":15,"start_character":0,"end_line":18,"end_character":24},"in_reply_to":"3a461143_fe7ae6bb","updated":"2017-01-31 13:20:53.000000000","message":"Yes.","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"80ff0b837ac7eae467977ece20c81a688760e274","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        LOG.debug(msg)"},{"line_number":61,"context_line":"        return msg"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"api.validators.add_validator(\u0027type:rtrd_list\u0027, _validate_rtrd_list)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"# The alias of the extension."},{"line_number":66,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_1a0f8a37","line":63,"updated":"2017-01-24 17:07:15.000000000","message":"Why not add (in some form) directly to neutron_lib.api.validators rather than private?\n\n\nAlso it\u0027s missing a UT.","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ae4f328de7a698492847964c5597b654647ac381","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        LOG.debug(msg)"},{"line_number":61,"context_line":"        return msg"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"api.validators.add_validator(\u0027type:rtrd_list\u0027, _validate_rtrd_list)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"# The alias of the extension."},{"line_number":66,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_8d53886a","line":63,"in_reply_to":"5a3905b3_1a0f8a37","updated":"2017-01-30 22:17:55.000000000","message":"Adding it here makes the bgpvpn-specific things more contained. Isn\u0027t it a good idea ?","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"fb0c301d575debc806efdb35b0ecd880523d3ee9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        LOG.debug(msg)"},{"line_number":61,"context_line":"        return msg"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"api.validators.add_validator(\u0027type:rtrd_list\u0027, _validate_rtrd_list)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"# The alias of the extension."},{"line_number":66,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_dbc7ed61","line":63,"in_reply_to":"5a3905b3_1a0f8a37","updated":"2017-01-31 14:30:15.000000000","message":"I think it should probably be here unless there\u0027s some likelyhood of other extensions needing to validate RTs and RDs. These are pretty BGP specific concepts.\n\nI\u0027ll try to create some test cases.","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"80ff0b837ac7eae467977ece20c81a688760e274","unresolved":false,"context_lines":[{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"# The list of required extensions."},{"line_number":203,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":204,"context_line":"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"# The list of optional extensions."}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_35ad39e9","line":203,"updated":"2017-01-24 17:07:15.000000000","message":"Doesn\u0027t this need to depend on the \u0027router\u0027 exten [1] for l3 router support?\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/l3.py","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"fb0c301d575debc806efdb35b0ecd880523d3ee9","unresolved":false,"context_lines":[{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"# The list of required extensions."},{"line_number":203,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":204,"context_line":"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"# The list of optional extensions."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_bb1ea109","line":203,"in_reply_to":"3a461143_4da2804c","updated":"2017-01-31 14:30:15.000000000","message":"what if I put router below in the list of optional extensions?","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"da4a443e6fd31bae41bbb8b4d4d0d02ef03722db","unresolved":false,"context_lines":[{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"# The list of required extensions."},{"line_number":203,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":204,"context_line":"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"# The list of optional extensions."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_63c2cfea","line":203,"in_reply_to":"3a461143_bb1ea109","updated":"2017-01-31 15:36:50.000000000","message":"I think the cleanest way is:\n\n  import neutron_lib.api.definitions.l3\n\n  REQUIRED_EXTENSIONS \u003d [l3.ALIAS]","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ae4f328de7a698492847964c5597b654647ac381","unresolved":false,"context_lines":[{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"# The list of required extensions."},{"line_number":203,"context_line":"REQUIRED_EXTENSIONS \u003d ["},{"line_number":204,"context_line":"]"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"# The list of optional extensions."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_4da2804c","line":203,"in_reply_to":"5a3905b3_35ad39e9","updated":"2017-01-30 22:17:55.000000000","message":"Well, it\u0027s a dependency only if one wants to use router associations. The bgpvpn extension is usable without that.\n\nBut I guess the simpler is to declare the dependency to the \u0027router\u0027 extension.","commit_id":"4810cd83610523d8487a8068fbc29a725c439a97"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"ae7c9697bd01053d3072860c1732a7676e63a8fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3a461143_e6708d74","updated":"2017-01-31 15:48:01.000000000","message":"Something went wrong with git review. This file doesn\u0027t match what I have locally. I\u0027ll need to upload a new patch set after I get the validator test written.","commit_id":"1cc09251e3946a5e2b0af85efd1724bcb42e8b0f"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"878c3667301e0abfca929cc75b29afdca45d45dc","unresolved":false,"context_lines":[{"line_number":41,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def _validate_rtrd_list(data, valid_values\u003dNone):"},{"line_number":45,"context_line":"    if data is None or data is \"\":"},{"line_number":46,"context_line":"        return"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a461143_7357cf26","line":44,"updated":"2017-02-01 15:55:19.000000000","message":"I still think the core of this validator can be added to neutron_lib.api.validators in a more general form.\n\nConsider that we already have neutron_lib.api.validators._validate_list_of_items(...) that bascially does everything here except the checking for None or \"\" and we already have validate_regex_or_none(). So one idea is to add a general purpose validator like validate_list_of_regex_or_none(...) that uses _validate_list_of_items and validate_regex_or_none or validate a list of data via regex.\n\n\nIf we had something like that, then this extension specific validator could be as simple as::\n\n  def _validate_rtrd_list(...):\n    return validators.validate_list_of_regex_or_none(data, RTRD_REGEX)\n\n\nAt the very least I think this validator needs to be refactored to use _validate_list_of_items to reduce redundancy.","commit_id":"18bf6af18285590913e0a0f6e712b99ed51c57fd"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"801db21882b62a46c0424f35965e105d569056bb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def _validate_rtrd_list(data, valid_values\u003dNone):"},{"line_number":45,"context_line":"    if data is None or data is \"\":"},{"line_number":46,"context_line":"        return"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a461143_de9a0dc5","line":44,"in_reply_to":"3a461143_7357cf26","updated":"2017-02-02 21:36:03.000000000","message":"This makes sense.","commit_id":"18bf6af18285590913e0a0f6e712b99ed51c57fd"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f32b8583a6a1c8cb611672296284ebfe7cf76dc8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \u0027route_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                          \u0027default\u0027: [],"},{"line_number":80,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_list,"},{"line_number":81,"context_line":"                          \u0027validate\u0027: {\u0027type:route_target_list\u0027: None},"},{"line_number":82,"context_line":"                          \u0027is_visible\u0027: True,"},{"line_number":83,"context_line":"                          \u0027enforce_policy\u0027: True},"},{"line_number":84,"context_line":"        \u0027import_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a430d35_c0e655af","line":81,"range":{"start_line":81,"start_character":45,"end_line":81,"end_character":62},"updated":"2017-02-07 17:03:44.000000000","message":"is this defined anywhere ?","commit_id":"f41b7cd91d78f548124e614f67047c9c6aff58f0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"7c032605460e62c6ca51d44044a2b2850d9ccf07","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \u0027route_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":79,"context_line":"                          \u0027default\u0027: [],"},{"line_number":80,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_list,"},{"line_number":81,"context_line":"                          \u0027validate\u0027: {\u0027type:route_target_list\u0027: None},"},{"line_number":82,"context_line":"                          \u0027is_visible\u0027: True,"},{"line_number":83,"context_line":"                          \u0027enforce_policy\u0027: True},"},{"line_number":84,"context_line":"        \u0027import_targets\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a430d35_ab881c72","line":81,"range":{"start_line":81,"start_character":45,"end_line":81,"end_character":62},"in_reply_to":"1a430d35_c0e655af","updated":"2017-02-08 14:45:36.000000000","message":"No, it isn\u0027t. And, it doesn\u0027t exist on this line in my local git repo either. In my local repo the line reads:\n\n \u0027validate\u0027: {\u0027type:rtrd_list\u0027: None},\n\nSomehow in all this rebasing things are getting screwed up on Gerrit so that they don\u0027t match what I have on my local machine.","commit_id":"f41b7cd91d78f548124e614f67047c9c6aff58f0"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"7ca41fedd2e31f362bf9f19f427923ba8cc5fff1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron_lib.api import converters"},{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Regular expression to validate an empty string"},{"line_number":21,"context_line":"EMPTY_REGEX \u003d (r\u0027^$\u0027)"},{"line_number":22,"context_line":"# Regular expression to validate 32 bits unsigned int"},{"line_number":23,"context_line":"UINT32_REGEX \u003d (r\u0027(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}\u0027"},{"line_number":24,"context_line":"                r\u0027|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}\u0027"},{"line_number":25,"context_line":"                r\u0027|429496[0-6]\\d{3}|4294967[0-1]\\d{2}|42949672[0-8]\\d\u0027"},{"line_number":26,"context_line":"                r\u0027|429496729[0-5])\u0027)"},{"line_number":27,"context_line":"# Regular expression  to validate 16 bits unsigned int"},{"line_number":28,"context_line":"UINT16_REGEX \u003d (r\u0027(0|[1-9]\\d{0,3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}\u0027"},{"line_number":29,"context_line":"                r\u0027|655[0-2]\\d|6553[0-5])\u0027)"},{"line_number":30,"context_line":"# Regular expression to validate 8 bits unsigned int"},{"line_number":31,"context_line":"UINT8_REGEX \u003d (r\u0027(0|[1-9]\\d{0,1}|1\\d{2}|2[0-4]\\d|25[0-5])\u0027)"},{"line_number":32,"context_line":"# Regular expression to validate IPv4 address"},{"line_number":33,"context_line":"IP4_REGEX \u003d (r\u0027(%s\\.%s\\.%s\\.%s)\u0027) % (UINT8_REGEX, UINT8_REGEX, UINT8_REGEX,"},{"line_number":34,"context_line":"                                     UINT8_REGEX)"},{"line_number":35,"context_line":"# Regular expression to validate Route Target list format"},{"line_number":36,"context_line":"# Support of the Type 0, Type 1 and Type 2, cf. chapter 4.2 in RFC 4364"},{"line_number":37,"context_line":"# Also validates Route Distinguisher list format"},{"line_number":38,"context_line":"RTRD_REGEX \u003d (r\u0027%s|^(%s:%s|%s:%s|%s:%s)$\u0027) % (EMPTY_REGEX, UINT16_REGEX,"},{"line_number":39,"context_line":"                                              UINT32_REGEX, IP4_REGEX,"},{"line_number":40,"context_line":"                                              UINT16_REGEX, UINT32_REGEX,"},{"line_number":41,"context_line":"                                              UINT16_REGEX)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_26efec1e","line":41,"range":{"start_line":20,"start_character":1,"end_line":41,"end_character":59},"updated":"2017-02-09 00:22:18.000000000","message":"why are these here?","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"665ff7c5ed4b804e7f9a760da372e8ed9deff0ca","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron_lib.api import converters"},{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Regular expression to validate an empty string"},{"line_number":21,"context_line":"EMPTY_REGEX \u003d (r\u0027^$\u0027)"},{"line_number":22,"context_line":"# Regular expression to validate 32 bits unsigned int"},{"line_number":23,"context_line":"UINT32_REGEX \u003d (r\u0027(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}\u0027"},{"line_number":24,"context_line":"                r\u0027|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}\u0027"},{"line_number":25,"context_line":"                r\u0027|429496[0-6]\\d{3}|4294967[0-1]\\d{2}|42949672[0-8]\\d\u0027"},{"line_number":26,"context_line":"                r\u0027|429496729[0-5])\u0027)"},{"line_number":27,"context_line":"# Regular expression  to validate 16 bits unsigned int"},{"line_number":28,"context_line":"UINT16_REGEX \u003d (r\u0027(0|[1-9]\\d{0,3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}\u0027"},{"line_number":29,"context_line":"                r\u0027|655[0-2]\\d|6553[0-5])\u0027)"},{"line_number":30,"context_line":"# Regular expression to validate 8 bits unsigned int"},{"line_number":31,"context_line":"UINT8_REGEX \u003d (r\u0027(0|[1-9]\\d{0,1}|1\\d{2}|2[0-4]\\d|25[0-5])\u0027)"},{"line_number":32,"context_line":"# Regular expression to validate IPv4 address"},{"line_number":33,"context_line":"IP4_REGEX \u003d (r\u0027(%s\\.%s\\.%s\\.%s)\u0027) % (UINT8_REGEX, UINT8_REGEX, UINT8_REGEX,"},{"line_number":34,"context_line":"                                     UINT8_REGEX)"},{"line_number":35,"context_line":"# Regular expression to validate Route Target list format"},{"line_number":36,"context_line":"# Support of the Type 0, Type 1 and Type 2, cf. chapter 4.2 in RFC 4364"},{"line_number":37,"context_line":"# Also validates Route Distinguisher list format"},{"line_number":38,"context_line":"RTRD_REGEX \u003d (r\u0027%s|^(%s:%s|%s:%s|%s:%s)$\u0027) % (EMPTY_REGEX, UINT16_REGEX,"},{"line_number":39,"context_line":"                                              UINT32_REGEX, IP4_REGEX,"},{"line_number":40,"context_line":"                                              UINT16_REGEX, UINT32_REGEX,"},{"line_number":41,"context_line":"                                              UINT16_REGEX)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_45b6a5f9","line":41,"range":{"start_line":20,"start_character":1,"end_line":41,"end_character":59},"in_reply_to":"1a430d35_26efec1e","updated":"2017-02-09 07:33:19.000000000","message":"They are used at lines 109, 116, 123, 130.\nWhere else should we put them ?","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"7ca41fedd2e31f362bf9f19f427923ba8cc5fff1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                              UINT16_REGEX, UINT32_REGEX,"},{"line_number":41,"context_line":"                                              UINT16_REGEX)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# The alias of the extension."},{"line_number":46,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_e68a4463","line":43,"updated":"2017-02-09 00:22:18.000000000","message":"doesn\u0027t belong here.","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"4f159bcdbcfd2b7877fc4c23d709b12756806099","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                              UINT16_REGEX, UINT32_REGEX,"},{"line_number":41,"context_line":"                                              UINT16_REGEX)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# The alias of the extension."},{"line_number":46,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa31d9ce_9c542e55","line":43,"in_reply_to":"1a430d35_c5c29552","updated":"2017-02-10 17:20:52.000000000","message":"Done","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"665ff7c5ed4b804e7f9a760da372e8ed9deff0ca","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                              UINT16_REGEX, UINT32_REGEX,"},{"line_number":41,"context_line":"                                              UINT16_REGEX)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# The alias of the extension."},{"line_number":46,"context_line":"ALIAS \u003d \u0027bgpvpn\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_c5c29552","line":43,"in_reply_to":"1a430d35_e68a4463","updated":"2017-02-09 07:33:19.000000000","message":"indeed, this is a leftover from a previous PS","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"}],"neutron_lib/api/validators.py":[{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0aa285c8b2ebf2ab14a78db87675814ecd85f0e1","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        if segmentation_id:"},{"line_number":932,"context_line":"            segmentations[segmentation_type].add(segmentation_id)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"def _validate_rt_list(data, valid_values\u003dNone):"},{"line_number":935,"context_line":"    if data is None or data is \"\":"},{"line_number":936,"context_line":"        return"},{"line_number":937,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_aadf11d4","line":934,"range":{"start_line":934,"start_character":4,"end_line":934,"end_character":5},"updated":"2017-01-24 13:47:27.000000000","message":"The _ should be removed, for consistency with the rest of the code.","commit_id":"7d7599221bc9d143eac3bd77bdaf8a5c99a9607b"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"80a426a88d578ccae47b1a977b3e78d413dd86c4","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        if segmentation_id:"},{"line_number":932,"context_line":"            segmentations[segmentation_type].add(segmentation_id)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"def _validate_rt_list(data, valid_values\u003dNone):"},{"line_number":935,"context_line":"    if data is None or data is \"\":"},{"line_number":936,"context_line":"        return"},{"line_number":937,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_ed1773a0","line":934,"range":{"start_line":934,"start_character":4,"end_line":934,"end_character":5},"in_reply_to":"5a3905b3_aadf11d4","updated":"2017-01-24 14:01:38.000000000","message":"Done","commit_id":"7d7599221bc9d143eac3bd77bdaf8a5c99a9607b"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0aa285c8b2ebf2ab14a78db87675814ecd85f0e1","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        return msg"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    for item in data:"},{"line_number":944,"context_line":"        msg \u003d api.validators.validate_regex(item, constants.RT_REGEX)"},{"line_number":945,"context_line":"        if msg:"},{"line_number":946,"context_line":"            LOG.debug(msg)"},{"line_number":947,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_aa48f1b3","line":944,"range":{"start_line":944,"start_character":50,"end_line":944,"end_character":68},"updated":"2017-01-24 13:47:27.000000000","message":"This is not defined in neutron_lib but only in n8g-bgpvpn constants.\n\nTwo solutions:\na) move this const to neutron_lib.constants and then it can be used here\nb) define it in neutron_lib/api/definitions/bgpvpn.py and define the new validator by calling api.validators.add_validator(\u0027type:route_target_list\u0027, _validate_rt_list) from neutron_lib/api/definitions/bgpvpn.py as well\n\nI think I like (b) better since it keeps the BGPVPN things contained.","commit_id":"7d7599221bc9d143eac3bd77bdaf8a5c99a9607b"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"b53ecddcf6e1a16bae85d2714829298860b43793","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        return msg"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    for item in data:"},{"line_number":944,"context_line":"        msg \u003d api.validators.validate_regex(item, constants.RT_REGEX)"},{"line_number":945,"context_line":"        if msg:"},{"line_number":946,"context_line":"            LOG.debug(msg)"},{"line_number":947,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_b6913c49","line":944,"range":{"start_line":944,"start_character":50,"end_line":944,"end_character":68},"in_reply_to":"5a3905b3_0dd03fc8","updated":"2017-01-24 14:47:07.000000000","message":"(yes)","commit_id":"7d7599221bc9d143eac3bd77bdaf8a5c99a9607b"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"80a426a88d578ccae47b1a977b3e78d413dd86c4","unresolved":false,"context_lines":[{"line_number":941,"context_line":"        return msg"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"    for item in data:"},{"line_number":944,"context_line":"        msg \u003d api.validators.validate_regex(item, constants.RT_REGEX)"},{"line_number":945,"context_line":"        if msg:"},{"line_number":946,"context_line":"            LOG.debug(msg)"},{"line_number":947,"context_line":"            return msg"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_0dd03fc8","line":944,"range":{"start_line":944,"start_character":50,"end_line":944,"end_character":68},"in_reply_to":"5a3905b3_aa48f1b3","updated":"2017-01-24 14:01:38.000000000","message":"Do you mean remove this function definition from neutron_lib/api/validators.py and cut/paste it into neutron_lib/api/definitions/bgpvpn.py instead?","commit_id":"7d7599221bc9d143eac3bd77bdaf8a5c99a9607b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"80ff0b837ac7eae467977ece20c81a688760e274","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        if segmentation_id:"},{"line_number":932,"context_line":"            segmentations[segmentation_type].add(segmentation_id)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"# Dictionary that maintains a list of validation functions"},{"line_number":936,"context_line":"validators \u003d {\u0027type:dict\u0027: validate_dict,"},{"line_number":937,"context_line":"              \u0027type:dict_or_none\u0027: validate_dict_or_none,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_da6b42ef","side":"PARENT","line":934,"updated":"2017-01-24 17:07:15.000000000","message":"Is this intended?","commit_id":"0587be438c7b963677f6fc0b0f2eeb19e4ae6422"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"fb0c301d575debc806efdb35b0ecd880523d3ee9","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        if segmentation_id:"},{"line_number":932,"context_line":"            segmentations[segmentation_type].add(segmentation_id)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"# Dictionary that maintains a list of validation functions"},{"line_number":936,"context_line":"validators \u003d {\u0027type:dict\u0027: validate_dict,"},{"line_number":937,"context_line":"              \u0027type:dict_or_none\u0027: validate_dict_or_none,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_fb702942","side":"PARENT","line":934,"in_reply_to":"5a3905b3_da6b42ef","updated":"2017-01-31 14:30:15.000000000","message":"I think I probably changed it to make tox stop complaining, but I\u0027ll double check.","commit_id":"0587be438c7b963677f6fc0b0f2eeb19e4ae6422"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"4aaea9b1563e0c752d287c51608561abcc9ff9c2","unresolved":false,"context_lines":[{"line_number":653,"context_line":"    \"\"\""},{"line_number":654,"context_line":"    if data is not None:"},{"line_number":655,"context_line":"        _validate_list_of_items(validate_regex, data, valid_values)"},{"line_number":656,"context_line":"        return validate_regex(data, valid_values)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"def validate_subnetpool_id(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_065ad9f1","line":656,"range":{"start_line":656,"start_character":8,"end_line":656,"end_character":49},"updated":"2017-02-09 13:08:12.000000000","message":"You will need to add a unit test for this new validator (in neutron_lib.tests.unit.api.test_validators.TestAttributeValidation).\n\n\nAdditionally, the current implementation looks incorrect, the code is:\na) not doing anything with whatever _validate_list_of_items returns at line 655\nb) calling validate_regex with as first arg something that is not a string but a list (L656)\n\nI think it should be:\n\n    if data is not None:\n        return _validate_list_of_items(validate_regex, data, valid_values)","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"4f159bcdbcfd2b7877fc4c23d709b12756806099","unresolved":false,"context_lines":[{"line_number":653,"context_line":"    \"\"\""},{"line_number":654,"context_line":"    if data is not None:"},{"line_number":655,"context_line":"        _validate_list_of_items(validate_regex, data, valid_values)"},{"line_number":656,"context_line":"        return validate_regex(data, valid_values)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"def validate_subnetpool_id(data, valid_values\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa31d9ce_d762ffd7","line":656,"range":{"start_line":656,"start_character":8,"end_line":656,"end_character":49},"in_reply_to":"1a430d35_065ad9f1","updated":"2017-02-10 17:20:52.000000000","message":"Yes, I think you\u0027re right. I was thinking I had to validate it\u0027s a list and validate the regex, but the validation of the regex actually happens by passing the function to the function.","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"}],"neutron_lib/tests/unit/api/definitions/bgpvpn.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"982bd01310d982c7ce01f3fdab726bffe36b851c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class _BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_34cb2da7","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":61},"updated":"2017-01-03 17:16:15.000000000","message":"I must be missing something. Why am I not seeing any tests for this class run in [1]?\n\n\n[1] http://logs.openstack.org/82/413182/2/check/gate-neutron-lib-python27-ubuntu-xenial/51f7a65/testr_results.html.gz","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"4d2fa4a8afe91ded61ac40129544bcd114a3290c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class _BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba5201f7_a55531c7","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":61},"in_reply_to":"ba5201f7_34cb2da7","updated":"2017-01-10 15:50:38.000000000","message":"I guess we should mimic what is done for the \u0027trunk\u0027 API.","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bf4293deb6ae38c2d56ce078a6840217cc485787","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#         http://www.apache.org/licenses/LICENSE-2.0"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_43f0ab91","line":2,"updated":"2017-01-12 00:51:37.000000000","message":"the file name is wrong. The testcase is not executed.","commit_id":"953f850bf12e355e92ca861d3bb1cb12269d09e5"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5dcde97767864f734b0c11e4700fb80403098d24","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#         http://www.apache.org/licenses/LICENSE-2.0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a57fde8_f5b490d2","line":2,"in_reply_to":"ba5201f7_43f0ab91","updated":"2017-01-12 08:50:38.000000000","message":"(should be test_bgpvpn.py)","commit_id":"953f850bf12e355e92ca861d3bb1cb12269d09e5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d3624083f460c3d8c08a603d9bb2905f8c45f1b1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class _BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_e3843f0c","line":17,"updated":"2017-01-12 00:51:17.000000000","message":"why is this private?","commit_id":"953f850bf12e355e92ca861d3bb1cb12269d09e5"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"5dcde97767864f734b0c11e4700fb80403098d24","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class _BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a57fde8_f5ebb0ae","line":17,"in_reply_to":"ba5201f7_e3843f0c","updated":"2017-01-12 08:50:38.000000000","message":"I guess it\u0027s because that\u0027s what is done for _dummy (_DummyDefinitionTestCase).","commit_id":"953f850bf12e355e92ca861d3bb1cb12269d09e5"}],"neutron_lib/tests/unit/api/definitions/test_bgpvpn.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8794fa38cba44ff11913d06bd0613d646df7a2a8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"},{"line_number":20,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_16052b79","line":20,"updated":"2017-01-20 22:38:27.000000000","message":"extension_attributes would need to be defined here as well in order to make the test pass.","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"28345d64bcf783744181d84dc50f9a78e366adef","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"},{"line_number":20,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_2250b831","line":20,"in_reply_to":"5a3905b3_16052b79","updated":"2017-01-24 09:28:13.000000000","message":"yes, I think pcarver has identified that but not yet pushed a new PS","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"f23ee9167a0693213542868863ead59f6efceece","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class BgpvpnDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d bgpvpn"},{"line_number":19,"context_line":"    extension_resources \u003d (bgpvpn.COLLECTION_NAME,)"},{"line_number":20,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_eaa039f6","line":20,"in_reply_to":"5a3905b3_2250b831","updated":"2017-01-24 13:33:39.000000000","message":"Yes, I have extension_attributes locally but not sure if I need to do anything with subresource attributes.","commit_id":"3e26d278755f58a8416221a0d79e473def843959"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f32b8583a6a1c8cb611672296284ebfe7cf76dc8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"                            \u0027export_targets\u0027, \u0027route_distinguishers\u0027,"},{"line_number":22,"context_line":"                            \u0027networks\u0027, \u0027routers\u0027)"},{"line_number":23,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":"class TrunkDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":27,"context_line":"    extension_module \u003d trunk"},{"line_number":28,"context_line":"    extension_resources \u003d (trunk.TRUNKS,)"},{"line_number":29,"context_line":"    extension_attributes \u003d (trunk.SUB_PORTS,)"},{"line_number":30,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a430d35_c09d750b","line":30,"range":{"start_line":24,"start_character":0,"end_line":30,"end_character":3},"updated":"2017-02-07 17:03:44.000000000","message":"This can be removed (I guess you intended so in a different change).","commit_id":"f41b7cd91d78f548124e614f67047c9c6aff58f0"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"7c032605460e62c6ca51d44044a2b2850d9ccf07","unresolved":false,"context_lines":[{"line_number":21,"context_line":"                            \u0027export_targets\u0027, \u0027route_distinguishers\u0027,"},{"line_number":22,"context_line":"                            \u0027networks\u0027, \u0027routers\u0027)"},{"line_number":23,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":"class TrunkDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":27,"context_line":"    extension_module \u003d trunk"},{"line_number":28,"context_line":"    extension_resources \u003d (trunk.TRUNKS,)"},{"line_number":29,"context_line":"    extension_attributes \u003d (trunk.SUB_PORTS,)"},{"line_number":30,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a430d35_ab3d7c90","line":30,"range":{"start_line":24,"start_character":0,"end_line":30,"end_character":3},"in_reply_to":"1a430d35_c09d750b","updated":"2017-02-08 14:45:36.000000000","message":"This is more rebasing junk. This file does not match what\u0027s in my local repo. Somehow when resolving git review conflicts the wrong versions of files are getting uploaded.","commit_id":"f41b7cd91d78f548124e614f67047c9c6aff58f0"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"7ca41fedd2e31f362bf9f19f427923ba8cc5fff1","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                            \u0027networks\u0027, \u0027routers\u0027, \u0027router_id\u0027, \u0027network_id\u0027)"},{"line_number":23,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":"    def _data_for_invalid_rtdt(self):"},{"line_number":27,"context_line":"        values \u003d [[\u0027:1\u0027],"},{"line_number":28,"context_line":"                  [\u00271:\u0027],"},{"line_number":29,"context_line":"                  [\u002742\u0027],"},{"line_number":30,"context_line":"                  [\u002765536:123456\u0027],"},{"line_number":31,"context_line":"                  [\u0027123.456.789.123:65535\u0027],"},{"line_number":32,"context_line":"                  [\u00274294967296:65535\u0027],"},{"line_number":33,"context_line":"                  [\u00271.1.1.1:655351\u0027],"},{"line_number":34,"context_line":"                  [\u00274294967295:65536\u0027],"},{"line_number":35,"context_line":"                  ]"},{"line_number":36,"context_line":"        for value in values:"},{"line_number":37,"context_line":"            yield value"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _data_for_valid_rtdt(self):"},{"line_number":40,"context_line":"        values \u003d [[\u00271:1\u0027],"},{"line_number":41,"context_line":"                  [\u00271:4294967295\u0027],"},{"line_number":42,"context_line":"                  [\u002765535:0\u0027],"},{"line_number":43,"context_line":"                  [\u002765535:4294967295\u0027],"},{"line_number":44,"context_line":"                  [\u00271.1.1.1:1\u0027],"},{"line_number":45,"context_line":"                  [\u00271.1.1.1:65535\u0027],"},{"line_number":46,"context_line":"                  [\u00274294967295:0\u0027],"},{"line_number":47,"context_line":"                  [\u002765536:65535\u0027],"},{"line_number":48,"context_line":"                  [\u00274294967295:65535\u0027],"},{"line_number":49,"context_line":"                  ]"},{"line_number":50,"context_line":"        for value in values:"},{"line_number":51,"context_line":"            yield value"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_valid_rtrd(self):"},{"line_number":54,"context_line":"        for rtrd in self._data_for_valid_rtdt():"},{"line_number":55,"context_line":"            msg \u003d bgpvpn._validate_rtrd_list(rtrd)"},{"line_number":56,"context_line":"            self.assertIsNone(msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_invalid_rtrd(self):"},{"line_number":59,"context_line":"        for rtrd in self._data_for_invalid_rtdt():"},{"line_number":60,"context_line":"            msg \u003d bgpvpn._validate_rtrd_list(rtrd)"},{"line_number":61,"context_line":"            self.assertIsNotNone(msg)"},{"line_number":62,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_46f23807","line":62,"range":{"start_line":25,"start_character":0,"end_line":62,"end_character":3},"updated":"2017-02-09 00:22:18.000000000","message":"this seems leftover","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"4f159bcdbcfd2b7877fc4c23d709b12756806099","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                            \u0027networks\u0027, \u0027routers\u0027, \u0027router_id\u0027, \u0027network_id\u0027)"},{"line_number":23,"context_line":"    extension_subresources \u003d (\u0027network_associations\u0027, \u0027router_associations\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\u0027\u0027\u0027"},{"line_number":26,"context_line":"    def _data_for_invalid_rtdt(self):"},{"line_number":27,"context_line":"        values \u003d [[\u0027:1\u0027],"},{"line_number":28,"context_line":"                  [\u00271:\u0027],"},{"line_number":29,"context_line":"                  [\u002742\u0027],"},{"line_number":30,"context_line":"                  [\u002765536:123456\u0027],"},{"line_number":31,"context_line":"                  [\u0027123.456.789.123:65535\u0027],"},{"line_number":32,"context_line":"                  [\u00274294967296:65535\u0027],"},{"line_number":33,"context_line":"                  [\u00271.1.1.1:655351\u0027],"},{"line_number":34,"context_line":"                  [\u00274294967295:65536\u0027],"},{"line_number":35,"context_line":"                  ]"},{"line_number":36,"context_line":"        for value in values:"},{"line_number":37,"context_line":"            yield value"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _data_for_valid_rtdt(self):"},{"line_number":40,"context_line":"        values \u003d [[\u00271:1\u0027],"},{"line_number":41,"context_line":"                  [\u00271:4294967295\u0027],"},{"line_number":42,"context_line":"                  [\u002765535:0\u0027],"},{"line_number":43,"context_line":"                  [\u002765535:4294967295\u0027],"},{"line_number":44,"context_line":"                  [\u00271.1.1.1:1\u0027],"},{"line_number":45,"context_line":"                  [\u00271.1.1.1:65535\u0027],"},{"line_number":46,"context_line":"                  [\u00274294967295:0\u0027],"},{"line_number":47,"context_line":"                  [\u002765536:65535\u0027],"},{"line_number":48,"context_line":"                  [\u00274294967295:65535\u0027],"},{"line_number":49,"context_line":"                  ]"},{"line_number":50,"context_line":"        for value in values:"},{"line_number":51,"context_line":"            yield value"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_valid_rtrd(self):"},{"line_number":54,"context_line":"        for rtrd in self._data_for_valid_rtdt():"},{"line_number":55,"context_line":"            msg \u003d bgpvpn._validate_rtrd_list(rtrd)"},{"line_number":56,"context_line":"            self.assertIsNone(msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_invalid_rtrd(self):"},{"line_number":59,"context_line":"        for rtrd in self._data_for_invalid_rtdt():"},{"line_number":60,"context_line":"            msg \u003d bgpvpn._validate_rtrd_list(rtrd)"},{"line_number":61,"context_line":"            self.assertIsNotNone(msg)"},{"line_number":62,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa31d9ce_9c0c2e44","line":62,"range":{"start_line":25,"start_character":0,"end_line":62,"end_character":3},"in_reply_to":"1a430d35_46f23807","updated":"2017-02-10 17:20:52.000000000","message":"Yes, leftover from before generalizing the _validate_rtrd_list function to a validate_list_of_regex_or_none function. I think I should probably test that the generalized function accurately validates RTs and RDs in addition to testing that it validates regexes. I\u0027m going to keep these tests but modify them to test the new function.","commit_id":"809042d9829ede83795f6e806b8327faabb21edc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"884e2f07a0af656719ec1a58f18018d243365ec4","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.api.definitions import bgpvpn"},{"line_number":14,"context_line":"from neutron_lib.api.validators import validate_list_of_regex_or_none"},{"line_number":15,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa31d9ce_68cd3865","line":14,"updated":"2017-02-15 19:18:58.000000000","message":"this should be:\n\nfrom neutron_lib.api import validators","commit_id":"f791ae5f1c0dcd40cdbba4898a1c6c2ddfc368e4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e632df96bb632e5214ed36604a08bc6c48102c13","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.api.definitions import bgpvpn"},{"line_number":14,"context_line":"from neutron_lib.api.validators import validate_list_of_regex_or_none"},{"line_number":15,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa31d9ce_74e0b129","line":14,"in_reply_to":"fa31d9ce_5ed10e22","updated":"2017-02-15 20:47:50.000000000","message":"from neutron_lib.api import validators","commit_id":"f791ae5f1c0dcd40cdbba4898a1c6c2ddfc368e4"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"3b9cb67b6c5a9bd16a51bc090ff974ce1abc267d","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.api.definitions import bgpvpn"},{"line_number":14,"context_line":"from neutron_lib.api.validators import validate_list_of_regex_or_none"},{"line_number":15,"context_line":"from neutron_lib.tests.unit.api.definitions import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fa31d9ce_5ed10e22","line":14,"in_reply_to":"fa31d9ce_68cd3865","updated":"2017-02-15 20:26:01.000000000","message":"Importing it this waysaves me the extra line breaks from the rather long function name since I only need the one validator that I\u0027m testing, but I\u0027ll change it if you like.","commit_id":"f791ae5f1c0dcd40cdbba4898a1c6c2ddfc368e4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e632df96bb632e5214ed36604a08bc6c48102c13","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_valid_rtrd(self):"},{"line_number":54,"context_line":"        for rtrd in self._data_for_valid_rtdt():"},{"line_number":55,"context_line":"            msg \u003d validate_list_of_regex_or_none(rtrd, bgpvpn.RTRD_REGEX)"},{"line_number":56,"context_line":"            self.assertIsNone(msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_invalid_rtrd(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa31d9ce_143db58e","line":55,"updated":"2017-02-15 20:47:50.000000000","message":"msg \u003d (validators.\n       validate_list_of_regex_or_none(rtrd, bgpvpn.RTRD_REGEX))","commit_id":"f791ae5f1c0dcd40cdbba4898a1c6c2ddfc368e4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4527013c552a0a0845e45d012c15008b53328f1e","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def test_valid_rtrd(self):"},{"line_number":54,"context_line":"        for rtrd in self._data_for_valid_rtdt():"},{"line_number":55,"context_line":"            msg \u003d validate_list_of_regex_or_none(rtrd, bgpvpn.RTRD_REGEX)"},{"line_number":56,"context_line":"            self.assertIsNone(msg)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_invalid_rtrd(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa31d9ce_b46b0984","line":55,"in_reply_to":"fa31d9ce_143db58e","updated":"2017-02-15 20:49:48.000000000","message":"msg \u003d (validators.validate_list_of_regex_or_none(\n   rtrd, bgpvpn.RTRD_REGEX))","commit_id":"f791ae5f1c0dcd40cdbba4898a1c6c2ddfc368e4"}],"releasenotes/notes/bgpvpn-api-def-22c7072575316ddd.yaml":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e5e2a9f9a597d33408b0e5ec5ebbc2056f67887b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for networking-bgpvpn extension"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"1a6eadb0_ca7e77e3","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":23},"updated":"2016-12-21 16:07:13.000000000","message":"Nit: \"for the...\"","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e5e2a9f9a597d33408b0e5ec5ebbc2056f67887b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for networking-bgpvpn extension"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"1a6eadb0_6a7483fd","line":3,"range":{"start_line":3,"start_character":41,"end_line":3,"end_character":50},"updated":"2016-12-21 16:07:13.000000000","message":"Nit: Period at the end of sentence.","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"0591e0e930ef677da958e757ba400f8de99f543c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for networking-bgpvpn extension"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"ba5201f7_84184886","line":3,"range":{"start_line":3,"start_character":41,"end_line":3,"end_character":50},"in_reply_to":"1a6eadb0_6a7483fd","updated":"2017-01-02 16:25:23.000000000","message":"Done","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"0591e0e930ef677da958e757ba400f8de99f543c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for networking-bgpvpn extension"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"ba5201f7_a41d4c75","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":23},"in_reply_to":"1a6eadb0_ca7e77e3","updated":"2017-01-02 16:25:23.000000000","message":"Done","commit_id":"ba7f09cf619054295ce3cce94df716eeb3129ffe"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"982bd01310d982c7ce01f3fdab726bffe36b851c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for the networking-bgpvpn extension."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"ba5201f7_744cd542","line":3,"range":{"start_line":3,"start_character":27,"end_line":3,"end_character":44},"updated":"2017-01-03 17:16:15.000000000","message":"Nit: might format nicer if we used ``networking-bgpvpn``","commit_id":"6cb9d643b7f6d8fa9279414716ab4622325db503"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c18de2215a55a44335ec9c3ba0f478e2f4b05a57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"fa31d9ce_8903ce0c","line":4,"updated":"2017-02-13 13:31:39.000000000","message":"Thanks for addressing my earlier comment, but can we please add a rel note about the new validator (validate_list_of_regex_or_none) added here too?","commit_id":"554aaf6bfaee4f013d38b1e6da13bc36e4615f94"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"8bf4b8687b402db7ce83343fa1e416c1b1afa86e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"fa31d9ce_c45e8b75","line":4,"in_reply_to":"fa31d9ce_8903ce0c","updated":"2017-02-13 13:58:47.000000000","message":"Done","commit_id":"554aaf6bfaee4f013d38b1e6da13bc36e4615f94"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"4c7b8172f2f78c30ecae10e16014e04e4dbaff62","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for the ``networking-bgpvpn`` extension."},{"line_number":4,"context_line":"  - Adds new validator validate_list_of_regex_or_none"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"fa31d9ce_e4150ce5","line":4,"range":{"start_line":4,"start_character":23,"end_line":4,"end_character":53},"updated":"2017-02-14 17:30:58.000000000","message":"Nit: use ``validate_list_of_regex_or_none`` and add a period at end of line.","commit_id":"712cd89f3aed06244a80ce35ab444cb8eea6ca51"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"3e2bda577dab189e24b20e099203ca68d545d07a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - API definition for the ``networking-bgpvpn`` extension."},{"line_number":4,"context_line":"  - Adds new validator validate_list_of_regex_or_none"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"fa31d9ce_e4498cb8","line":4,"range":{"start_line":4,"start_character":23,"end_line":4,"end_character":53},"in_reply_to":"fa31d9ce_e4150ce5","updated":"2017-02-14 17:37:09.000000000","message":"Done","commit_id":"712cd89f3aed06244a80ce35ab444cb8eea6ca51"}]}
