)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"40efc08c5abdbeb6e24348112feb6b7ffb7bf293","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Lalit Dagre \u003clalitdagre@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-19 06:20:47 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Creates flavor* tables in API database"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creates the tables \"flavors\", \"flavor_extra_specs\" and \"flavor_projects\" in the"},{"line_number":10,"context_line":"API database for cellsV2. Soft-delete feature has been retained for all the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a29b11f_61794f93","line":7,"updated":"2015-10-19 08:28:09.000000000","message":"Please prefix this with cells:","commit_id":"f445ec202bfa38a03bc90e0ff2daa832107ba1d8"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5c4b0515ad96fe16316d2704986a7d3659d961d2","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Creates flavor* tables in API database"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creates the tables \"flavors\", \"flavor_extra_specs\" and \"flavor_projects\" in the"},{"line_number":10,"context_line":"API database for cellsV2. Soft-delete feature has been retained for all the"},{"line_number":11,"context_line":"tables for now to keep porting of Flavor object to new tables simple."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Co-Authored-By: Lalit Dagre \u003clalitdagre@gmail.com\u003e"},{"line_number":14,"context_line":"Change-Id: I6cdba5cc98a9f1595ef89244c47e9f63805451e7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"9a68dd71_1f080e91","line":11,"range":{"start_line":10,"start_character":26,"end_line":11,"end_character":69},"updated":"2016-01-26 11:40:09.000000000","message":"not sure I can see a trace of possible soft deletions in the DB upgrade ? I don\u0027t see a deleted flag.","commit_id":"ad21fcc29a8e96d752a03b871f4e2ce11bd2cb39"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"01c6bf4e0635c49b08913771686f59f3221320ac","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Creates flavor* tables in API database"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creates the tables \"flavors\", \"flavor_extra_specs\" and \"flavor_projects\" in the"},{"line_number":10,"context_line":"API database for cellsV2. Soft-delete feature has been retained for all the"},{"line_number":11,"context_line":"tables for now to keep porting of Flavor object to new tables simple."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Co-Authored-By: Lalit Dagre \u003clalitdagre@gmail.com\u003e"},{"line_number":14,"context_line":"Change-Id: I6cdba5cc98a9f1595ef89244c47e9f63805451e7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"7a5de9d1_27f8e57a","line":11,"range":{"start_line":10,"start_character":26,"end_line":11,"end_character":69},"in_reply_to":"9a68dd71_1f080e91","updated":"2016-01-29 15:41:53.000000000","message":"Yes, the commit message needs to be changed. Thanks.","commit_id":"ad21fcc29a8e96d752a03b871f4e2ce11bd2cb39"}],"nova/db/sqlalchemy/api_migrations/migrate_repo/versions/004_flavors.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5589320f3dd912855ee825b6e1cd91151ee30a11","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    flavors \u003d Table(\u0027flavors\u0027, meta,"},{"line_number":31,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":32,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":33,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"},{"line_number":34,"context_line":"        Column(\u0027name\u0027, String(length\u003d255)),"},{"line_number":35,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027memory_mb\u0027, Integer, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_02f6b5f8","line":33,"updated":"2015-07-22 19:49:49.000000000","message":"not needed","commit_id":"89f6ad9eca5154e45f59319609d80493cffe0600"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"78bb1ce852ebbdf170b3f4630b4c4842f4771423","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":46,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":47,"context_line":"    )"},{"line_number":48,"context_line":"    flavors.create(checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a4dcd0f_302ac430","line":45,"updated":"2015-08-13 22:09:29.000000000","message":"You didn\u0027t copy over the unique constraints for this table, on flavorid and name.","commit_id":"b7be0166bce194346e9a4a507630358e23a2fba0"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"9036bf4fc4e880e6e17954d5b604414bb13d99f1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"},{"line_number":45,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":46,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":47,"context_line":"    )"},{"line_number":48,"context_line":"    flavors.create(checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_5d5e8f46","line":45,"in_reply_to":"1a4dcd0f_302ac430","updated":"2015-08-17 11:03:36.000000000","message":"Done","commit_id":"b7be0166bce194346e9a4a507630358e23a2fba0"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027memory_mb\u0027, Integer, nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027vcpus\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027swap\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":41,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255)),"},{"line_number":42,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_45b751d8","line":39,"updated":"2015-10-07 01:42:58.000000000","message":"Do we need to set the appropriate defaults in the migration too? I see that they are already specified in the models\n\nThis has default\u003d0 in InstanceTypes","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        Column(\u0027swap\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":41,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255)),"},{"line_number":42,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":43,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":44,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":45,"context_line":"        Column(\u0027disabled\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_85c5693d","line":42,"updated":"2015-10-07 01:42:58.000000000","message":"This has default\u003d1 in InstanceTypes","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":43,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":44,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":45,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":46,"context_line":"        Column(\u0027is_public\u0027, Boolean),"},{"line_number":47,"context_line":"        UniqueConstraint(\"flavorid\", \"deleted\","},{"line_number":48,"context_line":"                         name\u003d\"uniq_flavors0flavorid0deleted\"),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_45de7112","line":45,"updated":"2015-10-07 01:42:58.000000000","message":"This has default\u003dFalse in InstanceTypes","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":44,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":45,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":46,"context_line":"        Column(\u0027is_public\u0027, Boolean),"},{"line_number":47,"context_line":"        UniqueConstraint(\"flavorid\", \"deleted\","},{"line_number":48,"context_line":"                         name\u003d\"uniq_flavors0flavorid0deleted\"),"},{"line_number":49,"context_line":"        UniqueConstraint(\"name\", \"deleted\","}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_05e879b3","line":46,"updated":"2015-10-07 01:42:58.000000000","message":"This has default\u003dTrue in InstanceTypes","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"}],"nova/db/sqlalchemy/api_migrations/migrate_repo/versions/005_flavors.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adebe0d08c887810eca817e9ddc7c62e5fd7d6c7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        Column(\u0027value\u0027, String(length\u003d255)),"},{"line_number":65,"context_line":"        UniqueConstraint(\u0027flavor_id\u0027, \u0027key\u0027, \u0027deleted\u0027,"},{"line_number":66,"context_line":"            name\u003d\u0027uniq_flavor_extra_specs0flavor_id0key0deleted\u0027),"},{"line_number":67,"context_line":"        Index(\u0027flavor_extra_specs_flavor_id_key_idx\u0027, \u0027flavor_id\u0027, \u0027key\u0027),"},{"line_number":68,"context_line":"        ForeignKeyConstraint(columns\u003d[\u0027flavor_id\u0027],"},{"line_number":69,"context_line":"            refcolumns\u003d[flavors.c.id]),"},{"line_number":70,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_f0e866e4","line":67,"updated":"2016-01-04 17:24:53.000000000","message":"As Melanie pointed out, this will fail with DB2 since the UniqueConstraint on flavor_id and key will implicitly create a unique index because key is nullable (DB2 requires that columns in a unique constraint are non-nullable, so if they are it will create a unique index instead), so adding the Index here will cause a duplicate index failure. See how this is handled in earlier migrations for the API DB.","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    flavors \u003d Table(\u0027flavors\u0027, meta,"},{"line_number":31,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":32,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":33,"context_line":"        Column(\u0027name\u0027, String(length\u003d255)),"},{"line_number":34,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027memory_mb\u0027, Integer, nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027vcpus\u0027, Integer, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_f291cd53","line":33,"updated":"2016-02-16 17:43:43.000000000","message":"Name is required in the v2.1 API:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/flavor_manage.py#L54\n\nAnd we have a UniqueConstraint on it, so it seems we should make it nullable\u003dFalse.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"c200f8072881f76cedd04ddd4170e2a8c05302f5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    flavors \u003d Table(\u0027flavors\u0027, meta,"},{"line_number":31,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":32,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":33,"context_line":"        Column(\u0027name\u0027, String(length\u003d255)),"},{"line_number":34,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027memory_mb\u0027, Integer, nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027vcpus\u0027, Integer, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_3b0e2e3b","line":33,"in_reply_to":"dae33548_3255f51c","updated":"2016-02-17 18:02:11.000000000","message":"The Flavor object is still having the name field nullable, that would probably be worth commenting that to see there is no reason to not provide a name... Very good catch, thanks.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f07ab88bd36a7b3c4545435bd8e8c42aac77f79","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    flavors \u003d Table(\u0027flavors\u0027, meta,"},{"line_number":31,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":32,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":33,"context_line":"        Column(\u0027name\u0027, String(length\u003d255)),"},{"line_number":34,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027memory_mb\u0027, Integer, nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027vcpus\u0027, Integer, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_3255f51c","line":33,"in_reply_to":"dae33548_f291cd53","updated":"2016-02-16 17:48:47.000000000","message":"And the v2.0 API:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/legacy_v2/contrib/flavormanage.py#L56","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027vcpus\u0027, Integer, nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027swap\u0027, Integer, nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255)),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_b210e5a9","line":39,"updated":"2016-02-16 17:43:43.000000000","message":"flavorid should probably be nullable\u003dFalse because of this note in the v2.1 API schema validation:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/flavor_manage.py#L47-L53\n\nSo that would be required, and if it\u0027s not provided the code automatically sets one using uuid:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/flavors.py#L95-L96\n\nAnd given flavorid is in a UniqueConstraint, it seems we should enforce that it\u0027s not null.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255)),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_92de810f","line":41,"updated":"2016-02-16 17:43:43.000000000","message":"The API also enforces that root_gb is provided, so it seems we should make this nullable\u003dFalse also.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f07ab88bd36a7b3c4545435bd8e8c42aac77f79","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255)),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_120ef13a","line":41,"in_reply_to":"dae33548_92de810f","updated":"2016-02-16 17:48:47.000000000","message":"v2.0:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/legacy_v2/contrib/flavormanage.py#L72\n\nv2.1:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/flavor_manage.py#L54","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f07ab88bd36a7b3c4545435bd8e8c42aac77f79","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":55,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":56,"context_line":"        Column(\u0027flavor_id\u0027, Integer, nullable\u003dFalse),"},{"line_number":57,"context_line":"        Column(\u0027key\u0027, String(length\u003d255)),"},{"line_number":58,"context_line":"        Column(\u0027value\u0027, String(length\u003d255)),"},{"line_number":59,"context_line":"        UniqueConstraint(\u0027flavor_id\u0027, \u0027key\u0027,"},{"line_number":60,"context_line":"            name\u003d\u0027uniq_flavor_extra_specs0flavor_id0key\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_4d6458e3","line":57,"updated":"2016-02-16 17:48:47.000000000","message":"The extra specs key should also be nullable\u003dFalse, the v2.1 validation is here:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/flavors.py#L65\n\nAnd v2.0 is validated here:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/flavors.py#L331\n\nPlus key is in a UC.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    # NOTE(mriedem): DB2 creates an index when a unique constraint is created"},{"line_number":67,"context_line":"    # so trying to add a second index on the host column will fail with error"},{"line_number":68,"context_line":"    # SQL0605W, so omit the index in the case of DB2."},{"line_number":69,"context_line":"    if migrate_engine.name !\u003d \u0027ibm_db_sa\u0027:"},{"line_number":70,"context_line":"        Index(\u0027flavor_id_key_idx\u0027, flavor_extra_specs.c.flavor_id,"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_3483259a","line":67,"range":{"start_line":67,"start_character":45,"end_line":67,"end_character":49},"updated":"2016-02-16 17:43:43.000000000","message":"flavor_id/key columns","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":77,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":78,"context_line":"        Column(\u0027flavor_id\u0027, Integer, nullable\u003dFalse),"},{"line_number":79,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255)),"},{"line_number":80,"context_line":"        UniqueConstraint(\u0027flavor_id\u0027, \u0027project_id\u0027,"},{"line_number":81,"context_line":"            name\u003d\u0027uniq_flavor_projects0flavor_id0project_id\u0027),"},{"line_number":82,"context_line":"        ForeignKeyConstraint(columns\u003d[\u0027flavor_id\u0027],"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_126f112c","line":79,"updated":"2016-02-16 17:43:43.000000000","message":"tenant is required in the API:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/flavor_access.py#L26\n\nAnd project_id is in a UniqueConstraint, so it seems it should be nullable\u003dFalse in the model.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f6b37a5544b5ad50cc7e3f4e3a37e6dc0ff0e8d0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer, nullable\u003dFalse),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":26,"id":"dae33548_ea0b49d4","line":41,"updated":"2016-02-17 19:46:00.000000000","message":"There\u0027s been some discussion on irc, but there\u0027s a question about whether or not this should actually be nullable due to the use case presented in https://review.openstack.org/#/c/280301/ . Right now -1 is proposed for use there, but I think None makes more sense given that 0 already has a special meaning.","commit_id":"3b103c866f2f5c7a01828f0cf536aaf9386ff01c"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"015d5548a000ab21729e92d8b8aea7735c3442c3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer, nullable\u003dFalse),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":26,"id":"dae33548_6a1f3908","line":41,"in_reply_to":"dae33548_ea0b49d4","updated":"2016-02-17 19:46:43.000000000","message":"https://review.openstack.org/#/c/267673/ is the spec link I meant to use.","commit_id":"3b103c866f2f5c7a01828f0cf536aaf9386ff01c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41d1787daa112d9266f22762a35e2867fe0846af","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        Column(\u0027vcpu_weight\u0027, Integer),"},{"line_number":39,"context_line":"        Column(\u0027flavorid\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027rxtx_factor\u0027, Float),"},{"line_number":41,"context_line":"        Column(\u0027root_gb\u0027, Integer, nullable\u003dTrue),"},{"line_number":42,"context_line":"        Column(\u0027ephemeral_gb\u0027, Integer),"},{"line_number":43,"context_line":"        Column(\u0027disabled\u0027, Boolean),"},{"line_number":44,"context_line":"        Column(\u0027is_public\u0027, Boolean),"}],"source_content_type":"text/x-python","patch_set":27,"id":"bae84128_9271ba7a","line":41,"range":{"start_line":41,"start_character":35,"end_line":41,"end_character":48},"updated":"2016-02-24 22:09:42.000000000","message":"Remove this since it\u0027s the default.","commit_id":"0a2bedb82485a7e3c813374c548a5cac8dc525f0"}],"nova/db/sqlalchemy/api_models.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"6d0e8eec33e96773bdb50eba01d35e3deec2f181","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":77,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""},{"line_number":78,"context_line":"    __tablename__ \u003d \u0027flavors\u0027"},{"line_number":79,"context_line":"    __table_args__ \u003d (schema.UniqueConstraint(\u0027name\u0027, \u0027deleted\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_1056465c","line":76,"updated":"2015-07-21 16:56:08.000000000","message":"We just discussed, at the midcycle, not adding the SoftDeleteMixin to anymore models.  We should check if it\u0027s necessary to read deleted flavors at any point in the code, but if not we should leave the mixin off and just let flavors be fully deletable.","commit_id":"89f6ad9eca5154e45f59319609d80493cffe0600"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5589320f3dd912855ee825b6e1cd91151ee30a11","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":77,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""},{"line_number":78,"context_line":"    __tablename__ \u003d \u0027flavors\u0027"},{"line_number":79,"context_line":"    __table_args__ \u003d (schema.UniqueConstraint(\u0027name\u0027, \u0027deleted\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_c240cd36","line":76,"in_reply_to":"3a50d1a3_1056465c","updated":"2015-07-22 19:49:49.000000000","message":"Agreed, Flavors are not really important to be soft-deleted IMHO so we can remove that.","commit_id":"89f6ad9eca5154e45f59319609d80493cffe0600"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5589320f3dd912855ee825b6e1cd91151ee30a11","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    \"\"\"Represents additional specs as key/value pairs for a flavor\"\"\""},{"line_number":100,"context_line":"    __tablename__ \u003d \u0027flavor_extra_specs\u0027"},{"line_number":101,"context_line":"    __table_args__ \u003d (Index(\u0027flavor_id\u0027, \u0027key\u0027),"},{"line_number":102,"context_line":"                      schema.UniqueConstraint(\u0027flavor_id\u0027, \u0027key\u0027, \u0027deleted\u0027,"},{"line_number":103,"context_line":"                        name\u003d\u0027uniq_flavor_extra_specs0flavor_id0key0deleted\u0027))"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_6260d9cf","line":102,"updated":"2015-07-22 19:49:49.000000000","message":"so the deleted col is not needed for the constraint","commit_id":"89f6ad9eca5154e45f59319609d80493cffe0600"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5589320f3dd912855ee825b6e1cd91151ee30a11","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    \"\"\"Represent projects associated to flavors\"\"\""},{"line_number":114,"context_line":"    __tablename__ \u003d \u0027flavor_projects\u0027"},{"line_number":115,"context_line":"    __table_args__ \u003d (schema.UniqueConstraint("},{"line_number":116,"context_line":"        \u0027flavor_id\u0027, \u0027project_id\u0027, \u0027deleted\u0027,"},{"line_number":117,"context_line":"        name\u003d\u0027uniq_flavor_projects0flavor_id0project_id0deleted\u0027),)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_02a8f5d9","line":116,"updated":"2015-07-22 19:49:49.000000000","message":"ditto with L102","commit_id":"89f6ad9eca5154e45f59319609d80493cffe0600"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"# NOTE(dheeraj): Flavors and realted tables do not need SoftDeleteMixin but"},{"line_number":78,"context_line":"# it cannot be removed without breaking lot of tests, so is being kept for now"},{"line_number":79,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":80,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_e569bd26","line":77,"range":{"start_line":77,"start_character":29,"end_line":77,"end_character":36},"updated":"2015-10-07 01:42:58.000000000","message":"typo \"related\"","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"40efc08c5abdbeb6e24348112feb6b7ffb7bf293","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"# NOTE(dheeraj): Flavors and realted tables do not need SoftDeleteMixin but"},{"line_number":78,"context_line":"# it cannot be removed without breaking lot of tests, so is being kept for now"},{"line_number":79,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":80,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a29b11f_c141433b","line":77,"updated":"2015-10-19 08:28:09.000000000","message":"realted \u003d\u003e related","commit_id":"f445ec202bfa38a03bc90e0ff2daa832107ba1d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adebe0d08c887810eca817e9ddc7c62e5fd7d6c7","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# NOTE(dheeraj): Flavors and related tables do not need SoftDeleteMixin but"},{"line_number":93,"context_line":"# it cannot be removed without breaking lot of tests, so is being kept for now"},{"line_number":94,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":95,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""},{"line_number":96,"context_line":"    __tablename__ \u003d \u0027flavors\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_f06946bf","line":93,"updated":"2016-01-04 17:24:53.000000000","message":"What is \u0027a lot\u0027? We have said we don\u0027t want to use the soft delete mixin anymore, so adding it in here seems like a bad idea.","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a77447aff4db5f96a8a636124d92623288caa9cd","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"# NOTE(dheeraj): Flavors and related tables do not need SoftDeleteMixin but"},{"line_number":93,"context_line":"# it cannot be removed without breaking lot of tests, so is being kept for now"},{"line_number":94,"context_line":"class Flavors(API_BASE, models.SoftDeleteMixin):"},{"line_number":95,"context_line":"    \"\"\"Represents possible flavors for instances\"\"\""},{"line_number":96,"context_line":"    __tablename__ \u003d \u0027flavors\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_2b58cf31","line":93,"in_reply_to":"fa69d971_f06946bf","updated":"2016-01-04 17:27:41.000000000","message":"Also, as far as I know, we don\u0027t have shadow tables for the API DB, so we don\u0027t have any kind of archive strategy for removing these soft-deleted entries.","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adebe0d08c887810eca817e9ddc7c62e5fd7d6c7","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    vcpus \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":107,"context_line":"    root_gb \u003d Column(Integer)"},{"line_number":108,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":109,"context_line":"    flavorid \u003d Column(String(255))"},{"line_number":110,"context_line":"    swap \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":111,"context_line":"    rxtx_factor \u003d Column(Float, default\u003d1)"},{"line_number":112,"context_line":"    vcpu_weight \u003d Column(Integer)"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_50b4d2cf","line":109,"updated":"2016-01-04 17:24:53.000000000","message":"There is a note in the instance_types table definition that this would be called public_id, but apparently we never did that, but it seems like if we care to, we should do it here now, unless we don\u0027t care - in which case we should remove that comment in the instance_types table def (not necessary in this change though):\n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/models.py#L403\n\nMaybe at this point we should just be consistent and call it flavorid, especially since the Flavor object field is also flavorid:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/flavor.py#L41","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adebe0d08c887810eca817e9ddc7c62e5fd7d6c7","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    key \u003d Column(String(255))"},{"line_number":130,"context_line":"    value \u003d Column(String(255))"},{"line_number":131,"context_line":"    flavor_id \u003d Column(Integer, ForeignKey(\u0027flavors.id\u0027),"},{"line_number":132,"context_line":"              nullable\u003dFalse)"},{"line_number":133,"context_line":"    flavor \u003d orm.relationship("},{"line_number":134,"context_line":"        Flavors, backref\u003d\"extra_specs\", foreign_keys\u003dflavor_id,"},{"line_number":135,"context_line":"        primaryjoin\u003d\u0027and_(\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_50393240","line":132,"updated":"2016-01-04 17:24:53.000000000","message":"nit: alignment here should be fixed, nullable kwarg should align with Integer arg.","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"adebe0d08c887810eca817e9ddc7c62e5fd7d6c7","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":148,"context_line":"    flavor_id \u003d Column(Integer, ForeignKey(\u0027flavors.id\u0027),"},{"line_number":149,"context_line":"                              nullable\u003dFalse)"},{"line_number":150,"context_line":"    project_id \u003d Column(String(255))"},{"line_number":151,"context_line":"    flavor \u003d orm.relationship("},{"line_number":152,"context_line":"        Flavors, backref\u003d\"projects\", foreign_keys\u003dflavor_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa69d971_10517a62","line":149,"updated":"2016-01-04 17:24:53.000000000","message":"nit: alignment should be cleaned up here.","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":112,"context_line":"class FlavorExtraSpecs(API_BASE):"},{"line_number":113,"context_line":"    \"\"\"Represents additional specs as key/value pairs for a flavor\"\"\""},{"line_number":114,"context_line":"    __tablename__ \u003d \u0027flavor_extra_specs\u0027"},{"line_number":115,"context_line":"    __table_args__ \u003d ("},{"line_number":116,"context_line":"        Index(\u0027flavor_id_key_idx\u0027, \u0027flavor_id\u0027, \u0027key\u0027),"},{"line_number":117,"context_line":"        schema.UniqueConstraint(\u0027flavor_id\u0027, \u0027key\u0027,"},{"line_number":118,"context_line":"            name\u003d\u0027uniq_flavor_extra_specs0flavor_id0key\u0027),)"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_973f93d5","line":115,"updated":"2016-02-16 17:43:43.000000000","message":"Why don\u0027t you have to specify this in the table args?\n\n{\u0027mysql_collate\u0027: \u0027utf8_bin\u0027},\n\nThat was added for a reason it looks like:\n\n402b3abf990d08d2af8331079d36a92d84d84b80","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    \"\"\"Represents additional specs as key/value pairs for a flavor\"\"\""},{"line_number":114,"context_line":"    __tablename__ \u003d \u0027flavor_extra_specs\u0027"},{"line_number":115,"context_line":"    __table_args__ \u003d ("},{"line_number":116,"context_line":"        Index(\u0027flavor_id_key_idx\u0027, \u0027flavor_id\u0027, \u0027key\u0027),"},{"line_number":117,"context_line":"        schema.UniqueConstraint(\u0027flavor_id\u0027, \u0027key\u0027,"},{"line_number":118,"context_line":"            name\u003d\u0027uniq_flavor_extra_specs0flavor_id0key\u0027),)"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_72513d0e","line":116,"range":{"start_line":116,"start_character":15,"end_line":116,"end_character":32},"updated":"2016-02-16 17:43:43.000000000","message":"In the nova db model, index names start with the table name, e.g.:\n\ninstance_type_extra_specs_instance_type_id_key_idx\n\nSeems we should continue that convention here. The table name is the namespace for the index, so without that we could have conflicts on index names if they happen to have the same columns in them.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class FlavorProjects(API_BASE):"},{"line_number":127,"context_line":"    \"\"\"Represent projects associated to flavors\"\"\""},{"line_number":128,"context_line":"    __tablename__ \u003d \u0027flavor_projects\u0027"},{"line_number":129,"context_line":"    __table_args__ \u003d (schema.UniqueConstraint(\u0027flavor_id\u0027, \u0027project_id\u0027,"},{"line_number":130,"context_line":"        name\u003d\u0027uniq_flavor_projects0flavor_id0project_id\u0027),)"}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_d2f489f3","line":127,"range":{"start_line":127,"start_character":7,"end_line":127,"end_character":16},"updated":"2016-02-16 17:43:43.000000000","message":"nit: Represents","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f1af75b52e7ca2011c80a27c42fcfe6b7c838a20","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":100,"context_line":"    memory_mb \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":101,"context_line":"    vcpus \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":102,"context_line":"    root_gb \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":103,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":104,"context_line":"    flavorid \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":105,"context_line":"    swap \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"}],"source_content_type":"text/x-python","patch_set":26,"id":"bae84128_76aeade8","line":102,"range":{"start_line":102,"start_character":30,"end_line":102,"end_character":44},"updated":"2016-02-24 21:06:45.000000000","message":"Because of https://review.openstack.org/#/c/267673/ I think we have to leave this nullable\u003dTrue (the default) until we know what\u0027s going to happen with that. If it turns out that we want root_gb to be nullable\u003dFalse, we can make that change with a DB migration later. But that\u0027s the only thing holding this up from landing in mitaka right now so let\u0027s punt on the decision and handle it later if needed. As it stands, the API already enforces that something is set for this.","commit_id":"3b103c866f2f5c7a01828f0cf536aaf9386ff01c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41d1787daa112d9266f22762a35e2867fe0846af","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":100,"context_line":"    memory_mb \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":101,"context_line":"    vcpus \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":102,"context_line":"    root_gb \u003d Column(Integer, nullable\u003dTrue)"},{"line_number":103,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":104,"context_line":"    flavorid \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":105,"context_line":"    swap \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"}],"source_content_type":"text/x-python","patch_set":27,"id":"bae84128_f26126aa","line":102,"range":{"start_line":102,"start_character":30,"end_line":102,"end_character":43},"updated":"2016-02-24 22:09:42.000000000","message":"nullable\u003dTrue is the default so don\u0027t list it (we try not to list the defaults for the data model stuff).","commit_id":"0a2bedb82485a7e3c813374c548a5cac8dc525f0"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"59a621ee7d14ac1ccad1a7920024ee4ca10f0152","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":100,"context_line":"    memory_mb \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":101,"context_line":"    vcpus \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":102,"context_line":"    root_gb \u003d Column(Integer, nullable\u003dTrue)"},{"line_number":103,"context_line":"    ephemeral_gb \u003d Column(Integer)"},{"line_number":104,"context_line":"    flavorid \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":105,"context_line":"    swap \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"}],"source_content_type":"text/x-python","patch_set":27,"id":"bae84128_d89243f6","line":102,"range":{"start_line":102,"start_character":30,"end_line":102,"end_character":43},"in_reply_to":"bae84128_f26126aa","updated":"2016-02-24 23:08:15.000000000","message":"I\u0027ve been including it in my models because I can\u0027t ever recall what the default it. But it doesn\u0027t matter to me if it\u0027s removed.","commit_id":"0a2bedb82485a7e3c813374c548a5cac8dc525f0"}],"nova/tests/functional/db/api/test_migrations.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"78bb1ce852ebbdf170b3f4630b4c4842f4771423","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            \u0027value\u0027]:"},{"line_number":201,"context_line":"            self.assertColumnExists(engine, \u0027flavor_extra_specs\u0027, column)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        self.assertIndexExists(engine, \u0027host_mappings\u0027, \u0027host_idx\u0027)"},{"line_number":204,"context_line":"        self.assertUniqueConstraintExists(engine, \u0027flavor_extra_specs\u0027,"},{"line_number":205,"context_line":"            [\u0027flavor_id\u0027, \u0027key\u0027])"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a4dcd0f_50bd10d6","line":203,"updated":"2015-08-13 22:09:29.000000000","message":"copy/paste?","commit_id":"b7be0166bce194346e9a4a507630358e23a2fba0"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"9036bf4fc4e880e6e17954d5b604414bb13d99f1","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            \u0027value\u0027]:"},{"line_number":201,"context_line":"            self.assertColumnExists(engine, \u0027flavor_extra_specs\u0027, column)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        self.assertIndexExists(engine, \u0027host_mappings\u0027, \u0027host_idx\u0027)"},{"line_number":204,"context_line":"        self.assertUniqueConstraintExists(engine, \u0027flavor_extra_specs\u0027,"},{"line_number":205,"context_line":"            [\u0027flavor_id\u0027, \u0027key\u0027])"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_7d2273bb","line":203,"in_reply_to":"1a4dcd0f_50bd10d6","updated":"2015-08-17 11:03:36.000000000","message":"Modified it.","commit_id":"b7be0166bce194346e9a4a507630358e23a2fba0"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b9102e72782634b85ddfc8714229fcbc2b2c3c67","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self.assertUniqueConstraintExists(engine, \u0027request_specs\u0027,"},{"line_number":197,"context_line":"                [\u0027instance_uuid\u0027])"},{"line_number":198,"context_line":"        if engine.name !\u003d \u0027ibm_db_sa\u0027:"},{"line_number":199,"context_line":"            self.assertIndexExists(engine, \u0027request_specs\u0027,"},{"line_number":200,"context_line":"                    \u0027request_spec_instance_uuid_idx\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _check_005(self, engine, data):"},{"line_number":203,"context_line":"        # flavors"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_578622ba","line":200,"range":{"start_line":198,"start_character":8,"end_line":200,"end_character":53},"updated":"2015-12-18 00:26:00.000000000","message":"The only concern I had on this patch is whether we need to watch out for a duplicate index creation with DB2. I noticed it in api_migrations 001, 002, 003, and 004 *but* I noticed DB2 CI passed on this patch back in August. I don\u0027t know what the current state of DB2 CI is either -- it seems to be gone","commit_id":"162ac540695e95e2110481e9ba975ce4952858ea"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c47e3f202d53ee9605bafa4bfc8d01f063bb6560","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            \u0027value\u0027]:"},{"line_number":216,"context_line":"            self.assertColumnExists(engine, \u0027flavor_extra_specs\u0027, column)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        self.assertIndexExists(engine, \u0027flavor_extra_specs\u0027,"},{"line_number":219,"context_line":"            \u0027flavor_id_key_idx\u0027)"},{"line_number":220,"context_line":"        self.assertUniqueConstraintExists(engine, \u0027flavor_extra_specs\u0027,"},{"line_number":221,"context_line":"            [\u0027flavor_id\u0027, \u0027key\u0027])"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"dae33548_325215de","line":219,"range":{"start_line":218,"start_character":8,"end_line":219,"end_character":32},"updated":"2016-02-16 17:43:43.000000000","message":"This is conditional on the engine not being ibm_db_sa so you should probably include that logic in the test.","commit_id":"ffb586a5971c841523b4e09aa4d8f499d8abc0d6"}],"nova/tests/functional/db/test_flavor_model.py":[{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class FlavorTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":20,"context_line":"    def _get_column_list(self, model):"},{"line_number":21,"context_line":"        inspect_model \u003d inspect(model)"},{"line_number":22,"context_line":"        column_list \u003d [c_at.key for c_at in inspect_model.mapper.column_attrs]"},{"line_number":23,"context_line":"        return column_list"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _check_column(self, model, column):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_08c9d458","line":22,"updated":"2015-08-07 05:36:36.000000000","message":"inspect(model) returns a mapper for that model so .mapper is not needed. (http://docs.sqlalchemy.org/en/rel_1_0/core/inspection.html#available-inspection-targets)\nMapper also has a columns attribute that is a list of all Columns, so we can also use that instead of column_attrs","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"f287712e6d6b113b6634075101ad7ad63fbdf3b7","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class FlavorTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":20,"context_line":"    def _get_column_list(self, model):"},{"line_number":21,"context_line":"        inspect_model \u003d inspect(model)"},{"line_number":22,"context_line":"        column_list \u003d [c_at.key for c_at in inspect_model.mapper.column_attrs]"},{"line_number":23,"context_line":"        return column_list"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def _check_column(self, model, column):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_fb3f5085","line":22,"in_reply_to":"1a4dcd0f_08c9d458","updated":"2015-08-09 09:14:37.000000000","message":"Indeed. Thanks.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        return True"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_column_list(self, column_new, column_old):"},{"line_number":32,"context_line":"        column_old.remove(\u0027deleted_at\u0027)"},{"line_number":33,"context_line":"        column_old.remove(\u0027deleted\u0027)"},{"line_number":34,"context_line":"        intersect \u003d set(column_new).intersection(set(column_old))"},{"line_number":35,"context_line":"        if intersect !\u003d set(column_new) or intersect !\u003d set(column_old):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_c8e1ac2b","line":32,"updated":"2015-08-07 05:36:36.000000000","message":"We should avoid hard-coding any column names in this function. Maybe we can pass a list of columns removed from old table, a list of columns added to the new table and a dictionary that maps changes in column names between old and new tables. Then this information can be used here to generate sets of applicable column names and then comparing them.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"f287712e6d6b113b6634075101ad7ad63fbdf3b7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        return True"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_column_list(self, column_new, column_old):"},{"line_number":32,"context_line":"        column_old.remove(\u0027deleted_at\u0027)"},{"line_number":33,"context_line":"        column_old.remove(\u0027deleted\u0027)"},{"line_number":34,"context_line":"        intersect \u003d set(column_new).intersection(set(column_old))"},{"line_number":35,"context_line":"        if intersect !\u003d set(column_new) or intersect !\u003d set(column_old):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_9bbacc09","line":32,"in_reply_to":"1a4dcd0f_c8e1ac2b","updated":"2015-08-09 09:14:37.000000000","message":"Since this is to handle the soft delete I would prefer to have them explicitly defined.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        column_old.remove(\u0027deleted_at\u0027)"},{"line_number":33,"context_line":"        column_old.remove(\u0027deleted\u0027)"},{"line_number":34,"context_line":"        intersect \u003d set(column_new).intersection(set(column_old))"},{"line_number":35,"context_line":"        if intersect !\u003d set(column_new) or intersect !\u003d set(column_old):"},{"line_number":36,"context_line":"            return False"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_6dd66a29","line":35,"updated":"2015-08-07 05:36:36.000000000","message":"Set difference can also be used as it would provide us with more information. E.g. columns existing in table A but not in B and columns existing in table B but not in table A. That would help in providing developers with a better message in case of failures","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"f287712e6d6b113b6634075101ad7ad63fbdf3b7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        column_old.remove(\u0027deleted_at\u0027)"},{"line_number":33,"context_line":"        column_old.remove(\u0027deleted\u0027)"},{"line_number":34,"context_line":"        intersect \u003d set(column_new).intersection(set(column_old))"},{"line_number":35,"context_line":"        if intersect !\u003d set(column_new) or intersect !\u003d set(column_old):"},{"line_number":36,"context_line":"            return False"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_db47f41b","line":35,"in_reply_to":"1a4dcd0f_6dd66a29","updated":"2015-08-09 09:14:37.000000000","message":"I don\u0027t believe we need to have all that logic here. What is proposed is a test per table that provides already fine grained info.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        intersect \u003d set(column_new).intersection(set(column_old))"},{"line_number":35,"context_line":"        if intersect !\u003d set(column_new) or intersect !\u003d set(column_old):"},{"line_number":36,"context_line":"            return False"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_flavor_extra_specs_column_flavor_id(self):"},{"line_number":40,"context_line":"        flavor_extra_specs \u003d api_models.FlavorExtraSpecs()"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_680898da","line":37,"updated":"2015-08-07 05:36:36.000000000","message":"Rather than return a boolean, we can add a check here itself and pass appropriate message to the user in case the test fails","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return False"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_flavor_extra_specs_column_flavor_id(self):"},{"line_number":40,"context_line":"        flavor_extra_specs \u003d api_models.FlavorExtraSpecs()"},{"line_number":41,"context_line":"        self.assertTrue(self._check_column(flavor_extra_specs, \u0027flavor_id\u0027))"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_cd00de04","line":39,"updated":"2015-08-07 05:36:36.000000000","message":"IIUC this test only checks if FlavorExtraSpecs has a column called \"flavor_id\". This is already tested in migration tests, so I think this should be dropped from here.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"f287712e6d6b113b6634075101ad7ad63fbdf3b7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return False"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_flavor_extra_specs_column_flavor_id(self):"},{"line_number":40,"context_line":"        flavor_extra_specs \u003d api_models.FlavorExtraSpecs()"},{"line_number":41,"context_line":"        self.assertTrue(self._check_column(flavor_extra_specs, \u0027flavor_id\u0027))"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_dbc0547f","line":39,"in_reply_to":"1a4dcd0f_cd00de04","updated":"2015-08-09 09:14:37.000000000","message":"yes, for the flavor* tables. However I think we should check if the \"instance_type_id\" exists in order to skip it in next tests.","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        flavor_extra_specs \u003d api_models.FlavorExtraSpecs()"},{"line_number":41,"context_line":"        self.assertTrue(self._check_column(flavor_extra_specs, \u0027flavor_id\u0027))"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_instance_type_extra_specs_column_instance_type_id(self):"},{"line_number":44,"context_line":"        instance_type_extra_specs \u003d models.InstanceTypeExtraSpecs()"},{"line_number":45,"context_line":"        self.assertTrue(self._check_column(instance_type_extra_specs,"},{"line_number":46,"context_line":"                        \u0027instance_type_id\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_c8176c43","line":43,"updated":"2015-08-07 05:36:36.000000000","message":"Ditto as L39","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.assertTrue(self._check_column(instance_type_extra_specs,"},{"line_number":46,"context_line":"                        \u0027instance_type_id\u0027))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_flavor_projects_column_flavor_id(self):"},{"line_number":49,"context_line":"        flavor_projects \u003d api_models.FlavorProjects()"},{"line_number":50,"context_line":"        self.assertTrue(self._check_column(flavor_projects, \u0027flavor_id\u0027))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_08123457","line":48,"updated":"2015-08-07 05:36:36.000000000","message":"Ditto as L39","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":12548,"name":"Dheeraj Gupta","email":"dheeraj.gupta4@gmail.com","username":"dgupta"},"change_message_id":"511e8dd1e92e623c249f29a58dfd463fe6ea3067","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        flavor_projects \u003d api_models.FlavorProjects()"},{"line_number":50,"context_line":"        self.assertTrue(self._check_column(flavor_projects, \u0027flavor_id\u0027))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_instance_type_projects_column_instance_type_id(self):"},{"line_number":53,"context_line":"        instance_type_projects \u003d models.InstanceTypeProjects()"},{"line_number":54,"context_line":"        self.assertTrue(self._check_column(instance_type_projects,"},{"line_number":55,"context_line":"                        \u0027instance_type_id\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_a81c606a","line":52,"updated":"2015-08-07 05:36:36.000000000","message":"Ditto as L39","commit_id":"b04b796d6de727c03df1474e9b78856b793efa64"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        columns_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return columns_list"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _check_column(self, model, column):"},{"line_number":24,"context_line":"        columns_list \u003d self._get_columns_list(model)"},{"line_number":25,"context_line":"        if column not in columns_list:"},{"line_number":26,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_8fc9027b","line":23,"updated":"2015-10-07 01:42:58.000000000","message":"I don\u0027t see this function isn\u0027t used anywhere -- can we remove it?","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f9e08b4e1feafb7162ada104e7b610aa2ba07d0d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        intersect \u003d set(columns_new).intersection(set(columns_old))"},{"line_number":31,"context_line":"        if intersect !\u003d set(columns_new) or intersect !\u003d set(columns_old):"},{"line_number":32,"context_line":"            return False"},{"line_number":33,"context_line":"        return True"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_tables_flavors_instance_types(self):"},{"line_number":36,"context_line":"        flavors \u003d api_models.Flavors()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a2fa921_afc4fe5e","line":33,"updated":"2015-10-07 01:42:58.000000000","message":"This works but I think you could have just:\n\n return set(columns_new) \u003d\u003d set(columns_old)","commit_id":"45fa9f0b30b8702366a5a735748bc4fb35a1e449"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"2597018e9c338ae53e17974f8965b3bb007e989d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        columns_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return columns_list"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _check_column(self, model, column):"},{"line_number":24,"context_line":"        columns_list \u003d self._get_columns_list(model)"},{"line_number":25,"context_line":"        if column not in columns_list:"},{"line_number":26,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_ccce445a","line":23,"updated":"2016-01-20 20:07:36.000000000","message":"This method isn\u0027t being used anywhere.","commit_id":"ad21fcc29a8e96d752a03b871f4e2ce11bd2cb39"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a83b12337e63005cfd006d427657403c76f5bdff","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        columns_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return columns_list"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _check_column(self, model, column):"},{"line_number":24,"context_line":"        columns_list \u003d self._get_columns_list(model)"},{"line_number":25,"context_line":"        if column not in columns_list:"},{"line_number":26,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_e77b237a","line":23,"in_reply_to":"9a68dd71_ccce445a","updated":"2016-01-20 20:16:21.000000000","message":"+1, I mentioned this in PS14","commit_id":"ad21fcc29a8e96d752a03b871f4e2ce11bd2cb39"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"01c6bf4e0635c49b08913771686f59f3221320ac","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        columns_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return columns_list"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _check_column(self, model, column):"},{"line_number":24,"context_line":"        columns_list \u003d self._get_columns_list(model)"},{"line_number":25,"context_line":"        if column not in columns_list:"},{"line_number":26,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a5de9d1_c74791ba","line":23,"in_reply_to":"9a68dd71_e77b237a","updated":"2016-01-29 15:41:53.000000000","message":"Indeed. Sorry about this.","commit_id":"ad21fcc29a8e96d752a03b871f4e2ce11bd2cb39"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a604d7de672a2e37fcd345aa65eb23fdf273e8b5","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _check_column_list(self, columns_new, columns_old):"},{"line_number":24,"context_line":"        columns_old.remove(\u0027deleted_at\u0027)"},{"line_number":25,"context_line":"        columns_old.remove(\u0027deleted\u0027)"},{"line_number":26,"context_line":"        intersect \u003d set(columns_new).intersection(set(columns_old))"},{"line_number":27,"context_line":"        if intersect !\u003d set(columns_new) or intersect !\u003d set(columns_old):"},{"line_number":28,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":26,"id":"dae33548_bbc87e23","line":25,"updated":"2016-02-17 18:01:58.000000000","message":"a comment would maybe have been worth it explaining that we don\u0027t want to support soft-deletes now, but that\u0027s fine.","commit_id":"3b103c866f2f5c7a01828f0cf536aaf9386ff01c"}]}
