)]}'
{"neutron_lib/api/converters.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"2b4812819cdce76067427cc17a83a4b73131549e","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        raise n_exc.InvalidInput(error_message\u003derror_message)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"def convert_to_lowercase(data):"},{"line_number":257,"context_line":"    if isinstance(data, six.string_types):"},{"line_number":258,"context_line":"        return data.lower()"},{"line_number":259,"context_line":"    msg \u003d _(\"\u0027%s\u0027 cannot be converted to lowercase string\") % data"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_ddbea7d3","line":256,"updated":"2017-05-01 12:46:41.000000000","message":"How is this different from convert_string_to_case_insensitive [1]?\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/converters.py#L206","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f562c4d1c1d40b5c33f0d2aaeb4cfbbed1a9dcfb","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        raise n_exc.InvalidInput(error_message\u003derror_message)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"def convert_to_lowercase(data):"},{"line_number":257,"context_line":"    if isinstance(data, six.string_types):"},{"line_number":258,"context_line":"        return data.lower()"},{"line_number":259,"context_line":"    msg \u003d _(\"\u0027%s\u0027 cannot be converted to lowercase string\") % data"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_f64ccf42","line":256,"in_reply_to":"5ff73747_ddbea7d3","updated":"2017-05-02 07:16:47.000000000","message":"You\u0027re right.","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"}],"neutron_lib/api/definitions/dns.py":[{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1246001a6603b5078646c87b877a62faadfee50e","unresolved":false,"context_lines":[{"line_number":108,"context_line":"# The list of optional extensions (mandatory)."},{"line_number":109,"context_line":"OPTIONAL_EXTENSIONS \u003d []"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _validate_dns_name(data, max_len\u003dFQDN_MAX_LEN):"},{"line_number":113,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":114,"context_line":"    if msg:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_6d0e583c","line":111,"updated":"2017-04-25 16:28:22.000000000","message":"I have to consider the following methods.","commit_id":"b27e785942fd1041943b059de5525ed7627d16e8"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"2b4812819cdce76067427cc17a83a4b73131549e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":54,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":55,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":56,"context_line":"FQDN_MAX_LEN \u003d 255"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The resource attribute map for the extension. It is effectively the"},{"line_number":59,"context_line":"# bulk of the API contract alongside ACTION_MAP (mandatory)."}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_7dac339e","line":56,"updated":"2017-05-01 12:46:41.000000000","message":"This appears to already be defined in the db constants; I think we should ref it from there rather than redefine. See: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/db/constants.py#L25","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f562c4d1c1d40b5c33f0d2aaeb4cfbbed1a9dcfb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":54,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":55,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":56,"context_line":"FQDN_MAX_LEN \u003d 255"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The resource attribute map for the extension. It is effectively the"},{"line_number":59,"context_line":"# bulk of the API contract alongside ACTION_MAP (mandatory)."}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_366eb7c8","line":56,"in_reply_to":"5ff73747_7dac339e","updated":"2017-05-02 07:16:47.000000000","message":"Done","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"2b4812819cdce76067427cc17a83a4b73131549e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"# The resource attribute map for the extension. It is effectively the"},{"line_number":59,"context_line":"# bulk of the API contract alongside ACTION_MAP (mandatory)."},{"line_number":60,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":61,"context_line":"    \u0027ports\u0027: {"},{"line_number":62,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":63,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":64,"context_line":"                  \u0027convert_to\u0027: converters.convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_dda347b1","line":61,"range":{"start_line":61,"start_character":5,"end_line":61,"end_character":10},"updated":"2017-05-01 12:46:41.000000000","message":"Seems like we\u0027d be better off using the respective api-def\u0027s constant for these values. For example here::\n\n    port_def.COLLECTION_NAME","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f562c4d1c1d40b5c33f0d2aaeb4cfbbed1a9dcfb","unresolved":false,"context_lines":[{"line_number":58,"context_line":"# The resource attribute map for the extension. It is effectively the"},{"line_number":59,"context_line":"# bulk of the API contract alongside ACTION_MAP (mandatory)."},{"line_number":60,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":61,"context_line":"    \u0027ports\u0027: {"},{"line_number":62,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":63,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":64,"context_line":"                  \u0027convert_to\u0027: converters.convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_16717ba8","line":61,"range":{"start_line":61,"start_character":5,"end_line":61,"end_character":10},"in_reply_to":"5ff73747_dda347b1","updated":"2017-05-02 07:16:47.000000000","message":"Done","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"2b4812819cdce76067427cc17a83a4b73131549e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"OPTIONAL_EXTENSIONS \u003d []"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _validate_dns_name(data, max_len\u003dFQDN_MAX_LEN):"},{"line_number":113,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":114,"context_line":"    if msg:"},{"line_number":115,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_9da93f91","line":112,"updated":"2017-05-01 12:46:41.000000000","message":"All these validators should probably be incorporated into neutron_lib.api.validators; we haven\u0027t been leaving api specific validators in the defs.","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f562c4d1c1d40b5c33f0d2aaeb4cfbbed1a9dcfb","unresolved":false,"context_lines":[{"line_number":109,"context_line":"OPTIONAL_EXTENSIONS \u003d []"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _validate_dns_name(data, max_len\u003dFQDN_MAX_LEN):"},{"line_number":113,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":114,"context_line":"    if msg:"},{"line_number":115,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_367c7770","line":112,"in_reply_to":"5ff73747_9da93f91","updated":"2017-05-02 07:16:47.000000000","message":"I moved them into validators but I guess that they are not general method so they may not fit the place.","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c44e8f4dc6c5e65a859cc2cd31014feacb57a2e7","unresolved":false,"context_lines":[{"line_number":102,"context_line":"ACTION_STATUS \u003d {}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# The list of required extensions (mandatory)."},{"line_number":105,"context_line":"REQUIRED_EXTENSIONS \u003d [\u0027router\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# The list of optional extensions (mandatory)."},{"line_number":108,"context_line":"OPTIONAL_EXTENSIONS \u003d []"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_d98797d7","line":105,"range":{"start_line":105,"start_character":24,"end_line":105,"end_character":30},"updated":"2017-05-15 17:16:20.000000000","message":"why not just import neutron_lib.api.definitions.l3 and use l3.ALIAS rather than this static string?","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1688cd24eb8c3d5921c5f283e925155e368d8818","unresolved":false,"context_lines":[{"line_number":102,"context_line":"ACTION_STATUS \u003d {}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"# The list of required extensions (mandatory)."},{"line_number":105,"context_line":"REQUIRED_EXTENSIONS \u003d [\u0027router\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# The list of optional extensions (mandatory)."},{"line_number":108,"context_line":"OPTIONAL_EXTENSIONS \u003d []"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_e5405c38","line":105,"range":{"start_line":105,"start_character":24,"end_line":105,"end_character":30},"in_reply_to":"1f013ff3_d98797d7","updated":"2017-05-16 04:08:58.000000000","message":"Done","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"}],"neutron_lib/api/validators.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"624bb327987c6c858bb7ebed3108b7f8af964e92","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# List of validator key which should be exception when checking duplicated"},{"line_number":42,"context_line":"# validator."},{"line_number":43,"context_line":"EXCEPTION_DUPLICATED_VALIDATORS \u003d [\u0027type:dns_name\u0027, \u0027type:fip_dns_name\u0027,"},{"line_number":44,"context_line":"                                   \u0027type:dns_domain\u0027]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_22a30a52","line":43,"updated":"2017-05-03 21:19:11.000000000","message":"Seems like this should be private, if needed at all.","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"624bb327987c6c858bb7ebed3108b7f8af964e92","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"    return validators.get(_to_validation_type(validation_type), default)"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"def _validate_exception_dupricated_validator(validator_key):"},{"line_number":1245,"context_line":"    \"\"\"Check exception for dupricated validator"},{"line_number":1246,"context_line":""},{"line_number":1247,"context_line":"    This checks duplicated validator should be exception. This is needed"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_a546044f","line":1244,"updated":"2017-05-03 21:19:11.000000000","message":"Isn\u0027t there a way to get this done without the need to check these duplicates? For example couldn\u0027t we just have the type slight different in lib so that there\u0027s no collisions with that in neutron?\n\n\nFor example::\n\n   \u0027type:domain_name\u0027: validate_dns_name\n\n\nThat\u0027s the approach I took here: https://review.openstack.org/#/c/428387/15/neutron_lib/api/validators.py","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f88baa4e02b9aeed6b21ff330cc851bb02c8c8ea","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"    return validators.get(_to_validation_type(validation_type), default)"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"def _validate_exception_dupricated_validator(validator_key):"},{"line_number":1245,"context_line":"    \"\"\"Check exception for dupricated validator"},{"line_number":1246,"context_line":""},{"line_number":1247,"context_line":"    This checks duplicated validator should be exception. This is needed"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f044301_62fbc746","line":1244,"in_reply_to":"3f044301_a546044f","updated":"2017-05-10 14:57:48.000000000","message":"I tried to do as well but it\u0027s troubled me. I guess that actually validate_dns_name validates host name of dns. I also think that the type name should not be estranged from method name. How do you think about dns_domain? And also this issue will trouble us on other rehome works with moving validators.\n\nWell, I\u0027m OK. I tried to change type name again.","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c44e8f4dc6c5e65a859cc2cd31014feacb57a2e7","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"    indicating why validation failed."},{"line_number":1093,"context_line":"    \"\"\""},{"line_number":1094,"context_line":"    def _get_dns_domain():"},{"line_number":1095,"context_line":"        if not cfg.CONF.dns_domain:"},{"line_number":1096,"context_line":"            return \u0027\u0027"},{"line_number":1097,"context_line":"        if cfg.CONF.dns_domain.endswith(\u0027.\u0027):"},{"line_number":1098,"context_line":"            return cfg.CONF.dns_domain"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_392b1bec","line":1095,"range":{"start_line":1095,"start_character":15,"end_line":1095,"end_character":34},"updated":"2017-05-15 17:16:20.000000000","message":"IMO we should doc the prereq that consumers need to have dns_domain registered with the global CONF.","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1688cd24eb8c3d5921c5f283e925155e368d8818","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"    indicating why validation failed."},{"line_number":1093,"context_line":"    \"\"\""},{"line_number":1094,"context_line":"    def _get_dns_domain():"},{"line_number":1095,"context_line":"        if not cfg.CONF.dns_domain:"},{"line_number":1096,"context_line":"            return \u0027\u0027"},{"line_number":1097,"context_line":"        if cfg.CONF.dns_domain.endswith(\u0027.\u0027):"},{"line_number":1098,"context_line":"            return cfg.CONF.dns_domain"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_4504b015","line":1095,"range":{"start_line":1095,"start_character":15,"end_line":1095,"end_character":34},"in_reply_to":"1f013ff3_392b1bec","updated":"2017-05-16 04:08:58.000000000","message":"Done","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c44e8f4dc6c5e65a859cc2cd31014feacb57a2e7","unresolved":false,"context_lines":[{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    def _get_request_dns_name(data):"},{"line_number":1102,"context_line":"        dns_domain \u003d _get_dns_domain()"},{"line_number":1103,"context_line":"        if ((dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT)):"},{"line_number":1104,"context_line":"            return data"},{"line_number":1105,"context_line":"        return \u0027\u0027"},{"line_number":1106,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_79dac317","line":1103,"range":{"start_line":1103,"start_character":11,"end_line":1103,"end_character":13},"updated":"2017-05-15 17:16:20.000000000","message":"Nit: I don\u0027t think we need this if enclosed.","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1688cd24eb8c3d5921c5f283e925155e368d8818","unresolved":false,"context_lines":[{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    def _get_request_dns_name(data):"},{"line_number":1102,"context_line":"        dns_domain \u003d _get_dns_domain()"},{"line_number":1103,"context_line":"        if ((dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT)):"},{"line_number":1104,"context_line":"            return data"},{"line_number":1105,"context_line":"        return \u0027\u0027"},{"line_number":1106,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_65ffac01","line":1103,"range":{"start_line":1103,"start_character":11,"end_line":1103,"end_character":13},"in_reply_to":"1f013ff3_79dac317","updated":"2017-05-16 04:08:58.000000000","message":"Right. It\u0027s trash under development.","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4e5f29b4daa5f84364aef70f78aa47c256b83937","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"            return cfg.CONF.dns_domain"},{"line_number":1101,"context_line":"        return \u0027%s.\u0027 % cfg.CONF.dns_domain"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"    def _get_request_dns_name(data):"},{"line_number":1104,"context_line":"        dns_domain \u003d _get_dns_domain()"},{"line_number":1105,"context_line":"        if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1106,"context_line":"            return data"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_dddaac15","line":1103,"updated":"2017-05-17 07:24:00.000000000","message":"can we avoid defining these as closures? I don\u0027t see a reason to create a closure every time this function is called when we don\u0027t reference anything in the closure scope.","commit_id":"e12e523c462a3da629c18daaf3deceb16e751f94"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"244a683e40d8ca5c5e71e7a4344eb12945d39022","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"            return cfg.CONF.dns_domain"},{"line_number":1101,"context_line":"        return \u0027%s.\u0027 % cfg.CONF.dns_domain"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"    def _get_request_dns_name(data):"},{"line_number":1104,"context_line":"        dns_domain \u003d _get_dns_domain()"},{"line_number":1105,"context_line":"        if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1106,"context_line":"            return data"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_d49d3467","line":1103,"in_reply_to":"1f013ff3_dddaac15","updated":"2017-05-17 13:56:59.000000000","message":"you\u0027re right. done.","commit_id":"e12e523c462a3da629c18daaf3deceb16e751f94"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"    if not data:"},{"line_number":1020,"context_line":"        return"},{"line_number":1021,"context_line":"    try:"},{"line_number":1022,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":1023,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":1024,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":1025,"context_line":"        if len(trimmed) \u003e max_len:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_82bbb770","line":1022,"range":{"start_line":1022,"start_character":10,"end_line":1022,"end_character":30},"updated":"2017-05-19 10:59:31.000000000","message":"Only a single trailing period is allowed, so I think it should be \"A trailing period is allowed ...\"","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"    if not data:"},{"line_number":1020,"context_line":"        return"},{"line_number":1021,"context_line":"    try:"},{"line_number":1022,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":1023,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":1024,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":1025,"context_line":"        if len(trimmed) \u003e max_len:"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_f3615d3b","line":1022,"range":{"start_line":1022,"start_character":10,"end_line":1022,"end_character":30},"in_reply_to":"ff0f0b1f_82bbb770","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"    try:"},{"line_number":1022,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":1023,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":1024,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":1025,"context_line":"        if len(trimmed) \u003e max_len:"},{"line_number":1026,"context_line":"            raise TypeError("},{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_42723fe5","line":1024,"range":{"start_line":1024,"start_character":18,"end_line":1024,"end_character":63},"updated":"2017-05-19 10:59:31.000000000","message":"Consider:\n\n   data[:-1] if data.endswith(\u0027.\u0027) else data\n\nI think it is more straight-forward.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"    try:"},{"line_number":1022,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":1023,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":1024,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":1025,"context_line":"        if len(trimmed) \u003e max_len:"},{"line_number":1026,"context_line":"            raise TypeError("},{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_f3c6fd16","line":1024,"range":{"start_line":1024,"start_character":18,"end_line":1024,"end_character":63},"in_reply_to":"ff0f0b1f_42723fe5","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_5daa24d2","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"updated":"2017-05-19 10:59:31.000000000","message":"I think we call it as \u0027component\u0027, so in general \u0027component\u0027 and \u0027components\u0027 are the right variable names (except the length of var names).","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aeff52976010612a7048519d68dec5c5b301a79d","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_a434b94b","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"in_reply_to":"df140735_13fa9141","updated":"2017-05-29 16:22:54.000000000","message":"Sounds good. \u0027label\u0027 is used in RFC 1034.\n\n\u0027label\u0027 looks more appropriate here. In RFC 1034, it seems \u0027component\u0027 is used in a more generic meaning in the RFC.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e74aad43212f3adbcf364fed80e8d86b0c272080","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_ea565a2a","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"in_reply_to":"ff0f0b1f_096bf9b6","updated":"2017-05-23 21:18:42.000000000","message":"In https://tools.ietf.org/html/rfc1034 these \u0027components\u0027 (as Akihiro suggests calling them) are referred to as \u0027labels\u0027. So if this is going to be changed, why not stick to the standard?.\n\nHaving said this, I want to point out that when I originally implemented the DNS extension, I was given this method by Kevin Benton for this validation. Please take this into consideration when / if changing this method. Please read Kevin\u0027s comments to patchset 23 here: https://review.openstack.org/#/c/200952","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_13fa9141","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"in_reply_to":"ff0f0b1f_5c4f4a92","updated":"2017-05-29 15:03:52.000000000","message":"Thank you. I got it. I guess that \"label\" is better. I changed the valiable name but I hesitated to change Error messages(\"Name ...\") because it\u0027s not confused for me and basically I\u0027m afraid to change existing code which can be observed from users.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b682b1cb474e1ce732401d1ef8dc5fe5ec66f99c","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_096bf9b6","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"in_reply_to":"ff0f0b1f_5daa24d2","updated":"2017-05-23 13:37:54.000000000","message":"I don\u0027t understand. Do you mean the variable names(name and names) doesn\u0027t suit splited name of FQDN?","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"46ba1b131beea4f6dc0c56ffc33e72493061490c","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the %(maxlen)s character FQDN \""},{"line_number":1028,"context_line":"                  \"limit\") % {\u0027trimmed\u0027: trimmed, \u0027maxlen\u0027: max_len})"},{"line_number":1029,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_5c4f4a92","line":1030,"range":{"start_line":1030,"start_character":12,"end_line":1030,"end_character":16},"in_reply_to":"ff0f0b1f_ea565a2a","updated":"2017-05-24 06:30:17.000000000","message":"Thanks Miguel for following up my comments. Yes, according to RFC1034, each part delimited by a period is called as \"component\".\n\nThe other reason that I prefer to \u0027component\u0027 over \u0027name\u0027 is because we use \u0027name\u0027 as dns_name too, so there are two different \u0027name\u0027(s). It is something like:\n\n   names \u003d dns_name.split(\u0027.\u0027)\n\nI don\u0027t want to change the logic itself. I believe it is beyond the scope of API rehoming. I just would like to clean up the code.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"},{"line_number":1034,"context_line":"                raise TypeError("},{"line_number":1035,"context_line":"                    _(\"Name \u0027%s\u0027 must not start or end with a hyphen.\") % name)"},{"line_number":1036,"context_line":"            if not re.match(constants.DNS_LABEL_REGEX, name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_0255671d","line":1033,"range":{"start_line":1033,"start_character":37,"end_line":1033,"end_character":51},"updated":"2017-05-19 10:59:31.000000000","message":"name.startswith(\u0027-\u0027) looks better for consistency.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"        for name in names:"},{"line_number":1031,"context_line":"            if not name:"},{"line_number":1032,"context_line":"                raise TypeError(_(\"Encountered an empty component.\"))"},{"line_number":1033,"context_line":"            if name.endswith(\u0027-\u0027) or name[0] \u003d\u003d \u0027-\u0027:"},{"line_number":1034,"context_line":"                raise TypeError("},{"line_number":1035,"context_line":"                    _(\"Name \u0027%s\u0027 must not start or end with a hyphen.\") % name)"},{"line_number":1036,"context_line":"            if not re.match(constants.DNS_LABEL_REGEX, name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_332eb5a5","line":1033,"range":{"start_line":1033,"start_character":37,"end_line":1033,"end_character":51},"in_reply_to":"ff0f0b1f_0255671d","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"            if not re.match(constants.DNS_LABEL_REGEX, name):"},{"line_number":1037,"context_line":"                raise TypeError("},{"line_number":1038,"context_line":"                    _(\"Name \u0027%s\u0027 must be 1-63 characters long, each of \""},{"line_number":1039,"context_line":"                      \"which can only be alphanumeric or a hyphen.\") % name)"},{"line_number":1040,"context_line":"        # RFC 1123 hints that a TLD can\u0027t be all numeric. last is a TLD if"},{"line_number":1041,"context_line":"        # it\u0027s an FQDN."},{"line_number":1042,"context_line":"        if len(names) \u003e 1 and re.match(\"^[0-9]+$\", names[-1]):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_5de22403","line":1039,"range":{"start_line":1039,"start_character":65,"end_line":1039,"end_character":66},"updated":"2017-05-19 10:59:31.000000000","message":"Some exception messages end with a period but some do not. Looks inconsistent.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"            if not re.match(constants.DNS_LABEL_REGEX, name):"},{"line_number":1037,"context_line":"                raise TypeError("},{"line_number":1038,"context_line":"                    _(\"Name \u0027%s\u0027 must be 1-63 characters long, each of \""},{"line_number":1039,"context_line":"                      \"which can only be alphanumeric or a hyphen.\") % name)"},{"line_number":1040,"context_line":"        # RFC 1123 hints that a TLD can\u0027t be all numeric. last is a TLD if"},{"line_number":1041,"context_line":"        # it\u0027s an FQDN."},{"line_number":1042,"context_line":"        if len(names) \u003e 1 and re.match(\"^[0-9]+$\", names[-1]):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_d31e596f","line":1039,"range":{"start_line":1039,"start_character":65,"end_line":1039,"end_character":66},"in_reply_to":"ff0f0b1f_5de22403","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"            raise TypeError(_(\"TLD \u0027%s\u0027 must not be all numeric\") % names[-1])"},{"line_number":1044,"context_line":"    except TypeError as e:"},{"line_number":1045,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 not a valid PQDN or FQDN. Reason: %(reason)s\") % {"},{"line_number":1046,"context_line":"            \u0027data\u0027: data, \u0027reason\u0027: str(e)}"},{"line_number":1047,"context_line":"        return msg"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_5d234406","line":1046,"range":{"start_line":1046,"start_character":36,"end_line":1046,"end_character":42},"updated":"2017-05-19 10:59:31.000000000","message":"str() is unnecessary here. %s does a conversion to string and it calls str() (more precisely __str__).","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"            raise TypeError(_(\"TLD \u0027%s\u0027 must not be all numeric\") % names[-1])"},{"line_number":1044,"context_line":"    except TypeError as e:"},{"line_number":1045,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 not a valid PQDN or FQDN. Reason: %(reason)s\") % {"},{"line_number":1046,"context_line":"            \u0027data\u0027: data, \u0027reason\u0027: str(e)}"},{"line_number":1047,"context_line":"        return msg"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_460f252e","line":1046,"range":{"start_line":1046,"start_character":36,"end_line":1046,"end_character":42},"in_reply_to":"ff0f0b1f_5d234406","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return msg"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"def _get_dns_domain():"},{"line_number":1087,"context_line":"    if not cfg.CONF.dns_domain:"},{"line_number":1088,"context_line":"        return \u0027\u0027"},{"line_number":1089,"context_line":"    if cfg.CONF.dns_domain.endswith(\u0027.\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_d8c1a2e6","line":1086,"range":{"start_line":1086,"start_character":4,"end_line":1086,"end_character":19},"updated":"2017-05-19 10:59:31.000000000","message":"How about _get_dns_domain_from_config() or _get_dns_domain_config() ? It is better to use the method name which indicates it returns the config variable.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return msg"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"def _get_dns_domain():"},{"line_number":1087,"context_line":"    if not cfg.CONF.dns_domain:"},{"line_number":1088,"context_line":"        return \u0027\u0027"},{"line_number":1089,"context_line":"    if cfg.CONF.dns_domain.endswith(\u0027.\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_e675199a","line":1086,"range":{"start_line":1086,"start_character":4,"end_line":1086,"end_character":19},"in_reply_to":"ff0f0b1f_d8c1a2e6","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"    return \u0027%s.\u0027 % cfg.CONF.dns_domain"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_18a83a75","line":1094,"range":{"start_line":1094,"start_character":26,"end_line":1094,"end_character":30},"updated":"2017-05-19 10:59:31.000000000","message":"It is better to use \u0027dns_name\u0027 now.\nAs a validator method, \u0027data\u0027 is good but it is better to use more clear names in sub methods.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"    return \u0027%s.\u0027 % cfg.CONF.dns_domain"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_86741d9b","line":1094,"range":{"start_line":1094,"start_character":26,"end_line":1094,"end_character":30},"in_reply_to":"ff0f0b1f_18a83a75","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"},{"line_number":1098,"context_line":"    return \u0027\u0027"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_f8d34637","line":1098,"range":{"start_line":1096,"start_character":4,"end_line":1098,"end_character":13},"updated":"2017-05-19 10:59:31.000000000","message":"Does this mean we don\u0027t need to validate dns_name if CONF.dns_domain  is the default value \u0027openstacklocal\u0027? Is it based on the assumption that dns_name is not used for such case?","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"},{"line_number":1098,"context_line":"    return \u0027\u0027"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_266311df","line":1098,"range":{"start_line":1096,"start_character":4,"end_line":1098,"end_character":13},"in_reply_to":"ff0f0b1f_5ce06acd","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"46ba1b131beea4f6dc0c56ffc33e72493061490c","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"},{"line_number":1098,"context_line":"    return \u0027\u0027"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_5ce06acd","line":1098,"range":{"start_line":1096,"start_character":4,"end_line":1098,"end_character":13},"in_reply_to":"ff0f0b1f_6a3eca8b","updated":"2017-05-24 06:30:17.000000000","message":"Thanks Miguel. It makes sense. Some inline comment would be nice.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e74aad43212f3adbcf364fed80e8d86b0c272080","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"},{"line_number":1098,"context_line":"    return \u0027\u0027"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_6a3eca8b","line":1098,"range":{"start_line":1096,"start_character":4,"end_line":1098,"end_character":13},"in_reply_to":"ff0f0b1f_89638942","updated":"2017-05-23 21:18:42.000000000","message":"Yes, if CONF.dns_domain is the default value \u0027openstacklocal\u0027, we don\u0027t let the user to assign dns_name to ports","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b682b1cb474e1ce732401d1ef8dc5fe5ec66f99c","unresolved":false,"context_lines":[{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"def _get_request_dns_name(data):"},{"line_number":1095,"context_line":"    dns_domain \u003d _get_dns_domain()"},{"line_number":1096,"context_line":"    if (dns_domain and dns_domain !\u003d constants.DNS_DOMAIN_DEFAULT):"},{"line_number":1097,"context_line":"        return data"},{"line_number":1098,"context_line":"    return \u0027\u0027"},{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_89638942","line":1098,"range":{"start_line":1096,"start_character":4,"end_line":1098,"end_character":13},"in_reply_to":"ff0f0b1f_f8d34637","updated":"2017-05-23 13:37:54.000000000","message":"It looks like your comment although I\u0027m not sure. I\u0027d like to ask Miguel.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"},{"line_number":1102,"context_line":"    \"\"\"Validate dns name."},{"line_number":1103,"context_line":""},{"line_number":1104,"context_line":"    This method validates dns name and also needs to have dns_domain in config"},{"line_number":1105,"context_line":"    because this may call a method which uses the config."}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_bdd140d0","line":1102,"range":{"start_line":1102,"start_character":16,"end_line":1102,"end_character":19},"updated":"2017-05-19 10:59:31.000000000","message":"DNS is preferred","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1099,"context_line":""},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"def validate_dns_name(data, max_len\u003ddb_constants.FQDN_FIELD_SIZE):"},{"line_number":1102,"context_line":"    \"\"\"Validate dns name."},{"line_number":1103,"context_line":""},{"line_number":1104,"context_line":"    This method validates dns name and also needs to have dns_domain in config"},{"line_number":1105,"context_line":"    because this may call a method which uses the config."}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_66aea9e8","line":1102,"range":{"start_line":1102,"start_character":16,"end_line":1102,"end_character":19},"in_reply_to":"ff0f0b1f_bdd140d0","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"    :returns: None if data is valid, otherwise a human readable message"},{"line_number":1159,"context_line":"    indicating why validation failed."},{"line_number":1160,"context_line":"    \"\"\""},{"line_number":1161,"context_line":"    msg \u003d validate_string(data)"},{"line_number":1162,"context_line":"    if msg:"},{"line_number":1163,"context_line":"        return msg"},{"line_number":1164,"context_line":"    if not data:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_825f3771","line":1161,"range":{"start_line":1161,"start_character":25,"end_line":1161,"end_character":31},"updated":"2017-05-19 10:59:31.000000000","message":"Isn\u0027t it better to pass max_len here?","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"    :returns: None if data is valid, otherwise a human readable message"},{"line_number":1159,"context_line":"    indicating why validation failed."},{"line_number":1160,"context_line":"    \"\"\""},{"line_number":1161,"context_line":"    msg \u003d validate_string(data)"},{"line_number":1162,"context_line":"    if msg:"},{"line_number":1163,"context_line":"        return msg"},{"line_number":1164,"context_line":"    if not data:"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_c66455bc","line":1161,"range":{"start_line":1161,"start_character":25,"end_line":1161,"end_character":31},"in_reply_to":"ff0f0b1f_825f3771","updated":"2017-05-29 15:03:52.000000000","message":"I think that DNS specific message is better, that is \"XXX exceeds the 255 character FQDN limit\" although the difference is very small.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    if msg:"},{"line_number":1171,"context_line":"        return msg"},{"line_number":1172,"context_line":"    length \u003d len(data)"},{"line_number":1173,"context_line":"    if length \u003e max_len - 2:"},{"line_number":1174,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 contains \u0027%(length)s\u0027 characters. Adding a \""},{"line_number":1175,"context_line":"                \"sub-domain will cause it to exceed the maximum length of a \""},{"line_number":1176,"context_line":"                \"FQDN of \u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_7d25e8c1","line":1173,"range":{"start_line":1173,"start_character":3,"end_line":1173,"end_character":28},"updated":"2017-05-19 10:59:31.000000000","message":"How about moving this to before L.1666.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aeff52976010612a7048519d68dec5c5b301a79d","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    if msg:"},{"line_number":1171,"context_line":"        return msg"},{"line_number":1172,"context_line":"    length \u003d len(data)"},{"line_number":1173,"context_line":"    if length \u003e max_len - 2:"},{"line_number":1174,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 contains \u0027%(length)s\u0027 characters. Adding a \""},{"line_number":1175,"context_line":"                \"sub-domain will cause it to exceed the maximum length of a \""},{"line_number":1176,"context_line":"                \"FQDN of \u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_bf516411","line":1173,"range":{"start_line":1173,"start_character":3,"end_line":1173,"end_character":28},"in_reply_to":"df140735_86af7d93","updated":"2017-05-29 16:22:54.000000000","message":"Yes, what I\u0027d mean is L.1166.\n\nAt first, I wondered it is better to do a simple check like length check first and then complex checks like _validate_dns_format().\nHowever, on a second thought, all valid input should pass all validations, so the cost of the validation does not change and the clearness of the logic is more important. I am fine to keep your code.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    if msg:"},{"line_number":1171,"context_line":"        return msg"},{"line_number":1172,"context_line":"    length \u003d len(data)"},{"line_number":1173,"context_line":"    if length \u003e max_len - 2:"},{"line_number":1174,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 contains \u0027%(length)s\u0027 characters. Adding a \""},{"line_number":1175,"context_line":"                \"sub-domain will cause it to exceed the maximum length of a \""},{"line_number":1176,"context_line":"                \"FQDN of \u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_86af7d93","line":1173,"range":{"start_line":1173,"start_character":3,"end_line":1173,"end_character":28},"in_reply_to":"ff0f0b1f_7d25e8c1","updated":"2017-05-29 15:03:52.000000000","message":"You mean L1166? Even if so, I guess that this check shoud be done after L1025.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        return msg"},{"line_number":1172,"context_line":"    length \u003d len(data)"},{"line_number":1173,"context_line":"    if length \u003e max_len - 2:"},{"line_number":1174,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 contains \u0027%(length)s\u0027 characters. Adding a \""},{"line_number":1175,"context_line":"                \"sub-domain will cause it to exceed the maximum length of a \""},{"line_number":1176,"context_line":"                \"FQDN of \u0027%(max_len)s\u0027\") % {\"data\": data,"},{"line_number":1177,"context_line":"                                            \"length\": length,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_bd6dc005","line":1174,"range":{"start_line":1174,"start_character":37,"end_line":1174,"end_character":49},"updated":"2017-05-19 10:59:31.000000000","message":"I don\u0027t think you need to quote a number. For example, \"100 characters\" is okay to me.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        return msg"},{"line_number":1172,"context_line":"    length \u003d len(data)"},{"line_number":1173,"context_line":"    if length \u003e max_len - 2:"},{"line_number":1174,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 contains \u0027%(length)s\u0027 characters. Adding a \""},{"line_number":1175,"context_line":"                \"sub-domain will cause it to exceed the maximum length of a \""},{"line_number":1176,"context_line":"                \"FQDN of \u0027%(max_len)s\u0027\") % {\"data\": data,"},{"line_number":1177,"context_line":"                                            \"length\": length,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_269e7163","line":1174,"range":{"start_line":1174,"start_character":37,"end_line":1174,"end_character":49},"in_reply_to":"ff0f0b1f_bd6dc005","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"              \u0027type:list_of_unique_strings\u0027: validate_list_of_unique_strings,"},{"line_number":1220,"context_line":"              \u0027type:list_of_any_key_specs_or_none\u0027:"},{"line_number":1221,"context_line":"                  validate_any_key_specs_or_none,"},{"line_number":1222,"context_line":"              \u0027type:dns_host_name\u0027: validate_dns_name,"},{"line_number":1223,"context_line":"              \u0027type:fip_dns_host_name\u0027: validate_fip_dns_name,"},{"line_number":1224,"context_line":"              \u0027type:dns_domain_name\u0027: validate_dns_domain}"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def _to_validation_type(validation_type):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_f8f0e669","line":1224,"range":{"start_line":1222,"start_character":14,"end_line":1224,"end_character":57},"updated":"2017-05-19 10:59:31.000000000","message":"I am afraid these validators are too specific to DNS. At now, we have all validators in this module, but in my understanding it is intended to have generic validators. I wonder it is better to have these validators in the API definition module. There may be various opinions but I believe it is worth discussed.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"46ba1b131beea4f6dc0c56ffc33e72493061490c","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"              \u0027type:list_of_unique_strings\u0027: validate_list_of_unique_strings,"},{"line_number":1220,"context_line":"              \u0027type:list_of_any_key_specs_or_none\u0027:"},{"line_number":1221,"context_line":"                  validate_any_key_specs_or_none,"},{"line_number":1222,"context_line":"              \u0027type:dns_host_name\u0027: validate_dns_name,"},{"line_number":1223,"context_line":"              \u0027type:fip_dns_host_name\u0027: validate_fip_dns_name,"},{"line_number":1224,"context_line":"              \u0027type:dns_domain_name\u0027: validate_dns_domain}"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def _to_validation_type(validation_type):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_1cd0b2c8","line":1224,"range":{"start_line":1222,"start_character":14,"end_line":1224,"end_character":57},"in_reply_to":"ff0f0b1f_0a23cebe","updated":"2017-05-24 06:30:17.000000000","message":"I agree having validators directory is a nice idea. (For more detail, I will comment in [2])\n\nI wonder what \"API definition\" is. Our API definition is some kind of API schema and schema usually defines what kind of parameters are allowed. This is what validators provides. Thus IMHO a validator is one of important part of API definitions, so I think having DNS-specific validators in the API definition.\n\nOn the other hand, I guess boden thinks the API definition *python module* should contain only stuffs which can be tested by the API definition tests. It makes sense too from the code maintenance perspective.\n\nAnyway I am against having these here.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"              \u0027type:list_of_unique_strings\u0027: validate_list_of_unique_strings,"},{"line_number":1220,"context_line":"              \u0027type:list_of_any_key_specs_or_none\u0027:"},{"line_number":1221,"context_line":"                  validate_any_key_specs_or_none,"},{"line_number":1222,"context_line":"              \u0027type:dns_host_name\u0027: validate_dns_name,"},{"line_number":1223,"context_line":"              \u0027type:fip_dns_host_name\u0027: validate_fip_dns_name,"},{"line_number":1224,"context_line":"              \u0027type:dns_domain_name\u0027: validate_dns_domain}"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def _to_validation_type(validation_type):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_46cde55b","line":1224,"range":{"start_line":1222,"start_character":14,"end_line":1224,"end_character":57},"in_reply_to":"ff0f0b1f_1cd0b2c8","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e74aad43212f3adbcf364fed80e8d86b0c272080","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"              \u0027type:list_of_unique_strings\u0027: validate_list_of_unique_strings,"},{"line_number":1220,"context_line":"              \u0027type:list_of_any_key_specs_or_none\u0027:"},{"line_number":1221,"context_line":"                  validate_any_key_specs_or_none,"},{"line_number":1222,"context_line":"              \u0027type:dns_host_name\u0027: validate_dns_name,"},{"line_number":1223,"context_line":"              \u0027type:fip_dns_host_name\u0027: validate_fip_dns_name,"},{"line_number":1224,"context_line":"              \u0027type:dns_domain_name\u0027: validate_dns_domain}"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def _to_validation_type(validation_type):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_0a23cebe","line":1224,"range":{"start_line":1222,"start_character":14,"end_line":1224,"end_character":57},"in_reply_to":"ff0f0b1f_9c985e75","updated":"2017-05-23 21:18:42.000000000","message":"I agree in that these validators are too specific to be here","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b682b1cb474e1ce732401d1ef8dc5fe5ec66f99c","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"              \u0027type:list_of_unique_strings\u0027: validate_list_of_unique_strings,"},{"line_number":1220,"context_line":"              \u0027type:list_of_any_key_specs_or_none\u0027:"},{"line_number":1221,"context_line":"                  validate_any_key_specs_or_none,"},{"line_number":1222,"context_line":"              \u0027type:dns_host_name\u0027: validate_dns_name,"},{"line_number":1223,"context_line":"              \u0027type:fip_dns_host_name\u0027: validate_fip_dns_name,"},{"line_number":1224,"context_line":"              \u0027type:dns_domain_name\u0027: validate_dns_domain}"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"def _to_validation_type(validation_type):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_9c985e75","line":1224,"range":{"start_line":1222,"start_character":14,"end_line":1224,"end_character":57},"in_reply_to":"ff0f0b1f_f8f0e669","updated":"2017-05-23 13:37:54.000000000","message":"I agree with you. The validators are specific so they should be loaded for users only who use dns extension. I originally did so but boden disagree with the implementation[1]. Actually validators are not \"API definition\" so I moved them here.\n\nAnyway, I have another plan[2]. It makes validators directory and we have general validators in __init__.py and then we can add specific validators there. This is reference on exception[3].\n\n[1]: https://review.openstack.org/#/c/459782/3/neutron_lib/api/definitions/dns.py\n[2]: https://review.openstack.org/#/c/467236/\n[3]: https://review.openstack.org/#/c/433239/","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"}],"neutron_lib/constants.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13f0b930aeb0e9b261665bfce5948cdad8efccb6","unresolved":false,"context_lines":[{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"class Sentinel(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_7d4ba82a","line":311,"range":{"start_line":311,"start_character":18,"end_line":311,"end_character":19},"updated":"2017-05-19 10:59:31.000000000","message":"re.match assumes an implicit \u0027^\u0027, but I would like to have \u0027^\u0027 at the beginning to clarify the meaning.\n\n ^[a-z0-9-]{1,63}$\"","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e74aad43212f3adbcf364fed80e8d86b0c272080","unresolved":false,"context_lines":[{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"class Sentinel(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_a59c13c0","line":311,"range":{"start_line":311,"start_character":18,"end_line":311,"end_character":19},"in_reply_to":"ff0f0b1f_7d4ba82a","updated":"2017-05-23 21:18:42.000000000","message":"Same comment here as for https://review.openstack.org/#/c/459782/9/neutron_lib/api/validators.py@1030. This regex forms part of a method given to my by Kevin Benton to perform the validations. Please see comments to patchset 23 here: https://review.openstack.org/#/c/200952","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"46ba1b131beea4f6dc0c56ffc33e72493061490c","unresolved":false,"context_lines":[{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"class Sentinel(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_dc27dac9","line":311,"range":{"start_line":311,"start_character":18,"end_line":311,"end_character":19},"in_reply_to":"ff0f0b1f_a59c13c0","updated":"2017-05-24 06:30:17.000000000","message":"I do not plan to change the logic. Just would like to improve the readability a bit.","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3d75c8f63723ddac3ea49468de142bfc8496d5e2","unresolved":false,"context_lines":[{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"class Sentinel(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_06d7edef","line":311,"range":{"start_line":311,"start_character":18,"end_line":311,"end_character":19},"in_reply_to":"ff0f0b1f_dc27dac9","updated":"2017-05-29 15:03:52.000000000","message":"Done","commit_id":"3e43addcb88a10e85b06d9a3c3ccaa60f2801932"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"7cde8842b29836d29f29d226933dda3985b60dc5","unresolved":false,"context_lines":[{"line_number":305,"context_line":"GRE_ENCAP_OVERHEAD \u003d 22"},{"line_number":306,"context_line":"VXLAN_ENCAP_OVERHEAD \u003d 30"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"^[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_0d72817d","line":308,"updated":"2017-06-06 18:45:08.000000000","message":"What about FQDN_MAX_LEN from the neutron dns extension; shouldn\u0027t that be included as well?","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"bf43fcf9d04ec3efdea33cc8da678a64b7562e96","unresolved":false,"context_lines":[{"line_number":305,"context_line":"GRE_ENCAP_OVERHEAD \u003d 22"},{"line_number":306,"context_line":"VXLAN_ENCAP_OVERHEAD \u003d 30"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"^[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_6b63c543","line":308,"in_reply_to":"df140735_010469c5","updated":"2017-06-13 19:21:17.000000000","message":"got it","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"099eb528bf7a7fefa88426b4c1fc5a077b29acc9","unresolved":false,"context_lines":[{"line_number":305,"context_line":"GRE_ENCAP_OVERHEAD \u003d 22"},{"line_number":306,"context_line":"VXLAN_ENCAP_OVERHEAD \u003d 30"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"^[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_2e709bdc","line":308,"in_reply_to":"df140735_0d72817d","updated":"2017-06-06 20:54:09.000000000","message":"Yeah, it should be moved here","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"207609671d81522b23c104a4c77f62f4b2e07c81","unresolved":false,"context_lines":[{"line_number":305,"context_line":"GRE_ENCAP_OVERHEAD \u003d 22"},{"line_number":306,"context_line":"VXLAN_ENCAP_OVERHEAD \u003d 30"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"^[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_f0eef8b2","line":308,"in_reply_to":"df140735_2e709bdc","updated":"2017-06-07 05:55:07.000000000","message":"Please look at https://review.openstack.org/#/c/416364/","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"478d2b303f449b535bd01aa9d55ceddec43678c3","unresolved":false,"context_lines":[{"line_number":305,"context_line":"GRE_ENCAP_OVERHEAD \u003d 22"},{"line_number":306,"context_line":"VXLAN_ENCAP_OVERHEAD \u003d 30"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"# For DNS extension"},{"line_number":309,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":310,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":311,"context_line":"DNS_LABEL_REGEX \u003d \"^[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_010469c5","line":308,"in_reply_to":"df140735_f0eef8b2","updated":"2017-06-07 15:53:30.000000000","message":"ahhh, I wasn\u0027t aware of that. Thanks for pointing it out","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"}],"neutron_lib/tests/unit/api/definitions/test_dns.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"343df6caf36354c2dcc2099b15b2939463f673ed","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class DnsDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d dns"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027floatingips\u0027,)"},{"line_number":20,"context_line":"    extension_attributes \u003d (dns.DNSNAME, dns.DNSDOMAIN, dns.DNSASSIGNMENT,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_9227f7ca","line":19,"updated":"2017-04-30 03:08:22.000000000","message":"networks and ports should be added here","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f562c4d1c1d40b5c33f0d2aaeb4cfbbed1a9dcfb","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class DnsDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d dns"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027floatingips\u0027,)"},{"line_number":20,"context_line":"    extension_attributes \u003d (dns.DNSNAME, dns.DNSDOMAIN, dns.DNSASSIGNMENT,)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_76eb1f12","line":19,"in_reply_to":"5ff73747_9227f7ca","updated":"2017-05-02 07:16:47.000000000","message":"They are unnecessary here because \"networks\" and \"ports\" are not extension.","commit_id":"c5e53bb46241a8ca8e45f1f80de0c6387df8e8e9"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c44e8f4dc6c5e65a859cc2cd31014feacb57a2e7","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class DnsDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d dns"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027floatingips\u0027,)"},{"line_number":20,"context_line":"    extension_attributes \u003d (dns.DNSNAME, dns.DNSDOMAIN, dns.DNSASSIGNMENT,)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_794f63bd","line":19,"range":{"start_line":19,"start_character":28,"end_line":19,"end_character":39},"updated":"2017-05-15 17:16:20.000000000","message":"Can\u0027t we use neutron_lib.api.definitions.l3.FLOATINGIPS?","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1688cd24eb8c3d5921c5f283e925155e368d8818","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class DnsDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d dns"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027floatingips\u0027,)"},{"line_number":20,"context_line":"    extension_attributes \u003d (dns.DNSNAME, dns.DNSDOMAIN, dns.DNSASSIGNMENT,)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_8532b8f0","line":19,"range":{"start_line":19,"start_character":28,"end_line":19,"end_character":39},"in_reply_to":"1f013ff3_794f63bd","updated":"2017-05-16 04:08:58.000000000","message":"Done","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"98d6551431c9f4bb82a0e3ae81dccecb8c3d73d7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_0ea2edfd","line":29,"updated":"2017-06-15 02:30:48.000000000","message":"It seems to me like these validators are part of the API contract. Can\u0027t we have logic that adds them immediately when the definition is imported?","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"aa2c36bb9805b0b2db9f1b6499dbc90b4b5d343d","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_72ae552f","line":29,"updated":"2017-05-30 12:02:54.000000000","message":"why do we need to add DNS-specific validators in our tests?\n\nThese validators need to be registered in the regular usage, so who should be responsible to add them?","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"df7028540bbba6b67c9f0def2bcc5e9162e071e3","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_df749338","line":29,"in_reply_to":"7f231b9d_0ea2edfd","updated":"2017-06-15 14:30:44.000000000","message":"I am in the same page as Kevin. This is the initial motivation of my comment. It is a bit tricky if the API definition requires validators when it is imported but the validators are not registered yet.","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"db55992feb36af7d2e49dc9936469b096ebec60e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_13a1d194","line":29,"in_reply_to":"7f231b9d_df749338","updated":"2017-06-16 04:16:35.000000000","message":"I\u0027m OK. I pushed new version, which definition includes validator register so they are registered when the definition is imported.","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"bf43fcf9d04ec3efdea33cc8da678a64b7562e96","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_36ebf479","line":29,"in_reply_to":"df140735_4c0cf23a","updated":"2017-06-13 19:21:17.000000000","message":"Well technically we will change the implementation; once this lands and is released we\u0027ll consume it in neutron and likely reduce the extension in neutron to nothing but a stub like [1].\n\n\nSo IMHO the question becomes who\u0027s responsible for adding extension API validator(s)? Today we do it where the API is defined in the neutron.extensions.dns.py as you pointed out, but now the API def will live in neutron-lib. So if some other consumer wanted to use these validators, to be safe they\u0027d have to check if the validator(s) were already added (adding an existing raises) and if not add them... \n\nThat said to me it seems easier and more convenient to just add the validator automatically in lib. This way any consumer (neutron or other) can use it by specifying the type and there\u0027s no need to worry about if the validator has already been registered or not.\n\n\nPerhaps we should ask someone like Kevin to weigh-in?\n\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/extensions/extra_dhcp_opt.py","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c9a9aa5c03e8fe04993862f21cacb67eeb9553a1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_c3f67090","line":29,"in_reply_to":"df140735_72ae552f","updated":"2017-05-30 14:03:49.000000000","message":"Because base unit test checks validators[1]. Of cource, I can change the check itself not adding add_validators here.\n\n[1]: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/tests/unit/api/definitions/base.py#L50","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"7cde8842b29836d29f29d226933dda3985b60dc5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_cdbda903","line":29,"in_reply_to":"df140735_c3f67090","updated":"2017-06-06 18:45:08.000000000","message":"So now if consumers want to use these validation types, they need to first check to see if the validator(s) are registered and if not add the validators themselves? Today this is done right in the neutron dns extension, so it\u0027s not clear to me how the validators get added now.\n\n\nFrom a consumer POV, it seems to me they should be added automatically. If not IMO we need to update our dev-ref or doc strings to reflect how we expect consumers to use them.","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"207609671d81522b23c104a4c77f62f4b2e07c81","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    validators.add_validator(\u0027fip_dns_host_name\u0027,"},{"line_number":27,"context_line":"                             dns_validator.validate_fip_dns_name)"},{"line_number":28,"context_line":"    validators.add_validator(\u0027dns_domain_name\u0027,"},{"line_number":29,"context_line":"                             dns_validator.validate_dns_domain)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_4c0cf23a","line":29,"in_reply_to":"df140735_cdbda903","updated":"2017-06-07 05:55:07.000000000","message":"These validators are registered in dns extension[1]. I don\u0027t intend to change the implementation. I\u0027ll change the extension as the following.\n\n from neutron_lib.api.validators import dns as dns_validator\n\n validators.add_validator(\u0027dns_host_name\u0027, dns_validator.validate_dns_name)\n validators.add_validator(\u0027fip_dns_host_name\u0027, dns_validator.validate_fip_dns_name)\n validators.add_validator(\u0027dns_domain_name\u0027, dns_validator.validate_dns_domain)\n\nSo consumers can use them as before.\n\n[1]: https://github.com/openstack/neutron/blob/master/neutron/extensions/dns.py#L200-L202","commit_id":"a353b3b9f2eb143a7c28e303841a246d5e77ed18"}],"neutron_lib/tests/unit/api/test_validators.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"624bb327987c6c858bb7ebed3108b7f8af964e92","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3f044301_6588fc70","updated":"2017-05-03 21:19:11.000000000","message":"What about UTs for all the new validators that were added in this patch?","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f88baa4e02b9aeed6b21ff330cc851bb02c8c8ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3f044301_5daaec70","in_reply_to":"3f044301_6588fc70","updated":"2017-05-10 14:57:48.000000000","message":"I\u0027ll do","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"}],"releasenotes/notes/dns-api-def-bc24a58f56c5fbfb.yaml":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"624bb327987c6c858bb7ebed3108b7f8af964e92","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The ``DNS Integration`` extension API definition has been added as"},{"line_number":4,"context_line":"    ``neutron_lib.api.definitions.dns``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3f044301_45f2a008","line":3,"updated":"2017-05-03 21:19:11.000000000","message":"It would probably be worth also noting the new public facing validators.","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f88baa4e02b9aeed6b21ff330cc851bb02c8c8ea","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The ``DNS Integration`` extension API definition has been added as"},{"line_number":4,"context_line":"    ``neutron_lib.api.definitions.dns``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3f044301_1dba24c0","line":3,"in_reply_to":"3f044301_45f2a008","updated":"2017-05-10 14:57:48.000000000","message":"Done","commit_id":"5af775cce5de7c2f9743672bc76c72ce4dc44b16"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"c44e8f4dc6c5e65a859cc2cd31014feacb57a2e7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - The ``DNS Integration`` extension API definition has been added as"},{"line_number":4,"context_line":"    ``neutron_lib.api.definitions.dns``."},{"line_number":5,"context_line":"  - The ``validate_dns_name``, ``validate_fip_dns_name``, and"},{"line_number":6,"context_line":"    ``validate_dns_domain`` validators have been added in validators of"},{"line_number":7,"context_line":"    neutron-lib."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"1f013ff3_d9bc376b","line":7,"range":{"start_line":6,"start_character":27,"end_line":7,"end_character":15},"updated":"2017-05-15 17:16:20.000000000","message":"What about something like: \"are now available as neutron-lib validators\"","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"1688cd24eb8c3d5921c5f283e925155e368d8818","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - The ``DNS Integration`` extension API definition has been added as"},{"line_number":4,"context_line":"    ``neutron_lib.api.definitions.dns``."},{"line_number":5,"context_line":"  - The ``validate_dns_name``, ``validate_fip_dns_name``, and"},{"line_number":6,"context_line":"    ``validate_dns_domain`` validators have been added in validators of"},{"line_number":7,"context_line":"    neutron-lib."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"1f013ff3_257084a5","line":7,"range":{"start_line":6,"start_character":27,"end_line":7,"end_character":15},"in_reply_to":"1f013ff3_d9bc376b","updated":"2017-05-16 04:08:58.000000000","message":"Done","commit_id":"f43b69fe63a70eab4847bea3643c82e4a352008f"}]}
