)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1b9a0b58dfe93d00e2782b54a2e3d9fc00a66251","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow ability for non admin users to use all filters on server list."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If policy allows for index:get_all_tenants to be issued then also"},{"line_number":10,"context_line":"allow the use of all filters, eg. host and IP filters."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-bug: #1737050"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df87a7cf_33e404e0","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":54},"updated":"2017-12-08 02:58:04.000000000","message":"I\u0027m not sure I agree with the assertion. What if I don\u0027t want to allow a user to list instances for all tenants, but I\u0027m OK with allowing them to filter the instances they own based on host, IP, etc. Is there no use case for that?","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"430acf96f2e599f9bcd707f0d132314b56baec82","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow ability for non admin users to use all filters on server list."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If policy allows for index:get_all_tenants to be issued then also"},{"line_number":10,"context_line":"allow the use of all filters, eg. host and IP filters."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-bug: #1737050"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df87a7cf_e504854c","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":54},"in_reply_to":"df87a7cf_33e404e0","updated":"2017-12-08 14:12:37.000000000","message":"According to _get_server_search_options non-admins can already search by ip.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"91339e3d524d9d65529010d461271181ae7013dd","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow ability for non admin users to use all filters on server list."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds a new policy rule \"restricted_filters\" to control whether a user"},{"line_number":10,"context_line":"can use all filters when listing servers."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-bug: #1737050"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3f79a3b5_c6fd006f","line":9,"range":{"start_line":9,"start_character":24,"end_line":9,"end_character":42},"updated":"2018-09-14 23:03:35.000000000","message":"This is out of date.","commit_id":"f8cd64b7d1fe8c7bd29c5fad9d0a4627872c4c3d"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"430acf96f2e599f9bcd707f0d132314b56baec82","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                search_opts[\u0027changes-since\u0027])"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        # By default, compute\u0027s get_all() will return deleted instances."},{"line_number":215,"context_line":"        # If an admin hasn\u0027t specified a \u0027deleted\u0027 search option, we need"},{"line_number":216,"context_line":"        # to filter out deleted instances by setting the filter ourselves."},{"line_number":217,"context_line":"        # ... Unless \u0027changes-since\u0027 is specified, because \u0027changes-since\u0027"},{"line_number":218,"context_line":"        # should return recently deleted instances according to the API spec."}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_8568191d","line":215,"range":{"start_line":215,"start_character":10,"end_line":215,"end_character":65},"updated":"2017-12-08 14:12:37.000000000","message":"This implies that with the new rule, non-admins could also list deleted instances, is that OK?","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                search_opts[\u0027changes-since\u0027])"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        # By default, compute\u0027s get_all() will return deleted instances."},{"line_number":215,"context_line":"        # If an admin hasn\u0027t specified a \u0027deleted\u0027 search option, we need"},{"line_number":216,"context_line":"        # to filter out deleted instances by setting the filter ourselves."},{"line_number":217,"context_line":"        # ... Unless \u0027changes-since\u0027 is specified, because \u0027changes-since\u0027"},{"line_number":218,"context_line":"        # should return recently deleted instances according to the API spec."}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_c16cb5cf","line":215,"range":{"start_line":215,"start_character":10,"end_line":215,"end_character":65},"in_reply_to":"df87a7cf_8568191d","updated":"2017-12-11 03:33:51.000000000","message":"IMO, no. commented below.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"430acf96f2e599f9bcd707f0d132314b56baec82","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                search_opts[\u0027deleted\u0027], default\u003dFalse)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        if search_opts.get(\"vm_state\") \u003d\u003d [\u0027deleted\u0027]:"},{"line_number":232,"context_line":"            if context.is_admin:"},{"line_number":233,"context_line":"                search_opts[\u0027deleted\u0027] \u003d True"},{"line_number":234,"context_line":"            else:"},{"line_number":235,"context_line":"                msg \u003d _(\"Only administrators may list deleted instances\")"},{"line_number":236,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.26\u0027):"},{"line_number":239,"context_line":"            for tag_filter in TAG_SEARCH_FILTERS:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_25590d8d","line":236,"range":{"start_line":232,"start_character":12,"end_line":236,"end_character":56},"updated":"2017-12-08 14:12:37.000000000","message":"Yeah see this.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                search_opts[\u0027deleted\u0027], default\u003dFalse)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        if search_opts.get(\"vm_state\") \u003d\u003d [\u0027deleted\u0027]:"},{"line_number":232,"context_line":"            if context.is_admin:"},{"line_number":233,"context_line":"                search_opts[\u0027deleted\u0027] \u003d True"},{"line_number":234,"context_line":"            else:"},{"line_number":235,"context_line":"                msg \u003d _(\"Only administrators may list deleted instances\")"},{"line_number":236,"context_line":"                raise exc.HTTPForbidden(explanation\u003dmsg)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.26\u0027):"},{"line_number":239,"context_line":"            for tag_filter in TAG_SEARCH_FILTERS:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_a1441148","line":236,"range":{"start_line":232,"start_character":12,"end_line":236,"end_character":56},"in_reply_to":"df87a7cf_25590d8d","updated":"2017-12-11 03:33:51.000000000","message":"this will change the API behavior. Now non-admin gets 403 and if we allow we make it success which cause interop issue.\n\nI am not sure why we did not allow it for non-admin at first but if we do now we need to think about version bump or something.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"430acf96f2e599f9bcd707f0d132314b56baec82","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            password \u003d utils.generate_password()"},{"line_number":1039,"context_line":"        return password"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_server_search_options(self, req):"},{"line_number":1042,"context_line":"        \"\"\"Return server search options allowed by non-admin.\"\"\""},{"line_number":1043,"context_line":"        opt_list \u003d (\u0027reservation_id\u0027, \u0027name\u0027, \u0027status\u0027, \u0027image\u0027, \u0027flavor\u0027,"},{"line_number":1044,"context_line":"                    \u0027ip\u0027, \u0027changes-since\u0027, \u0027all_tenants\u0027)"},{"line_number":1045,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.5\u0027):"},{"line_number":1046,"context_line":"            opt_list +\u003d (\u0027ip6\u0027,)"},{"line_number":1047,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.26\u0027):"},{"line_number":1048,"context_line":"            opt_list +\u003d TAG_SEARCH_FILTERS"},{"line_number":1049,"context_line":"        return opt_list"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"    def _get_instance(self, context, instance_uuid):"},{"line_number":1052,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_25e7cdae","line":1049,"range":{"start_line":1041,"start_character":4,"end_line":1049,"end_character":23},"updated":"2017-12-08 14:12:37.000000000","message":"I doubt we do a good job of documenting which parameters are available for non-admins...but would have to dig for that.\n\nI\u0027m surprised all_tenants is in this list.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"dc6a8be8e276326a1349e4b8e50a72048f469909","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            password \u003d utils.generate_password()"},{"line_number":1039,"context_line":"        return password"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_server_search_options(self, req):"},{"line_number":1042,"context_line":"        \"\"\"Return server search options allowed by non-admin.\"\"\""},{"line_number":1043,"context_line":"        opt_list \u003d (\u0027reservation_id\u0027, \u0027name\u0027, \u0027status\u0027, \u0027image\u0027, \u0027flavor\u0027,"},{"line_number":1044,"context_line":"                    \u0027ip\u0027, \u0027changes-since\u0027, \u0027all_tenants\u0027)"},{"line_number":1045,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.5\u0027):"},{"line_number":1046,"context_line":"            opt_list +\u003d (\u0027ip6\u0027,)"},{"line_number":1047,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.26\u0027):"},{"line_number":1048,"context_line":"            opt_list +\u003d TAG_SEARCH_FILTERS"},{"line_number":1049,"context_line":"        return opt_list"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"    def _get_instance(self, context, instance_uuid):"},{"line_number":1052,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_0ce3a9a5","line":1049,"range":{"start_line":1041,"start_character":4,"end_line":1049,"end_character":23},"in_reply_to":"df87a7cf_01561d07","updated":"2017-12-11 13:38:34.000000000","message":"https://review.openstack.org/#/c/527042/","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"            password \u003d utils.generate_password()"},{"line_number":1039,"context_line":"        return password"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_server_search_options(self, req):"},{"line_number":1042,"context_line":"        \"\"\"Return server search options allowed by non-admin.\"\"\""},{"line_number":1043,"context_line":"        opt_list \u003d (\u0027reservation_id\u0027, \u0027name\u0027, \u0027status\u0027, \u0027image\u0027, \u0027flavor\u0027,"},{"line_number":1044,"context_line":"                    \u0027ip\u0027, \u0027changes-since\u0027, \u0027all_tenants\u0027)"},{"line_number":1045,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.5\u0027):"},{"line_number":1046,"context_line":"            opt_list +\u003d (\u0027ip6\u0027,)"},{"line_number":1047,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.26\u0027):"},{"line_number":1048,"context_line":"            opt_list +\u003d TAG_SEARCH_FILTERS"},{"line_number":1049,"context_line":"        return opt_list"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"    def _get_instance(self, context, instance_uuid):"},{"line_number":1052,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_01561d07","line":1049,"range":{"start_line":1041,"start_character":4,"end_line":1049,"end_character":23},"in_reply_to":"df87a7cf_25e7cdae","updated":"2017-12-11 03:33:51.000000000","message":"yea we do not have and we should have one on api-ref side :). i will put that.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b223b0930db527cbd5a5194a2572125cd84b4147","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"def remove_invalid_options(context, search_options, allowed_search_options):"},{"line_number":1128,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_73904c44","line":1127,"range":{"start_line":1127,"start_character":4,"end_line":1127,"end_character":26},"updated":"2017-12-08 02:54:53.000000000","message":"This method is used for both index() and detail() so why would we just restrict the policy rule to index?","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"def remove_invalid_options(context, search_options, allowed_search_options):"},{"line_number":1128,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_a68c27d7","line":1127,"range":{"start_line":1127,"start_character":4,"end_line":1127,"end_character":26},"in_reply_to":"df87a7cf_73904c44","updated":"2017-12-11 03:33:51.000000000","message":"+1. If we do, then yes it should be for both rule.\n\nWe tried to make those more clear by deprecating the old rule and introduces a single rule but that did not happen. May be i need to iterate that again in Rocky\n- https://review.openstack.org/#/c/426128/1\n- https://review.openstack.org/#/c/425533/3","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b223b0930db527cbd5a5194a2572125cd84b4147","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_f3a3fc9c","line":1131,"updated":"2017-12-08 02:54:53.000000000","message":"This changes the meaning of the get_all_tenants rule, so we\u0027d also need to document that wrinkle in the policy docs, which like config options, are generated from code now:\n\nhttps://github.com/openstack/nova/blob/master/nova/policies/servers.py#L45\n\nSame for \u0027detail\u0027.\n\nWe\u0027d also likely need an \u0027upgrade\u0027 release note for this:\n\nhttps://docs.openstack.org/nova/latest/contributor/releasenotes.html\n\nI\u0027m not sure if we should piggyback on the existing rule or add a new one...that point is up for discussion.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_c1159541","line":1131,"in_reply_to":"df87a7cf_020f2437","updated":"2017-12-11 03:33:51.000000000","message":"\u003eThis changes the meaning of the get_all_tenants rule\nAlso it does more than that. it change the whitelist of filters for non-admin.","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":11869,"name":"zhubingbing","email":"zhu.bingbing@99cloud.net","username":"zhubingbing"},"change_message_id":"0a3bbf67c319961eef518728bd0f4f596ce64762","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_020f2437","line":1131,"in_reply_to":"df87a7cf_f3a3fc9c","updated":"2017-12-08 08:47:47.000000000","message":"agree","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"430acf96f2e599f9bcd707f0d132314b56baec82","unresolved":false,"context_lines":[{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"},{"line_number":1135,"context_line":"        return"},{"line_number":1136,"context_line":"    # Otherwise, strip out all unknown options"},{"line_number":1137,"context_line":"    unknown_options \u003d [opt for opt in search_options"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_25802dbf","line":1134,"range":{"start_line":1132,"start_character":8,"end_line":1134,"end_character":41},"updated":"2017-12-08 14:12:37.000000000","message":"I\u0027m confused why this method removes paging parameters for an admin context in the first place...","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":3031,"name":"Sam Morrison","email":"sorrison@gmail.com","username":"sorrison"},"change_message_id":"32fcef749217b27f63360455f2765cfa9107ff71","unresolved":false,"context_lines":[{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"},{"line_number":1135,"context_line":"        return"},{"line_number":1136,"context_line":"    # Otherwise, strip out all unknown options"},{"line_number":1137,"context_line":"    unknown_options \u003d [opt for opt in search_options"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_ebfe7869","line":1134,"range":{"start_line":1132,"start_character":8,"end_line":1134,"end_character":41},"in_reply_to":"df87a7cf_25802dbf","updated":"2017-12-11 00:50:16.000000000","message":"I think it is removing these as they aren\u0027t strictly for filtering instances","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"fba97478767b6f18aba834757f77264bdf7db105","unresolved":false,"context_lines":[{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    if context.is_admin or context.can("},{"line_number":1131,"context_line":"        server_policies.SERVERS % \u0027index:get_all_tenants\u0027, fatal\u003dFalse):"},{"line_number":1132,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1133,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1134,"context_line":"            search_options.pop(key, None)"},{"line_number":1135,"context_line":"        return"},{"line_number":1136,"context_line":"    # Otherwise, strip out all unknown options"},{"line_number":1137,"context_line":"    unknown_options \u003d [opt for opt in search_options"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_4698bb1a","line":1134,"range":{"start_line":1132,"start_character":8,"end_line":1134,"end_character":41},"in_reply_to":"df87a7cf_ebfe7869","updated":"2017-12-11 03:33:51.000000000","message":"yea, we pass pagination params as separate args @L288-290.\n\nif we do not filter out those from search_options then it will blow up in DB.\n\nFor non-admin users those are taken care by L1137-L1143","commit_id":"94e26bf7a3ab0db39a337f4d0cc4c19de8c6f1ce"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"ad10d4e3d4b4cbcfc3c5c7ed5d2a92cacd2f1a4a","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"def remove_invalid_options(context, search_options, allowed_search_options):"},{"line_number":1143,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1144,"context_line":""},{"line_number":1145,"context_line":"    if context.is_admin or context.can("},{"line_number":1146,"context_line":"        server_policies.SERVERS % \u0027restricted_filters\u0027, fatal\u003dFalse):"},{"line_number":1147,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1148,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_a32618ba","line":1145,"range":{"start_line":1145,"start_character":6,"end_line":1145,"end_character":39},"updated":"2018-04-27 06:34:11.000000000","message":"could this be just:\nif context.can(server_policies.SERCER % \u0027restricted_filters, fatal\u003dFalse)","commit_id":"125ebc0185d1a06e0960b3752bc120f0a084f0fb"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"be660d47ad4014a61fc99eb956dd80115eb310ed","unresolved":false,"context_lines":[{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":""},{"line_number":1159,"context_line":"def remove_invalid_options(context, search_options, allowed_search_options):"},{"line_number":1160,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"    if context.can(server_policies.SERVERS % \u0027restricted_filters\u0027,"},{"line_number":1163,"context_line":"                   fatal\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2d4a8c54","line":1160,"range":{"start_line":1160,"start_character":52,"end_line":1160,"end_character":74},"updated":"2018-08-22 09:09:21.000000000","message":"this can be adjusted?","commit_id":"0811692e791abd71aa64cf29376e3be2a14b9d5e"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"885810c204f46296b3d1a2a3aefc762ac9562f40","unresolved":false,"context_lines":[{"line_number":1159,"context_line":"def remove_invalid_options(context, search_options, allowed_search_options):"},{"line_number":1160,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"    if context.can(server_policies.SERVERS % \u0027restricted_filters\u0027,"},{"line_number":1163,"context_line":"                   fatal\u003dFalse):"},{"line_number":1164,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1165,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2f07e41e","line":1162,"range":{"start_line":1162,"start_character":46,"end_line":1162,"end_character":64},"updated":"2018-08-22 08:34:41.000000000","message":"Maybe I\u0027m too nit picking here, but ``restricted_filters`` seems a name for a list of filters, maybe we can use something like``use_all_filters``.","commit_id":"0811692e791abd71aa64cf29376e3be2a14b9d5e"}],"nova/policies/servers.py":[{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"3a67c7f066eea3dd066a3ea6d26253d1fb0d7f2a","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        SERVERS % \u0027use_all_filters\u0027,"},{"line_number":67,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":68,"context_line":"        \"Use all filters when listing servers\","},{"line_number":69,"context_line":"        ["},{"line_number":70,"context_line":"            {"},{"line_number":71,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":72,"context_line":"                \u0027path\u0027: \u0027/servers\u0027"},{"line_number":73,"context_line":"            }"},{"line_number":74,"context_line":"        ]),"},{"line_number":75,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":76,"context_line":"        SERVERS % \u0027show\u0027,"},{"line_number":77,"context_line":"        RULE_AOO,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_ef5c457e","line":74,"range":{"start_line":69,"start_character":8,"end_line":74,"end_character":11},"updated":"2018-08-24 14:51:10.000000000","message":"Like what Matt has mentioned, this rule should apply to \"GET /servers/detail\" as well, as remove_invalid_options method is called by both APIs. And it might be the reason some unit tests failed.","commit_id":"1ebe8159d55afdce7bbd7742803255b417882201"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                \u0027path\u0027: \u0027/servers/detail\u0027"},{"line_number":43,"context_line":"            }"},{"line_number":44,"context_line":"        ]),"},{"line_number":45,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":46,"context_line":"        SERVERS % \u0027index:get_all_tenants\u0027,"},{"line_number":47,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":48,"context_line":"        \"List all servers for all projects\","},{"line_number":49,"context_line":"        ["},{"line_number":50,"context_line":"            {"},{"line_number":51,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":52,"context_line":"                \u0027path\u0027: \u0027/servers\u0027"},{"line_number":53,"context_line":"            }"},{"line_number":54,"context_line":"        ]),"},{"line_number":55,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":56,"context_line":"        SERVERS % \u0027detail:get_all_tenants\u0027,"},{"line_number":57,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":58,"context_line":"        \"List all servers with detailed information for all projects\","},{"line_number":59,"context_line":"        ["},{"line_number":60,"context_line":"            {"},{"line_number":61,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"},{"line_number":62,"context_line":"                \u0027path\u0027: \u0027/servers/detail\u0027"},{"line_number":63,"context_line":"            }"},{"line_number":64,"context_line":"        ]),"},{"line_number":65,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":66,"context_line":"        SERVERS % \u0027use_all_filters\u0027,"},{"line_number":67,"context_line":"        base.RULE_ADMIN_API,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_b13e03b7","line":64,"range":{"start_line":45,"start_character":4,"end_line":64,"end_character":11},"updated":"2018-09-14 17:36:37.000000000","message":"I guess we are granular to the point of index vs detail for getting all tenants, but that seems excessive to me.","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            }"},{"line_number":64,"context_line":"        ]),"},{"line_number":65,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":66,"context_line":"        SERVERS % \u0027use_all_filters\u0027,"},{"line_number":67,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":68,"context_line":"        \"Use all filters when listing servers\","},{"line_number":69,"context_line":"        ["}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_3174339c","line":66,"range":{"start_line":66,"start_character":19,"end_line":66,"end_character":22},"updated":"2018-09-14 17:36:37.000000000","message":"allow?","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":66,"context_line":"        SERVERS % \u0027use_all_filters\u0027,"},{"line_number":67,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":68,"context_line":"        \"Use all filters when listing servers\","},{"line_number":69,"context_line":"        ["},{"line_number":70,"context_line":"            {"},{"line_number":71,"context_line":"                \u0027method\u0027: \u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_9143c73f","line":68,"range":{"start_line":68,"start_character":9,"end_line":68,"end_character":12},"updated":"2018-09-14 17:36:37.000000000","message":"Allow?","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5dc423c7e9f3928cd2a292a6aec7c1325881349e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            }"},{"line_number":64,"context_line":"        ]),"},{"line_number":65,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":66,"context_line":"        SERVERS % \u0027allow_all_filters\u0027,"},{"line_number":67,"context_line":"        base.RULE_ADMIN_API,"},{"line_number":68,"context_line":"        \"Allow all filters when listing servers\","},{"line_number":69,"context_line":"        ["}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_a5d69ac2","line":66,"updated":"2018-09-17 18:27:31.000000000","message":"nit: could do this in a follow up since I just noticed it, but we could also mention the policy rule in the API reference:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/api-ref/source/servers.inc#n174","commit_id":"7c56588647be64a2248b1f37d40369765bc6b977"}],"nova/tests/unit/api/openstack/compute/test_serversV21.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        }"},{"line_number":1272,"context_line":"        policy.set_rules(oslo_policy.Rules.from_dict(rules))"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":"        self.stubs.Set(compute_api.API, \u0027get_all\u0027, fake_get_all)"},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        query_str \u003d (\"name\u003dfoo\u0026ip\u003d10.*\u0026status\u003dactive\u0026unknown_option\u003dmeow\u0026\""},{"line_number":1277,"context_line":"                     \"terminated_at\u003d^2016-02-01.*\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_915c271a","line":1274,"range":{"start_line":1274,"start_character":8,"end_line":1274,"end_character":22},"updated":"2018-09-14 17:36:37.000000000","message":"Use mock for this. self.stubs is mox.","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"        req \u003d self.req(\u0027/fake/servers?%s\u0027 % query_str)"},{"line_number":1279,"context_line":"        servers \u003d self.controller.index(req)[\u0027servers\u0027]"},{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":"        self.assertEqual(len(servers), 1)"},{"line_number":1282,"context_line":"        self.assertEqual(servers[0][\u0027id\u0027], server_uuid)"},{"line_number":1283,"context_line":""},{"line_number":1284,"context_line":"    def test_get_servers_allows_ip(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_3182f353","line":1281,"range":{"start_line":1281,"start_character":25,"end_line":1281,"end_character":41},"updated":"2018-09-14 17:36:37.000000000","message":"reverse these args: (expected, actual)","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68c88bab025d4344a892a61484e995b476f0509f","unresolved":false,"context_lines":[{"line_number":1279,"context_line":"        servers \u003d self.controller.index(req)[\u0027servers\u0027]"},{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":"        self.assertEqual(len(servers), 1)"},{"line_number":1282,"context_line":"        self.assertEqual(servers[0][\u0027id\u0027], server_uuid)"},{"line_number":1283,"context_line":""},{"line_number":1284,"context_line":"    def test_get_servers_allows_ip(self):"},{"line_number":1285,"context_line":"        \"\"\"Test getting servers by ip.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f17b1b78","line":1282,"updated":"2018-09-14 17:36:37.000000000","message":"same","commit_id":"cb00e3782aa3a5b231b8aba1089044aa393f129e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d375a9239590cf92109014250eca9b0822a6c0fa","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        self.ips_controller \u003d ips.IPsController()"},{"line_number":183,"context_line":"        policy.reset()"},{"line_number":184,"context_line":"        policy.init()"},{"line_number":185,"context_line":"        self.addCleanup(policy.reset)"},{"line_number":186,"context_line":"        fake_network.stub_out_nw_api_get_instance_nw_info(self)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_352c1c00","line":185,"updated":"2018-09-14 20:30:27.000000000","message":"I\u0027m not sure, but policy is a global and I think the new test might be throwing things off - although it\u0027s really odd that the same tests fail on every run upstream but we\u0027re not seeing the same failures locally.\n\nLooking at how the policy fixture works, it looks like lots of tests are setting rules via the policy fixture which handles resetting the global between test runs, but lots of tests, like these, are modifying the global directly, which could be leaking and causing failures. Just a hunch at this point. Would be non-trivial to get everything to switch over to hitting the PolicyFixture.set_rules directly.","commit_id":"f8cd64b7d1fe8c7bd29c5fad9d0a4627872c4c3d"}],"nova/tests/unit/test_policy.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f6773edf35c55d004c7351c393f33c4ed1f3510","unresolved":false,"context_lines":[{"line_number":279,"context_line":"\"os_compute_api:servers:create:forced_host\","},{"line_number":280,"context_line":"\"os_compute_api:servers:detail:get_all_tenants\","},{"line_number":281,"context_line":"\"os_compute_api:servers:index:get_all_tenants\","},{"line_number":282,"context_line":"\"os_compute_api:servers:use_all_filters\","},{"line_number":283,"context_line":"\"os_compute_api:servers:show:host_status\","},{"line_number":284,"context_line":"\"os_compute_api:servers:migrations:force_complete\","},{"line_number":285,"context_line":"\"os_compute_api:servers:migrations:delete\","}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_1a8da034","line":282,"updated":"2018-09-13 23:12:18.000000000","message":"I think this also has to go here:\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/unit/fake_policy.py\n\nMight fix your tests.","commit_id":"41f38eb4becea03af4d9473ec0a5f2fbfa1d49ec"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"89545400633177793bf3526f22ef961d3133f2e9","unresolved":false,"context_lines":[{"line_number":279,"context_line":"\"os_compute_api:servers:create:forced_host\","},{"line_number":280,"context_line":"\"os_compute_api:servers:detail:get_all_tenants\","},{"line_number":281,"context_line":"\"os_compute_api:servers:index:get_all_tenants\","},{"line_number":282,"context_line":"\"os_compute_api:servers:allow_all_filters\","},{"line_number":283,"context_line":"\"os_compute_api:servers:show:host_status\","},{"line_number":284,"context_line":"\"os_compute_api:servers:migrations:force_complete\","},{"line_number":285,"context_line":"\"os_compute_api:servers:migrations:delete\","}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_e0ff9d31","line":282,"range":{"start_line":282,"start_character":24,"end_line":282,"end_character":41},"updated":"2018-09-17 22:17:24.000000000","message":"How about \"index:allw_all_filters\" instead of \"allow_all_filters\" for matching the above \"index:get_all_tenants\" for the consistency?","commit_id":"7c56588647be64a2248b1f37d40369765bc6b977"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"109e43113c9917d75f4522e50ab0bb5cc062aaa7","unresolved":false,"context_lines":[{"line_number":279,"context_line":"\"os_compute_api:servers:create:forced_host\","},{"line_number":280,"context_line":"\"os_compute_api:servers:detail:get_all_tenants\","},{"line_number":281,"context_line":"\"os_compute_api:servers:index:get_all_tenants\","},{"line_number":282,"context_line":"\"os_compute_api:servers:allow_all_filters\","},{"line_number":283,"context_line":"\"os_compute_api:servers:show:host_status\","},{"line_number":284,"context_line":"\"os_compute_api:servers:migrations:force_complete\","},{"line_number":285,"context_line":"\"os_compute_api:servers:migrations:delete\","}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_31d2c535","line":282,"range":{"start_line":282,"start_character":24,"end_line":282,"end_character":41},"in_reply_to":"3f79a3b5_e0ff9d31","updated":"2018-09-18 01:38:31.000000000","message":"That would mean adding two separate policies for the same thing - I don\u0027t see a need to differentiate this for index vs detail, as noted earlier in the review.","commit_id":"7c56588647be64a2248b1f37d40369765bc6b977"}],"releasenotes/notes/add-server-restrictedfilters-policy-3ddfe1885056f0ca.yaml":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"be660d47ad4014a61fc99eb956dd80115eb310ed","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new policy rule \"restricted_filters\" to control whether a user can use"},{"line_number":5,"context_line":"    all filters when listing servers. "}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3f79a3b5_ed4c9477","line":5,"range":{"start_line":5,"start_character":37,"end_line":5,"end_character":38},"updated":"2018-08-22 09:09:21.000000000","message":"remove this blank\n\nthen I guess we might want to include the bug here?","commit_id":"0811692e791abd71aa64cf29376e3be2a14b9d5e"}],"releasenotes/notes/add-server-use_all_filters-policy-3ddfe1885056f0ca.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d5608ab3de7181098ab875c5362c5d8aea63de52","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new policy rule \"use_all_filters\" to control whether a user can use"},{"line_number":5,"context_line":"    all filters when listing servers. Fixes bug #1737050"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3f79a3b5_9f4c429e","line":4,"range":{"start_line":4,"start_character":28,"end_line":4,"end_character":43},"updated":"2018-09-13 22:44:54.000000000","message":"Should be the full policy rule name, not just the suffix.","commit_id":"41f38eb4becea03af4d9473ec0a5f2fbfa1d49ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d5608ab3de7181098ab875c5362c5d8aea63de52","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new policy rule \"use_all_filters\" to control whether a user can use"},{"line_number":5,"context_line":"    all filters when listing servers. Fixes bug #1737050"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3f79a3b5_df787ac2","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":8},"updated":"2018-09-13 22:44:54.000000000","message":"This reads like a commit message but release note are published in batch, so there isn\u0027t really context on what \"adds\" is doing - just say a new policy rule is added for blah blah.","commit_id":"41f38eb4becea03af4d9473ec0a5f2fbfa1d49ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d5608ab3de7181098ab875c5362c5d8aea63de52","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new policy rule \"use_all_filters\" to control whether a user can use"},{"line_number":5,"context_line":"    all filters when listing servers. Fixes bug #1737050"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3f79a3b5_3f388eec","line":5,"range":{"start_line":5,"start_character":38,"end_line":5,"end_character":56},"updated":"2018-09-13 22:44:54.000000000","message":"Link to the actual bug, or could just remove this.","commit_id":"41f38eb4becea03af4d9473ec0a5f2fbfa1d49ec"}]}
