)]}'
{"ironic/api/controllers/v1/port.py":[{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"529a26c7d4d8204dc356609fb577c45a68a759b1","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            # is None here, so we can\u0027t put it in the decorator"},{"line_number":399,"context_line":"            if (not api_utils.allow_node_logical_names() and"},{"line_number":400,"context_line":"                    not uuidutils.is_uuid_like(node)):"},{"line_number":401,"context_line":"                raise exception.NotAcceptable()"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        if fields is None:"},{"line_number":404,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_90289486","line":401,"updated":"2017-04-03 12:23:06.000000000","message":"It appears that two separate checks have been merged together here:\n\n1. A check for if we\u0027re allowed to use node. Which should return a Bad Request for a field that isn\u0027t recognised/allowed.\n\n2. A check for if both node_uuid and node are set. Which should also return a Bad Request or Not Acceptable (I\u0027m not sure which, I think I prefer Bad Request).\n\nI guess that would end up being a behaviour change though :(","commit_id":"601416be703cc7e0da3b1d2af627b3018c816fa5"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"adeb972d8cc209309334da04c47ba35e32df780c","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            # is None here, so we can\u0027t put it in the decorator"},{"line_number":399,"context_line":"            if (not api_utils.allow_node_logical_names() and"},{"line_number":400,"context_line":"                    not uuidutils.is_uuid_like(node)):"},{"line_number":401,"context_line":"                raise exception.NotAcceptable()"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        if fields is None:"},{"line_number":404,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_7ce96718","line":401,"in_reply_to":"dfeb2761_90289486","updated":"2017-04-03 12:26:56.000000000","message":"Yup. This was introduced back at version 1.5, so I guess we just did not know how to do the microversions properly at that point :)","commit_id":"601416be703cc7e0da3b1d2af627b3018c816fa5"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2a12d88c9cdc67c7f63aef7afc56133154cc35df","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        if (pecan.request.version.minor \u003c min_version or"},{"line_number":452,"context_line":"                pecan.request.version.minor \u003e max_version):"},{"line_number":453,"context_line":"            raise endpoint_exc_class()"},{"line_number":454,"context_line":"        for (field, min_ver, max_ver, checker_function,"},{"line_number":455,"context_line":"             exc_class) in args_fields_check or []:"},{"line_number":456,"context_line":"            if not min_ver \u003c\u003d pecan.request.version.minor \u003c max_ver:"},{"line_number":457,"context_line":"                continue"},{"line_number":458,"context_line":"            d \u003d dict(zip(func.__code__.co_varnames, args))"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"            def default_checker_function(value):"},{"line_number":461,"context_line":"                if value is not None:"},{"line_number":462,"context_line":"                    raise exc_class()"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"            if not isinstance(field, list):"},{"line_number":465,"context_line":"                field \u003d [field]"},{"line_number":466,"context_line":"            for f in field:"},{"line_number":467,"context_line":"                (checker_function or default_checker_function)("},{"line_number":468,"context_line":"                    d.get(f, kwargs.get(f)))"},{"line_number":469,"context_line":"        for (field, min_ver, max_ver, checker_function,"},{"line_number":470,"context_line":"             exc_class) in body_fields_check or []:"},{"line_number":471,"context_line":"            if min_ver \u003c\u003d pecan.request.version.minor \u003c\u003d max_ver:"},{"line_number":472,"context_line":"                continue"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"            def default_checker_function(body, field_name):"},{"line_number":475,"context_line":"                if field_name in body:"},{"line_number":476,"context_line":"                    raise exc_class()"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"            if not isinstance(field, list):"},{"line_number":479,"context_line":"                field \u003d [field]"},{"line_number":480,"context_line":"            for f in field:"},{"line_number":481,"context_line":"                (checker_function or default_checker_function)("},{"line_number":482,"context_line":"                    pecan.request.json_body, f)"},{"line_number":483,"context_line":"        return func(*args, **kwargs)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    return wrapper"}],"source_content_type":"text/x-python","patch_set":8,"id":"bff0334d_e5e8c9b3","line":482,"range":{"start_line":454,"start_character":8,"end_line":482,"end_character":47},"updated":"2017-04-11 17:13:37.000000000","message":"need to add a unittest for these bits too.","commit_id":"346f83f4669061eda0c05476e0c50ec4c52ee6af"}],"ironic/tests/unit/api/v1/test_expose.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4b035f322e5a9554c7c0df425cc2a437d8216d2c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    \"\"\"Ensure that all exposed HTTP endpoints call authorize.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        self.skipTest(\u0027just for fun\u0027)"},{"line_number":31,"context_line":"        super(TestExposedAPIMethodsCheckPolicy, self).setUp()"},{"line_number":32,"context_line":"        self.original_method \u003d sys.modules[\u0027ironic.api.expose\u0027].expose"},{"line_number":33,"context_line":"        self.exposed_methods \u003d set()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfeb2761_014a4a26","line":30,"updated":"2017-03-30 17:09:32.000000000","message":"Need to think how to do the testing of this one, as we have a new decorator.","commit_id":"8db5cfceb490fb11f9d1b75208e5af9ebc55d62c"}]}
