)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow testing of neutron extensions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added a subclass of policy_authority to allow Neutron extensions to"},{"line_number":10,"context_line":"be tested with Patrole, with the expectation that these tests would"},{"line_number":11,"context_line":"live in the Neutron extensions or the tempest plugins for the"},{"line_number":12,"context_line":"Neutron extensions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_c644d349","line":9,"range":{"start_line":9,"start_character":54,"end_line":9,"end_character":64},"updated":"2019-07-16 00:37:52.000000000","message":"Do you mean extensions or plugins? We have 2 gates that specifically test Neutron extensions. So I believe this should be plugins.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow testing of neutron extensions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added a subclass of policy_authority to allow Neutron extensions to"},{"line_number":10,"context_line":"be tested with Patrole, with the expectation that these tests would"},{"line_number":11,"context_line":"live in the Neutron extensions or the tempest plugins for the"},{"line_number":12,"context_line":"Neutron extensions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_49d8beed","line":9,"range":{"start_line":9,"start_character":54,"end_line":9,"end_character":64},"in_reply_to":"7faddb67_c644d349","updated":"2019-07-18 23:14:27.000000000","message":"I was thinking extensions because this calls the network extension api [0]. But neutron is pretty loose about what called an extension versus a plugin, so I\u0027m fine with either.\n\nThe two existing gates test only the extensions that are covered by the neutron-tempest-plugin. But there are many neutron plugin/extensions that aren\u0027t - tap-as-a-service, fwaas, etc.\n\n[0] https://developer.openstack.org/api-ref/network/v2/index.html#id5","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added a subclass of policy_authority to allow Neutron extensions to"},{"line_number":10,"context_line":"be tested with Patrole, with the expectation that these tests would"},{"line_number":11,"context_line":"live in the Neutron extensions or the tempest plugins for the"},{"line_number":12,"context_line":"Neutron extensions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Depends-on: I498c637da9dac7605851b2edbbfb302103c3d6a9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_66771fa2","line":11,"range":{"start_line":11,"start_character":19,"end_line":11,"end_character":38},"updated":"2019-07-16 00:37:52.000000000","message":"plugins, as in","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Added a subclass of policy_authority to allow Neutron extensions to"},{"line_number":10,"context_line":"be tested with Patrole, with the expectation that these tests would"},{"line_number":11,"context_line":"live in the Neutron extensions or the tempest plugins for the"},{"line_number":12,"context_line":"Neutron extensions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Depends-on: I498c637da9dac7605851b2edbbfb302103c3d6a9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_0cfc14b3","line":11,"range":{"start_line":11,"start_character":19,"end_line":11,"end_character":38},"in_reply_to":"7faddb67_66771fa2","updated":"2019-07-18 23:14:27.000000000","message":"Fixed","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":11,"context_line":"live in the Neutron extensions or the tempest plugins for the"},{"line_number":12,"context_line":"Neutron extensions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Depends-on: I498c637da9dac7605851b2edbbfb302103c3d6a9"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I13e1b4223cff5efe008cb7207304a51d04e7a6ec"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_8c29e437","line":14,"updated":"2019-07-18 23:14:27.000000000","message":"Also for this to be useful, I need to add patrole to openstack/requirements, do you have any concerns about that?\n\nhttps://review.opendev.org/#/c/670913/","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"86757d8653520925003575394e4af3283e96b608","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f3791382_5509cef2","updated":"2023-03-11 02:12:38.000000000","message":"no activity for long time, and as this repo is almost inactive I will propose it to retire soon but if you would like to maintain it, ping us on #openstack-qa IRC OFTC channel","commit_id":"b468ce7e78e8a70aaf1be011f6fab778941c7702"}],"patrole_tempest_plugin/network_policy_authority.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.service \u003d self.validate_service(service, network_extension)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def validate_service(cls, service, network_extension\u003dNone):"},{"line_number":40,"context_line":"        # Ensure that neutron is available because it contains rule definitions"},{"line_number":41,"context_line":"        # that it\u0027s extensions rely on -- ex admin_only, admin_or_owner, etc"},{"line_number":42,"context_line":"        super(NetworkPolicyAuthority, cls).validate_service(NETWORK_SERVICE)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_e6130f5b","line":39,"range":{"start_line":39,"start_character":30,"end_line":39,"end_character":37},"updated":"2019-07-16 00:37:52.000000000","message":"I don\u0027t believe this has to be here. If you have to provide this positional arg you can rename this as _ (just underscore) which indicates a throwaway variable.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.service \u003d self.validate_service(service, network_extension)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def validate_service(cls, service, network_extension\u003dNone):"},{"line_number":40,"context_line":"        # Ensure that neutron is available because it contains rule definitions"},{"line_number":41,"context_line":"        # that it\u0027s extensions rely on -- ex admin_only, admin_or_owner, etc"},{"line_number":42,"context_line":"        super(NetworkPolicyAuthority, cls).validate_service(NETWORK_SERVICE)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_dee80d7d","line":39,"range":{"start_line":39,"start_character":30,"end_line":39,"end_character":37},"in_reply_to":"7faddb67_e6130f5b","updated":"2019-07-18 23:14:27.000000000","message":"Nope we need two arguments. I need both the name of the repository where the policy in code lives and the alias of the extension as returned the network extension api. Unfortunately, these are often not the same. So for tap-as-a-service for example, I would use service\u003d\"tap-as-a-service\" and network_extension\u003d\"taas\".\n\nI\u0027m thinking that network_extension might better be named something like \u0027net_ext_alias\u0027 though.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        # Ensure that neutron is available because it contains rule definitions"},{"line_number":41,"context_line":"        # that it\u0027s extensions rely on -- ex admin_only, admin_or_owner, etc"},{"line_number":42,"context_line":"        super(NetworkPolicyAuthority, cls).validate_service(NETWORK_SERVICE)"},{"line_number":43,"context_line":"        service \u003d service.lower().strip() if service else None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        admin_mgr \u003d clients.Manager("},{"line_number":46,"context_line":"            credentials.get_configured_admin_credentials())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_460b0323","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":62},"updated":"2019-07-16 00:37:52.000000000","message":"We can remove this.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        # Ensure that neutron is available because it contains rule definitions"},{"line_number":41,"context_line":"        # that it\u0027s extensions rely on -- ex admin_only, admin_or_owner, etc"},{"line_number":42,"context_line":"        super(NetworkPolicyAuthority, cls).validate_service(NETWORK_SERVICE)"},{"line_number":43,"context_line":"        service \u003d service.lower().strip() if service else None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        admin_mgr \u003d clients.Manager("},{"line_number":46,"context_line":"            credentials.get_configured_admin_credentials())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_8c8484d4","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":62},"in_reply_to":"7faddb67_460b0323","updated":"2019-07-18 23:14:27.000000000","message":"Because we\u0027re accepting service from the test developer, I think this check probably should remain for consistency with policy_authority.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # repository"},{"line_number":61,"context_line":"        if network_extension in cls.extension_list \\"},{"line_number":62,"context_line":"            and service not in cls.available_services:"},{"line_number":63,"context_line":"            cls.available_services \u003d cls.available_services + [service]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if network_extension is not None and \\"},{"line_number":66,"context_line":"            (not service or service not in cls.available_services):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_862edb8f","line":63,"range":{"start_line":63,"start_character":63,"end_line":63,"end_character":70},"updated":"2019-07-16 00:37:52.000000000","message":"Wouldn\u0027t this just be NETWORK_SERVICE?","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # repository"},{"line_number":61,"context_line":"        if network_extension in cls.extension_list \\"},{"line_number":62,"context_line":"            and service not in cls.available_services:"},{"line_number":63,"context_line":"            cls.available_services \u003d cls.available_services + [service]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if network_extension is not None and \\"},{"line_number":66,"context_line":"            (not service or service not in cls.available_services):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_feb94978","line":63,"range":{"start_line":63,"start_character":63,"end_line":63,"end_character":70},"in_reply_to":"7faddb67_862edb8f","updated":"2019-07-18 23:14:27.000000000","message":"Nope, I expect the name of the repository. It\u0027s confusing because service \"neutron\" lives in dir \"neutron\", but \"taas\" lives in \"tap-as-a-service\" and \"fwaas\" lives in \"neutron-fwaas\". As far as I can tell there\u0027s no way to map on to the other programmatically. So we rely on the test developer to tell us.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            and service not in cls.available_services:"},{"line_number":63,"context_line":"            cls.available_services \u003d cls.available_services + [service]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if network_extension is not None and \\"},{"line_number":66,"context_line":"            (not service or service not in cls.available_services):"},{"line_number":67,"context_line":"            LOG.debug(\"%s is NOT a valid service.\", service)"},{"line_number":68,"context_line":"            raise rbac_exceptions.RbacInvalidServiceException("},{"line_number":69,"context_line":"                \"%s is NOT a valid service.\" % service)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_462463af","line":66,"range":{"start_line":65,"start_character":8,"end_line":66,"end_character":67},"updated":"2019-07-16 00:37:52.000000000","message":"This condition can be merged with the one on L53. Namely:\n\n    if network_extension is not None:\n        if network_extension not in cls.extension_list:\n            # throw error\n        if not service or service not in cls.available_services:\n            # throw error","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            and service not in cls.available_services:"},{"line_number":63,"context_line":"            cls.available_services \u003d cls.available_services + [service]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if network_extension is not None and \\"},{"line_number":66,"context_line":"            (not service or service not in cls.available_services):"},{"line_number":67,"context_line":"            LOG.debug(\"%s is NOT a valid service.\", service)"},{"line_number":68,"context_line":"            raise rbac_exceptions.RbacInvalidServiceException("},{"line_number":69,"context_line":"                \"%s is NOT a valid service.\" % service)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_21bb40c5","line":66,"range":{"start_line":65,"start_character":8,"end_line":66,"end_character":67},"in_reply_to":"7faddb67_462463af","updated":"2019-07-18 23:14:27.000000000","message":"Actually this should just be removed. Since we have to assume that the service is ok, all we\u0027re doing is checking that we\u0027ve added it to the list above. Good grief.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        if network_extension is not None and \\"},{"line_number":66,"context_line":"            (not service or service not in cls.available_services):"},{"line_number":67,"context_line":"            LOG.debug(\"%s is NOT a valid service.\", service)"},{"line_number":68,"context_line":"            raise rbac_exceptions.RbacInvalidServiceException("},{"line_number":69,"context_line":"                \"%s is NOT a valid service.\" % service)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_261fe75b","line":67,"range":{"start_line":67,"start_character":16,"end_line":67,"end_character":21},"updated":"2019-07-16 00:37:52.000000000","message":"This should be error.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"}],"patrole_tempest_plugin/policy_authority.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3e5d1f2eb6fc42b4219a67e1e1e05406381653ce","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                               if CONF.identity_feature_enabled.api_v3"},{"line_number":133,"context_line":"                               else admin_mgr.identity_services_client)"},{"line_number":134,"context_line":"            services \u003d services_client.list_services()[\u0027services\u0027]"},{"line_number":135,"context_line":"            services_list \u003d [s[\u0027name\u0027] for s in services]"},{"line_number":136,"context_line":"            extensions_client \u003d admin_mgr.network_extensions_client"},{"line_number":137,"context_line":"            extensions \u003d extensions_client.list_extensions()[\u0027extensions\u0027]"},{"line_number":138,"context_line":"            extenstion_list \u003d [e[\u0027alias\u0027] for e in extensions]"},{"line_number":139,"context_line":"            available \u003d services_list + extenstion_list"},{"line_number":140,"context_line":"            cls.available_services \u003d available"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        if not service or service not in cls.available_services:"},{"line_number":143,"context_line":"            LOG.debug(\"%s is NOT a valid service.\", service)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_dc746600","line":140,"range":{"start_line":135,"start_character":12,"end_line":140,"end_character":46},"updated":"2019-05-31 03:34:13.000000000","message":"This sort of thing would be better if it only lived within the Neutron class itself. That would require subclassing PolicyAuthority, overriding this validate_service method in the subclass, then calling the appropriate PolicyAuthority class here: https://github.com/openstack/patrole/blob/5b5f1b1dc72344ba591c554d7c195245e59c17c8/patrole_tempest_plugin/rbac_rule_validation.py#L357\n\nUsing some kind of wrapper that returns either an instance of PolicyAuthority if service !\u003d \u0027network\u0027 or else NetworkPolicyAuthority if service \u003d\u003d \u0027network\u0027, if that makes sense.","commit_id":"187cea1e2f5127cc3d286da35c1006be6396045e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3e5d1f2eb6fc42b4219a67e1e1e05406381653ce","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        if not hasattr(cls, \u0027policy_files\u0027):"},{"line_number":156,"context_line":"            cls.policy_files \u003d collections.defaultdict(list)"},{"line_number":157,"context_line":"            for service in cls.available_services:"},{"line_number":158,"context_line":"                for candidate_path in CONF.patrole.custom_policy_files:"},{"line_number":159,"context_line":"                    path \u003d candidate_path % service"},{"line_number":160,"context_line":"                    for filename in glob.iglob(path):"},{"line_number":161,"context_line":"                        if os.path.isfile(filename):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_9c7b4ef3","line":158,"range":{"start_line":157,"start_character":12,"end_line":158,"end_character":71},"updated":"2019-05-31 03:34:13.000000000","message":"Yeah this is why you\u0027re expanding on the available services so then you even consider the policy files for tap-as-a-service.\n\nThere\u0027s been a lot of discussion on supporting Neutron extensions in the past, and I think that as long as the intention is to simply add the ability to test TaaS with Patrole, but include the Patrole TaaS tests in a separate plugin, then that should be fine.","commit_id":"187cea1e2f5127cc3d286da35c1006be6396045e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if extra_target_data is None:"},{"line_number":105,"context_line":"            extra_target_data \u003d {}"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.service \u003d self.validate_service(service, network_extension\u003dNone)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # Prioritize dynamically searching for policy files over relying on"},{"line_number":110,"context_line":"        # deprecated service-specific policy file locations."}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_2654c7fd","line":107,"range":{"start_line":107,"start_character":54,"end_line":107,"end_character":76},"updated":"2019-07-16 00:37:52.000000000","message":"This doesn\u0027t need to be here.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if extra_target_data is None:"},{"line_number":105,"context_line":"            extra_target_data \u003d {}"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.service \u003d self.validate_service(service, network_extension\u003dNone)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # Prioritize dynamically searching for policy files over relying on"},{"line_number":110,"context_line":"        # deprecated service-specific policy file locations."}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_41be7cb4","line":107,"range":{"start_line":107,"start_character":54,"end_line":107,"end_character":76},"in_reply_to":"7faddb67_2654c7fd","updated":"2019-07-18 23:14:27.000000000","message":"Fixed","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.extra_target_data \u003d extra_target_data"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @classmethod"},{"line_number":120,"context_line":"    def validate_service(cls, service, network_extension\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Validate whether the service passed to ``__init__`` exists.\"\"\""},{"line_number":122,"context_line":"        service \u003d service.lower().strip() if service else None"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_664e3f70","line":120,"range":{"start_line":120,"start_character":39,"end_line":120,"end_character":61},"updated":"2019-07-16 00:37:52.000000000","message":"This doesn\u0027t need to be here.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.extra_target_data \u003d extra_target_data"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @classmethod"},{"line_number":120,"context_line":"    def validate_service(cls, service, network_extension\u003dNone):"},{"line_number":121,"context_line":"        \"\"\"Validate whether the service passed to ``__init__`` exists.\"\"\""},{"line_number":122,"context_line":"        service \u003d service.lower().strip() if service else None"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_e1b0c8df","line":120,"range":{"start_line":120,"start_character":39,"end_line":120,"end_character":61},"in_reply_to":"7faddb67_664e3f70","updated":"2019-07-18 23:14:27.000000000","message":"Fixed","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"}],"patrole_tempest_plugin/rbac_rule_validation.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"def action(service,"},{"line_number":43,"context_line":"           rules\u003dNone,"},{"line_number":44,"context_line":"           expected_error_codes\u003dNone,"},{"line_number":45,"context_line":"           network_extension\u003dNone,"},{"line_number":46,"context_line":"           extra_target_data\u003dNone):"},{"line_number":47,"context_line":"    \"\"\"A decorator for verifying OpenStack policy enforcement."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_4659c332","line":45,"range":{"start_line":45,"start_character":11,"end_line":45,"end_character":28},"updated":"2019-07-16 00:37:52.000000000","message":"This is missing from the :param: list below in the pydoc.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":42,"context_line":"def action(service,"},{"line_number":43,"context_line":"           rules\u003dNone,"},{"line_number":44,"context_line":"           expected_error_codes\u003dNone,"},{"line_number":45,"context_line":"           network_extension\u003dNone,"},{"line_number":46,"context_line":"           extra_target_data\u003dNone):"},{"line_number":47,"context_line":"    \"\"\"A decorator for verifying OpenStack policy enforcement."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_5e7f3daa","line":45,"range":{"start_line":45,"start_character":11,"end_line":45,"end_character":28},"in_reply_to":"7faddb67_4659c332","updated":"2019-07-18 23:14:27.000000000","message":"Good catch!","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f58627169e6183ed4d7d279a8441c31ec80316f7","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    return evaluated_rules, exp_error_codes"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"def _is_authorized(test_obj, service, rule, network_extension,"},{"line_number":316,"context_line":"                   extra_target_data):"},{"line_number":317,"context_line":"    \"\"\"Validates whether current RBAC role has permission to do policy action."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_063f4bb4","line":315,"range":{"start_line":315,"start_character":44,"end_line":315,"end_character":61},"updated":"2019-07-16 00:37:52.000000000","message":"This is missing from the :param: list below in the pydoc.","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"aa29fcf0e167fc6a91f435da430ad0685a790e59","unresolved":false,"context_lines":[{"line_number":312,"context_line":"    return evaluated_rules, exp_error_codes"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"def _is_authorized(test_obj, service, rule, network_extension,"},{"line_number":316,"context_line":"                   extra_target_data):"},{"line_number":317,"context_line":"    \"\"\"Validates whether current RBAC role has permission to do policy action."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_ff66fcba","line":315,"range":{"start_line":315,"start_character":44,"end_line":315,"end_character":61},"in_reply_to":"7faddb67_063f4bb4","updated":"2019-07-18 23:14:27.000000000","message":"Fixed","commit_id":"d27e8e4271a0a32391e054b6e3a760ef30d7346a"}]}
