)]}'
{"nova/db/sqlalchemy/api_migrations/migrate_repo/versions/043_placement_consumers.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6772e22119508055eb6bcde108c8118bddb35fe","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":31,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse,"},{"line_number":32,"context_line":"               autoincrement\u003dTrue),"},{"line_number":33,"context_line":"        Column(\u0027consumer_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_3dbdf701","line":33,"updated":"2017-06-01 20:26:48.000000000","message":"Let\u0027s call this field just \"uuid\" since a) it\u0027s in the consumers table so we know it\u0027s already related to the consumer :) and b) it\u0027s a uuid not an ID. Eventually, we\u0027ll change the allocations table to have allocations.consumer_id be an integer instead of a VARCHAR(255). And then we will have integer key nirvana ;)","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b49e851e601dad8a1cadefa369f62d97bdbd1ae","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":31,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse,"},{"line_number":32,"context_line":"               autoincrement\u003dTrue),"},{"line_number":33,"context_line":"        Column(\u0027consumer_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_98df7139","line":33,"in_reply_to":"df140735_3dbdf701","updated":"2017-06-01 20:55:18.000000000","message":"Yup, makes sense.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a0232d4f01e698a880f673f3beb9cd51a316ded5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        Column(\u0027consumer_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_f2de8e0f","line":36,"range":{"start_line":36,"start_character":25,"end_line":36,"end_character":41},"updated":"2017-06-01 19:46:52.000000000","message":"Shouldn\u0027t these use the actual column names? I think that\u0027s the standard naming convention (table_col1_col2_colN_idx).","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b49e851e601dad8a1cadefa369f62d97bdbd1ae","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        Column(\u0027consumer_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_58e55908","line":36,"range":{"start_line":36,"start_character":25,"end_line":36,"end_character":41},"in_reply_to":"df140735_ddcddb31","updated":"2017-06-01 20:55:18.000000000","message":"Will do.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6772e22119508055eb6bcde108c8118bddb35fe","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        Column(\u0027consumer_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_ddcddb31","line":36,"range":{"start_line":36,"start_character":25,"end_line":36,"end_character":41},"in_reply_to":"df140735_f2de8e0f","updated":"2017-06-01 20:26:48.000000000","message":"Yup, agreed with the Matt.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a0232d4f01e698a880f673f3beb9cd51a316ded5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_d2e38ad8","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":46},"updated":"2017-06-01 19:46:52.000000000","message":"same","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b49e851e601dad8a1cadefa369f62d97bdbd1ae","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        Column(\u0027project_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":35,"context_line":"        Column(\u0027user_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_18eb61dc","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":46},"in_reply_to":"df140735_d2e38ad8","updated":"2017-06-01 20:55:18.000000000","message":"Will do.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a0232d4f01e698a880f673f3beb9cd51a316ded5","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027latin1\u0027"},{"line_number":42,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_12d582e5","line":39,"range":{"start_line":39,"start_character":46,"end_line":39,"end_character":69},"updated":"2017-06-01 19:46:52.000000000","message":"Should be: uniq_consumers0consumer_id","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b49e851e601dad8a1cadefa369f62d97bdbd1ae","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Index(\u0027consumers_project_consumer_idx\u0027, \u0027project_id\u0027, \u0027consumer_id\u0027),"},{"line_number":37,"context_line":"        Index(\u0027consumers_project_user_consumer_idx\u0027, \u0027project_id\u0027, \u0027user_id\u0027,"},{"line_number":38,"context_line":"              \u0027consumer_id\u0027),"},{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027latin1\u0027"},{"line_number":42,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_d8c28959","line":39,"range":{"start_line":39,"start_character":46,"end_line":39,"end_character":69},"in_reply_to":"df140735_12d582e5","updated":"2017-06-01 20:55:18.000000000","message":"Will do.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a6772e22119508055eb6bcde108c8118bddb35fe","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027latin1\u0027"},{"line_number":42,"context_line":"    )"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    consumers.create(checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_9d5e4374","line":42,"updated":"2017-06-01 20:26:48.000000000","message":"So, the access patterns we\u0027re going to see eventually with this table are like so:\n\n1) Get the project\u0027s usage\n\nSELECT usage.*\nFROM (\n SELECT resource_class_id, SUM(used) AS used\n FROM allocations\n JOIN consumers\n  ON allocations.consumer_id \u003d consumers.uuid\n WHERE consumers.project_id \u003d $PROJECT\n GROUP BY resource_class_id\n) AS usages\n\n2) Get the user\u0027s usage\n\nSELECT usage.*\nFROM (\n SELECT resource_class_id, SUM(used) AS used\n FROM allocations\n JOIN consumers\n  ON allocations.consumer_id \u003d consumers.uuid\n WHERE consumers.user_id \u003d $USER\n GROUP BY resource_class_id\n) AS usages\n\n3) Get the project\u0027s usage, broken down by users in the project\n\nSELECT usage.*\nFROM (\n SELECT consumers.user_id, resource_class_id, SUM(used) AS used\n FROM allocations\n JOIN consumers\n  ON allocations.consumer_id \u003d consumers.uuid\n WHERE consumers.project_id \u003d $PROJECT\n GROUP BY consumers.user_id, resource_class_id\n) AS usages\n\n#1 can be satisfied by the proposed index on (\u0027project_id\u0027, \u0027consumer_id\u0027), so that one\u0027s good. (though as mentioned above, I\u0027d rename consumer_id to uuid..)\n\n#3 can be satisfied by the proposed index on (\u0027project_id\u0027, \u0027user_id\u0027, \u0027consumer_id\u0027), so that one\u0027s good. (though as mentioned above, I\u0027d rename consumer_id to uuid..)\n\nHowever, because there is no proposed index that contains the user_id field as a left-most column prefix, #2 cannot be satisfied by any proposed index above.\n\nSo, I would add one more index on (\u0027user_id\u0027, \u0027consumer_id\u0027) (or uuid :) ).","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b49e851e601dad8a1cadefa369f62d97bdbd1ae","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027latin1\u0027"},{"line_number":42,"context_line":"    )"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    consumers.create(checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_d8d96957","line":42,"in_reply_to":"df140735_9d5e4374","updated":"2017-06-01 20:55:18.000000000","message":"Okay. Something to note though is we currently don\u0027t have a notion of scoping a query to only a user -- the other cases I know of (involving quotas) scope to either a project or a project/user combo. If we have a user-only query, that would represent their usage across projects (if they are a member of more than one project). Which might be fine, I just want to make sure that\u0027s what we want (to break with current tradition).\n\nIn the last patch in this series (GET /usages) I wrestled with whether or not to require project_id and/or what the behavior should be if neither project_id nor user_id were provided in the query. So that\u0027s related to what we expect the usage of the API to be. For quotas, we need project-scoped or project/user-scoped.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d9d4394fdecb313dac4bf552d71d42a38e4d238c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        UniqueConstraint(\u0027consumer_id\u0027, name\u003d\u0027uniq_consumers0consumer\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027latin1\u0027"},{"line_number":42,"context_line":"    )"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    consumers.create(checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"df140735_235ef611","line":42,"in_reply_to":"df140735_d8d96957","updated":"2017-06-01 21:21:50.000000000","message":"Good point, Melanie, I hadn\u0027t known we don\u0027t support querying by just user. We can always add that at a later time if we need to, so OK to leave that off for now.","commit_id":"fe0208d8b9885d60f9abd9f86f39f2c01137340c"}]}
