)]}'
{"neutron/objects/base.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"57b1f5d9fd64f6f83e956e1f603e829089037a64","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    @abc.abstractmethod"},{"line_number":127,"context_line":"    def get_objects(cls, context,"},{"line_number":128,"context_line":"                    sorts\u003dNone,"},{"line_number":129,"context_line":"                    limit\u003dNone,"},{"line_number":130,"context_line":"                    marker\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_220a7979","line":127,"updated":"2016-03-31 16:10:38.000000000","message":"Need to add some docstring describing the format of kwargs since it\u0027s not obvious now.","commit_id":"f6759398414bb618f1ea4931b682ca94d72f1b91"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"29735015727907513416a1f3870d4081f8ff7bad","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                raise NeutronSyntheticFieldMultipleForeignKeys(field\u003dfield)"},{"line_number":318,"context_line":"            objs \u003d objclass.get_objects("},{"line_number":319,"context_line":"                self._context, **{"},{"line_number":320,"context_line":"                    k: {getattr(self, v)}"},{"line_number":321,"context_line":"                    for k, v in objclass.foreign_keys.items()})"},{"line_number":322,"context_line":"            if isinstance(self.fields[field], obj_fields.ObjectField):"},{"line_number":323,"context_line":"                setattr(self, field, objs[0] if objs else None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_78751262","line":320,"range":{"start_line":320,"start_character":20,"end_line":320,"end_character":40},"updated":"2016-04-01 13:30:50.000000000","message":"Why this change? k: {..}","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0b2707e76f98676b8c373b50157dc42c5a136a2f","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                raise NeutronSyntheticFieldMultipleForeignKeys(field\u003dfield)"},{"line_number":318,"context_line":"            objs \u003d objclass.get_objects("},{"line_number":319,"context_line":"                self._context, **{"},{"line_number":320,"context_line":"                    k: {getattr(self, v)}"},{"line_number":321,"context_line":"                    for k, v in objclass.foreign_keys.items()})"},{"line_number":322,"context_line":"            if isinstance(self.fields[field], obj_fields.ObjectField):"},{"line_number":323,"context_line":"                setattr(self, field, objs[0] if objs else None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_deedff26","line":320,"range":{"start_line":320,"start_character":20,"end_line":320,"end_character":40},"in_reply_to":"ba0121b8_61b27e4d","updated":"2016-04-04 14:45:07.000000000","message":"Added docstring here.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"bd8b71404042a5f1379a83f121ddaa9ce7d18dff","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                raise NeutronSyntheticFieldMultipleForeignKeys(field\u003dfield)"},{"line_number":318,"context_line":"            objs \u003d objclass.get_objects("},{"line_number":319,"context_line":"                self._context, **{"},{"line_number":320,"context_line":"                    k: {getattr(self, v)}"},{"line_number":321,"context_line":"                    for k, v in objclass.foreign_keys.items()})"},{"line_number":322,"context_line":"            if isinstance(self.fields[field], obj_fields.ObjectField):"},{"line_number":323,"context_line":"                setattr(self, field, objs[0] if objs else None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_61b27e4d","line":320,"range":{"start_line":320,"start_character":20,"end_line":320,"end_character":40},"in_reply_to":"ba0121b8_78751262","updated":"2016-04-01 14:02:05.000000000","message":"That\u0027s because now get_objects filter values are sets. This is to reflect filter capabilities provided by API and common_db_mixin.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"ddb92d53a2f88c0864af55bde25afdc6a8716c65","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    @classmethod"},{"line_number":128,"context_line":"    @abc.abstractmethod"},{"line_number":129,"context_line":"    def get_objects(cls, context,"},{"line_number":130,"context_line":"                    sorts\u003dNone,"},{"line_number":131,"context_line":"                    limit\u003dNone,"},{"line_number":132,"context_line":"                    marker\u003dNone,"},{"line_number":133,"context_line":"                    page_reverse\u003dFalse,"},{"line_number":134,"context_line":"                    **kwargs):"},{"line_number":135,"context_line":"        raise NotImplementedError()"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_53c4765e","line":133,"range":{"start_line":130,"start_character":20,"end_line":133,"end_character":39},"updated":"2016-05-23 19:36:07.000000000","message":"I think it would be better to introduce a (e.g.) Pager class and have it passed as a single \u0027pager\u0027 (or even \u0027_pager\u0027) argument instead of these 4. Otherwise it could lead to conflicts with \u0027get_objects\u0027 data model filters from \u0027kwargs\u0027 (e.g. Quota.limit [1]).\n\n[1] https://github.com/openstack/neutron/blob/bf2f1f1f8713b65c0414f1dc2fb955307875735e/neutron/db/quota/models.py#L50","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"49680f26206b612d17331b1e511136fe9182fb30","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    @classmethod"},{"line_number":128,"context_line":"    @abc.abstractmethod"},{"line_number":129,"context_line":"    def get_objects(cls, context,"},{"line_number":130,"context_line":"                    sorts\u003dNone,"},{"line_number":131,"context_line":"                    limit\u003dNone,"},{"line_number":132,"context_line":"                    marker\u003dNone,"},{"line_number":133,"context_line":"                    page_reverse\u003dFalse,"},{"line_number":134,"context_line":"                    **kwargs):"},{"line_number":135,"context_line":"        raise NotImplementedError()"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_1d9ae2c5","line":133,"range":{"start_line":130,"start_character":20,"end_line":133,"end_character":39},"in_reply_to":"bab6814e_53c4765e","updated":"2016-05-24 09:39:34.000000000","message":"That\u0027s a really good catch. Let me see what I can do.","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3563ad41863b9dedb245c2aa3cd95355c239938","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    @classmethod"},{"line_number":274,"context_line":"    def get_objects(cls, context, _pager\u003dNone, **kwargs):"},{"line_number":275,"context_line":"        \"\"\""},{"line_number":276,"context_line":"        This method fetches objects from DB and converts them to versioned"},{"line_number":277,"context_line":"        objects."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        :param context:"},{"line_number":280,"context_line":"        :param _pager: a Pager object representing advanced sorting/pagination"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_405da5e8","line":277,"range":{"start_line":276,"start_character":8,"end_line":277,"end_character":16},"updated":"2016-05-27 15:13:15.000000000","message":"Nit: Doesn\u0027t comply with pep257 :) Should be\n\n Fetch objects from DB and convert them to versioned objects.","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3563ad41863b9dedb245c2aa3cd95355c239938","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        cls.validate_filters(**kwargs)"},{"line_number":286,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":287,"context_line":"            if _pager is not None:"},{"line_number":288,"context_line":"                kwargs[\u0027_pager\u0027] \u003d _pager"},{"line_number":289,"context_line":"            db_objs \u003d obj_db_api.get_objects(context, cls.db_model, **kwargs)"},{"line_number":290,"context_line":"            return [cls._load_object(context, db_obj) for db_obj in db_objs]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_401485f4","line":287,"range":{"start_line":287,"start_character":15,"end_line":287,"end_character":33},"updated":"2016-05-27 15:13:15.000000000","message":"Nit:\n\n if pager:","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e34ddc9e0a7e75128a5d8b0c19ea846b0518f0b8","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        cls.validate_filters(**kwargs)"},{"line_number":286,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":287,"context_line":"            if _pager is not None:"},{"line_number":288,"context_line":"                kwargs[\u0027_pager\u0027] \u003d _pager"},{"line_number":289,"context_line":"            db_objs \u003d obj_db_api.get_objects(context, cls.db_model, **kwargs)"},{"line_number":290,"context_line":"            return [cls._load_object(context, db_obj) for db_obj in db_objs]"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_b812b256","line":287,"updated":"2016-05-24 14:23:08.000000000","message":"this change is probably stale,  you added the _pager as arg of obj_db_api.get_objects","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e95603c2dd3c8fa33b75345c77bdaf9c33774f67","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        cls.validate_filters(**kwargs)"},{"line_number":286,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":287,"context_line":"            if _pager is not None:"},{"line_number":288,"context_line":"                kwargs[\u0027_pager\u0027] \u003d _pager"},{"line_number":289,"context_line":"            db_objs \u003d obj_db_api.get_objects(context, cls.db_model, **kwargs)"},{"line_number":290,"context_line":"            return [cls._load_object(context, db_obj) for db_obj in db_objs]"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_12d0c61e","line":287,"range":{"start_line":287,"start_character":15,"end_line":287,"end_character":33},"in_reply_to":"9abb7d3a_401485f4","updated":"2016-05-30 16:53:55.000000000","message":"Or actually we can pass it always as it can be None:\n\n db_objs \u003d obj_db_api.get_objects(\n     context, cls.db_model, _pager\u003d_pager, **kwargs)","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e8949f00cb44200a39fb07fb6ee31d8ea48bb48f","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        cls.validate_filters(**kwargs)"},{"line_number":286,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":287,"context_line":"            if _pager is not None:"},{"line_number":288,"context_line":"                kwargs[\u0027_pager\u0027] \u003d _pager"},{"line_number":289,"context_line":"            db_objs \u003d obj_db_api.get_objects(context, cls.db_model, **kwargs)"},{"line_number":290,"context_line":"            return [cls._load_object(context, db_obj) for db_obj in db_objs]"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_24721c7d","line":287,"in_reply_to":"bab6814e_81781a91","updated":"2016-05-24 15:03:57.000000000","message":"we agreed to pass the _page explicitly at line 289 if the patch needs a respin.","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0dda6d421ccc241f7e046c212a0dcf6a15abd8f4","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        \"\"\""},{"line_number":285,"context_line":"        cls.validate_filters(**kwargs)"},{"line_number":286,"context_line":"        with db_api.autonested_transaction(context.session):"},{"line_number":287,"context_line":"            if _pager is not None:"},{"line_number":288,"context_line":"                kwargs[\u0027_pager\u0027] \u003d _pager"},{"line_number":289,"context_line":"            db_objs \u003d obj_db_api.get_objects(context, cls.db_model, **kwargs)"},{"line_number":290,"context_line":"            return [cls._load_object(context, db_obj) for db_obj in db_objs]"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_81781a91","line":287,"in_reply_to":"bab6814e_b812b256","updated":"2016-05-24 14:49:49.000000000","message":"Right. But I need to pass it through into the db_api function.","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"39f43080ac256c85d3ebbc90b6b81b4110250de9","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return fields"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class Pager(object):"},{"line_number":73,"context_line":"    \u0027\u0027\u0027"},{"line_number":74,"context_line":"    This class represents a pager object. It is consumed by get_objects to"},{"line_number":75,"context_line":"    specify sorting and pagination criteria."}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_32e4c1aa","line":72,"range":{"start_line":72,"start_character":6,"end_line":72,"end_character":11},"updated":"2016-05-31 12:49:06.000000000","message":"Working on subnetpool integration led me to https://specs.openstack.org/openstack/neutron-specs/specs/mitaka/add-port-timestamp.html#rest-api-impact\n\nWhich basically means that filters are extensible. IIUC it\u0027s done by hooks added to CommonDbPlugin that are tied to model queries (which we encapsulate).\n\nMaybe we should generalize this class to consume \"whatever\" and everything to _get_collection() called on plugin.\n\nIt could be a followup though.","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c46801b1132077977792ce75064277474527f750","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return fields"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class Pager(object):"},{"line_number":73,"context_line":"    \u0027\u0027\u0027"},{"line_number":74,"context_line":"    This class represents a pager object. It is consumed by get_objects to"},{"line_number":75,"context_line":"    specify sorting and pagination criteria."}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_11b25a4c","line":72,"range":{"start_line":72,"start_character":6,"end_line":72,"end_character":11},"in_reply_to":"9abb7d3a_32e4c1aa","updated":"2016-05-31 13:06:42.000000000","message":"Please ignore, this is related to filters and not pager","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"}],"neutron/objects/db/api.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"509227e501a485432b7af30c0295b2f96cbcdb7a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_c2645dba","line":40,"updated":"2016-03-31 16:06:03.000000000","message":"Not sure assuming core plugin here is correct.","commit_id":"f6759398414bb618f1ea4931b682ca94d72f1b91"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"235a878b30a16279781a87e66bfd2371355ec78e","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, marker, limit):"},{"line_number":29,"context_line":"    if marker and limit:"},{"line_number":30,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":31,"context_line":"    return None"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_cfdaf3e7","line":29,"range":{"start_line":29,"start_character":18,"end_line":29,"end_character":23},"updated":"2016-04-19 18:27:20.000000000","message":"is the limit argument only used for the validation?","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5362fd1d4cace7891cc46ea364db8347adffa982","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_3800b333","line":40,"updated":"2016-04-01 15:27:54.000000000","message":"I hate that I need the plugin to call the method. Maybe folks have alternative ideas.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0426f23b5a5a2cd9a420b85af710edd7018a0654","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_b1785091","line":40,"in_reply_to":"9a061dce_9d64434a","updated":"2016-04-04 09:46:26.000000000","message":"There are some \u0027hooks\u0027 inside base plugin code that require plugin instance. We should look at whether we need those hooks. If not, we can indeed tear off some filtering/sorting code from common_db_mixin and make it stateless.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"5c2558ba02b378b3f605cd786ba55bf809ee8f8b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_e3083094","line":40,"in_reply_to":"9a061dce_b1785091","updated":"2016-04-04 14:33:41.000000000","message":"+1 I like this idea","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"235a878b30a16279781a87e66bfd2371355ec78e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_1e8c1ad9","line":40,"in_reply_to":"9a061dce_b1785091","updated":"2016-04-19 18:27:20.000000000","message":"@Ihar are you referring to these hooks?\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/common_db_mixin.py#L169-L170","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0b2707e76f98676b8c373b50157dc42c5a136a2f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_1ecf77b1","line":40,"in_reply_to":"9a061dce_e3083094","updated":"2016-04-04 14:45:07.000000000","message":"I will add a TODO for now and will handle it in a follow up later.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"a0399cdd6ff235ed30112e51c5bf334763b5519c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        **kwargs):"},{"line_number":38,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":39,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":40,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":41,"context_line":"        return plugin._get_collection("},{"line_number":42,"context_line":"            context, model, lambda obj, fields: obj,"},{"line_number":43,"context_line":"            filters\u003dkwargs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_9d64434a","line":40,"in_reply_to":"ba0121b8_3800b333","updated":"2016-04-04 08:40:43.000000000","message":"I\u0027m also not a fan of using plugin... Alternative is to copy-paste or import the needed solution for sorting/filtering/etc...\n\nBTW, does using plugin allow us to integrate with non-db plugins? Maybe using the plugin is not a such a bad idea after all?","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"3a98ba304fd424f70785fe52a962d0cc63f079a6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, marker, limit):"},{"line_number":29,"context_line":"    if marker and limit:"},{"line_number":30,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":31,"context_line":"    return None"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_41d7d7ec","line":29,"range":{"start_line":29,"start_character":18,"end_line":29,"end_character":23},"updated":"2016-04-19 18:44:38.000000000","message":"Is limit required for this function? I only see its reference in the validation.","commit_id":"ebcd9c78bc132986deaae8a8c9a8481d5c445abb"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"3a98ba304fd424f70785fe52a962d0cc63f079a6","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":44,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":45,"context_line":"        filters \u003d _kwargs_to_filters(**kwargs)"},{"line_number":46,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":47,"context_line":"        # TODO(ihrachys): decompose _get_collection from plugin instance"},{"line_number":48,"context_line":"        return plugin._get_collection("},{"line_number":49,"context_line":"            context, model,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a122d0e_a1606ba6","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":52},"updated":"2016-04-19 18:44:38.000000000","message":"Another reason to dislike plugins?\n\nException: Neutron core_plugin not configured!","commit_id":"ebcd9c78bc132986deaae8a8c9a8481d5c445abb"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5c0be3835f45ca7fcd5b930b86c29ba548eb5265","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _kwargs_to_filters(**kwargs):"},{"line_number":35,"context_line":"    return {k: [v]"},{"line_number":36,"context_line":"            for k, v in kwargs.items()}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_edaff227","line":35,"updated":"2016-04-19 20:46:25.000000000","message":"Not overly familiar with this part of the code, but can \u0027v\u0027 ever be a list to begin with in which case it becomes a nested list and if so is this desired? If not we should probably handle the case where v is already a list.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9a9759d6e568004a2aa8f2d210949521821f62ed","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _kwargs_to_filters(**kwargs):"},{"line_number":35,"context_line":"    return {k: [v]"},{"line_number":36,"context_line":"            for k, v in kwargs.items()}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_fe9383a1","line":35,"in_reply_to":"1a122d0e_edaff227","updated":"2016-05-18 17:21:05.000000000","message":"AFAIK we don\u0027t handle it in any special way in common_db_mixin right now. Also, I find it fair to pass user list into database backend if that\u0027s what we are called with.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5c0be3835f45ca7fcd5b930b86c29ba548eb5265","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sorts\u003dNone, limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse,"},{"line_number":42,"context_line":"        **kwargs):"},{"line_number":43,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":44,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":45,"context_line":"        filters \u003d _kwargs_to_filters(**kwargs)"},{"line_number":46,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":47,"context_line":"        # TODO(ihrachys): decompose _get_collection from plugin instance"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_ed2412c6","line":44,"updated":"2016-04-19 20:46:25.000000000","message":"Do we want the call to _get_marker_obj() in a transaction? It appears _get_marker_obj() calls get_object() which is itself in a transaction. Perhaps it doesn\u0027t matter.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"d3208953da2aa1dc7d00034248e133d1ce5ebe5b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sorts\u003dNone, limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse,"},{"line_number":42,"context_line":"        **kwargs):"},{"line_number":43,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":44,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":45,"context_line":"        filters \u003d _kwargs_to_filters(**kwargs)"},{"line_number":46,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":47,"context_line":"        # TODO(ihrachys): decompose _get_collection from plugin instance"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_65fee839","line":44,"in_reply_to":"1a122d0e_ed2412c6","updated":"2016-04-21 16:17:12.000000000","message":"get_object opens a sub-transaction that it\u0027s closed when the method returns. We need a transaction to encompass all the operations performed by get_objects so context.session.begin is needed here.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"70ea2afb476324f2d6e42849241f62c45023428b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, marker, limit):"},{"line_number":29,"context_line":"    if marker and limit:"},{"line_number":30,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":31,"context_line":"    return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_1bfb957a","line":30,"range":{"start_line":30,"start_character":42,"end_line":30,"end_character":44},"updated":"2016-05-20 09:29:00.000000000","message":"should it be more of primary keys way? more then just \u0027id\u0027","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"e185edbc320cc934658a4069d42fe39d08473ee4","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, marker, limit):"},{"line_number":29,"context_line":"    if marker and limit:"},{"line_number":30,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":31,"context_line":"    return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_9cc2d132","line":30,"range":{"start_line":30,"start_character":42,"end_line":30,"end_character":44},"in_reply_to":"bab6814e_1bfb957a","updated":"2016-05-20 13:33:49.000000000","message":"Our marker API assumes just id.","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"2b05e4d66b777622dcb022d208a6e140c5095404","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, marker, limit):"},{"line_number":29,"context_line":"    if marker and limit:"},{"line_number":30,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":31,"context_line":"    return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_1f6b73f2","line":30,"range":{"start_line":30,"start_character":42,"end_line":30,"end_character":44},"in_reply_to":"bab6814e_9cc2d132","updated":"2016-05-20 13:53:35.000000000","message":"If API supports just ID, then it is fine.","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"ed2159642d65ae497d42558e5fdfeb6a5822fc65","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sorts\u003dNone, limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse,"},{"line_number":42,"context_line":"        **kwargs):"},{"line_number":43,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":44,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":45,"context_line":"        filters \u003d _kwargs_to_filters(**kwargs)"},{"line_number":46,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":47,"context_line":"        # TODO(ihrachys): decompose _get_collection from plugin instance"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_b78af118","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":67},"updated":"2016-05-23 18:30:08.000000000","message":"I maybe missing something, but didn\u0027t see this aspect of get_objects() being unit tested. For example something that verifies if marker + limit are given marker_obj is gotten. Is this something that we should cover as part of this patch?","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"49680f26206b612d17331b1e511136fe9182fb30","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sorts\u003dNone, limit\u003dNone, marker\u003dNone, page_reverse\u003dFalse,"},{"line_number":42,"context_line":"        **kwargs):"},{"line_number":43,"context_line":"    with context.session.begin(subtransactions\u003dTrue):"},{"line_number":44,"context_line":"        marker_obj \u003d _get_marker_obj(context, model, marker, limit)"},{"line_number":45,"context_line":"        filters \u003d _kwargs_to_filters(**kwargs)"},{"line_number":46,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":47,"context_line":"        # TODO(ihrachys): decompose _get_collection from plugin instance"}],"source_content_type":"text/x-python","patch_set":13,"id":"bab6814e_fd50be0c","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":67},"in_reply_to":"bab6814e_b78af118","updated":"2016-05-24 09:39:34.000000000","message":"Done","commit_id":"ffe717db1407ebae096df27ae083941c05bcf991"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e34ddc9e0a7e75128a5d8b0c19ea846b0518f0b8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                .first())"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _get_marker_obj(context, model, _pager):"},{"line_number":29,"context_line":"    marker \u003d _pager.marker"},{"line_number":30,"context_line":"    if marker and _pager.limit:"},{"line_number":31,"context_line":"        return get_object(context, model, id\u003dmarker)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_3dc6b416","line":28,"updated":"2016-05-24 14:23:08.000000000","message":"I would avoid another method here and would get the marker in _pager_to_kwargs directly...but that\u0027s a question of taste","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e34ddc9e0a7e75128a5d8b0c19ea846b0518f0b8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    marker \u003d _pager.marker"},{"line_number":30,"context_line":"    if marker and _pager.limit:"},{"line_number":31,"context_line":"        return get_object(context, model, id\u003dmarker)"},{"line_number":32,"context_line":"    return None"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _pager_to_kwargs(context, model, pager):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_5d39f840","line":32,"updated":"2016-05-24 14:23:08.000000000","message":"this line can be removed, as you like","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3563ad41863b9dedb245c2aa3cd95355c239938","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    return None"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _pager_to_kwargs(context, model, pager):"},{"line_number":36,"context_line":"    if pager is None:"},{"line_number":37,"context_line":"        return {}"},{"line_number":38,"context_line":"    kwargs \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_80f5cd84","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":20},"updated":"2016-05-27 15:13:15.000000000","message":"Would it make more sense to have this as Pager.to_kwargs() method?","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3563ad41863b9dedb245c2aa3cd95355c239938","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def _pager_to_kwargs(context, model, pager):"},{"line_number":36,"context_line":"    if pager is None:"},{"line_number":37,"context_line":"        return {}"},{"line_number":38,"context_line":"    kwargs \u003d {"},{"line_number":39,"context_line":"        attr: getattr(pager, attr)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_63ca73a3","line":36,"range":{"start_line":36,"start_character":7,"end_line":36,"end_character":20},"updated":"2016-05-27 15:13:15.000000000","message":"Nit: if not pager:","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f6a9ad53baa79ba72d339f35fa20bef9d139936e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                .first())"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _kwargs_to_filters(**kwargs):"},{"line_number":29,"context_line":"    return {k: [v]"},{"line_number":30,"context_line":"            for k, v in kwargs.items()}"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_de5f2de3","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":22},"updated":"2016-05-31 17:08:40.000000000","message":"candidate for neutron-lib or neutron.common.utils?","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"cbcd5f77c1f131ff3f283fcd7a0504e128fad73f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                .first())"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def _kwargs_to_filters(**kwargs):"},{"line_number":29,"context_line":"    return {k: [v]"},{"line_number":30,"context_line":"            for k, v in kwargs.items()}"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_7763a842","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":22},"in_reply_to":"9abb7d3a_de5f2de3","updated":"2016-06-01 09:36:22.000000000","message":"Sounds good (common.utils), consider it if you need to respin.","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"}],"neutron/objects/qos/policy.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"509227e501a485432b7af30c0295b2f96cbcdb7a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # sure the tenant has permission to access the policy later on."},{"line_number":111,"context_line":"        admin_context \u003d context.elevated()"},{"line_number":112,"context_line":"        with db_api.autonested_transaction(admin_context.session):"},{"line_number":113,"context_line":"            objs \u003d super(QosPolicy, cls).get_objects(admin_context, **kwargs)"},{"line_number":114,"context_line":"            result \u003d []"},{"line_number":115,"context_line":"            for obj in objs:"},{"line_number":116,"context_line":"                if not cls.is_accessible(context, obj):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_025bf5f6","line":113,"updated":"2016-03-31 16:06:03.000000000","message":"unneeded change...","commit_id":"f6759398414bb618f1ea4931b682ca94d72f1b91"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"bd8b71404042a5f1379a83f121ddaa9ce7d18dff","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # sure the tenant has permission to access the policy later on."},{"line_number":111,"context_line":"        admin_context \u003d context.elevated()"},{"line_number":112,"context_line":"        with db_api.autonested_transaction(admin_context.session):"},{"line_number":113,"context_line":"            objs \u003d super(QosPolicy, cls).get_objects(admin_context, **kwargs)"},{"line_number":114,"context_line":"            result \u003d []"},{"line_number":115,"context_line":"            for obj in objs:"},{"line_number":116,"context_line":"                if not cls.is_accessible(context, obj):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_c1870a5f","line":113,"updated":"2016-04-01 14:02:05.000000000","message":"unneeded change","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0b2707e76f98676b8c373b50157dc42c5a136a2f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # sure the tenant has permission to access the policy later on."},{"line_number":111,"context_line":"        admin_context \u003d context.elevated()"},{"line_number":112,"context_line":"        with db_api.autonested_transaction(admin_context.session):"},{"line_number":113,"context_line":"            objs \u003d super(QosPolicy, cls).get_objects(admin_context, **kwargs)"},{"line_number":114,"context_line":"            result \u003d []"},{"line_number":115,"context_line":"            for obj in objs:"},{"line_number":116,"context_line":"                if not cls.is_accessible(context, obj):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_9ebb870e","line":113,"in_reply_to":"ba0121b8_c1870a5f","updated":"2016-04-04 14:45:07.000000000","message":"Done","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"}],"neutron/objects/qos/rule.py":[{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"235a878b30a16279781a87e66bfd2371355ec78e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            rule_cls \u003d getattr(sys.modules[__name__], rule_cls_name)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"            rules \u003d rule_cls.get_objects("},{"line_number":42,"context_line":"                context, qos_policy_id\u003d{qos_policy_id})"},{"line_number":43,"context_line":"            all_rules.extend(rules)"},{"line_number":44,"context_line":"    return all_rules"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_ea3cfdc9","line":42,"range":{"start_line":42,"start_character":39,"end_line":42,"end_character":54},"updated":"2016-04-19 18:27:20.000000000","message":"This change is because you changed the method in the base class -\u003e https://review.openstack.org/#/c/300055/4/neutron/objects/base.py@320 ?","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"}],"neutron/services/qos/qos_plugin.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5c0be3835f45ca7fcd5b930b86c29ba548eb5265","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            limit\u003dlimit,"},{"line_number":86,"context_line":"            marker\u003dmarker,"},{"line_number":87,"context_line":"            page_reverse\u003dpage_reverse,"},{"line_number":88,"context_line":"            **filters)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    #TODO(mangelajo): need to add a proxy catch-all for rules, so"},{"line_number":91,"context_line":"    #           we capture the API function call, and just pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_88d2ac5a","line":88,"updated":"2016-04-19 20:46:25.000000000","message":"If filters is ever None (default) this will obviously raise.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9a9759d6e568004a2aa8f2d210949521821f62ed","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            limit\u003dlimit,"},{"line_number":86,"context_line":"            marker\u003dmarker,"},{"line_number":87,"context_line":"            page_reverse\u003dpage_reverse,"},{"line_number":88,"context_line":"            **filters)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    #TODO(mangelajo): need to add a proxy catch-all for rules, so"},{"line_number":91,"context_line":"    #           we capture the API function call, and just pass"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_9e607737","line":88,"in_reply_to":"1a122d0e_88d2ac5a","updated":"2016-05-18 17:21:05.000000000","message":"Theoretically, yes. Practically, it\u0027s always passed, and the default value if no filters are passed is {} (see api_common.get_filters()). Also it\u0027s not an issue for the patch to solve since it\u0027s present earlier.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5c0be3835f45ca7fcd5b930b86c29ba548eb5265","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                limit\u003dlimit,"},{"line_number":169,"context_line":"                marker\u003dmarker,"},{"line_number":170,"context_line":"                page_reverse\u003dpage_reverse,"},{"line_number":171,"context_line":"                **filters)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":174,"context_line":"    def create_policy_dscp_marking_rule(self, context, policy_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_e8c36087","line":171,"updated":"2016-04-19 20:46:25.000000000","message":"If filters is ever None (default) this will obviously raise.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9a9759d6e568004a2aa8f2d210949521821f62ed","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                limit\u003dlimit,"},{"line_number":169,"context_line":"                marker\u003dmarker,"},{"line_number":170,"context_line":"                page_reverse\u003dpage_reverse,"},{"line_number":171,"context_line":"                **filters)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":174,"context_line":"    def create_policy_dscp_marking_rule(self, context, policy_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_7e65d343","line":171,"in_reply_to":"1a122d0e_e8c36087","updated":"2016-05-18 17:21:05.000000000","message":"ditto","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5c0be3835f45ca7fcd5b930b86c29ba548eb5265","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                limit\u003dlimit,"},{"line_number":246,"context_line":"                marker\u003dmarker,"},{"line_number":247,"context_line":"                page_reverse\u003dpage_reverse,"},{"line_number":248,"context_line":"                **filters)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    # TODO(QoS): enforce rule types when accessing rule objects"},{"line_number":251,"context_line":"    # TODO(QoS): support advanced search and sorting criteria"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_28ba780a","line":248,"updated":"2016-04-19 20:46:25.000000000","message":"If filters is ever None (default) this will obviously raise.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9a9759d6e568004a2aa8f2d210949521821f62ed","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                limit\u003dlimit,"},{"line_number":246,"context_line":"                marker\u003dmarker,"},{"line_number":247,"context_line":"                page_reverse\u003dpage_reverse,"},{"line_number":248,"context_line":"                **filters)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    # TODO(QoS): enforce rule types when accessing rule objects"},{"line_number":251,"context_line":"    # TODO(QoS): support advanced search and sorting criteria"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_de5aff82","line":248,"in_reply_to":"1a122d0e_28ba780a","updated":"2016-05-18 17:21:05.000000000","message":"ditto","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"}],"neutron/tests/unit/objects/db/test_api.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e3563ad41863b9dedb245c2aa3cd95355c239938","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def test_get_objects_pass_marker_obj_when_limit_and_marker_passed(self):"},{"line_number":34,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":35,"context_line":"        model \u003d mock.Mock()"},{"line_number":36,"context_line":"        marker \u003d \u0027fake-marker-id\u0027"},{"line_number":37,"context_line":"        limit \u003d 10"},{"line_number":38,"context_line":"        pager \u003d base.Pager(marker\u003dmarker, limit\u003dlimit)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9abb7d3a_a33a9bcb","line":35,"range":{"start_line":35,"start_character":16,"end_line":35,"end_character":27},"updated":"2016-05-27 15:13:15.000000000","message":"Nit: Mock() consumes some memory (we had issues in the past that UTs consume too much ram). If you test interaction in this test, there is mock.sentinel object designed for that. Though this comment might be just premature optimization :)","commit_id":"181ba6df598d37dbd879f8ce21ea5140ccd9325f"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"cbcd5f77c1f131ff3f283fcd7a0504e128fad73f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with mock.patch.object(plugin, \u0027_get_collection\u0027) as get_collection:"},{"line_number":42,"context_line":"            with mock.patch.object(api, \u0027get_object\u0027) as get_object:"},{"line_number":43,"context_line":"                api.get_objects(ctxt, model, _pager\u003dpager)"},{"line_number":44,"context_line":"        get_object.assert_called_with(ctxt, model, id\u003dmarker)"},{"line_number":45,"context_line":"        get_collection.assert_called_with("},{"line_number":46,"context_line":"            ctxt, model, mock.ANY,"},{"line_number":47,"context_line":"            filters\u003d{},"}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_9d590b38","line":44,"updated":"2016-06-01 09:36:22.000000000","message":"Useless comments: I know that get_collection \u0026 get_object persist after the with context, but I\u0027ve always found it weird and find the usage of those vars inside the indent more natural.","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c66e744aeb456067e6222afa881802744a7a3206","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        with mock.patch.object(plugin, \u0027_get_collection\u0027) as get_collection:"},{"line_number":42,"context_line":"            with mock.patch.object(api, \u0027get_object\u0027) as get_object:"},{"line_number":43,"context_line":"                api.get_objects(ctxt, model, _pager\u003dpager)"},{"line_number":44,"context_line":"        get_object.assert_called_with(ctxt, model, id\u003dmarker)"},{"line_number":45,"context_line":"        get_collection.assert_called_with("},{"line_number":46,"context_line":"            ctxt, model, mock.ANY,"},{"line_number":47,"context_line":"            filters\u003d{},"}],"source_content_type":"text/x-python","patch_set":16,"id":"9abb7d3a_0045b444","line":44,"in_reply_to":"9abb7d3a_9d590b38","updated":"2016-06-01 09:51:27.000000000","message":"I prefer to keep the scope of mock activation as narrow as possible.","commit_id":"5decc850f126d74b89ec79593afcc68b9e8988e6"}],"neutron/tests/unit/objects/qos/test_policy.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"29735015727907513416a1f3870d4081f8ff7bad","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        context_mock.assert_called_once_with()"},{"line_number":66,"context_line":"        self.get_objects.assert_any_call("},{"line_number":67,"context_line":"            admin_context, self._test_class.db_model,"},{"line_number":68,"context_line":"            limit\u003dNone, marker\u003dNone,"},{"line_number":69,"context_line":"            page_reverse\u003dFalse, sorts\u003dNone)"},{"line_number":70,"context_line":"        self._validate_objects(self.db_objs, objs)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_58adaee7","line":68,"updated":"2016-04-01 13:30:50.000000000","message":"can we skip the None args?","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"bd8b71404042a5f1379a83f121ddaa9ce7d18dff","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        context_mock.assert_called_once_with()"},{"line_number":66,"context_line":"        self.get_objects.assert_any_call("},{"line_number":67,"context_line":"            admin_context, self._test_class.db_model,"},{"line_number":68,"context_line":"            limit\u003dNone, marker\u003dNone,"},{"line_number":69,"context_line":"            page_reverse\u003dFalse, sorts\u003dNone)"},{"line_number":70,"context_line":"        self._validate_objects(self.db_objs, objs)"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_21408606","line":68,"in_reply_to":"ba0121b8_58adaee7","updated":"2016-04-01 14:02:05.000000000","message":"we could set it to mock.ANY, but you still need to specify them since that\u0027s what we pass from the object.","commit_id":"af4ce6d24eb632cc92ef794c2e6236119eaf4c1b"}],"neutron/tests/unit/objects/test_base.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"ad68761af6c32c7a56d7d45905176bef8e644d0e","unresolved":false,"context_lines":[{"line_number":631,"context_line":"        obj \u003d self._test_class(self.context, **self.obj_fields[0])"},{"line_number":632,"context_line":"        self.assertRaises(base.NeutronSyntheticFieldMultipleForeignKeys,"},{"line_number":633,"context_line":"                          obj.load_synthetic_db_fields)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"class BaseDbObjectTestCase(_BaseObjectTestCase):"},{"line_number":637,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a122d0e_487b017c","line":634,"updated":"2016-04-21 16:19:53.000000000","message":"let\u0027s add pagination, sort etc. tests here so that are executed for all the objects?","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"9a9759d6e568004a2aa8f2d210949521821f62ed","unresolved":false,"context_lines":[{"line_number":631,"context_line":"        obj \u003d self._test_class(self.context, **self.obj_fields[0])"},{"line_number":632,"context_line":"        self.assertRaises(base.NeutronSyntheticFieldMultipleForeignKeys,"},{"line_number":633,"context_line":"                          obj.load_synthetic_db_fields)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"class BaseDbObjectTestCase(_BaseObjectTestCase):"},{"line_number":637,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_a1dd5e16","line":634,"in_reply_to":"1a122d0e_487b017c","updated":"2016-05-18 17:21:05.000000000","message":"I will add tests that validate that arguments are proxied intact.","commit_id":"e2ae79e5239e2b4d7a17ae6fa5b3fd877336afa1"}]}
