)]}'
{"neutron/db/metering/metering_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f446c6307567f9e3ebf5715913376a180b7da770","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    direction\u003dmetering_label_rule[\u0027direction\u0027],"},{"line_number":128,"context_line":"                    excluded\u003dmetering_label_rule[\u0027excluded\u0027],"},{"line_number":129,"context_line":"                )"},{"line_number":130,"context_line":"                if metering_label_rule.get(\u0027remote_ip_prefix\u0027):"},{"line_number":131,"context_line":"                    rule.remote_ip_prefix \u003d netaddr.IPNetwork("},{"line_number":132,"context_line":"                        metering_label_rule[\u0027remote_ip_prefix\u0027])"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_9a4a7caa","line":130,"updated":"2020-09-22 07:15:13.000000000","message":"to check a key in a dict:\n  if remote_ip_prefix in metering_label_rule","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"1772b27aaa39e84f6858a2e530049643c7a22a78","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    direction\u003dmetering_label_rule[\u0027direction\u0027],"},{"line_number":128,"context_line":"                    excluded\u003dmetering_label_rule[\u0027excluded\u0027],"},{"line_number":129,"context_line":"                )"},{"line_number":130,"context_line":"                if metering_label_rule.get(\u0027remote_ip_prefix\u0027):"},{"line_number":131,"context_line":"                    rule.remote_ip_prefix \u003d netaddr.IPNetwork("},{"line_number":132,"context_line":"                        metering_label_rule[\u0027remote_ip_prefix\u0027])"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_a8457546","line":130,"in_reply_to":"9f560f44_9a4a7caa","updated":"2020-09-22 13:32:11.000000000","message":"We are not just checking if the key exist, but also, if the content of the key is not None.","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9574f4df0dd158e09775fec8c2810a0093500b3b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                    direction\u003dmetering_label_rule[\u0027direction\u0027],"},{"line_number":128,"context_line":"                    excluded\u003dmetering_label_rule[\u0027excluded\u0027],"},{"line_number":129,"context_line":"                )"},{"line_number":130,"context_line":"                if metering_label_rule.get(\u0027remote_ip_prefix\u0027):"},{"line_number":131,"context_line":"                    rule.remote_ip_prefix \u003d netaddr.IPNetwork("},{"line_number":132,"context_line":"                        metering_label_rule[\u0027remote_ip_prefix\u0027])"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_e25e6911","line":130,"in_reply_to":"9f560f44_a8457546","updated":"2020-09-22 14:16:55.000000000","message":"Right!","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"}],"neutron/db/migration/alembic_migrations/versions/victoria/expand/I38991de2b4_source_and_destination_ip_prefix_neutron_metering_rule.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"9c2c0b33ddacb5caf28a6f3290604252c2e7361c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"def upgrade():"},{"line_number":35,"context_line":"    session \u003d sa.orm.Session(bind\u003dop.get_bind())"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":38,"context_line":"        op.add_column(metering_label_rules_table_name,"},{"line_number":39,"context_line":"                      sa.Column(\u0027source_ip_prefix\u0027, sa.String(64)))"},{"line_number":40,"context_line":"        op.add_column(metering_label_rules_table_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_ff6bf71b","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":45},"updated":"2020-08-17 06:18:18.000000000","message":"No need to use this here, just add columnds https://github.com/openstack/neutron/blob/a388701ddfe628e9a5bd16a78422164799b11ef8/neutron/db/migration/alembic_migrations/versions/liberty/expand/1b4c6e320f79_address_scope_support_in_subnetpool.py#L33","commit_id":"410f7671699d66d84feaa63462c1db06c145acaa"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"8d56e2d7d6d94ae5e1978df174d4ff0f733030c6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"def upgrade():"},{"line_number":35,"context_line":"    session \u003d sa.orm.Session(bind\u003dop.get_bind())"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    with session.begin(subtransactions\u003dTrue):"},{"line_number":38,"context_line":"        op.add_column(metering_label_rules_table_name,"},{"line_number":39,"context_line":"                      sa.Column(\u0027source_ip_prefix\u0027, sa.String(64)))"},{"line_number":40,"context_line":"        op.add_column(metering_label_rules_table_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_e84fbfbb","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":45},"in_reply_to":"9f560f44_ff6bf71b","updated":"2020-08-17 10:45:08.000000000","message":"Done","commit_id":"410f7671699d66d84feaa63462c1db06c145acaa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f446c6307567f9e3ebf5715913376a180b7da770","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    op.add_column(metering_label_rules_table_name,"},{"line_number":36,"context_line":"                  sa.Column(\u0027source_ip_prefix\u0027, sa.String(64)))"},{"line_number":37,"context_line":"    op.add_column(metering_label_rules_table_name,"},{"line_number":38,"context_line":"                  sa.Column(\u0027destination_ip_prefix\u0027, sa.String(64)))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_5a02a43f","line":38,"updated":"2020-09-22 07:15:13.000000000","message":"just a comment: we are safe here because \"remote_ip_prefix\" column is also nullable","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"1772b27aaa39e84f6858a2e530049643c7a22a78","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    op.add_column(metering_label_rules_table_name,"},{"line_number":36,"context_line":"                  sa.Column(\u0027source_ip_prefix\u0027, sa.String(64)))"},{"line_number":37,"context_line":"    op.add_column(metering_label_rules_table_name,"},{"line_number":38,"context_line":"                  sa.Column(\u0027destination_ip_prefix\u0027, sa.String(64)))"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_68687db9","line":38,"in_reply_to":"9f560f44_5a02a43f","updated":"2020-09-22 13:32:11.000000000","message":"Exactly. It was required in the API, but for some reason, people created the column on the DB as nullable.","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"}],"neutron/objects/metering.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3896eda3cd79cdf256a965a9238aa8a00718bf86","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # Version 1.0: Initial version"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":"    # Version 2.0: Source and destination field for the metering label rule"},{"line_number":28,"context_line":"    VERSION \u003d \u00272.0\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    db_model \u003d metering_models.MeteringLabelRule"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_d1e3e8d6","line":28,"updated":"2020-09-11 08:26:31.000000000","message":"You should just update L26 and move comment from L27 to above L26.\nBTW. Why not 1.1 version?","commit_id":"1c43797f23705790bb74a6f4fd732bd58ca4b8cf"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"00ea03755627d3df7f759522bddb2053cc7f1509","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # Version 1.0: Initial version"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":"    # Version 2.0: Source and destination field for the metering label rule"},{"line_number":28,"context_line":"    VERSION \u003d \u00272.0\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    db_model \u003d metering_models.MeteringLabelRule"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_dae3fdd6","line":28,"in_reply_to":"9f560f44_d1e3e8d6","updated":"2020-09-11 11:07:02.000000000","message":"I see. Thanks for the hint. \n\nWhy 2.0, and not 1.1. Well, because I assumed that everything that is 1 is the legacy mode, which did not have a schema version, and then we start version 2.0 with the schema version support. It does not make much difference though. I can use 1.1 if you think that it is better.","commit_id":"1c43797f23705790bb74a6f4fd732bd58ca4b8cf"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"c99af49a78d6104a7166eda0a08354cb564df4a7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # Version 1.0: Initial version"},{"line_number":26,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":27,"context_line":"    # Version 2.0: Source and destination field for the metering label rule"},{"line_number":28,"context_line":"    VERSION \u003d \u00272.0\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    db_model \u003d metering_models.MeteringLabelRule"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_ba8289c5","line":28,"in_reply_to":"9f560f44_dae3fdd6","updated":"2020-09-11 11:13:17.000000000","message":"Ops, sorry I confused this with other implementation I am doing for Keystone... So, ignore what I mentioned about schema version...\n\nWell, why not 1.1, I have no explanations :)\nI just put 2 there without much thinking. I can set it to 1.1 though. Just let me know.","commit_id":"1c43797f23705790bb74a6f4fd732bd58ca4b8cf"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f446c6307567f9e3ebf5715913376a180b7da770","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":47,"context_line":"        result \u003d super(MeteringLabelRule, cls).modify_fields_from_db(db_obj)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"remote_ip_prefix\")"},{"line_number":50,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"source_ip_prefix\")"},{"line_number":51,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"destination_ip_prefix\")"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_5a8744b7","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":25},"updated":"2020-09-22 07:15:13.000000000","message":"nit: cls","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"1772b27aaa39e84f6858a2e530049643c7a22a78","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":47,"context_line":"        result \u003d super(MeteringLabelRule, cls).modify_fields_from_db(db_obj)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"remote_ip_prefix\")"},{"line_number":50,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"source_ip_prefix\")"},{"line_number":51,"context_line":"        MeteringLabelRule.ip_field_from_db(result, \"destination_ip_prefix\")"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_087e2169","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":25},"in_reply_to":"9f560f44_5a8744b7","updated":"2020-09-22 13:32:11.000000000","message":"Done","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f446c6307567f9e3ebf5715913376a180b7da770","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    @classmethod"},{"line_number":72,"context_line":"    def ip_field_to_db(cls, result, attribute_name):"},{"line_number":73,"context_line":"        if attribute_name in result:"},{"line_number":74,"context_line":"            result[attribute_name] \u003d cls.filter_to_str(result[attribute_name])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"@base.NeutronObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_5ab0e48b","line":74,"range":{"start_line":74,"start_character":41,"end_line":74,"end_character":54},"updated":"2020-09-22 07:15:13.000000000","message":"Are we going to admit list of IPs?","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"1772b27aaa39e84f6858a2e530049643c7a22a78","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    @classmethod"},{"line_number":72,"context_line":"    def ip_field_to_db(cls, result, attribute_name):"},{"line_number":73,"context_line":"        if attribute_name in result:"},{"line_number":74,"context_line":"            result[attribute_name] \u003d cls.filter_to_str(result[attribute_name])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"@base.NeutronObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":12,"id":"9f560f44_68db5d7c","line":74,"range":{"start_line":74,"start_character":41,"end_line":74,"end_character":54},"in_reply_to":"9f560f44_5ab0e48b","updated":"2020-09-22 13:32:11.000000000","message":"Right now, no. We validate the API input in `MeteringPlugin.validate_metering_label_rule`, and we require the input to be a valid CIDR. Therefore, a list of CIDRs would not work, as we are not parsing the input value.\n\nI am just using the `cls.filter_to_str` because it was already used before.","commit_id":"cce9b91ab685e483bbe78d8469704e8deb43edb5"}]}
