)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CellsV2 requires that aggregates be available in the API db. Create"},{"line_number":10,"context_line":"the \u0027aggregates\u0027 and \u0027aggregate_metadata\u0027 tables in the API db."},{"line_number":11,"context_line":"\u0027aggregate_hosts\u0027 will remain in the cells db as they pertain to"},{"line_number":12,"context_line":"hosts located in each cell."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"blueprint cells-aggregate-api-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"dab17558_4b4c5d70","line":11,"updated":"2016-05-13 18:34:30.000000000","message":"The migration in this patch does (correctly) bring the aggregate_hosts table into the API database, so you should remove this last sentence of the commit message.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cd4d626284a1881488b09d359f218ae3696d18b2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CellsV2 requires that aggregates be available in the API db. Create"},{"line_number":10,"context_line":"the \u0027aggregates\u0027 and \u0027aggregate_metadata\u0027 tables in the API db."},{"line_number":11,"context_line":"\u0027aggregate_hosts\u0027 will remain in the cells db as they pertain to"},{"line_number":12,"context_line":"hosts located in each cell."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"blueprint cells-aggregate-api-db"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"bab6814e_6178a0f9","line":12,"range":{"start_line":11,"start_character":0,"end_line":12,"end_character":27},"updated":"2016-05-24 12:57:33.000000000","message":"that\u0027s no longer true","commit_id":"6a1755710b845f34df5d06793fbc40cd419c7ac2"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"acf536c0638d330684002dad2e72e5321657a38f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CellsV2 requires that aggregates be available in the API db. Create"},{"line_number":10,"context_line":"the \u0027aggregates\u0027 and \u0027aggregate_metadata\u0027 tables in the API db."},{"line_number":11,"context_line":"\u0027aggregate_hosts\u0027 will remain in the cells db as they pertain to"},{"line_number":12,"context_line":"hosts located in each cell."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"blueprint cells-aggregate-api-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9abb7d3a_3753c118","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":45},"updated":"2016-06-01 16:56:17.000000000","message":"This should be updated.","commit_id":"21e455f17ad8e0c3b85ce163419325953ac7892d"}],"nova/db/sqlalchemy/api_migrations/migrate_repo/versions/015_aggregates.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    aggregate_hosts \u003d Table(\u0027aggregate_hosts\u0027, meta,"},{"line_number":44,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":45,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":46,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":47,"context_line":"        Column(\u0027host\u0027, String(length\u003d255)),"},{"line_number":48,"context_line":"        Column(\u0027aggregate_id\u0027, Integer, ForeignKey(\u0027aggregates.id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_cb6e8dc8","line":45,"updated":"2016-05-13 18:34:30.000000000","message":"What is the point of a created_at and updated_at column on the aggregate_hosts table? I can *maybe* see some value in created_at, but updated_at will never be set to anything other than created_at, since there\u0027s nothing to \"update\" about a many-to-many mapping table\u0027s records. The mapping table either exists or it doesn\u0027t exist... I\u0027d recommend getting rid of both fields, frankly.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"e135f876dee1a38b1d67b8df028714f704b86cea","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    aggregate_hosts \u003d Table(\u0027aggregate_hosts\u0027, meta,"},{"line_number":44,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":45,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":46,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":47,"context_line":"        Column(\u0027host\u0027, String(length\u003d255)),"},{"line_number":48,"context_line":"        Column(\u0027aggregate_id\u0027, Integer, ForeignKey(\u0027aggregates.id\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_d1911b9c","line":45,"in_reply_to":"dab17558_cb6e8dc8","updated":"2016-05-13 21:45:52.000000000","message":"Unfortunately we pass these fields out in the API. We could either:\n\n1. Add a microversion change to the spec and remove these fields.\n2. Not do a microversion change, get rid of them but always pass back fake timestamp values. (Would have to do this for older microversions anyway)\n3. Leave them in.\n\nAny preference?","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        Column(\u0027aggregate_id\u0027, Integer, ForeignKey(\u0027aggregates.id\u0027),"},{"line_number":49,"context_line":"              nullable\u003dFalse),"},{"line_number":50,"context_line":"        UniqueConstraint(\u0027host\u0027, \u0027aggregate_id\u0027,"},{"line_number":51,"context_line":"                     name\u003d\u0027uniq_aggregate_hosts0host0aggregate_id\u0027),"},{"line_number":52,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_ab7189aa","line":51,"updated":"2016-05-13 18:34:30.000000000","message":"Per my comment on the related spec, you\u0027ll want to add an index on (aggregate_id) alone in order to allow SELECT host FROM aggregate_hosts WHERE aggregate_id \u003d $ADD_ID; to be satisfied by an index instead of a full table scan.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"e135f876dee1a38b1d67b8df028714f704b86cea","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        Column(\u0027aggregate_id\u0027, Integer, ForeignKey(\u0027aggregates.id\u0027),"},{"line_number":49,"context_line":"              nullable\u003dFalse),"},{"line_number":50,"context_line":"        UniqueConstraint(\u0027host\u0027, \u0027aggregate_id\u0027,"},{"line_number":51,"context_line":"                     name\u003d\u0027uniq_aggregate_hosts0host0aggregate_id\u0027),"},{"line_number":52,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":53,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":54,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_71e94f1a","line":51,"in_reply_to":"dab17558_ab7189aa","updated":"2016-05-13 21:45:52.000000000","message":"Will add the index, thanks.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"}],"nova/db/sqlalchemy/api_migrations/migrate_repo/versions/017_aggregates.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cd4d626284a1881488b09d359f218ae3696d18b2","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        Column(\u0027uuid\u0027, String(length\u003d36)),"},{"line_number":34,"context_line":"        Column(\u0027name\u0027, String(length\u003d255)),"},{"line_number":35,"context_line":"        Index(\u0027aggregate_uuid_idx\u0027, \u0027uuid\u0027),"},{"line_number":36,"context_line":"        UniqueConstraint(\u0027name\u0027, name\u003d\u0027uniq_aggregate0name\u0027),"},{"line_number":37,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":38,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":39,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_e1d010fa","line":36,"range":{"start_line":36,"start_character":39,"end_line":36,"end_character":59},"updated":"2016-05-24 12:57:33.000000000","message":"femtonit: in general, the name should be uniq_\u003ctable_name\u003e0\u003crow_name\u003e where table_name is \"aggregates\" (with a trailing \"s\")","commit_id":"6a1755710b845f34df5d06793fbc40cd419c7ac2"}],"nova/db/sqlalchemy/api_models.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"32bddeffe5fba88e44af5b87231d03fcccae1bd4","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, autoincrement\u003dTrue)"},{"line_number":74,"context_line":"    uuid \u003d Column(String(36))"},{"line_number":75,"context_line":"    name \u003d Column(String(255))"},{"line_number":76,"context_line":"    _hosts \u003d orm.relationship(AggregateHost,"},{"line_number":77,"context_line":"                          primaryjoin\u003d"},{"line_number":78,"context_line":"                          \u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a1b2928_82a670bf","line":76,"updated":"2016-04-11 20:04:03.000000000","message":"I didn\u0027t catch this until reviewing a later patch, but why are you calling these \"_hosts\" instead of \"hosts\"? There\u0027s really no reason to have the @property on this model since we only use it in one place, above which we have our own facade. Seems more confusing than useful to me.","commit_id":"95422e7a3ec21470239d87887f3461849a0c064b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a33beaeb30ee333fa8096900209393b83e27729b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    name \u003d Column(String(255))"},{"line_number":77,"context_line":"    hosts \u003d orm.relationship(AggregateHost,"},{"line_number":78,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":80,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":81,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_ffa0bda7","line":79,"updated":"2016-04-15 16:34:38.000000000","message":"Hmm, I\u0027m not sure what that is. If it\u0027s something we control, we should fix it because it\u0027s pretty terrible, IMHO.\n\nI see now that you\u0027re copying what we have in aggregate now in the main DB. However, I\u0027d like to do better than that going forward if we can.\n\nThe easiest way to do this would be to prefix things like this so we end up with \"agg_metadata\" or something.\n\nAlso, note that Instance.metadata is used without a problem, using backref on the InstanceMetadata model.\n\nAm I being too OCD about not liking a property starting with _ and looking private?","commit_id":"c9a4cec1db5f60200fadd55aa73b4035c52b0b08"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"80cc3e6060f1dae38d8929a40dbb3c4842855e92","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    name \u003d Column(String(255))"},{"line_number":77,"context_line":"    hosts \u003d orm.relationship(AggregateHost,"},{"line_number":78,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":80,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":81,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_dd05d614","line":79,"in_reply_to":"1a122d0e_3d9b2a68","updated":"2016-05-03 19:27:35.000000000","message":"Also, major pain in the ass. The sqlalchemy base class that we are using for these models has a reserved \u0027metadata\u0027 attribute. I think it is used for table metadata. This is probably why we use \u0027metadetails\u0027.\n\nI don\u0027t think I\u0027m getting around that one, would require changes in sqlalchemy.","commit_id":"c9a4cec1db5f60200fadd55aa73b4035c52b0b08"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"927bdf33dae8a7e4a88b34dee79ea70d1f3b40f5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    name \u003d Column(String(255))"},{"line_number":77,"context_line":"    hosts \u003d orm.relationship(AggregateHost,"},{"line_number":78,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":80,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":81,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_3817b855","line":79,"in_reply_to":"1a122d0e_dd05d614","updated":"2016-05-03 19:50:18.000000000","message":"Yeah, I see that. I\u0027m not super firm, I\u0027d just hate to bring forward the warts of yesteryear.\n\nI think it could be done, but I\u0027m not the one doing it so I won\u0027t hold us up  if you think it\u0027s not worth it.","commit_id":"c9a4cec1db5f60200fadd55aa73b4035c52b0b08"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"3aba6824b437f9fff29ef8ab93c7223b42a57b11","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    name \u003d Column(String(255))"},{"line_number":77,"context_line":"    hosts \u003d orm.relationship(AggregateHost,"},{"line_number":78,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":80,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":81,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_3d9b2a68","line":79,"in_reply_to":"1a122d0e_ffa0bda7","updated":"2016-05-03 19:10:49.000000000","message":"How firm are we on getting rid of this wart? At the moment the \u0027old\u0027 Aggregate model has \u0027_hosts\u0027 and \u0027_metadata\u0027 properties. These ARE private to the model. As far as i\u0027m aware they are never accessed. Instead the \u0027hosts\u0027 and \u0027metadetails\u0027 properties are used to access this data. In the process of accessing these there is a conversion done from AggregateHost and AggregateMetadata objects to \u0027list of string\u0027 and \u0027dictionary of string\u0027 types respectively.\n\nChanging the external API of the new Aggregate model presents difficulties when dealing with things in the \u0027Aggregate\u0027 object, as I will have to make affordances for which type of Aggregate model has been returned. (Unless I also change the properties in the \u0027old\u0027 aggregate model.)","commit_id":"c9a4cec1db5f60200fadd55aa73b4035c52b0b08"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"7aaccf40462ac2fdb5b6739b229cd1736ef2c8de","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    name \u003d Column(String(255))"},{"line_number":77,"context_line":"    hosts \u003d orm.relationship(AggregateHost,"},{"line_number":78,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":79,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":80,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":81,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_df67c123","line":79,"in_reply_to":"1a122d0e_ffa0bda7","updated":"2016-04-15 16:42:28.000000000","message":"It would be good to clean this up. I don\u0027t remember what it does but \u0027metadata\u0027 is used by sqlalchemy for something so you can\u0027t directly define a column named that. You can do it with a backref as it\u0027s done for Instance.\n\nIf it were a column on this table I would say prefix it, since it\u0027s a relationship I would probably go the backref route. But either works for me.","commit_id":"c9a4cec1db5f60200fadd55aa73b4035c52b0b08"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @property"},{"line_number":92,"context_line":"    def metadetails(self):"},{"line_number":93,"context_line":"        return {m.key: m.value for m in self._metadata}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @property"},{"line_number":96,"context_line":"    def availability_zone(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_8b74859c","line":93,"updated":"2016-05-13 18:34:30.000000000","message":"This awefulness should DIAF in some (near) future patch...","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"e135f876dee1a38b1d67b8df028714f704b86cea","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @property"},{"line_number":92,"context_line":"    def metadetails(self):"},{"line_number":93,"context_line":"        return {m.key: m.value for m in self._metadata}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @property"},{"line_number":96,"context_line":"    def availability_zone(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_11ff23ab","line":93,"in_reply_to":"dab17558_8b74859c","updated":"2016-05-13 21:45:52.000000000","message":"Its pretty awful. There is a \u0027metadata\u0027 field on a superclass in oslo.db, so changes would have to take place there, so I\u0027m keeping the awfulness for now.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return {m.key: m.value for m in self._metadata}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @property"},{"line_number":96,"context_line":"    def availability_zone(self):"},{"line_number":97,"context_line":"        if \u0027availability_zone\u0027 not in self.metadetails:"},{"line_number":98,"context_line":"            return None"},{"line_number":99,"context_line":"        return self.metadetails[\u0027availability_zone\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_6b77a19f","line":96,"updated":"2016-05-13 18:34:30.000000000","message":"As should this.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"e135f876dee1a38b1d67b8df028714f704b86cea","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return {m.key: m.value for m in self._metadata}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @property"},{"line_number":96,"context_line":"    def availability_zone(self):"},{"line_number":97,"context_line":"        if \u0027availability_zone\u0027 not in self.metadetails:"},{"line_number":98,"context_line":"            return None"},{"line_number":99,"context_line":"        return self.metadetails[\u0027availability_zone\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_3104e7be","line":96,"in_reply_to":"dab17558_6b77a19f","updated":"2016-05-13 21:45:52.000000000","message":"This could actually go away. I\u0027d prefer to keep it for this series and do a fix later.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"87bf1b1be62c55b6c3f36202151c4d76631fb55a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    name \u003d Column(String(255))"},{"line_number":78,"context_line":"    _hosts \u003d orm.relationship(AggregateHost,"},{"line_number":79,"context_line":"                    primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateHost.aggregate_id\u0027)"},{"line_number":80,"context_line":"    # The \u0027metadata\u0027 property is reserved for base class metadata"},{"line_number":81,"context_line":"    _metadata \u003d orm.relationship(AggregateMetadata,"},{"line_number":82,"context_line":"                primaryjoin\u003d\u0027Aggregate.id \u003d\u003d AggregateMetadata.aggregate_id\u0027)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_fea91b25","line":80,"updated":"2016-06-01 14:56:52.000000000","message":"Hmm, looks like you wanted to remove this but it leaked into the following patch?","commit_id":"87aeeb1287c96c984a6d7d5211047951b5b21b25"}],"nova/tests/functional/db/api/test_migrations.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cd4d626284a1881488b09d359f218ae3696d18b2","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        self.assertIndexExists(engine, \u0027aggregates\u0027,"},{"line_number":374,"context_line":"            \u0027aggregate_uuid_idx\u0027)"},{"line_number":375,"context_line":"        self.assertUniqueConstraintExists(engine, \u0027aggregates\u0027, [\u0027name\u0027])"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"class TestNovaAPIMigrationsWalkSQLite(NovaAPIMigrationsWalk,"},{"line_number":379,"context_line":"                                      test_base.DbTestCase,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_9364f7e5","line":376,"updated":"2016-05-24 12:57:33.000000000","message":"Where is the check for verifying aggregate_hosts ?\n\nI suppose you forgot it when adding that table.","commit_id":"6a1755710b845f34df5d06793fbc40cd419c7ac2"}],"nova/tests/functional/db/test_aggregate_model.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c43beba0c74c698cd48699a4cff5af68c4e3fdad","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class AggregateTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":19,"context_line":"    def _get_columns_list(self, model):"},{"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":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_2b47594c","line":19,"updated":"2016-05-13 18:34:30.000000000","message":"nit: _get_column_list instead of _get_columns_list to align with _check_column_list() below.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":18247,"name":"Mark Doffman","email":"mdoffman@linux.vnet.ibm.com","username":"doffm"},"change_message_id":"e135f876dee1a38b1d67b8df028714f704b86cea","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class AggregateTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":19,"context_line":"    def _get_columns_list(self, model):"},{"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":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dab17558_51d6cb27","line":19,"in_reply_to":"dab17558_2b47594c","updated":"2016-05-13 21:45:52.000000000","message":"Will do.","commit_id":"b7ad1c42d99c5bffb24f27c5be7a1193962c28f9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cd4d626284a1881488b09d359f218ae3696d18b2","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from nova import test"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class AggregateTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":19,"context_line":"    def _get_column_list(self, model):"},{"line_number":20,"context_line":"        column_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return column_list"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_13be47d4","line":18,"updated":"2016-05-24 12:57:33.000000000","message":"not sure I\u0027m super happy to see this test, unless you want to make sure that if someone adds a new field for an aggregate-related table, then Jenkins should verify whether both API DB and cell DB are identical ?\n\nThat just looks to me a temporary TestCase honestly.","commit_id":"6a1755710b845f34df5d06793fbc40cd419c7ac2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d4d5ec38246771718aa90886ee3152c646c164cc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from nova import test"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class AggregateTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":19,"context_line":"    def _get_column_list(self, model):"},{"line_number":20,"context_line":"        column_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return column_list"}],"source_content_type":"text/x-python","patch_set":9,"id":"bab6814e_539d6f58","line":18,"in_reply_to":"bab6814e_13be47d4","updated":"2016-05-24 12:58:55.000000000","message":"Nevermind the above, when reviewing the next change, I understand why you need it. +1 for that one (but still -1 because of the missing DB migration check)","commit_id":"6a1755710b845f34df5d06793fbc40cd419c7ac2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4aaa9ccdae6cfe45018e928536709227445e7b0d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from nova import test"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class AggregateTablesCompareTestCase(test.NoDBTestCase):"},{"line_number":19,"context_line":"    def _get_column_list(self, model):"},{"line_number":20,"context_line":"        column_list \u003d [m.key for m in model.__table__.columns]"},{"line_number":21,"context_line":"        return column_list"}],"source_content_type":"text/x-python","patch_set":10,"id":"9abb7d3a_fee47bac","line":18,"updated":"2016-06-01 14:56:07.000000000","message":"Awesome.","commit_id":"87aeeb1287c96c984a6d7d5211047951b5b21b25"}]}
