)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e78151fb72b09c47ed1682582d4442dfbdfe3235","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- Route - implementation done, UT TODO"},{"line_number":13,"context_line":"- IPAllocation, implementation and UT done"},{"line_number":14,"context_line":"- Subnet - TODO"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I3fca197098f24f68ea2b2915851c68dc170e781c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a5de9d1_a8e7f6e2","line":15,"updated":"2016-01-28 20:02:20.000000000","message":"Should this commit depend on I383c59b52adda47fe1f96fb6e99e4c24955690f3 and then remove the IP enum from this commit?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d7cb144af50a7e562e176d618a29c95a642e5792","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- IPAllocation"},{"line_number":13,"context_line":"- Subnet"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO:"},{"line_number":16,"context_line":"- remove modification of arguments when IP and CIDR SQL decorator ready"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Bug: #1541928"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7a1b2928_518613ba","line":15,"updated":"2016-04-11 08:13:15.000000000","message":"Please mark the patch as WIP","commit_id":"bf582f7e7ed434e586aa006a6e52a663f3638b3d"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"d9c956a0de953119359bb4fb369d15089d199bc6","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- IPAllocation"},{"line_number":13,"context_line":"- Subnet"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO:"},{"line_number":16,"context_line":"- remove modification of arguments when IP and CIDR SQL decorator ready"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Bug: #1541928"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7a1b2928_ae89f6cc","line":15,"in_reply_to":"7a1b2928_518613ba","updated":"2016-04-11 12:21:42.000000000","message":"The removal will not be done in this patch, so there is not WIP needed. I guess I have to remove the TODO since the item will be introduce after Subnet OVO adoption.","commit_id":"bf582f7e7ed434e586aa006a6e52a663f3638b3d"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- IPAllocation"},{"line_number":13,"context_line":"- Subnet"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-Bug: #1541928"},{"line_number":16,"context_line":"Change-Id: I3fca197098f24f68ea2b2915851c68dc170e781c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"1a122d0e_96581d8c","line":15,"updated":"2016-04-19 15:13:30.000000000","message":"blueprint needs to be used\nPartially-Implements: blueprint adopt-oslo-versioned-objects-for-db","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"408a7396a857570078243fb552852591e5424a86","unresolved":false,"context_lines":[{"line_number":12,"context_line":"- IPAllocation"},{"line_number":13,"context_line":"- Subnet"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-Bug: #1541928"},{"line_number":16,"context_line":"Change-Id: I3fca197098f24f68ea2b2915851c68dc170e781c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"1a122d0e_48e51dda","line":15,"in_reply_to":"1a122d0e_96581d8c","updated":"2016-04-20 14:11:03.000000000","message":"Done","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"}],"neutron/objects/subnet.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    db_model \u003d models_v2.DNSNameServer"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    fields \u003d {"},{"line_number":32,"context_line":"        \u0027address\u0027: obj_fields.StringField(nullable\u003dFalse),"},{"line_number":33,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":34,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"},{"line_number":35,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_f078d1fa","line":32,"updated":"2016-01-20 14:54:48.000000000","message":"it can be an ip address or a host name, right? I wonder whether oslo.versionedobjects has some support for type variants (so that we can mark the field with both). If not, we should probably implement a new field type for the variant and use it here.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    db_model \u003d models_v2.DNSNameServer"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    fields \u003d {"},{"line_number":32,"context_line":"        \u0027address\u0027: obj_fields.StringField(nullable\u003dFalse),"},{"line_number":33,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":34,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"},{"line_number":35,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_83ebd112","line":32,"in_reply_to":"9a68dd71_f078d1fa","updated":"2016-01-22 14:58:56.000000000","message":"My main concert is how we would like to capture strict host name? FQDN? I did not see support for this in OVO, therefore I have left it for later.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@obj_base.VersionedObjectRegistry.register"},{"line_number":39,"context_line":"class SubnetPoolPrefix(base.NeutronDbObject):"},{"line_number":40,"context_line":"    # Version 1.0: Initial version"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_f09451e9","line":39,"updated":"2016-01-20 14:54:48.000000000","message":"I don\u0027t think this justifies a separate object. Instead, I would put it in a new field named \u0027prefixes\u0027 in SubnetPool object which would merely contain CIDR-typed fields.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@obj_base.VersionedObjectRegistry.register"},{"line_number":39,"context_line":"class SubnetPoolPrefix(base.NeutronDbObject):"},{"line_number":40,"context_line":"    # Version 1.0: Initial version"},{"line_number":41,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_e3e2cd2e","line":39,"in_reply_to":"9a68dd71_f09451e9","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    db_model \u003d models_v2.SubnetPoolPrefix"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    fields \u003d {"},{"line_number":46,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(nullable\u003dFalse),"},{"line_number":47,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.StringField(nullable\u003dFalse)"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_13524f14","line":46,"updated":"2016-01-20 14:54:48.000000000","message":"We should have a special type for CIDR.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    db_model \u003d models_v2.SubnetPoolPrefix"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    fields \u003d {"},{"line_number":46,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(nullable\u003dFalse),"},{"line_number":47,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.StringField(nullable\u003dFalse)"},{"line_number":48,"context_line":"    }"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_23c4658f","line":46,"in_reply_to":"9a68dd71_13524f14","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":60,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":61,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":62,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":63,"context_line":"        \u0027default_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":64,"context_line":"        \u0027min_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":65,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_53b6873e","line":62,"updated":"2016-01-20 14:54:48.000000000","message":"Should have some special type which would be an enum of two possible values.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":60,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":61,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":62,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":63,"context_line":"        \u0027default_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":64,"context_line":"        \u0027min_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":65,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_a33e158a","line":62,"in_reply_to":"9a68dd71_53b6873e","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":61,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":62,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":63,"context_line":"        \u0027default_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":64,"context_line":"        \u0027min_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":65,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":66,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_13eecf22","line":63,"updated":"2016-01-20 14:54:48.000000000","message":"Those fields should also have some limits, so that we don\u0027t have 1000-lengths for prefixes.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":66,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":67,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":68,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":69,"context_line":"        \u0027address_scope_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_133c8f92","line":68,"updated":"2016-01-20 14:54:48.000000000","message":"it\u0027s nullable\u003dTrue in model.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":66,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":67,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":68,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":69,"context_line":"        \u0027address_scope_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_03236157","line":68,"in_reply_to":"9a68dd71_133c8f92","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":67,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":68,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":69,"context_line":"        \u0027address_scope_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_336c339c","line":69,"updated":"2016-01-20 14:54:48.000000000","message":"Should be of UUID type.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":67,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":68,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":69,"context_line":"        \u0027address_scope_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_a3da954a","line":69,"in_reply_to":"9a68dd71_336c339c","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":68,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":69,"context_line":"        \u0027address_scope_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    synthetic_fields \u003d [\u0027prefixes\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_43b2b907","line":70,"range":{"start_line":70,"start_character":9,"end_line":70,"end_character":17},"updated":"2016-01-22 14:58:56.000000000","message":"Changed to list of cidrs","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    synthetic_fields \u003d [\u0027prefixes\u0027]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_73f94bc8","line":73,"updated":"2016-01-20 14:54:48.000000000","message":"I don\u0027t see implementation of the field anywhere.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetPoolPrefix\u0027)"},{"line_number":71,"context_line":"    }"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    synthetic_fields \u003d [\u0027prefixes\u0027]"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_237c651e","line":73,"in_reply_to":"9a68dd71_73f94bc8","updated":"2016-01-22 14:58:56.000000000","message":"What kind of implementation are you talking about? What is the purpose of \u0027synthetic_fields\u0027?","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"@obj_base.VersionedObjectRegistry.register"},{"line_number":77,"context_line":"class SubnetRoute(base.NeutronDbObject):"},{"line_number":78,"context_line":"    # Version 1.0: Initial version"},{"line_number":79,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c95ba82d","line":77,"updated":"2016-01-20 14:54:48.000000000","message":"I think it would be reasonable to rename it into just Route.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"@obj_base.VersionedObjectRegistry.register"},{"line_number":77,"context_line":"class SubnetRoute(base.NeutronDbObject):"},{"line_number":78,"context_line":"    # Version 1.0: Initial version"},{"line_number":79,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_a396153d","line":77,"in_reply_to":"9a68dd71_c95ba82d","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    db_model \u003d models_v2.SubnetRoute"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"},{"line_number":84,"context_line":"        \u0027destination\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027nexthop\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c648778a","line":84,"updated":"2016-01-20 14:54:48.000000000","message":"is it IPAddress type?","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    db_model \u003d models_v2.SubnetRoute"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"},{"line_number":84,"context_line":"        \u0027destination\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027nexthop\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_23d1c5fa","line":84,"in_reply_to":"9a68dd71_c648778a","updated":"2016-01-22 14:58:56.000000000","message":"Changed to IPAddressField","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"},{"line_number":84,"context_line":"        \u0027destination\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027nexthop\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_e6301b0a","line":85,"updated":"2016-01-20 14:54:48.000000000","message":"ditto","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    fields \u003d {"},{"line_number":84,"context_line":"        \u0027destination\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":85,"context_line":"        \u0027nexthop\u0027: obj_fields.StringField(nullable\u003dTrue)"},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_e3d64df0","line":85,"in_reply_to":"9a68dd71_e6301b0a","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    db_model \u003d models_v2.IPAllocationPool"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    fields \u003d {"},{"line_number":97,"context_line":"        \u0027start\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027end\u0027: obj_fields.StringField()"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_467ec7af","line":97,"updated":"2016-01-20 14:54:48.000000000","message":"Should have IPAddressField type","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    db_model \u003d models_v2.IPAllocationPool"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    fields \u003d {"},{"line_number":97,"context_line":"        \u0027start\u0027: obj_fields.StringField(),"},{"line_number":98,"context_line":"        \u0027end\u0027: obj_fields.StringField()"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_a30b758d","line":97,"in_reply_to":"9a68dd71_467ec7af","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":113,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_46f9e74c","line":115,"updated":"2016-01-20 14:54:48.000000000","message":"version type needed","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":113,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c31ea9ba","line":115,"in_reply_to":"9a68dd71_46f9e74c","updated":"2016-01-22 14:58:56.000000000","message":"Added IPVersinEnumField with 4 and 6 (Integers) as valid values.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"},{"line_number":119,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_06c1afe4","line":116,"updated":"2016-01-20 14:54:48.000000000","message":"CIDR type needed","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"},{"line_number":119,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c34c69ca","line":116,"in_reply_to":"9a68dd71_06c1afe4","updated":"2016-01-22 14:58:56.000000000","message":"OVO has already support for that in IPNetworkField type, from netaddr lib.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"},{"line_number":119,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":120,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c6bab76e","line":117,"updated":"2016-01-20 14:54:48.000000000","message":"IPAddress type","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":115,"context_line":"        \u0027ip_version\u0027: obj_fields.IntegerField(),"},{"line_number":116,"context_line":"        \u0027cidr\u0027: obj_fields.StringField(),"},{"line_number":117,"context_line":"        \u0027gateway_ip\u0027: obj_fields.StringField(),"},{"line_number":118,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"},{"line_number":119,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":120,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_83c99128","line":117,"in_reply_to":"9a68dd71_c6bab76e","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027),"},{"line_number":121,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetRoute\u0027),"},{"line_number":122,"context_line":"        \u0027ipv6_ra_mode\u0027: obj_fields.EnumField("},{"line_number":123,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":124,"context_line":"            nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_89105050","line":123,"updated":"2016-01-20 14:54:48.000000000","message":"use IPV6_MODES instead","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027),"},{"line_number":121,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027SubnetRoute\u0027),"},{"line_number":122,"context_line":"        \u0027ipv6_ra_mode\u0027: obj_fields.EnumField("},{"line_number":123,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":124,"context_line":"            nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_63d49dbc","line":123,"in_reply_to":"9a68dd71_89105050","updated":"2016-01-22 14:58:56.000000000","message":"I have created IPV6ModeEnumField for that.\nDone.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":124,"context_line":"            nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":127,"context_line":"            nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_0979c093","line":126,"updated":"2016-01-20 14:54:48.000000000","message":"ditto","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":124,"context_line":"            nullable\u003dTrue),"},{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":127,"context_line":"            nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_03de01dd","line":126,"in_reply_to":"9a68dd71_0979c093","updated":"2016-01-22 14:58:56.000000000","message":"Done","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":127,"context_line":"            nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_c6ecf791","line":128,"updated":"2016-01-20 14:54:48.000000000","message":"We will need to adopt the code that will be uploaded to https://review.openstack.org/#/c/250081/ in a week.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \u0027ipv6_address_mode\u0027: obj_fields.EnumField("},{"line_number":126,"context_line":"            valid_values\u003d[\u0027slaac\u0027, \u0027dhcpv6-stateful\u0027, \u0027dhcpv6-stateless\u0027],"},{"line_number":127,"context_line":"            nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_63eb3d79","line":128,"in_reply_to":"9a68dd71_c6ecf791","updated":"2016-01-22 14:58:56.000000000","message":"Can you elaborate more?","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"f1897cd29b175ad8633fcae7c5f0da558ab047ed","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"},{"line_number":132,"context_line":"                        \u0027shared\u0027]"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_467487fc","line":131,"updated":"2016-01-20 14:54:48.000000000","message":"Those should be implemented.","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1e35ca04221f8dce9f3120fe11aa61e9d1a86f3e","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":129,"context_line":"    }"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"},{"line_number":132,"context_line":"                        \u0027shared\u0027]"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_a39cd50f","line":131,"in_reply_to":"9a68dd71_467487fc","updated":"2016-01-22 14:58:56.000000000","message":"What kind of implementation are you talking about? What is the purpose of \u0027synthetic_fields\u0027?","commit_id":"97a2b392b3f96905285ff5d948e5520c274c6eaa"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    }"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def get_by_id(cls, context, address, subnet_id):"},{"line_number":83,"context_line":"        db_obj \u003d db_api.get_object(context, cls.db_model, address\u003daddress,"},{"line_number":84,"context_line":"                                   subnet_id\u003dsubnet_id)"},{"line_number":85,"context_line":"        if db_obj:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_4ad165f9","line":82,"updated":"2016-01-29 17:26:57.000000000","message":"yep this is how we should handle table with composite primary keys. We should find a way to generalize this and put it in NeutronDbObject since this is not the only class that has composite primary keys.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    }"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def get_by_id(cls, context, address, subnet_id):"},{"line_number":83,"context_line":"        db_obj \u003d db_api.get_object(context, cls.db_model, address\u003daddress,"},{"line_number":84,"context_line":"                                   subnet_id\u003dsubnet_id)"},{"line_number":85,"context_line":"        if db_obj:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_946c2909","line":82,"in_reply_to":"7a5de9d1_4ad165f9","updated":"2016-02-01 14:14:33.000000000","message":"I will put TODO, to remember the case.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            db_obj \u003d db_api.get_object(self._context, self.db_model,"},{"line_number":96,"context_line":"                                       address\u003dself.address,"},{"line_number":97,"context_line":"                                       subnet_id\u003dself.subnet_id)"},{"line_number":98,"context_line":"            db_obj.update(updates)"},{"line_number":99,"context_line":"            db_obj.save(session\u003dself._context.session)"},{"line_number":100,"context_line":"            self.from_db_object(self, db_obj)"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_0aa60d53","line":98,"updated":"2016-01-29 17:26:57.000000000","message":"you are doing the same operations as the super class method, call update and then save. Why did you have to override it? The only part you are skipping is:\n\n        kwargs \u003d {}\n        if key:\n            kwargs[\u0027key\u0027] \u003d key\n        db_obj \u003d _safe_get_object(context, model, id,\n                                  **kwargs)\n\nbut can\u0027t see a problem here. Also be aware that you are not starting a subtransaction here","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            db_obj \u003d db_api.get_object(self._context, self.db_model,"},{"line_number":96,"context_line":"                                       address\u003dself.address,"},{"line_number":97,"context_line":"                                       subnet_id\u003dself.subnet_id)"},{"line_number":98,"context_line":"            db_obj.update(updates)"},{"line_number":99,"context_line":"            db_obj.save(session\u003dself._context.session)"},{"line_number":100,"context_line":"            self.from_db_object(self, db_obj)"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_2ae2ac2f","line":98,"in_reply_to":"7a5de9d1_0aa60d53","updated":"2016-02-01 14:14:33.000000000","message":"Update method is overridden because in line 95-97 the key is set to multiple values: address and subnet_id.\nThanks for the subtraction here, I have missed it.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            db_obj.save(session\u003dself._context.session)"},{"line_number":100,"context_line":"            self.from_db_object(self, db_obj)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete(self):"},{"line_number":103,"context_line":"        with self._context.session.begin(subtransactions\u003dTrue):"},{"line_number":104,"context_line":"            db_obj \u003d db_api.get_object(self._context, self.db_model,"},{"line_number":105,"context_line":"                                       address\u003dself.address,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_ad76f3a1","line":102,"updated":"2016-01-29 17:26:57.000000000","message":"ditto","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            db_obj.save(session\u003dself._context.session)"},{"line_number":100,"context_line":"            self.from_db_object(self, db_obj)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete(self):"},{"line_number":103,"context_line":"        with self._context.session.begin(subtransactions\u003dTrue):"},{"line_number":104,"context_line":"            db_obj \u003d db_api.get_object(self._context, self.db_model,"},{"line_number":105,"context_line":"                                       address\u003dself.address,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_8a408008","line":102,"in_reply_to":"7a5de9d1_ad76f3a1","updated":"2016-02-01 14:14:33.000000000","message":"I had to delete object with composite primary key.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":119,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":120,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":121,"context_line":"        \u0027ip_version\u0027: IPVersionEnumField(),"},{"line_number":122,"context_line":"        \u0027default_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":123,"context_line":"        \u0027min_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":124,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_0dbaa70a","line":121,"updated":"2016-01-29 17:26:57.000000000","message":"tbh this seems a bit an overkill to me, it can be define simply as integer. Adding 4 classes to manage this fields add complexity and I can\u0027t see what it brings. If we really want to we can create one class IPVersionField, that accepts only 4 and 6 as versions but again, can\u0027t see what we gain","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":120,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":121,"context_line":"        \u0027ip_version\u0027: IPVersionEnumField(),"},{"line_number":122,"context_line":"        \u0027default_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":123,"context_line":"        \u0027min_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":124,"context_line":"        \u0027max_prefixlen\u0027: obj_fields.IntegerField(nullable\u003dFalse),"},{"line_number":125,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_2d98c377","line":122,"updated":"2016-01-29 17:26:57.000000000","message":"nullable is false by default...no need to specify it","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(nullable\u003dFalse),"},{"line_number":127,"context_line":"        \u0027default_quota\u0027: obj_fields.IntegerField(nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027address_scope_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":129,"context_line":"        \u0027prefixes\u0027: obj_fields.ListOfObjectsField(obj_fields.IPNetworkField)"},{"line_number":130,"context_line":"    }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    synthetic_fields \u003d [\u0027prefixes\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_edd94b23","line":129,"updated":"2016-01-29 17:26:57.000000000","message":"not sure about this one","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @staticmethod"},{"line_number":151,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":152,"context_line":"        if \u0027destination\u0027 in fields:"},{"line_number":153,"context_line":"            fields[\u0027destination\u0027] \u003d str(fields[\u0027destination\u0027])"},{"line_number":154,"context_line":"        if \u0027nexthop\u0027 in fields:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_6d423b6a","line":151,"updated":"2016-01-29 17:26:57.000000000","message":"I faced the same issue...\"Error binding parameter\" . Anyway this is hacky. We should fix the way Nova does, that is defining them like it\u0027s done in nova/db/sqlalchemy/types . In the meanwhile I\u0027d use StringField , put a TODO and avoid this work-arounds","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @staticmethod"},{"line_number":151,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":152,"context_line":"        if \u0027destination\u0027 in fields:"},{"line_number":153,"context_line":"            fields[\u0027destination\u0027] \u003d str(fields[\u0027destination\u0027])"},{"line_number":154,"context_line":"        if \u0027nexthop\u0027 in fields:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_effca3b9","line":151,"in_reply_to":"7a5de9d1_6d423b6a","updated":"2016-02-01 14:14:33.000000000","message":"I\u0027m thinking about removing this workaround after creating the custom type decorator. This would be less complicated then now using the string value - in this OVO use case.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            db_obj[\u0027end\u0027] \u003d db_obj[\u0027last_ip\u0027]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @staticmethod"},{"line_number":218,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":219,"context_line":"        if \u0027start\u0027 in fields:"},{"line_number":220,"context_line":"            fields[\u0027first_ip\u0027] \u003d str(fields[\u0027start\u0027])"},{"line_number":221,"context_line":"            del fields[\u0027start\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_58a37f00","line":218,"updated":"2016-01-29 17:26:57.000000000","message":"ditto regarding this hacks","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            db_obj[\u0027end\u0027] \u003d db_obj[\u0027last_ip\u0027]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @staticmethod"},{"line_number":218,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":219,"context_line":"        if \u0027start\u0027 in fields:"},{"line_number":220,"context_line":"            fields[\u0027first_ip\u0027] \u003d str(fields[\u0027start\u0027])"},{"line_number":221,"context_line":"            del fields[\u0027start\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_124a8626","line":218,"in_reply_to":"7a5de9d1_58a37f00","updated":"2016-02-01 14:14:33.000000000","message":"This hack is changing the naming: \u0027first_ip\u0027 in DB is \u0027start\u0027 field in OVO. I have done this, because the subnet RPC message has \u0027start\u0027 in dict.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e78151fb72b09c47ed1682582d4442dfbdfe3235","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":282,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":283,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":284,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":285,"context_line":"        \u0027ip_version\u0027: IPVersionEnumField(),"},{"line_number":286,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":287,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_720a4c23","line":284,"range":{"start_line":284,"start_character":46,"end_line":284,"end_character":59},"updated":"2016-01-28 20:02:20.000000000","message":"Is this field nullable?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":282,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":283,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":284,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":285,"context_line":"        \u0027ip_version\u0027: IPVersionEnumField(),"},{"line_number":286,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":287,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_bfedcbb8","line":284,"range":{"start_line":284,"start_character":46,"end_line":284,"end_character":59},"in_reply_to":"7a5de9d1_720a4c23","updated":"2016-02-01 14:14:33.000000000","message":"If there is no subnetpool then this field is null.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e78151fb72b09c47ed1682582d4442dfbdfe3235","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027),"},{"line_number":289,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":290,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027),"},{"line_number":291,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027),"},{"line_number":292,"context_line":"        \u0027ipv6_ra_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":293,"context_line":"        \u0027ipv6_address_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":294,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_72a6cc11","line":291,"range":{"start_line":291,"start_character":9,"end_line":291,"end_character":20},"updated":"2016-01-28 20:02:20.000000000","message":"Should this be routes and the list of type \"SubnetRoute\"?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e78151fb72b09c47ed1682582d4442dfbdfe3235","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027),"},{"line_number":292,"context_line":"        \u0027ipv6_ra_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":293,"context_line":"        \u0027ipv6_address_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":294,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":295,"context_line":"    }"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_32c6149b","line":294,"updated":"2016-01-28 20:02:20.000000000","message":"I didn\u0027t see this in the model in my view. Can you elaborate what this is for?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027),"},{"line_number":292,"context_line":"        \u0027ipv6_ra_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":293,"context_line":"        \u0027ipv6_address_mode\u0027: IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":294,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField()"},{"line_number":295,"context_line":"    }"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_ff534369","line":294,"in_reply_to":"7a5de9d1_32c6149b","updated":"2016-02-01 14:14:33.000000000","message":"The shared field is returned by db_base_plugin_v2 so I have put it in here. The \u0027shared\u0027 value is calculated in neutron/db/db_base_plugin_common.py in _make_subnet_dict. The value is based on subnet\u0027s network state. I will remove the shared value for next patch.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                [pool.to_dict() for pool in dict_[\u0027allocation_pools\u0027]]"},{"line_number":305,"context_line":"        return dict_"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":308,"context_line":"        if attrname !\u003d \u0027rules\u0027:"},{"line_number":309,"context_line":"            raise n_exc.ObjectActionError("},{"line_number":310,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_f88b4b66","line":307,"updated":"2016-01-29 17:26:57.000000000","message":"copy/paste?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                [pool.to_dict() for pool in dict_[\u0027allocation_pools\u0027]]"},{"line_number":305,"context_line":"        return dict_"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def obj_load_attr(self, attrname):"},{"line_number":308,"context_line":"        if attrname !\u003d \u0027rules\u0027:"},{"line_number":309,"context_line":"            raise n_exc.ObjectActionError("},{"line_number":310,"context_line":"                action\u003d\u0027obj_load_attr\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_320ea2e5","line":307,"in_reply_to":"7a5de9d1_f88b4b66","updated":"2016-02-01 14:14:33.000000000","message":"yes, it was copied and not changed ;)","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            self.reload_rules()"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    @classmethod"},{"line_number":317,"context_line":"    def get_subnets(cls, context, filters\u003dNone):"},{"line_number":318,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":319,"context_line":"        subnets \u003d plugin.get_subnets(context, filters)"},{"line_number":320,"context_line":"        LOG.debug(\"Subnet fetch from db: {0}\".format(subnets))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_d8e52f38","line":317,"updated":"2016-01-29 17:26:57.000000000","message":"this should be get_objects right?","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        LOG.debug(\"Subnet fetch from db: {0}\".format(subnets))"},{"line_number":321,"context_line":"        subnet_objs \u003d []"},{"line_number":322,"context_line":"        for subnet in subnets:"},{"line_number":323,"context_line":"            subnet[\u0027allocation_pools\u0027] \u003d IPAllocationPool.get_objects("},{"line_number":324,"context_line":"                context, subnet_id\u003dsubnet[\u0027id\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"            subnet[\u0027dns_nameservers\u0027] \u003d DNSNameServer.get_objects("}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_580dbfe6","line":323,"updated":"2016-01-29 17:26:57.000000000","message":"look at https://review.openstack.org/#/c/253641/4/neutron/objects/port/port.py load_synthetic_fields ...I can make it more general and move it to a common place so that you can reuse it. So we can avoid all these methods doing the same stuff","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        LOG.debug(\"Subnet fetch from db: {0}\".format(subnets))"},{"line_number":321,"context_line":"        subnet_objs \u003d []"},{"line_number":322,"context_line":"        for subnet in subnets:"},{"line_number":323,"context_line":"            subnet[\u0027allocation_pools\u0027] \u003d IPAllocationPool.get_objects("},{"line_number":324,"context_line":"                context, subnet_id\u003dsubnet[\u0027id\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"            subnet[\u0027dns_nameservers\u0027] \u003d DNSNameServer.get_objects("}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_52a1de44","line":323,"in_reply_to":"7a5de9d1_580dbfe6","updated":"2016-02-01 14:14:33.000000000","message":"Yes, the load_synthetic_fields looks promising. I will try to consume it and see how it is working.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"b2728e2c01a9be28b077b122592b579aead89b69","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            return obj"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _save_get_object(self):"},{"line_number":95,"context_line":"        # TODO(korzen) find a better way of handling the composite primary keys"},{"line_number":96,"context_line":"        db_obj \u003d db_api.get_object(self._context, self.db_model,"},{"line_number":97,"context_line":"                                   address\u003dself.address,"},{"line_number":98,"context_line":"                                   subnet_id\u003dself.subnet_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a5de9d1_2ab57b7d","line":95,"updated":"2016-02-02 18:20:13.000000000","message":"yep we should find a general way to handle composite key in get_objects so then we don\u0027t need to override update and delete. Introducing this mechanism should be the next step.","commit_id":"cae9b1c41ae0026fe55dcdbdd140aef3d0537046"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"b2728e2c01a9be28b077b122592b579aead89b69","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    }"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @staticmethod"},{"line_number":168,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":169,"context_line":"        if \u0027destination\u0027 in fields:"},{"line_number":170,"context_line":"            fields[\u0027destination\u0027] \u003d str(fields[\u0027destination\u0027])"},{"line_number":171,"context_line":"        if \u0027nexthop\u0027 in fields:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a5de9d1_ea0be329","line":168,"updated":"2016-02-02 18:20:13.000000000","message":"here we need another TODO to get rid of it when we can handle the IPNetworkField and IPAddressField properly :)","commit_id":"cae9b1c41ae0026fe55dcdbdd140aef3d0537046"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"b2728e2c01a9be28b077b122592b579aead89b69","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    }"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @staticmethod"},{"line_number":228,"context_line":"    def _modify_fields_from_db(db_obj):"},{"line_number":229,"context_line":"        if \u0027first_ip\u0027 in db_obj:"},{"line_number":230,"context_line":"            db_obj[\u0027start\u0027] \u003d db_obj[\u0027first_ip\u0027]"},{"line_number":231,"context_line":"        if \u0027last_ip\u0027 in db_obj:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a5de9d1_ed53fd6a","line":228,"updated":"2016-02-02 18:20:13.000000000","message":"I see that those fields name is changed in _make_subnet_dict ...I think that in the long term we want to use the same name for the object field and for the table in the db. In the meanwhile we should make sure that we are backward compatible. Anyway instead of adding this new method why not overriding from_db_object ? I guess it could spare you to override update and it\u0027s cleaner","commit_id":"cae9b1c41ae0026fe55dcdbdd140aef3d0537046"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"b2728e2c01a9be28b077b122592b579aead89b69","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            db_obj[\u0027end\u0027] \u003d db_obj[\u0027last_ip\u0027]"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @staticmethod"},{"line_number":235,"context_line":"    def _modify_fields_to_db(fields):"},{"line_number":236,"context_line":"        if \u0027start\u0027 in fields:"},{"line_number":237,"context_line":"            fields[\u0027first_ip\u0027] \u003d str(fields[\u0027start\u0027])"},{"line_number":238,"context_line":"            del fields[\u0027start\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a5de9d1_ad92e5f4","line":235,"updated":"2016-02-02 18:20:13.000000000","message":"we should create a method in NeutronDbObject to be able to modify the fields before writing in the DB. To make it more general I don\u0027t think this is the only case.","commit_id":"cae9b1c41ae0026fe55dcdbdd140aef3d0537046"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"b2728e2c01a9be28b077b122592b579aead89b69","unresolved":false,"context_lines":[{"line_number":323,"context_line":"                        dict_[field].to_dict() if dict_[field] else None)"},{"line_number":324,"context_line":"        return dict_"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def reload_allocation_pools(self):"},{"line_number":327,"context_line":"        allocation_pools \u003d IPAllocationPool.get_objects(self._context,"},{"line_number":328,"context_line":"                                                        subnet_id\u003dstr(self.id))"},{"line_number":329,"context_line":"        setattr(self, \u0027allocation_pools\u0027, allocation_pools)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a5de9d1_0d3779e4","line":326,"updated":"2016-02-02 18:20:13.000000000","message":"I will move the work I have done for synthetic field in a common place so that you can use it here :)","commit_id":"cae9b1c41ae0026fe55dcdbdd140aef3d0537046"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":11,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"#    under the License."},{"line_number":13,"context_line":"import netaddr"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log"},{"line_number":16,"context_line":"from oslo_versionedobjects import base as obj_base"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_0c081527","line":13,"updated":"2016-04-08 00:19:09.000000000","message":"nit: Don\u0027t you have to add an extra line after the header?","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":11,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"#    under the License."},{"line_number":13,"context_line":"import netaddr"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log"},{"line_number":16,"context_line":"from oslo_versionedobjects import base as obj_base"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_c357ec24","line":13,"in_reply_to":"9a061dce_0c081527","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":99,"context_line":"        \u0027start\u0027: obj_fields.IPAddressField(),"},{"line_number":100,"context_line":"        \u0027end\u0027: obj_fields.IPAddressField()"},{"line_number":101,"context_line":"    }"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @classmethod"},{"line_number":104,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_0c5775ca","line":101,"updated":"2016-04-08 00:19:09.000000000","message":"Is the \"available_ranges\" a synthetic field?","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":99,"context_line":"        \u0027start\u0027: obj_fields.IPAddressField(),"},{"line_number":100,"context_line":"        \u0027end\u0027: obj_fields.IPAddressField()"},{"line_number":101,"context_line":"    }"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @classmethod"},{"line_number":104,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_7e403336","line":101,"in_reply_to":"9a061dce_0c5775ca","updated":"2016-04-08 13:45:05.000000000","message":"I would suggest to add it in follow up patch introducing the available_ranges OVO. I need to find in core Neutron how it is used with IP allocations...","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    fields \u003d {"},{"line_number":132,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":133,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_0c25b55a","line":133,"range":{"start_line":133,"start_character":41,"end_line":133,"end_character":44},"updated":"2016-04-08 00:19:09.000000000","message":"nullable\u003dTrue","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    fields \u003d {"},{"line_number":132,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":133,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_3e7b5b7d","line":133,"range":{"start_line":133,"start_character":41,"end_line":133,"end_character":44},"in_reply_to":"9a061dce_0c25b55a","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":133,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":137,"context_line":"        \u0027ip_version\u0027: common_types.IpProtocolEnumField,"},{"line_number":138,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_0caad584","line":135,"range":{"start_line":135,"start_character":42,"end_line":135,"end_character":45},"updated":"2016-04-08 00:19:09.000000000","message":"nullable\u003dTrue","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":133,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":137,"context_line":"        \u0027ip_version\u0027: common_types.IpProtocolEnumField,"},{"line_number":138,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_1e801746","line":135,"range":{"start_line":135,"start_character":42,"end_line":135,"end_character":45},"in_reply_to":"9a061dce_0caad584","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":137,"context_line":"        \u0027ip_version\u0027: common_types.IpProtocolEnumField,"},{"line_number":138,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":139,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"},{"line_number":140,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_5716164c","line":137,"range":{"start_line":137,"start_character":54,"end_line":137,"end_character":55},"updated":"2016-04-08 00:19:09.000000000","message":"\u0027ip_version\u0027: common_types.IpProtocolEnumField(),\n\nObjectFieldInvalid: Field ip_version of Subnet is not an instance of Field","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":135,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(),"},{"line_number":136,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":137,"context_line":"        \u0027ip_version\u0027: common_types.IpProtocolEnumField,"},{"line_number":138,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":139,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"},{"line_number":140,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_7e95d386","line":137,"range":{"start_line":137,"start_character":54,"end_line":137,"end_character":55},"in_reply_to":"9a061dce_5716164c","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":143,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"},{"line_number":144,"context_line":"                                                         nullable\u003dTrue),"},{"line_number":145,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027, nullable\u003dTrue),"},{"line_number":146,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_8cac258d","line":145,"range":{"start_line":145,"start_character":9,"end_line":145,"end_character":20},"updated":"2016-04-08 00:19:09.000000000","message":"s/host_routes/routes ?","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":143,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"},{"line_number":144,"context_line":"                                                         nullable\u003dTrue),"},{"line_number":145,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027, nullable\u003dTrue),"},{"line_number":146,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_bec76b63","line":145,"range":{"start_line":145,"start_character":9,"end_line":145,"end_character":20},"in_reply_to":"9a061dce_8cac258d","updated":"2016-04-08 13:45:05.000000000","message":"host_routes are used in core Neutron in _make_subnet_dict in:\nhttps://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_common.py#L117","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_8cf1c597","line":149,"updated":"2016-04-08 00:19:09.000000000","message":"foreign_keys \u003d {\"network_id\": \"id\"}","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_9ec42760","line":149,"in_reply_to":"9a061dce_8cf1c597","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_4c7fad14","line":150,"range":{"start_line":150,"start_character":23,"end_line":150,"end_character":25},"updated":"2016-04-08 00:19:09.000000000","message":"is is \"subnetpool\" another synthetic field?","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_de921f4b","line":150,"range":{"start_line":150,"start_character":23,"end_line":150,"end_character":25},"in_reply_to":"9a061dce_4c7fad14","updated":"2016-04-08 13:45:05.000000000","message":"I need to see how it is used in core Neutron. Maybe we can add it in usage of Subnet OVO patch?","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d7cb144af50a7e562e176d618a29c95a642e5792","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.objects import base"},{"line_number":22,"context_line":"from neutron.objects import common_types"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a1b2928_31443773","line":24,"updated":"2016-04-11 08:13:15.000000000","message":"this is not used","commit_id":"bf582f7e7ed434e586aa006a6e52a663f3638b3d"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"d9c956a0de953119359bb4fb369d15089d199bc6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.objects import base"},{"line_number":22,"context_line":"from neutron.objects import common_types"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a1b2928_21ee978b","line":24,"in_reply_to":"7a1b2928_31443773","updated":"2016-04-11 12:21:42.000000000","message":"Done","commit_id":"bf582f7e7ed434e586aa006a6e52a663f3638b3d"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    fields \u003d {"},{"line_number":36,"context_line":"        \u0027address\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":38,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"},{"line_number":39,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_1ba9d624","line":36,"updated":"2016-04-19 15:13:30.000000000","message":"should this be a StringField?","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"408a7396a857570078243fb552852591e5424a86","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    foreign_keys \u003d {\u0027subnet_id\u0027: \u0027id\u0027}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    fields \u003d {"},{"line_number":36,"context_line":"        \u0027address\u0027: obj_fields.StringField(),"},{"line_number":37,"context_line":"        \u0027subnet_id\u0027: obj_fields.UUIDField(),"},{"line_number":38,"context_line":"        \u0027order\u0027: obj_fields.IntegerField()"},{"line_number":39,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_b346e24c","line":36,"in_reply_to":"1a122d0e_1ba9d624","updated":"2016-04-20 14:11:03.000000000","message":"The address can be the hostname or IP address, so I have used the string field. I would need to see how it will be introduced to Neutron core code. I\u0027ve seen that API is allowing the hostname or IP, but the db_base_plugin is validating the address as IPAddress in [1]\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_v2.py#L499","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    foreign_keys \u003d {\u0027network_id\u0027: \u0027id\u0027}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_db0e3e3a","line":150,"updated":"2016-04-19 15:13:30.000000000","message":"I don\u0027t think this is needed since Subnet is not used as Object Field in another object class","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"408a7396a857570078243fb552852591e5424a86","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    foreign_keys \u003d {\u0027network_id\u0027: \u0027id\u0027}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @classmethod"},{"line_number":153,"context_line":"    def modify_fields_from_db(cls, db_obj):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_98f77e58","line":150,"in_reply_to":"1a122d0e_db0e3e3a","updated":"2016-04-20 14:11:03.000000000","message":"The Subnet is synthetic field in Network OVO [1]\n\n[1] https://review.openstack.org/#/c/269658/3/neutron/objects/network.py@66","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"720d8eb355e97e40ed650a74769c7470e25ac32a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":131,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":132,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":133,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_791892d3","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":56},"updated":"2016-04-20 15:41:41.000000000","message":"Is there a case where network_id is null?","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"7fb31a743cd1381f4431fc93e6d3cedd65b693a4","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":131,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":132,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":133,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_50cdb72f","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":56},"in_reply_to":"1a122d0e_4905fe0e","updated":"2016-05-11 13:34:27.000000000","message":"From operational point of view we can say that subnet without a network is useless. I will change. Thanks.","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"9cfc43459a26c8ad64063d91684738413a5fe485","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":131,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":132,"context_line":"        \u0027name\u0027: obj_fields.StringField(),"},{"line_number":133,"context_line":"        \u0027network_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_4905fe0e","line":133,"range":{"start_line":133,"start_character":43,"end_line":133,"end_character":56},"in_reply_to":"1a122d0e_791892d3","updated":"2016-04-20 18:08:02.000000000","message":"That\u0027s my fault, I made a comment on PS17 about this.  I based my comment on the result generated by mysql \n\n+-------------------+----------------------------------------------------+------+-----+---------+-------+\n| Field             | Type                                               | Null | Key | Default | Extra |\n+-------------------+----------------------------------------------------+------+-----+---------+-------+\n| network_id        | varchar(36)                                        | YES  | MUL | NULL    |       |\n\ninstead of the class definition\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/models_v2.py#L186","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"720d8eb355e97e40ed650a74769c7470e25ac32a","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":137,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"},{"line_number":138,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":139,"context_line":"                                                          nullable\u003dTrue),"},{"line_number":140,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_392a9a90","line":137,"updated":"2016-04-20 15:41:41.000000000","message":"gateway_ip field can be null (None).\nDoes IPAddressField allow this?","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"7fb31a743cd1381f4431fc93e6d3cedd65b693a4","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":137,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"},{"line_number":138,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":139,"context_line":"                                                          nullable\u003dTrue),"},{"line_number":140,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_7098bb1c","line":137,"in_reply_to":"1a122d0e_392a9a90","updated":"2016-05-11 13:34:27.000000000","message":"Thanks Akihiro, indeed you can create the subnet without the gateway set via CLI. Fixed.","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"9cfc43459a26c8ad64063d91684738413a5fe485","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        \u0027subnetpool_id\u0027: obj_fields.UUIDField(nullable\u003dTrue),"},{"line_number":135,"context_line":"        \u0027ip_version\u0027: common_types.IPVersionEnumField(),"},{"line_number":136,"context_line":"        \u0027cidr\u0027: obj_fields.IPNetworkField(),"},{"line_number":137,"context_line":"        \u0027gateway_ip\u0027: obj_fields.IPAddressField(),"},{"line_number":138,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":139,"context_line":"                                                          nullable\u003dTrue),"},{"line_number":140,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_49a17ef7","line":137,"in_reply_to":"1a122d0e_392a9a90","updated":"2016-04-20 18:08:02.000000000","message":"ditto 133\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/models_v2.py#L197\n\nvs \n\n+-------------------+----------------------------------------------------+------+-----+---------+-------+\n| Field             | Type                                               | Null | Key | Default | Extra |\n+-------------------+----------------------------------------------------+------+-----+---------+-------+\n| gateway_ip        | varchar(64)                                        | YES  |     | NULL    |       |","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"720d8eb355e97e40ed650a74769c7470e25ac32a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        result \u003d super(Subnet, cls).modify_fields_to_db(fields)"},{"line_number":166,"context_line":"        if \u0027cidr\u0027 in result:"},{"line_number":167,"context_line":"            result[\u0027cidr\u0027] \u003d str(result[\u0027cidr\u0027])"},{"line_number":168,"context_line":"        if \u0027gateway_ip\u0027 in result:"},{"line_number":169,"context_line":"            result[\u0027gateway_ip\u0027] \u003d str(result[\u0027gateway_ip\u0027])"},{"line_number":170,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_bd44d549","line":168,"updated":"2016-04-20 15:41:41.000000000","message":"gateway_ip can be None. Don\u0027t we need to consider gateway_ip\u003dNone?","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"7fb31a743cd1381f4431fc93e6d3cedd65b693a4","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        result \u003d super(Subnet, cls).modify_fields_to_db(fields)"},{"line_number":166,"context_line":"        if \u0027cidr\u0027 in result:"},{"line_number":167,"context_line":"            result[\u0027cidr\u0027] \u003d str(result[\u0027cidr\u0027])"},{"line_number":168,"context_line":"        if \u0027gateway_ip\u0027 in result:"},{"line_number":169,"context_line":"            result[\u0027gateway_ip\u0027] \u003d str(result[\u0027gateway_ip\u0027])"},{"line_number":170,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":23,"id":"dab17558_90a1df48","line":168,"in_reply_to":"1a122d0e_bd44d549","updated":"2016-05-11 13:34:27.000000000","message":"Thanks, corrected.","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"c36b0c58631f58f362ceec853f3e4e1afeee0ae7","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @classmethod"},{"line_number":59,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":60,"context_line":"        # TODO(korzen) remove this method when IP and CIDR decorator ready"},{"line_number":61,"context_line":"        result \u003d super(Route, cls).modify_fields_from_db(db_obj)"},{"line_number":62,"context_line":"        if \u0027destination\u0027 in result:"},{"line_number":63,"context_line":"            result[\u0027destination\u0027] \u003d netaddr.IPNetwork(result[\u0027destination\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_e7955287","line":60,"updated":"2016-05-20 10:21:39.000000000","message":"we should raise priority of this item and find somebody that wants to take care of it during next upgrade team meeting","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @classmethod"},{"line_number":59,"context_line":"    def modify_fields_from_db(cls, db_obj):"},{"line_number":60,"context_line":"        # TODO(korzen) remove this method when IP and CIDR decorator ready"},{"line_number":61,"context_line":"        result \u003d super(Route, cls).modify_fields_from_db(db_obj)"},{"line_number":62,"context_line":"        if \u0027destination\u0027 in result:"},{"line_number":63,"context_line":"            result[\u0027destination\u0027] \u003d netaddr.IPNetwork(result[\u0027destination\u0027])"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_a28e8e76","line":60,"in_reply_to":"bab6814e_e7955287","updated":"2016-05-20 14:00:13.000000000","message":"Agreed.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # TODO(korzen) remove this method when IP and CIDR decorator ready"},{"line_number":103,"context_line":"        result \u003d super(IPAllocationPool, cls).modify_fields_from_db(db_obj)"},{"line_number":104,"context_line":"        if \u0027start\u0027 in result:"},{"line_number":105,"context_line":"            result[\u0027start\u0027] \u003d netaddr.IPAddress(result[\u0027start\u0027])"},{"line_number":106,"context_line":"        if \u0027end\u0027 in result:"},{"line_number":107,"context_line":"            result[\u0027end\u0027] \u003d netaddr.IPAddress(result[\u0027end\u0027])"},{"line_number":108,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_629826c1","line":105,"range":{"start_line":105,"start_character":30,"end_line":105,"end_character":64},"updated":"2016-05-20 14:00:13.000000000","message":"(No action required) We may need authentic version here, we\u0027ll see...","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        \u0027allocation_pools\u0027: obj_fields.ListOfObjectsField(\u0027IPAllocationPool\u0027,"},{"line_number":138,"context_line":"                                                          nullable\u003dTrue),"},{"line_number":139,"context_line":"        \u0027enable_dhcp\u0027: obj_fields.BooleanField(),"},{"line_number":140,"context_line":"        \u0027dns_nameservers\u0027: obj_fields.ListOfObjectsField(\u0027DNSNameServer\u0027,"},{"line_number":141,"context_line":"                                                         nullable\u003dTrue),"},{"line_number":142,"context_line":"        \u0027host_routes\u0027: obj_fields.ListOfObjectsField(\u0027Route\u0027, nullable\u003dTrue),"},{"line_number":143,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":144,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_1f5533f9","line":141,"range":{"start_line":140,"start_character":8,"end_line":141,"end_character":72},"updated":"2016-05-20 14:00:13.000000000","message":"(No action required) In the future, we could convert that to a simple list of addresses (strings), where the order will matter and would be reflected in \u0027order\u0027 of the underlying model.\n\nBut I agree we should move with what we have.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue)"},{"line_number":145,"context_line":"    }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027]"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    foreign_keys \u003d {\u0027network_id\u0027: \u0027id\u0027}"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_5f605b01","line":147,"range":{"start_line":147,"start_character":24,"end_line":147,"end_character":76},"updated":"2016-05-20 14:00:13.000000000","message":"(No action required) One day we could make the base class fill it in automatically based on field types.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        # TODO(korzen) remove this method when IP and CIDR decorator ready"},{"line_number":158,"context_line":"        result \u003d super(Subnet, cls).modify_fields_from_db(db_obj)"},{"line_number":159,"context_line":"        if \u0027cidr\u0027 in result:"},{"line_number":160,"context_line":"            result[\u0027cidr\u0027] \u003d netaddr.IPNetwork(result[\u0027cidr\u0027])"},{"line_number":161,"context_line":"        if \u0027gateway_ip\u0027 in result and result[\u0027gateway_ip\u0027] is not None:"},{"line_number":162,"context_line":"            result[\u0027gateway_ip\u0027] \u003d netaddr.IPAddress(result[\u0027gateway_ip\u0027])"},{"line_number":163,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_e2009603","line":160,"range":{"start_line":160,"start_character":29,"end_line":160,"end_character":62},"updated":"2016-05-20 14:00:13.000000000","message":"We may need authentic version of it, but let\u0027s leave it to adoption time.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        if \u0027cidr\u0027 in result:"},{"line_number":160,"context_line":"            result[\u0027cidr\u0027] \u003d netaddr.IPNetwork(result[\u0027cidr\u0027])"},{"line_number":161,"context_line":"        if \u0027gateway_ip\u0027 in result and result[\u0027gateway_ip\u0027] is not None:"},{"line_number":162,"context_line":"            result[\u0027gateway_ip\u0027] \u003d netaddr.IPAddress(result[\u0027gateway_ip\u0027])"},{"line_number":163,"context_line":"        return result"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_22073e19","line":162,"range":{"start_line":162,"start_character":35,"end_line":162,"end_character":74},"updated":"2016-05-20 14:00:13.000000000","message":"ditto","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"}],"neutron/tests/unit/objects/test_base.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":266,"context_line":"        self.db_objs \u003d list(self.get_random_fields() for _ in range(3))"},{"line_number":267,"context_line":"        self.db_obj \u003d self.db_objs[0]"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        self.obj_fields \u003d [self._test_class.modify_fields_from_db(db_obj)"},{"line_number":270,"context_line":"                           for db_obj in self.db_objs]"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        valid_field \u003d [f for f in self._test_class.fields"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_d6745569","line":269,"updated":"2016-04-19 15:13:30.000000000","message":"this is not really related...it would have been nice to have this change here https://review.openstack.org/#/c/306951/ too late I guess.","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        for db_obj in db_objs:"},{"line_number":352,"context_line":"            for field in self._test_class.synthetic_fields:"},{"line_number":353,"context_line":"                if self._test_class.is_object_field(field):"},{"line_number":354,"context_line":"                    obj_class \u003d obj_base.VersionedObjectRegistry.obj_classes("},{"line_number":355,"context_line":"                                    ).get(self._test_class.fields["},{"line_number":356,"context_line":"                                        field].objname)[0]"},{"line_number":357,"context_line":"                    mock_calls.append("}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_f6feb1ac","line":354,"updated":"2016-04-19 15:13:30.000000000","message":"this needs to be rebased :)","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"408a7396a857570078243fb552852591e5424a86","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        for db_obj in db_objs:"},{"line_number":352,"context_line":"            for field in self._test_class.synthetic_fields:"},{"line_number":353,"context_line":"                if self._test_class.is_object_field(field):"},{"line_number":354,"context_line":"                    obj_class \u003d obj_base.VersionedObjectRegistry.obj_classes("},{"line_number":355,"context_line":"                                    ).get(self._test_class.fields["},{"line_number":356,"context_line":"                                        field].objname)[0]"},{"line_number":357,"context_line":"                    mock_calls.append("}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_0afdc6b3","line":354,"in_reply_to":"1a122d0e_f6feb1ac","updated":"2016-04-20 14:11:03.000000000","message":"Done","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"3808f3d24c2f4d6f8b08fc7765dce7e1244e83e8","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        obj.create()"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        new \u003d self._test_class.get_object(self.context,"},{"line_number":676,"context_line":"                                          **obj._get_composite_keys())"},{"line_number":677,"context_line":"        self.assertEqual(obj, new)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        obj \u003d new"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_3696693f","line":676,"updated":"2016-04-19 15:13:30.000000000","message":"more changes that are not related...sorry for being picky but can you create a patch and put all these fixups there?, thanks!","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"408a7396a857570078243fb552852591e5424a86","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        obj.create()"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        new \u003d self._test_class.get_object(self.context,"},{"line_number":676,"context_line":"                                          **obj._get_composite_keys())"},{"line_number":677,"context_line":"        self.assertEqual(obj, new)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        obj \u003d new"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a122d0e_2a1522e4","line":676,"in_reply_to":"1a122d0e_3696693f","updated":"2016-04-20 14:11:03.000000000","message":"Will do.","commit_id":"a80c443e263a3e57ca8209dc6bca33c6db5e457a"}],"neutron/tests/unit/objects/test_subnet.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"e6d626b5ad01a35057b2a7d99e3d3e809fab1dc3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \u0027shared\u0027: False"},{"line_number":53,"context_line":"}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class IPAllocationPoolTestCase(test_base.BaseTestCase):"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    _test_class \u003d subnet.IPAllocationPool"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_d8c20f34","line":55,"updated":"2016-01-29 17:26:57.000000000","message":"we really need to add tests from BaseDbObjectTestCase","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \u0027shared\u0027: False"},{"line_number":53,"context_line":"}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class IPAllocationPoolTestCase(test_base.BaseTestCase):"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    _test_class \u003d subnet.IPAllocationPool"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_32b5427d","line":55,"in_reply_to":"7a5de9d1_d8c20f34","updated":"2016-02-01 14:14:33.000000000","message":"Will do.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e78151fb72b09c47ed1682582d4442dfbdfe3235","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                               return_value\u003ddict(allocation_pool_db)) \\"},{"line_number":68,"context_line":"                as get_object_mock:"},{"line_number":69,"context_line":"            test_obj \u003d self._test_class.get_by_id(self.context, id\u003d\u0027fake_id\u0027)"},{"line_number":70,"context_line":"            self.assertEqual(str(test_obj.start),"},{"line_number":71,"context_line":"                             allocation_pool_db[\u0027first_ip\u0027])"},{"line_number":72,"context_line":"            get_object_mock.assert_has_calls(["},{"line_number":73,"context_line":"                mock.call("}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_b2bbe4e4","line":70,"updated":"2016-01-28 20:02:20.000000000","message":"On all the asserts in this module, are the args (expected, actual)? Looks like they are reversed, if I understand correctly.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0206bc37b892ddeab0711cdced25c969da65b2da","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                               return_value\u003ddict(allocation_pool_db)) \\"},{"line_number":68,"context_line":"                as get_object_mock:"},{"line_number":69,"context_line":"            test_obj \u003d self._test_class.get_by_id(self.context, id\u003d\u0027fake_id\u0027)"},{"line_number":70,"context_line":"            self.assertEqual(str(test_obj.start),"},{"line_number":71,"context_line":"                             allocation_pool_db[\u0027first_ip\u0027])"},{"line_number":72,"context_line":"            get_object_mock.assert_has_calls(["},{"line_number":73,"context_line":"                mock.call("}],"source_content_type":"text/x-python","patch_set":10,"id":"7a5de9d1_7fce732f","line":70,"in_reply_to":"7a5de9d1_b2bbe4e4","updated":"2016-02-01 14:14:33.000000000","message":"I will change it.","commit_id":"08c36a3f9b21c796063d4e51157387d52fc1e6fe"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c26ee15b2127f6b4bb0e772ae33fcbd733c15a8c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"import itertools"},{"line_number":13,"context_line":"import mock"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.objects import base"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_0ce775ac","line":12,"updated":"2016-04-08 00:19:09.000000000","message":"ditto","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6482f1e525ce40d5a0af7f04d4a321396190e7da","unresolved":false,"context_lines":[{"line_number":9,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":"import itertools"},{"line_number":13,"context_line":"import mock"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.objects import base"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a061dce_7ea2f39b","line":12,"in_reply_to":"9a061dce_0ce775ac","updated":"2016-04-08 13:45:05.000000000","message":"Done","commit_id":"9d055bf4df2acc9cba537544539d14d519a6dd87"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"720d8eb355e97e40ed650a74769c7470e25ac32a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import itertools"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.objects import base"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a122d0e_1defc91e","line":13,"updated":"2016-04-20 15:41:41.000000000","message":"blank line here","commit_id":"d8bb684ab12fb21ecc43bfb1f76b5a6a5d16da79"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import itertools"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.objects import base"},{"line_number":17,"context_line":"from neutron.objects.db import api as obj_db_api"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_c23d9290","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":11},"updated":"2016-05-20 14:00:13.000000000","message":"nit: mock is 3party, could go a separate section.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"84dd323037e647c5f7abd37082a53bfad46b4f9a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    _test_class \u003d subnet.Route"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(obj_db_api, \u0027update_object\u0027)"},{"line_number":65,"context_line":"    def test_update_changes(self, update_mock):"},{"line_number":66,"context_line":"        fields_to_update \u003d self.get_updatable_fields(self.db_obj)"},{"line_number":67,"context_line":"        with mock.patch.object(base.NeutronDbObject,"},{"line_number":68,"context_line":"                               \u0027_get_changed_persistent_fields\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_e206d6cc","line":65,"updated":"2016-05-20 14:00:13.000000000","message":"What\u0027s the reason for override?","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6066bec3ffd61ed0c3887a824f394d14d9a70136","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    _test_class \u003d subnet.Route"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(obj_db_api, \u0027update_object\u0027)"},{"line_number":65,"context_line":"    def test_update_changes(self, update_mock):"},{"line_number":66,"context_line":"        fields_to_update \u003d self.get_updatable_fields(self.db_obj)"},{"line_number":67,"context_line":"        with mock.patch.object(base.NeutronDbObject,"},{"line_number":68,"context_line":"                               \u0027_get_changed_persistent_fields\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_70790cc8","line":65,"in_reply_to":"bab6814e_0538443c","updated":"2016-05-20 14:39:31.000000000","message":"it would not raise an Exception*","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1cfc842234f117d6e904aad020a2a6a5e40a3f35","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    _test_class \u003d subnet.Route"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(obj_db_api, \u0027update_object\u0027)"},{"line_number":65,"context_line":"    def test_update_changes(self, update_mock):"},{"line_number":66,"context_line":"        fields_to_update \u003d self.get_updatable_fields(self.db_obj)"},{"line_number":67,"context_line":"        with mock.patch.object(base.NeutronDbObject,"},{"line_number":68,"context_line":"                               \u0027_get_changed_persistent_fields\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_9646284d","line":65,"in_reply_to":"bab6814e_70790cc8","updated":"2016-05-20 15:06:15.000000000","message":"Isn\u0027t it covered by test_update_no_changes already? I think we should just remove the test from here, it passes fine without the override.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6947066aec387f1ad0602b1f6517f47c693501e8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    _test_class \u003d subnet.Route"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @mock.patch.object(obj_db_api, \u0027update_object\u0027)"},{"line_number":65,"context_line":"    def test_update_changes(self, update_mock):"},{"line_number":66,"context_line":"        fields_to_update \u003d self.get_updatable_fields(self.db_obj)"},{"line_number":67,"context_line":"        with mock.patch.object(base.NeutronDbObject,"},{"line_number":68,"context_line":"                               \u0027_get_changed_persistent_fields\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"bab6814e_0538443c","line":65,"in_reply_to":"bab6814e_e206d6cc","updated":"2016-05-20 14:18:35.000000000","message":"I have overridden this test because Route object cannot be changed, due to all fields being the primary keys. In this test, I\u0027m not changing the object, and checking if update() did not call the update_mock in line 70.\n\nThis test is checking if when we do not change the object and call update(), would it raise an Exception.","commit_id":"d3700b262bdcfd7f6ffef1f2ec305274ce6858db"}]}
