)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a566e9da0bd3a48abc33b50e63ac07db152d361d","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Depends-On: I8b8ddf2a9cc4d2f18c4b32917630c2a26ee0d713"},{"line_number":13,"context_line":"Depends-On: I9fc39c5adcf136fce520c329f48cbad60cd21861"},{"line_number":14,"context_line":"Depends-On: I57504f97ac39b5b7d301fd5cc88228a121f0677e"},{"line_number":15,"context_line":"Depends-On: Ib8c27159568db40028175e9fed701189eb5d2e15"},{"line_number":16,"context_line":"Depends-On: I0b3a2d80f4b0f6e49048f8bf0ba9349b7512877f"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a74a57a_38026f70","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":53},"updated":"2016-11-30 01:47:45.000000000","message":"this is supposed to be Needed-by, as the dependency is reverse.","commit_id":"19404d8862425d8225ee29b4fb71165748a6f578"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fcd95848e0fa01ac927d9c0d6ff105506152c664","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Depends-On: I9fc39c5adcf136fce520c329f48cbad60cd21861"},{"line_number":14,"context_line":"Depends-On: Ib8c27159568db40028175e9fed701189eb5d2e15"},{"line_number":15,"context_line":"Depends-On: I0b3a2d80f4b0f6e49048f8bf0ba9349b7512877f"},{"line_number":16,"context_line":"Depends-On: I8dcf49adc7754d0c9aa0479ede2de481325bb3e3"},{"line_number":17,"context_line":"Needed-By: I57504f97ac39b5b7d301fd5cc88228a121f0677e"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I7b4108772e8370e8f51971caf40ecd23e9f977e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a71b18c_81db397b","line":16,"updated":"2016-12-07 03:10:23.000000000","message":"please don\u0027t use Depends-on for changes in the same repo, use rebase instead.","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e53c06a188373de6ed9c57c9d80529331746c8e5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Depends-On: I9fc39c5adcf136fce520c329f48cbad60cd21861"},{"line_number":14,"context_line":"Depends-On: Ib8c27159568db40028175e9fed701189eb5d2e15"},{"line_number":15,"context_line":"Depends-On: I0b3a2d80f4b0f6e49048f8bf0ba9349b7512877f"},{"line_number":16,"context_line":"Depends-On: I8dcf49adc7754d0c9aa0479ede2de481325bb3e3"},{"line_number":17,"context_line":"Needed-By: I57504f97ac39b5b7d301fd5cc88228a121f0677e"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I7b4108772e8370e8f51971caf40ecd23e9f977e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1a6eadb0_bde63ab2","line":16,"in_reply_to":"3a71b18c_81db397b","updated":"2016-12-13 22:09:00.000000000","message":"Done","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"}],"neutron_lib/api/converters.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"58db21a26b74f315c67a58c7de2860f4f0e66405","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    if data is None:"},{"line_number":189,"context_line":"        return"},{"line_number":190,"context_line":"    else:"},{"line_number":191,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_00ea19db","line":191,"updated":"2016-12-05 14:15:01.000000000","message":"If data isn\u0027t a str, then this will raise. Not sure if its worth mentioning that in the docstring.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e465914c09c8f91801f7867adb6f6b34c2e88c57","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    if data is None:"},{"line_number":189,"context_line":"        return"},{"line_number":190,"context_line":"    else:"},{"line_number":191,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_5d122b58","line":191,"in_reply_to":"3a71b18c_00ea19db","updated":"2016-12-05 18:24:19.000000000","message":"Noted.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return [data]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def convert_to_string(data):"},{"line_number":168,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    :param data: The value to convert."},{"line_number":171,"context_line":"    :return: The string representation of the value, or None is \u0027data\u0027 is None."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":"    if data is None:"},{"line_number":174,"context_line":"        return"},{"line_number":175,"context_line":"    else:"},{"line_number":176,"context_line":"        return str(data)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def convert_string_to_case_insensitive(data):"},{"line_number":180,"context_line":"    \"\"\"Convert a string value into a lower case string."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This effectively makes the string case-insensitive."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    :param data: The value to convert."},{"line_number":185,"context_line":"    :return: The lower-cased string representation of the value, or None is"},{"line_number":186,"context_line":"    \u0027data\u0027 is None."},{"line_number":187,"context_line":"    :raises AttributeError: If the value is not a string."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if data is None:"},{"line_number":190,"context_line":"        return"},{"line_number":191,"context_line":"    else:"},{"line_number":192,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_74b1b246","line":192,"range":{"start_line":167,"start_character":0,"end_line":192,"end_character":27},"updated":"2016-12-06 01:57:52.000000000","message":"you don\u0027t need to contribute validators to neutron-lib at all costs. They could stay in fwaas and you can add them to the validator map using [1].\nBesides, where are these coming from? I don\u0027t see them anywhere.\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/validators.py#L936","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1707ba8ccaeddf270069bf6b94db66d375d3b11e","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return [data]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def convert_to_string(data):"},{"line_number":168,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    :param data: The value to convert."},{"line_number":171,"context_line":"    :return: The string representation of the value, or None is \u0027data\u0027 is None."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":"    if data is None:"},{"line_number":174,"context_line":"        return"},{"line_number":175,"context_line":"    else:"},{"line_number":176,"context_line":"        return str(data)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def convert_string_to_case_insensitive(data):"},{"line_number":180,"context_line":"    \"\"\"Convert a string value into a lower case string."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This effectively makes the string case-insensitive."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    :param data: The value to convert."},{"line_number":185,"context_line":"    :return: The lower-cased string representation of the value, or None is"},{"line_number":186,"context_line":"    \u0027data\u0027 is None."},{"line_number":187,"context_line":"    :raises AttributeError: If the value is not a string."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if data is None:"},{"line_number":190,"context_line":"        return"},{"line_number":191,"context_line":"    else:"},{"line_number":192,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_c1dff1d3","line":192,"range":{"start_line":167,"start_character":0,"end_line":192,"end_character":27},"in_reply_to":"3a71b18c_4b46a27b","updated":"2016-12-07 03:14:43.000000000","message":"Your question makes me realize that in reality converters/validators are an integral part of the API definition. We can really defer their initialization. In fact they are used by the tests themselves, and as such must be available. Discard my previous suggestion. Having said that, I think we should assess your new additions on their own merit to see if we either have other overlapping validators or we can make them free of fwaas specifics so that they can be more widely reused.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ac2b820e2194bb061623826dc55c9377f2bda38e","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return [data]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def convert_to_string(data):"},{"line_number":168,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    :param data: The value to convert."},{"line_number":171,"context_line":"    :return: The string representation of the value, or None is \u0027data\u0027 is None."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":"    if data is None:"},{"line_number":174,"context_line":"        return"},{"line_number":175,"context_line":"    else:"},{"line_number":176,"context_line":"        return str(data)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def convert_string_to_case_insensitive(data):"},{"line_number":180,"context_line":"    \"\"\"Convert a string value into a lower case string."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This effectively makes the string case-insensitive."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    :param data: The value to convert."},{"line_number":185,"context_line":"    :return: The lower-cased string representation of the value, or None is"},{"line_number":186,"context_line":"    \u0027data\u0027 is None."},{"line_number":187,"context_line":"    :raises AttributeError: If the value is not a string."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if data is None:"},{"line_number":190,"context_line":"        return"},{"line_number":191,"context_line":"    else:"},{"line_number":192,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_c67b87bc","line":192,"range":{"start_line":167,"start_character":0,"end_line":192,"end_character":27},"in_reply_to":"3a71b18c_4b46a27b","updated":"2016-12-07 02:49:56.000000000","message":"gotcha.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        return [data]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def convert_to_string(data):"},{"line_number":168,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    :param data: The value to convert."},{"line_number":171,"context_line":"    :return: The string representation of the value, or None is \u0027data\u0027 is None."},{"line_number":172,"context_line":"    \"\"\""},{"line_number":173,"context_line":"    if data is None:"},{"line_number":174,"context_line":"        return"},{"line_number":175,"context_line":"    else:"},{"line_number":176,"context_line":"        return str(data)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def convert_string_to_case_insensitive(data):"},{"line_number":180,"context_line":"    \"\"\"Convert a string value into a lower case string."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This effectively makes the string case-insensitive."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    :param data: The value to convert."},{"line_number":185,"context_line":"    :return: The lower-cased string representation of the value, or None is"},{"line_number":186,"context_line":"    \u0027data\u0027 is None."},{"line_number":187,"context_line":"    :raises AttributeError: If the value is not a string."},{"line_number":188,"context_line":"    \"\"\""},{"line_number":189,"context_line":"    if data is None:"},{"line_number":190,"context_line":"        return"},{"line_number":191,"context_line":"    else:"},{"line_number":192,"context_line":"        return data.lower()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_4b46a27b","line":192,"range":{"start_line":167,"start_character":0,"end_line":192,"end_character":27},"in_reply_to":"3a71b18c_74b1b246","updated":"2016-12-07 02:36:23.000000000","message":"If I use add_validator() to add a validator, then do I just omit the validated field from RESOURCE_ATTRIBUTE_MAP?  For example, do I omit \u0027convert_to\u0027 entirely at https://review.openstack.org/#/c/389388/8/neutron_lib/api/definitions/firewall_v2.py@74\n\nThe convert_string_to_case_insensitive() function comes from convert_action_to_case_insensitive() - I tried to make it a more generally applicable converter should someone want to do something similar.  The original is here: http://git.openstack.org/cgit/openstack/neutron-fwaas/tree/neutron_fwaas/extensions/firewall.py#n195\n\nSimilarly, convert_to_string is a more generalized version of convert_port_to_string() http://git.openstack.org/cgit/openstack/neutron-fwaas/tree/neutron_fwaas/extensions/firewall.py#n202","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fcd95848e0fa01ac927d9c0d6ff105506152c664","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return value"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def convert_to_string(data):"},{"line_number":188,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    :param data: The value to convert."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_41ada199","line":187,"updated":"2016-12-07 03:10:23.000000000","message":"my suggestion is to extract the introduction of converters and/or validators into a base patch so that they can undergo a wider scrutiny. I believe I am mainly the only one looking at these stadium-related patches.","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e53c06a188373de6ed9c57c9d80529331746c8e5","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    return value"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"def convert_to_string(data):"},{"line_number":188,"context_line":"    \"\"\"Convert a value into a string."},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    :param data: The value to convert."}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_5dec468f","line":187,"in_reply_to":"3a71b18c_41ada199","updated":"2016-12-13 22:09:00.000000000","message":"These have been extracted.","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"}],"neutron_lib/api/definitions/constants.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b477b830c132d0ec6769a0fba6b6a7a7d34bb016","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 Big Switch Networks, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_f4911448","line":1,"updated":"2017-01-06 23:02:08.000000000","message":"Nit: is this copyright still correct?","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"273b466b23be3d70b719cd5632ef6342cb5a8212","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"# neutron-fwaas constants"},{"line_number":15,"context_line":"FWAAS_ALLOW \u003d \"allow\""},{"line_number":16,"context_line":"FWAAS_DENY \u003d \"deny\""},{"line_number":17,"context_line":"FWAAS_REJECT \u003d \"reject\""},{"line_number":18,"context_line":"FW_VALID_ACTION_VALUES \u003d [FWAAS_ALLOW, FWAAS_DENY, FWAAS_REJECT]"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_005b44f7","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":23},"updated":"2017-01-10 18:10:19.000000000","message":"I wonder if these would ever be used by other non-FWAAS definitions? If so maybe we should consider dropping the leading \"FWAAS_\" part.","commit_id":"b8630be9dc70f5ff28aa733851dd769fa7ccffce"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f2aad8e56d81156f6932fb3dcd535d8a1748b270","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"#    under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"# neutron-fwaas constants"},{"line_number":15,"context_line":"FWAAS_ALLOW \u003d \"allow\""},{"line_number":16,"context_line":"FWAAS_DENY \u003d \"deny\""},{"line_number":17,"context_line":"FWAAS_REJECT \u003d \"reject\""}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_a805b611","line":14,"updated":"2017-01-12 00:08:15.000000000","message":"I am not in love with this module. I worry it becomes a huge pile of incoherent stuff :P","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"}],"neutron_lib/api/definitions/firewall.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"58db21a26b74f315c67a58c7de2860f4f0e66405","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_a0a8858e","updated":"2016-12-05 14:15:01.000000000","message":"Don\u0027t we need the ALIAS, NAME, etc. defined in here like we do for others like: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/trunk.py","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e465914c09c8f91801f7867adb6f6b34c2e88c57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_9d184377","in_reply_to":"3a71b18c_a0a8858e","updated":"2016-12-05 18:24:19.000000000","message":"Done.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":33,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"# The name of the extension."},{"line_number":36,"context_line":"NAME \u003d \u0027FWaaS v1\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# The description of the extension."},{"line_number":39,"context_line":"DESCRIPTION \u003d \"Provides support for firewall-as-a-service version 1\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_d48b6666","line":36,"updated":"2016-12-06 01:57:52.000000000","message":"is there any timeframe in which the team intends to deprecate fw v1?","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"# The name of the extension."},{"line_number":36,"context_line":"NAME \u003d \u0027FWaaS v1\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"# The description of the extension."},{"line_number":39,"context_line":"DESCRIPTION \u003d \"Provides support for firewall-as-a-service version 1\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_0bc2eae8","line":36,"in_reply_to":"3a71b18c_d48b6666","updated":"2016-12-07 02:36:23.000000000","message":"We have delayed deprecating FWaaS v1 until FWaaS v2 is ready.  The FWaaS v2 effort is targeted to conclude within the Ocata cycle, so we expect to start the deprecation process at the beginning of the Pike cycle.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":42,"context_line":"UPDATED_TIMESTAMP \u003d \"2016-01-01T10:00:00-00:00\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Base for the API calls"},{"line_number":45,"context_line":"FIREWALL_PREFIX \u003d \u0027/fw\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":48,"context_line":"    \u0027firewall_rules\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_14f07efd","line":45,"updated":"2016-12-06 01:57:52.000000000","message":"best to call this API_PREFIX. Eventually I\u0027d like to document all of these in a dummy extension so that users can copy and paste and fill the dots.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"UPDATED_TIMESTAMP \u003d \"2016-01-01T10:00:00-00:00\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Base for the API calls"},{"line_number":45,"context_line":"FIREWALL_PREFIX \u003d \u0027/fw\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":48,"context_line":"    \u0027firewall_rules\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_0b690af9","line":45,"in_reply_to":"3a71b18c_14f07efd","updated":"2016-12-07 02:36:23.000000000","message":"Done.  And thanks for the dummy extension work!","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Base for the API calls"},{"line_number":45,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":48,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":49,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa48f94a_d2e6c4e7","line":46,"updated":"2016-12-21 17:25:59.000000000","message":"As per [1] We should be using RESOURCE_NAME and COLLECTION_NAME. However it\u0027s not clear to me how that works here since this extends multiple collections.\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/_dummy.py","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"# Base for the API calls"},{"line_number":45,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":48,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":49,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_74efeb1d","line":46,"in_reply_to":"fa48f94a_d2e6c4e7","updated":"2017-01-06 18:28:48.000000000","message":"Per your direction, this is waiting on armax\u0027s comments on https://review.openstack.org/394244 to clarify this issue.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    },"},{"line_number":162,"context_line":"}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"# The action map."},{"line_number":165,"context_line":"ACTION_MAP \u003d None"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"# The list of required extensions."},{"line_number":168,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"# The list of optional extensions."},{"line_number":171,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa48f94a_d28164fd","line":171,"range":{"start_line":164,"start_character":0,"end_line":171,"end_character":26},"updated":"2016-12-21 17:25:59.000000000","message":"Nit: these don\u0027t follow the default values as per [1].\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/_dummy.py","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    },"},{"line_number":162,"context_line":"}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"# The action map."},{"line_number":165,"context_line":"ACTION_MAP \u003d None"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"# The list of required extensions."},{"line_number":168,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"# The list of optional extensions."},{"line_number":171,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_74d60b50","line":171,"range":{"start_line":164,"start_character":0,"end_line":171,"end_character":26},"in_reply_to":"fa48f94a_d28164fd","updated":"2017-01-06 18:28:48.000000000","message":"Done","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b477b830c132d0ec6769a0fba6b6a7a7d34bb016","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# Base for the API calls"},{"line_number":46,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":50,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":51,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_74cd2465","line":48,"updated":"2017-01-06 23:02:08.000000000","message":"Should we be using get_resource_attribute_map() instead? Both? I used both on https://review.openstack.org/#/c/404488/6/neutron_lib/api/definitions/bgp.py. Maybe it was the wrong thing to do, but I thought we were trying to avoid used of RESOURCE_ATTRIBUTE_MAP.\n\nSee https://review.openstack.org/#/c/394244/17/neutron_lib/api/definitions/network.py@23","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"a77fb6a35f13c64d2ab945d89af801c9e826d460","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# Base for the API calls"},{"line_number":46,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":50,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":51,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_cb4a7fac","line":48,"in_reply_to":"ba5201f7_74cd2465","updated":"2017-01-09 16:24:52.000000000","message":"If this is the case then we should probably change the \"dummy\" plugin [1] to match the desired pattern, since AFAICT that is a styleguide-by-example for this effort.  I\u0027d appreciate a comment from @HenryG about this, since he made the comment you\u0027re referring to.\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/_dummy.py","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"b6ed26a0ef95bc5b3f9695af4f1fc1fc65eba6e9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# Base for the API calls"},{"line_number":46,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":50,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":51,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_7c36b7e8","line":48,"in_reply_to":"ba5201f7_cb4a7fac","updated":"2017-01-09 16:57:47.000000000","message":"We decided not to go with get_resource_attribute_map() IIRC.","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"273b466b23be3d70b719cd5632ef6342cb5a8212","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    \u0027default\u0027: True, \u0027is_visible\u0027: True,"},{"line_number":100,"context_line":"                    \u0027convert_to\u0027: converters.convert_to_boolean},"},{"line_number":101,"context_line":"    },"},{"line_number":102,"context_line":"    \u0027firewall_policies\u0027: {"},{"line_number":103,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":104,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":105,"context_line":"               \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_20d128fc","line":102,"range":{"start_line":102,"start_character":5,"end_line":102,"end_character":22},"updated":"2017-01-10 18:10:19.000000000","message":"It\u0027s still not clear to me how we handle api-defs that define multiple resources in this map. I just asked Armando about that over here: https://review.openstack.org/#/c/418108/3","commit_id":"b8630be9dc70f5ff28aa733851dd769fa7ccffce"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"18c64004bfdba5c8df8e8e9e4bb19f1a72d46d32","unresolved":false,"context_lines":[{"line_number":43,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":46,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":47,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":48,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":49,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a57fde8_c15264dd","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":19},"updated":"2017-01-12 13:29:11.000000000","message":"I\u0027d opt to make these resource names a constant herein.","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"30812afc7a28cb3fcd3ba290c8c23e30de2b29ad","unresolved":false,"context_lines":[{"line_number":43,"context_line":"API_PREFIX \u003d \u0027/fw\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":46,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":47,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":48,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":49,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a57fde8_7e6866bb","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":19},"in_reply_to":"9a57fde8_c15264dd","updated":"2017-01-12 17:02:02.000000000","message":"Done","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"}],"neutron_lib/api/definitions/firewall_common.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"acd5762a4c9947d355adae0a33445ba5c8813632","unresolved":false,"context_lines":[{"line_number":30,"context_line":"FW_VALID_ACTION_VALUES \u003d [FWAAS_ALLOW, FWAAS_DENY, FWAAS_REJECT]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":34,"context_line":"def convert_protocol(data):"},{"line_number":35,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a74a57a_c6ffe2a8","line":33,"updated":"2016-11-29 22:22:51.000000000","message":"...as opposed to in neutron_lib.api.converters.","commit_id":"19404d8862425d8225ee29b4fb71165748a6f578"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"58db21a26b74f315c67a58c7de2860f4f0e66405","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_a01965d9","updated":"2016-12-05 14:15:01.000000000","message":"I\u0027m on the fence as to if we should really be adding util functionality under definitions.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e465914c09c8f91801f7867adb6f6b34c2e88c57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_5d406b34","in_reply_to":"3a71b18c_a01965d9","updated":"2016-12-05 18:24:19.000000000","message":"Is there a better way to provide what we need at https://review.openstack.org/#/c/389388/5/neutron_lib/api/definitions/firewall_v2.py@51 (for example) that you could suggest?","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":22,"context_line":"FWAAS_REJECT \u003d \"reject\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# Firewall resource path prefix"},{"line_number":25,"context_line":"FIREWALL_PREFIX \u003d \"/fw\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"FW_VALID_PROTOCOL_VALUES \u003d [None, constants.PROTO_NAME_TCP,"},{"line_number":28,"context_line":"                            constants.PROTO_NAME_UDP,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_94dc8e74","line":25,"updated":"2016-12-06 01:57:52.000000000","message":"why is this here?","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"FWAAS_REJECT \u003d \"reject\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# Firewall resource path prefix"},{"line_number":25,"context_line":"FIREWALL_PREFIX \u003d \"/fw\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"FW_VALID_PROTOCOL_VALUES \u003d [None, constants.PROTO_NAME_TCP,"},{"line_number":28,"context_line":"                            constants.PROTO_NAME_UDP,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_e676c3a2","line":25,"in_reply_to":"3a71b18c_94dc8e74","updated":"2016-12-07 02:36:23.000000000","message":"Oops, removed.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":34,"context_line":"def convert_protocol(data):"},{"line_number":35,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    :param data: The value to verify is an IP protocol."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_74c6129b","line":34,"updated":"2016-12-06 01:57:52.000000000","message":"again, I am not sure this is strictly required here. I\u0027d rather keep these as declarative as they can be and avoid \u0027polluting\u0027 them with actual code.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":34,"context_line":"def convert_protocol(data):"},{"line_number":35,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    :param data: The value to verify is an IP protocol."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_86ad0feb","line":34,"in_reply_to":"3a71b18c_74c6129b","updated":"2016-12-07 02:36:23.000000000","message":"Happy to, I just need to understand more clearly what goes in RESOURCE_ATTRIBUTE_MAP where this validator had been specified.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fcd95848e0fa01ac927d9c0d6ff105506152c664","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":31,"context_line":"def convert_protocol(data):"},{"line_number":32,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :param data: The value to verify is an IP protocol."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_61fb7d79","line":31,"updated":"2016-12-07 03:10:23.000000000","message":"I\u0027d keep definitions as declarative and prescriptive as possible. functions etc should be located elsewhere, but keep on reading...","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"fcd95848e0fa01ac927d9c0d6ff105506152c664","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if 0 \u003c\u003d val \u003c\u003d 255:"},{"line_number":46,"context_line":"            return val"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            raise exceptions.FirewallRuleInvalidProtocol("},{"line_number":49,"context_line":"                protocol\u003ddata,"},{"line_number":50,"context_line":"                datas\u003dFW_VALID_PROTOCOL_VALUES)"},{"line_number":51,"context_line":"    elif data.lower() in FW_VALID_PROTOCOL_VALUES:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_013d698e","line":48,"range":{"start_line":48,"start_character":30,"end_line":48,"end_character":31},"updated":"2016-12-07 03:10:23.000000000","message":"converters/validators 99.9% of the cases raise InvalidInput exceptions, and for the 0.1% left, they should really raise InvalidInput instead. This is because there\u0027s very little reason to use a specific exception at the API layer in that this is going to be mapped into an InvalidInput error anyway. The API layer doesn\u0027t know about the layers underneath, and if you make this converter general enough, you will find you don\u0027t need this exception here because all this is doing is turning a protocol input into a sane value and fail if the protocol number is invalid. That is not firewall specific.\n\nThat said I believe we have something similar for security groups, we should double check","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e53c06a188373de6ed9c57c9d80529331746c8e5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if 0 \u003c\u003d val \u003c\u003d 255:"},{"line_number":46,"context_line":"            return val"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            raise exceptions.FirewallRuleInvalidProtocol("},{"line_number":49,"context_line":"                protocol\u003ddata,"},{"line_number":50,"context_line":"                datas\u003dFW_VALID_PROTOCOL_VALUES)"},{"line_number":51,"context_line":"    elif data.lower() in FW_VALID_PROTOCOL_VALUES:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a6eadb0_dda69652","line":48,"range":{"start_line":48,"start_character":30,"end_line":48,"end_character":31},"in_reply_to":"3a71b18c_013d698e","updated":"2016-12-13 22:09:00.000000000","message":"This has been reworked in the separate converters patch, see: https://review.openstack.org/#/c/409343/3/neutron_lib/api/converters.py@215","commit_id":"f9ccb664be3ba2fcee7526cbe523cf0d4f3f8666"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"a18b530f74893ab3abbf4a4f8efc696328ce26d8","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":31,"context_line":"def convert_protocol(data):"},{"line_number":32,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :param data: The value to verify is an IP protocol."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a6eadb0_bcb7c1d6","line":31,"updated":"2016-12-15 13:07:21.000000000","message":"Unless I\u0027m missing something, this is already defined in the dependent patch [1] and therefore if defined here would be a duplicate convert_protocol() definition.\n\n\n[1] https://review.openstack.org/#/c/409343","commit_id":"ceff04b87ba5f64e5b452fc3cdaad1cae9415c3b"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"8e33c36e47c82480448c68d795e9c0056c733bbe","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# This is here because it raises an FWaaS-specific exception."},{"line_number":31,"context_line":"def convert_protocol(data):"},{"line_number":32,"context_line":"    \"\"\"Validate that a specified IP protocol is valid."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :param data: The value to verify is an IP protocol."}],"source_content_type":"text/x-python","patch_set":17,"id":"1a6eadb0_eeefb184","line":31,"in_reply_to":"1a6eadb0_bcb7c1d6","updated":"2016-12-15 17:50:13.000000000","message":"Sorry I missed this, I deleted it.","commit_id":"ceff04b87ba5f64e5b452fc3cdaad1cae9415c3b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"fa48f94a_d20b247c","updated":"2016-12-21 17:25:59.000000000","message":"Not sure that I like a per-extension common file; we could end up with a bunch. What do folks think about a neutron_lib.api.definitions.constants.py file to store all api-def constants? If these constants are not used outside of lib, they can be made private.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"ba5201f7_14be9ffe","in_reply_to":"fa48f94a_d20b247c","updated":"2017-01-06 18:28:48.000000000","message":"Moved to api/definitions/constants.py.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"}],"neutron_lib/api/definitions/firewall_v2.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"58db21a26b74f315c67a58c7de2860f4f0e66405","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_0070590a","updated":"2016-12-05 14:15:01.000000000","message":"Same comment as for firewall.py; don\u0027t we need NAME, ALIAS, etc.?","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e465914c09c8f91801f7867adb6f6b34c2e88c57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a71b18c_1d2353a8","in_reply_to":"3a71b18c_0070590a","updated":"2016-12-05 18:24:19.000000000","message":"Done","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":41,"context_line":"UPDATED_TIMESTAMP \u003d \"2016-10-06T10:00:00-00:00\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Base for the API calls"},{"line_number":44,"context_line":"FIREWALL_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"FIREWALL_CONST \u003d \u0027FIREWALL_V2\u0027"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_b4bc2a07","line":44,"updated":"2016-12-06 01:57:52.000000000","message":"ditto","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":43,"context_line":"# Base for the API calls"},{"line_number":44,"context_line":"FIREWALL_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"FIREWALL_CONST \u003d \u0027FIREWALL_V2\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    \u0027firewall_rules\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_140cfeeb","line":46,"updated":"2016-12-06 01:57:52.000000000","message":"if this is the label to lookup the plugin in the directory, it\u0027s a shame that it does not match the alias, but I guess this is not the only example. Perhaps you can call it PLUGIN_LABEL so that all plugins providing extensions can \u0027standardize\u0027 on the convention.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"# Base for the API calls"},{"line_number":44,"context_line":"FIREWALL_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"FIREWALL_CONST \u003d \u0027FIREWALL_V2\u0027"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    \u0027firewall_rules\u0027: {"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_86db4f7b","line":46,"in_reply_to":"3a71b18c_140cfeeb","updated":"2016-12-07 02:36:23.000000000","message":"Actually, this doesn\u0027t need to be here, it only needs to be specified in the class that inherits from ExtensionDescriptor.  Removed.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"a18b530f74893ab3abbf4a4f8efc696328ce26d8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"API_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"# Add validators for FWaaS-specific validation"},{"line_number":48,"context_line":"validators.add_validator(\u0027port_range\u0027, validators.validate_port_range)"},{"line_number":49,"context_line":"validators.add_validator(\u0027ip_or_subnet_or_none\u0027,"},{"line_number":50,"context_line":"                         validators.validate_ip_or_subnet_or_none)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a6eadb0_1c0fd588","line":48,"updated":"2016-12-15 13:07:21.000000000","message":"Why wouldn\u0027t we just add these to neutron_lib.api.validators.py directly [1] (via the dependent patches that define them) rather than adding them here?\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/validators.py#L883","commit_id":"ceff04b87ba5f64e5b452fc3cdaad1cae9415c3b"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"8e33c36e47c82480448c68d795e9c0056c733bbe","unresolved":false,"context_lines":[{"line_number":45,"context_line":"API_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"# Add validators for FWaaS-specific validation"},{"line_number":48,"context_line":"validators.add_validator(\u0027port_range\u0027, validators.validate_port_range)"},{"line_number":49,"context_line":"validators.add_validator(\u0027ip_or_subnet_or_none\u0027,"},{"line_number":50,"context_line":"                         validators.validate_ip_or_subnet_or_none)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a6eadb0_cef75557","line":48,"in_reply_to":"1a6eadb0_1c0fd588","updated":"2016-12-15 17:50:13.000000000","message":"Deleted, and adding to the dependent patch.","commit_id":"ceff04b87ba5f64e5b452fc3cdaad1cae9415c3b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    },"},{"line_number":177,"context_line":"}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"# The action map."},{"line_number":180,"context_line":"ACTION_MAP \u003d None"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"# The list of required extensions."},{"line_number":183,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"# The list of optional extensions."},{"line_number":186,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa48f94a_928efc25","line":186,"range":{"start_line":179,"start_character":0,"end_line":186,"end_character":26},"updated":"2016-12-21 17:25:59.000000000","message":"Ditto.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    },"},{"line_number":177,"context_line":"}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"# The action map."},{"line_number":180,"context_line":"ACTION_MAP \u003d None"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"# The list of required extensions."},{"line_number":183,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"# The list of optional extensions."},{"line_number":186,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_146cdf9a","line":186,"range":{"start_line":179,"start_character":0,"end_line":186,"end_character":26},"in_reply_to":"fa48f94a_928efc25","updated":"2017-01-06 18:28:48.000000000","message":"Done","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b477b830c132d0ec6769a0fba6b6a7a7d34bb016","unresolved":false,"context_lines":[{"line_number":44,"context_line":"# Base for the API calls"},{"line_number":45,"context_line":"API_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":48,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":49,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_74fb6479","line":47,"updated":"2017-01-06 23:02:08.000000000","message":"Same comment as L48 in https://review.openstack.org/#/c/389388/22/neutron_lib/api/definitions/firewall.py","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"18c64004bfdba5c8df8e8e9e4bb19f1a72d46d32","unresolved":false,"context_lines":[{"line_number":43,"context_line":"API_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":46,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":47,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":48,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":49,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a57fde8_215890fa","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":19},"updated":"2017-01-12 13:29:11.000000000","message":"Ditto W/R/T constants for these resource names.","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"30812afc7a28cb3fcd3ba290c8c23e30de2b29ad","unresolved":false,"context_lines":[{"line_number":43,"context_line":"API_PREFIX \u003d \u0027/fwaas\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":46,"context_line":"    \u0027firewall_rules\u0027: {"},{"line_number":47,"context_line":"        \u0027id\u0027: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":48,"context_line":"               \u0027validate\u0027: {\u0027type:uuid\u0027: None},"},{"line_number":49,"context_line":"               \u0027is_visible\u0027: True, \u0027primary_key\u0027: True},"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a57fde8_1ea03af4","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":19},"in_reply_to":"9a57fde8_215890fa","updated":"2017-01-12 17:02:02.000000000","message":"Done","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"}],"neutron_lib/api/definitions/firewallrouterinsertion.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":44,"context_line":"    \u0027firewalls\u0027: {"},{"line_number":45,"context_line":"        \u0027router_ids\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":46,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":47,"context_line":"                       \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa48f94a_f29d885a","line":44,"range":{"start_line":44,"start_character":5,"end_line":44,"end_character":14},"updated":"2016-12-21 17:25:59.000000000","message":"As per [1]; we should define/use the RESOURCE_NAME and COLLECTION name\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/_dummy.py","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":44,"context_line":"    \u0027firewalls\u0027: {"},{"line_number":45,"context_line":"        \u0027router_ids\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":46,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"},{"line_number":47,"context_line":"                       \u0027is_visible\u0027: True,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_b4df9338","line":44,"range":{"start_line":44,"start_character":5,"end_line":44,"end_character":14},"in_reply_to":"fa48f94a_f29d885a","updated":"2017-01-06 18:28:48.000000000","message":"Done","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    }"},{"line_number":50,"context_line":"}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# The action map."},{"line_number":53,"context_line":"ACTION_MAP \u003d None"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# The list of required extensions."},{"line_number":56,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The list of optional extensions."},{"line_number":59,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa48f94a_b293004f","line":59,"range":{"start_line":52,"start_character":0,"end_line":59,"end_character":26},"updated":"2016-12-21 17:25:59.000000000","message":"Ditto.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    }"},{"line_number":50,"context_line":"}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# The action map."},{"line_number":53,"context_line":"ACTION_MAP \u003d None"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# The list of required extensions."},{"line_number":56,"context_line":"REQUIRED_EXTENSIONS \u003d None"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# The list of optional extensions."},{"line_number":59,"context_line":"OPTIONAL_EXTENSIONS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_d4fc17ba","line":59,"range":{"start_line":52,"start_character":0,"end_line":59,"end_character":26},"in_reply_to":"fa48f94a_b293004f","updated":"2017-01-06 18:28:48.000000000","message":"Done","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"b477b830c132d0ec6769a0fba6b6a7a7d34bb016","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# The plural for the resource"},{"line_number":46,"context_line":"COLLECTION_NAME \u003d \"firewalls\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":49,"context_line":"    COLLECTION_NAME: {"},{"line_number":50,"context_line":"        \u0027router_ids\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":51,"context_line":"                       \u0027validate\u0027: {\u0027type:uuid_list\u0027: None},"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_f414b4a0","line":48,"updated":"2017-01-06 23:02:08.000000000","message":"Same comment as L48 in https://review.openstack.org/#/c/389388/22/neutron_lib/api/definitions/firewall.py","commit_id":"1d274c644c5599d374bb780555e07b8727e4e594"}],"neutron_lib/api/validators.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"58db21a26b74f315c67a58c7de2860f4f0e66405","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    \"\"\"Validate data is an IP address, a valid IP subnet string, or None."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    :param data: The data to validate."},{"line_number":547,"context_line":"    :param valid_values: Not used!"},{"line_number":548,"context_line":"    :return: None if data is None or a valid IP address or a valid IP subnet,"},{"line_number":549,"context_line":"    otherwise a human readable message indicating why the data is invalid."},{"line_number":550,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_40e411ab","line":547,"updated":"2016-12-05 14:15:01.000000000","message":"If its not used IMO let\u0027s not define it as a kwarg then.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"e465914c09c8f91801f7867adb6f6b34c2e88c57","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    \"\"\"Validate data is an IP address, a valid IP subnet string, or None."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    :param data: The data to validate."},{"line_number":547,"context_line":"    :param valid_values: Not used!"},{"line_number":548,"context_line":"    :return: None if data is None or a valid IP address or a valid IP subnet,"},{"line_number":549,"context_line":"    otherwise a human readable message indicating why the data is invalid."},{"line_number":550,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_5d678be8","line":547,"in_reply_to":"3a71b18c_40e411ab","updated":"2016-12-05 18:24:19.000000000","message":"That file is rife with this note.  \n\n    $ grep \u0027Not used\u0027 neutron_lib/api/validators.py | uniq -c\n         19     :param valid_values: Not used!\n\nI added it to maintain compatibility with the other validators.","commit_id":"1b67290eaa90f8594476603c495eba6befbb8b9f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        return validate_ip_address(data, valid_values)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"def validate_ip_or_subnet_or_none(data, valid_values\u003dNone):"},{"line_number":544,"context_line":"    \"\"\"Validate data is an IP address, a valid IP subnet string, or None."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    :param data: The data to validate."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_d4fe06ad","line":543,"updated":"2016-12-06 01:57:52.000000000","message":"I\u0027d rather extract this in a separate patch.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        return validate_ip_address(data, valid_values)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"def validate_ip_or_subnet_or_none(data, valid_values\u003dNone):"},{"line_number":544,"context_line":"    \"\"\"Validate data is an IP address, a valid IP subnet string, or None."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    :param data: The data to validate."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_86a18f96","line":543,"in_reply_to":"3a71b18c_d4fe06ad","updated":"2016-12-07 02:36:23.000000000","message":"Your wish is my command: https://review.openstack.org/407812","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"}],"neutron_lib/exceptions.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"# This exception is required by the FWaaS api specification because it is"},{"line_number":521,"context_line":"# thrown by an API validator."},{"line_number":522,"context_line":"class FirewallRuleInvalidProtocol(InvalidInput):"},{"line_number":523,"context_line":"    message \u003d _(\"Firewall Rule protocol %(protocol)s is not supported. \""},{"line_number":524,"context_line":"                \"Only protocol values %(values)s and their integer \""},{"line_number":525,"context_line":"                \"representation (0 to 255) are supported.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_34dbba50","line":522,"updated":"2016-12-06 01:57:52.000000000","message":"rule of thumb is that validators that are not used across a set of repos must be local to the repo where they are used, therefore I\u0027d say this exception should be local to where the validator goes. That said, there may be situations where multiple repos within neutron integrates with fwaas (e.g. midonet), and thus exceptions will have to be relocated, but let\u0027s take baby steps.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"# This exception is required by the FWaaS api specification because it is"},{"line_number":521,"context_line":"# thrown by an API validator."},{"line_number":522,"context_line":"class FirewallRuleInvalidProtocol(InvalidInput):"},{"line_number":523,"context_line":"    message \u003d _(\"Firewall Rule protocol %(protocol)s is not supported. \""},{"line_number":524,"context_line":"                \"Only protocol values %(values)s and their integer \""},{"line_number":525,"context_line":"                \"representation (0 to 255) are supported.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_4643f712","line":522,"in_reply_to":"3a71b18c_34dbba50","updated":"2016-12-07 02:36:23.000000000","message":"OK, and I think using add_validator will solve this for me.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"}],"neutron_lib/tests/unit/api/definitions/base.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            self.skipTest(\u0027Shim extension with no API changes.\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        for resource in self.resource_map:"},{"line_number":100,"context_line":"            if not isinstance(self.extension_resources, tuple):"},{"line_number":101,"context_line":"                self.extension_resources \u003d (self.extension_resources,)"},{"line_number":102,"context_line":"            self.assertIn("},{"line_number":103,"context_line":"                resource, base.KNOWN_RESOURCES + self.extension_resources,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_d49a866d","line":100,"updated":"2016-12-06 01:57:52.000000000","message":"Slap on the wrist! Don\u0027t mask errors in your tests by tweaking this!! No-uh!","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            self.skipTest(\u0027Shim extension with no API changes.\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        for resource in self.resource_map:"},{"line_number":100,"context_line":"            if not isinstance(self.extension_resources, tuple):"},{"line_number":101,"context_line":"                self.extension_resources \u003d (self.extension_resources,)"},{"line_number":102,"context_line":"            self.assertIn("},{"line_number":103,"context_line":"                resource, base.KNOWN_RESOURCES + self.extension_resources,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_a654cbc9","line":100,"in_reply_to":"3a71b18c_d49a866d","updated":"2016-12-07 02:36:23.000000000","message":"Sorry.  *shame*  Removed.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"}],"neutron_lib/tests/unit/api/definitions/test_firewall.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f2aad8e56d81156f6932fb3dcd535d8a1748b270","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class FirewallDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d firewall"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027firewalls\u0027, \u0027firewall_policies\u0027, \u0027firewall_rules\u0027)"},{"line_number":20,"context_line":"    extension_attributes \u003d (\u0027action\u0027, \u0027admin_state_up\u0027, \u0027audited\u0027,"},{"line_number":21,"context_line":"                            \u0027destination_ip_address\u0027, \u0027destination_port\u0027,"},{"line_number":22,"context_line":"                            \u0027enabled\u0027, \u0027firewall_policy_id\u0027, \u0027firewall_rules\u0027,"},{"line_number":23,"context_line":"                            \u0027ip_version\u0027, \u0027position\u0027, \u0027protocol\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_0815e23e","line":20,"range":{"start_line":20,"start_character":39,"end_line":20,"end_character":53},"updated":"2017-01-12 00:08:15.000000000","message":"this could be omitted, but ok.","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"}],"neutron_lib/tests/unit/api/definitions/test_firewall_v2.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f2aad8e56d81156f6932fb3dcd535d8a1748b270","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    extension_module \u003d firewall_v2"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027firewall_groups\u0027, \u0027firewall_policies\u0027,"},{"line_number":20,"context_line":"                           \u0027firewall_rules\u0027)"},{"line_number":21,"context_line":"    extension_attributes \u003d (\u0027action\u0027, \u0027admin_state_up\u0027, \u0027audited\u0027,"},{"line_number":22,"context_line":"                            \u0027destination_ip_address\u0027, \u0027destination_port\u0027,"},{"line_number":23,"context_line":"                            \u0027egress_firewall_policy_id\u0027, \u0027enabled\u0027,"},{"line_number":24,"context_line":"                            \u0027firewall_policy_id\u0027, \u0027firewall_rules\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_28954686","line":21,"range":{"start_line":21,"start_character":39,"end_line":21,"end_character":53},"updated":"2017-01-12 00:08:15.000000000","message":"ditto","commit_id":"78092faa4b5035c21f17190d9de92ad35350cbcb"}],"neutron_lib/tests/unit/api/definitions/test_firewallrouterinsertion.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30d8cfca4ffebb7046893764968a7b8900c44a17","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class FirewallDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d firewallrouterinsertion"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027firewalls\u0027)"},{"line_number":20,"context_line":"    extension_attributes \u003d (\u0027router_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_54859604","line":20,"updated":"2016-12-06 01:57:52.000000000","message":"you need a commas here, these are not tuples.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"f1838c18a40b5260c993cba1267d4d97c5aa810e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class FirewallDefinitionTestCase(base.DefinitionBaseTestCase):"},{"line_number":18,"context_line":"    extension_module \u003d firewallrouterinsertion"},{"line_number":19,"context_line":"    extension_resources \u003d (\u0027firewalls\u0027)"},{"line_number":20,"context_line":"    extension_attributes \u003d (\u0027router_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_8670af73","line":20,"in_reply_to":"3a71b18c_54859604","updated":"2016-12-07 02:36:23.000000000","message":"Thanks, fixed.","commit_id":"6f586e674b09c6042cacbbc49667920d58f7cd1d"}],"releasenotes/notes/fwaas-api-def-a6f03db369177b4a.yaml":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"fd82c6638388cc4c52428cc8432d2ea06017643a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"    - Adds the neutron-fwaas API definition to neutron-lib."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"fa48f94a_f2b4a8d2","line":3,"range":{"start_line":3,"start_character":33,"end_line":3,"end_character":43},"updated":"2016-12-21 17:25:59.000000000","message":"Nit: technically it adds multiple definitions.","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4fbffe8373146fcf74df922091bf55b0d7748387","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"    - Adds the neutron-fwaas API definition to neutron-lib."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"ba5201f7_34ec83f2","line":3,"range":{"start_line":3,"start_character":33,"end_line":3,"end_character":43},"in_reply_to":"fa48f94a_f2b4a8d2","updated":"2017-01-06 18:28:48.000000000","message":"Done","commit_id":"ecb771abf28869acd24bed7ae80d4c9110b4a0b8"}]}
