)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7593,"name":"Haomai Wang","email":"haomaiwang@gmail.com","username":"HaomaiWang"},"change_message_id":"799e1187d14f47647d1598624c2c3f348c25ec74","unresolved":false,"context_lines":[{"line_number":11,"context_line":"add the etc/trove/validation-rules.json for integers/boolean/string variables"},{"line_number":12,"context_line":"created an overrides template for mysql"},{"line_number":13,"context_line":"added tests to verify the configuration is applied to the instance correctly"},{"line_number":14,"context_line":"removed the special cases from the validation list"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I99b0bfe51c131ace30774e75e30d620101ed2e0b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2F6Fg%3D","line":14,"updated":"2013-10-25 12:27:17.000000000","message":"Could you give a detail bp description link?","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c1610497c906a868a3c7d506f537a2bf81d29ad9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"add the etc/trove/validation-rules.json for integers/boolean/string variables"},{"line_number":12,"context_line":"created an overrides template for mysql"},{"line_number":13,"context_line":"added tests to verify the configuration is applied to the instance correctly"},{"line_number":14,"context_line":"removed the special cases from the validation list"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I99b0bfe51c131ace30774e75e30d620101ed2e0b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2F4bw%3D","line":14,"in_reply_to":"AAAATn%2F%2F6Fg%3D","updated":"2013-10-25 18:27:10.000000000","message":"good point.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"}],"etc/trove/trove-guestagent.conf.sample":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"control_exchange \u003d trove"},{"line_number":3,"context_line":"# Show more verbose log output (sets INFO log level output)"},{"line_number":4,"context_line":"verbose \u003d True"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F%2Fe9g%3D","line":2,"updated":"2013-11-05 00:59:04.000000000","message":"I see no added/modified lines that make use of control_exchange, which begs the question: why was this added?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"control_exchange \u003d trove"},{"line_number":3,"context_line":"# Show more verbose log output (sets INFO log level output)"},{"line_number":4,"context_line":"verbose \u003d True"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F%2Fakk%3D","line":2,"in_reply_to":"AAAATn%2F%2FbfI%3D","updated":"2013-11-06 22:50:45.000000000","message":"This was added from the install/kick-start setup. Not sure why it isnt in as a default.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"control_exchange \u003d trove"},{"line_number":3,"context_line":"# Show more verbose log output (sets INFO log level output)"},{"line_number":4,"context_line":"verbose \u003d True"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F%2FbfI%3D","line":2,"in_reply_to":"AAAATn%2F%2Fe9g%3D","updated":"2013-11-06 10:59:05.000000000","message":"+1","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"c072e4ccb353552cf5d07d0467a920d54070fe9b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"control_exchange \u003d trove"},{"line_number":3,"context_line":"# Show more verbose log output (sets INFO log level output)"},{"line_number":4,"context_line":"verbose \u003d True"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAUH%2F%2FkTM%3D","line":2,"updated":"2014-01-10 23:59:19.000000000","message":"control_exchange already exists below (Line 45)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"b8a13068b07e58a2075fd517b36e8306a6c0f9bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"control_exchange \u003d trove"},{"line_number":3,"context_line":"# Show more verbose log output (sets INFO log level output)"},{"line_number":4,"context_line":"verbose \u003d True"},{"line_number":5,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":18,"id":"AAAAUH%2F%2Fdfk%3D","line":2,"in_reply_to":"AAAAUH%2F%2FkTM%3D","updated":"2014-01-13 18:56:51.000000000","message":"i think something magically added this.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa9276565cea9b0da066de245f26d5d99cbce1e8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"logging_exception_prefix \u003d %(color)s%(asctime)s.%(msecs)03d TRACE %(name)s \u001b[01;35m%(instance)s\u001b[00m"},{"line_number":3,"context_line":"logging_debug_format_suffix \u003d \u001b[00;33mfrom (pid\u003d%(process)d) %(funcName)s %(pathname)s:%(lineno)d\u001b[00m"},{"line_number":4,"context_line":"logging_default_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[00;36m-%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"},{"line_number":5,"context_line":"logging_context_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[01;36m%(request_id)s \u001b[00;36m%(user)s %(tenant)s%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAAUH%2F%2BBAM%3D","line":2,"updated":"2014-01-31 00:37:39.000000000","message":"you accidentally copied over redstack/devstack remnants here; none of these lines should be added.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"logging_exception_prefix \u003d %(color)s%(asctime)s.%(msecs)03d TRACE %(name)s \u001b[01;35m%(instance)s\u001b[00m"},{"line_number":3,"context_line":"logging_debug_format_suffix \u003d \u001b[00;33mfrom (pid\u003d%(process)d) %(funcName)s %(pathname)s:%(lineno)d\u001b[00m"},{"line_number":4,"context_line":"logging_default_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[00;36m-%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"},{"line_number":5,"context_line":"logging_context_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[01;36m%(request_id)s \u001b[00;36m%(user)s %(tenant)s%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAAUH%2F990A%3D","line":2,"in_reply_to":"AAAAUH%2F%2BAWM%3D","updated":"2014-01-31 21:22:42.000000000","message":"yes damn it...","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"5812dea32e93992946f832f400b1969ba30c3041","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[DEFAULT]"},{"line_number":2,"context_line":"logging_exception_prefix \u003d %(color)s%(asctime)s.%(msecs)03d TRACE %(name)s \u001b[01;35m%(instance)s\u001b[00m"},{"line_number":3,"context_line":"logging_debug_format_suffix \u003d \u001b[00;33mfrom (pid\u003d%(process)d) %(funcName)s %(pathname)s:%(lineno)d\u001b[00m"},{"line_number":4,"context_line":"logging_default_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[00;36m-%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"},{"line_number":5,"context_line":"logging_context_format_string \u003d %(asctime)s.%(msecs)03d %(color)s%(levelname)s %(name)s [\u001b[01;36m%(request_id)s \u001b[00;36m%(user)s %(tenant)s%(color)s] \u001b[01;35m%(instance)s%(color)s%(message)s\u001b[00m"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"AAAAUH%2F%2BAWM%3D","line":2,"in_reply_to":"AAAAUH%2F%2BBAM%3D","updated":"2014-01-31 03:14:48.000000000","message":"We need to fix this... its quite annoying","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"etc/trove/validation-rules.json":[{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"f1ed6641cb18f9a2293b63e57eec9a33f49fc08b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":2,"id":"AAAATn%2F%2F2i0%3D","line":2,"updated":"2013-10-27 10:17:18.000000000","message":"How about support of multiple datastore types?\neven different versions of datastore might have different settings\n\nfor example, for mysql 5.1 i want enable query cache, but for 5.5-galera i need turn it off","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":2,"id":"AAAATn%2F%2FouU%3D","line":2,"in_reply_to":"AAAATn%2F%2F2i0%3D","updated":"2013-10-31 05:03:32.000000000","message":"I am thinking that we can make configurations that share the type of database/version and can be changed here once that lands. I\u0027ve thought about this but i really would like to see the code in first so that we can integrate with it. This should not conflict with the types currently as long as mysql is the default.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2Fe8A%3D","line":2,"updated":"2013-11-05 00:59:04.000000000","message":"Maintaining the correct parameters and their validation rules across multiple service-types and versions is going to be trying at times. Given that MySQL supports \"mysqld --no-defaults --verbose --help\", I\u0027m wondering if a helper script should be added that can automatically generate this file?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2FmyE%3D","line":2,"updated":"2013-10-31 14:45:06.000000000","message":"Seems to be non-flexible due to different datastore configs","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2FbfE%3D","line":2,"in_reply_to":"AAAATn%2F%2Fe3Y%3D","updated":"2013-11-06 10:59:05.000000000","message":"Agreed to all amcrn complains","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2FakA%3D","line":2,"in_reply_to":"AAAATn%2F%2Fe3Y%3D","updated":"2013-11-06 22:50:45.000000000","message":"because the service (mysql in this case) sets the default and depending on what is set in the template that someone could change in a deployment it would not really serve a real purpose for the \"default\" to be here.\n\nThinking about this more. \nIf a user removes a configuration group from an instance and expects it to return to default state then i think maybe should should set the state to RESTART_REUQIRED so that the service can reset all the params to defaults if there are not set in the default flavor template.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2FakQ%3D","line":2,"in_reply_to":"AAAATn%2F%2Fe8A%3D","updated":"2013-11-06 22:50:45.000000000","message":"If thats possible then that is something someone should totally add.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"e63137c05382bfdeb5333d46a5f36a2c3a90adcb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2Fe3Y%3D","line":2,"in_reply_to":"AAAATn%2F%2Fe8A%3D","updated":"2013-11-05 01:29:25.000000000","message":"Why is there no \"default\" field, indicating what the default value is?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2FltY%3D","line":2,"in_reply_to":"AAAATn%2F%2FmyE%3D","updated":"2013-11-06 22:50:45.000000000","message":"addressing this by moving/renaming the file.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":5,"context_line":"            \"dynamic\": false,"},{"line_number":6,"context_line":"            \"max\": 1,"},{"line_number":7,"context_line":"            \"min\": 0,"},{"line_number":8,"context_line":"            \"type\": \"boolean\""},{"line_number":9,"context_line":"        },"},{"line_number":10,"context_line":"        {"},{"line_number":11,"context_line":"            \"name\": \"autocommit\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2Fe8o%3D","line":8,"updated":"2013-11-05 00:59:04.000000000","message":"The list of types thus far are boolean, string, and integer. Considering quite a few parameters have a closed-set of acceptable values, can we introduce the equivalent of a set or enum type?\n\nSomething like:\n\n\"type\": \"enum\",\n\"values\": [\"one\", \"two\", \"three\"]\n\nThat way the validation can be generalized and the scope is fully inclusive.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":5,"context_line":"            \"dynamic\": false,"},{"line_number":6,"context_line":"            \"max\": 1,"},{"line_number":7,"context_line":"            \"min\": 0,"},{"line_number":8,"context_line":"            \"type\": \"boolean\""},{"line_number":9,"context_line":"        },"},{"line_number":10,"context_line":"        {"},{"line_number":11,"context_line":"            \"name\": \"autocommit\","}],"source_content_type":"application/json","patch_set":3,"id":"AAAATn%2F%2Fakc%3D","line":8,"in_reply_to":"AAAATn%2F%2Fe8o%3D","updated":"2013-11-06 22:50:45.000000000","message":"i see a benefit of doing that if it was from a coding stand point but since this is just a json config for the allowed params i feel like this will lead to making the configuration more complicated than it needs to be right now.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FWx8%3D","line":2,"updated":"2013-11-08 11:20:04.000000000","message":"You have validation rules in two places.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FWRU%3D","line":2,"in_reply_to":"AAAATn%2F%2FWx8%3D","updated":"2013-11-08 18:21:09.000000000","message":"i guess i should remove this location and just use the trove/templates/* location since we are using the loader.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"}],"trove/common/api.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from trove.common import wsgi"},{"line_number":18,"context_line":"from trove.configuration.service import ConfigurationsController"},{"line_number":19,"context_line":"from trove.configuration.service import ParametersController"},{"line_number":20,"context_line":"from trove.flavor.service import FlavorController"},{"line_number":21,"context_line":"from trove.instance.service import InstanceController"},{"line_number":22,"context_line":"from trove.limits.service import LimitsController"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnLw%3D","line":19,"updated":"2013-10-31 14:45:06.000000000","message":"could we make import a bit simple ?\n\n\tfrom trove.configuration import service","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from trove.common import wsgi"},{"line_number":18,"context_line":"from trove.configuration.service import ConfigurationsController"},{"line_number":19,"context_line":"from trove.configuration.service import ParametersController"},{"line_number":20,"context_line":"from trove.flavor.service import FlavorController"},{"line_number":21,"context_line":"from trove.instance.service import InstanceController"},{"line_number":22,"context_line":"from trove.limits.service import LimitsController"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmeY%3D","line":19,"in_reply_to":"AAAATn%2F%2FnLw%3D","updated":"2013-11-06 22:50:45.000000000","message":"no i think its better to just keep the controller imported separately. Keeps the lines shorter as well.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def _configurations_router(self, mapper):"},{"line_number":67,"context_line":"        parameters_resource \u003d ParametersController().create_resource()"},{"line_number":68,"context_line":"        mapper.connect(\u0027/{tenant_id}/configurations/parameters\u0027,"},{"line_number":69,"context_line":"                       controller\u003dparameters_resource,"},{"line_number":70,"context_line":"                       action\u003d\u0027index\u0027,"},{"line_number":71,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe70%3D","line":68,"updated":"2013-11-05 00:59:04.000000000","message":"Why would getting a list of every possible parameter for every possible configuration be helpful? This doesn\u0027t seem like a valid/useful route.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def _configurations_router(self, mapper):"},{"line_number":67,"context_line":"        parameters_resource \u003d ParametersController().create_resource()"},{"line_number":68,"context_line":"        mapper.connect(\u0027/{tenant_id}/configurations/parameters\u0027,"},{"line_number":69,"context_line":"                       controller\u003dparameters_resource,"},{"line_number":70,"context_line":"                       action\u003d\u0027index\u0027,"},{"line_number":71,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbe0%3D","line":68,"in_reply_to":"AAAATn%2F%2Fe70%3D","updated":"2013-11-06 10:59:05.000000000","message":"+1","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def _configurations_router(self, mapper):"},{"line_number":67,"context_line":"        parameters_resource \u003d ParametersController().create_resource()"},{"line_number":68,"context_line":"        mapper.connect(\u0027/{tenant_id}/configurations/parameters\u0027,"},{"line_number":69,"context_line":"                       controller\u003dparameters_resource,"},{"line_number":70,"context_line":"                       action\u003d\u0027index\u0027,"},{"line_number":71,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027GET\u0027]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Faj0%3D","line":68,"in_reply_to":"AAAATn%2F%2Fe70%3D","updated":"2013-11-06 22:50:45.000000000","message":"This is so that you can see what the deployment supports for configurations. Its the validation list.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6aaab4523628a66f7f1bfdc312725d646bd71fbb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                       controller\u003dinstance_resource,"},{"line_number":78,"context_line":"                       action\u003d\"action\","},{"line_number":79,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":80,"context_line":"        mapper.connect(\"/{tenant_id}/instances/{id}\","},{"line_number":81,"context_line":"                       controller\u003dinstance_resource,"},{"line_number":82,"context_line":"                       action\u003d\"delete\","},{"line_number":83,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027DELETE\u0027]})"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAZc%3D","line":80,"updated":"2014-01-31 02:29:00.000000000","message":"you\u0027re missing:\n\n    mapper.connect(\"/{tenant_id}/instances/{id}\",\n                   controller\u003dinstance_resource,\n                   action\u003d\"update\",\n                   conditions\u003d{\u0027method\u0027: [\u0027PUT\u0027]})\n\nwhich means \"trove configuration-attach\" does not work (because it has no route).","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                       controller\u003dinstance_resource,"},{"line_number":78,"context_line":"                       action\u003d\"action\","},{"line_number":79,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027POST\u0027]})"},{"line_number":80,"context_line":"        mapper.connect(\"/{tenant_id}/instances/{id}\","},{"line_number":81,"context_line":"                       controller\u003dinstance_resource,"},{"line_number":82,"context_line":"                       action\u003d\"delete\","},{"line_number":83,"context_line":"                       conditions\u003d{\u0027method\u0027: [\u0027DELETE\u0027]})"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F99qI%3D","line":80,"in_reply_to":"AAAAUH%2F%2BAZc%3D","updated":"2014-01-31 21:22:42.000000000","message":"how the hell? I\u0027m confused how i missed this...","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"trove/common/apischema.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"e63137c05382bfdeb5333d46a5f36a2c3a90adcb","unresolved":false,"context_lines":[{"line_number":7,"context_line":"#"},{"line_number":8,"context_line":"#         http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":9,"context_line":"#"},{"line_number":10,"context_line":"#    Unless required by applicable law or agreed to in writing, software"},{"line_number":11,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe3I%3D","line":10,"updated":"2013-11-05 01:29:25.000000000","message":"You\u0027re missing validation rules for the Configuration API payload(s) for /configurations endpoints.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":"}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe7c%3D","line":171,"updated":"2013-11-05 00:59:04.000000000","message":"The datastore patch-set supports uuid + name, yours supports uuid + ref. A standard needs to be established and followed.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":"}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbew%3D","line":171,"in_reply_to":"AAAATn%2F%2Fe7c%3D","updated":"2013-11-06 10:59:05.000000000","message":"Agreed","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":"}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fajs%3D","line":171,"in_reply_to":"AAAATn%2F%2Fe7c%3D","updated":"2013-11-06 22:50:45.000000000","message":"Thats a good point and something that i have always been really confused about regarding providing refs in general. Is there a good use to have those come back in the api? or even be accepted in the api? when we just parse the tenant_id and uuid out of it anyway.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"from trove.common import cfg"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"CONF \u003d cfg.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"url_ref \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpkI%3D","line":17,"updated":"2013-11-22 02:16:40.000000000","message":"you\u0027re missing apischema for the newly introduced configuration routes; the additions below only handle instance-create.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"from trove.common import cfg"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"CONF \u003d cfg.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"url_ref \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BWOI%3D","line":17,"in_reply_to":"AAAATn%2F%2Bj14%3D","updated":"2013-12-02 05:03:15.000000000","message":"good catch. I added unit tests around these as well.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":"from trove.common import cfg"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"CONF \u003d cfg.CONF"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"url_ref \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj14%3D","line":17,"in_reply_to":"AAAATn%2F%2BpkI%3D","updated":"2013-11-23 13:50:53.000000000","message":"Agreed","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"},{"line_number":175,"context_line":"    ]"},{"line_number":176,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bpuk%3D","line":173,"updated":"2013-11-22 02:16:40.000000000","message":"the new multiple-datastores-and-versions feature does not support url_ref, only uuid; therefore i argue that you follow the latest precedent.\n\nif agreed, configuration_ref should be renamed to configuration (or configuration_id).","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"},{"line_number":175,"context_line":"    ]"},{"line_number":176,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BWOM%3D","line":173,"in_reply_to":"AAAATn%2F%2Bj18%3D","updated":"2013-12-02 05:03:15.000000000","message":"I\u0027m all for not using silly refs. :)","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"configuration_ref \u003d {"},{"line_number":172,"context_line":"    \u0027oneOf\u0027: ["},{"line_number":173,"context_line":"        url_ref,"},{"line_number":174,"context_line":"        uuid"},{"line_number":175,"context_line":"    ]"},{"line_number":176,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj18%3D","line":173,"in_reply_to":"AAAATn%2F%2Bpuk%3D","updated":"2013-11-23 13:50:53.000000000","message":"Yes, nice point.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"38020ce70a19496f0b7f0b02ddcfd9005af21c03","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                \"additionalProperties\": True,"},{"line_number":188,"context_line":"                \"properties\": {"},{"line_number":189,"context_line":"                    \"name\": non_empty_string,"},{"line_number":190,"context_line":"                    \"configuration_id\": configuration_id,"},{"line_number":191,"context_line":"                    \"flavorRef\": flavorref,"},{"line_number":192,"context_line":"                    \"volume\": volume,"},{"line_number":193,"context_line":"                    \"databases\": databases_def,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fuos%3D","line":190,"updated":"2014-01-09 04:40:03.000000000","message":"This was something we talked about when adding Backups, but any reason why we\u0027re going with configuration_id over configurationRef (to be consistent)?","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"a369c7dd74deb973faa610d32d453457b97ba19f","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                \"additionalProperties\": True,"},{"line_number":188,"context_line":"                \"properties\": {"},{"line_number":189,"context_line":"                    \"name\": non_empty_string,"},{"line_number":190,"context_line":"                    \"configuration_id\": configuration_id,"},{"line_number":191,"context_line":"                    \"flavorRef\": flavorref,"},{"line_number":192,"context_line":"                    \"volume\": volume,"},{"line_number":193,"context_line":"                    \"databases\": databases_def,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fr%2Fw%3D","line":190,"in_reply_to":"AAAAUH%2F%2Fuos%3D","updated":"2014-01-09 16:09:03.000000000","message":"Take a look at Patch set 9 comments on this file. \n\nhttps://review.openstack.org/#/c/53168/9/trove/common/apischema.py\n\nThis was because the new features are not using ref so we should not have the ref.","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"}],"trove/common/cfg.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                help\u003d\u0027Extention for default service managers.\u0027"},{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe7U%3D","line":222,"updated":"2013-11-05 00:59:04.000000000","message":"Needs help text.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                help\u003d\u0027Extention for default service managers.\u0027"},{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnK4%3D","line":222,"updated":"2013-10-31 14:45:06.000000000","message":"i suppose validation rules are custom per service type, would it be better make it more flexible and.\nalso it would be nice ot organise loading via jinja and then use json.loads()","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                help\u003d\u0027Extention for default service managers.\u0027"},{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmZ0%3D","line":222,"in_reply_to":"AAAATn%2F%2FnK4%3D","updated":"2013-11-06 22:50:45.000000000","message":"I\u0027m not sold on using jinja just because its the new hotness and we are not trying to apply any changes to the files.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2f6ad58d76f400b32359995bfa6ab577d696ac30","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7s%3D","line":223,"updated":"2013-10-31 14:53:50.000000000","message":"i think rules should be different for each datastore\n\nyou can create subfolder for configurations, and use datastore prefix\n\nlike: /etc/trove/configurations/mysql_parameters.json","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fmaw%3D","line":223,"in_reply_to":"AAAATn%2F%2Fm7s%3D","updated":"2013-11-06 22:50:45.000000000","message":"Yeah this is similar to what i was thinking for different data-stores. Ya this will be addressed in the next patch.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                     \u0027 Allows to use custom managers for each of\u0027"},{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbeo%3D","line":223,"in_reply_to":"AAAATn%2F%2Fm7s%3D","updated":"2013-11-06 10:59:05.000000000","message":"agreed","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe7Q%3D","line":224,"updated":"2013-11-05 00:59:04.000000000","message":"Needs help text.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027validation_rules\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/validation-rules.json\"),"},{"line_number":224,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue),"},{"line_number":225,"context_line":"]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbek%3D","line":224,"in_reply_to":"AAAATn%2F%2Fe7Q%3D","updated":"2013-11-06 10:59:05.000000000","message":"+1","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        cfg.validation_rules \u003d rules"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    return cfg.validation_rules"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"def custom_parser(parsername, parser):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnKs%3D","line":243,"updated":"2013-10-31 14:45:06.000000000","message":"Please take a look at previous comment. And it would be better to make this postprocessing not it cfg.py","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027configuration_validation_rules_folder\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/configurations\","},{"line_number":224,"context_line":"               help\u003d\u0027Validation rules folder where the configuration\u0027"},{"line_number":225,"context_line":"                    \u0027 groups rules files live.\u0027),"},{"line_number":226,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":227,"context_line":"                help\u003d\u0027Attempts to apply the configuration dynamically \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FW2o%3D","line":224,"updated":"2013-11-08 11:20:04.000000000","message":"Inconsistent folder, you validation rules are stored in etc/trove/","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                     \u0027 service type supported in trove\u0027),"},{"line_number":222,"context_line":"    cfg.StrOpt(\u0027configuration_validation_rules_folder\u0027,"},{"line_number":223,"context_line":"               default\u003d\"/etc/trove/configurations\","},{"line_number":224,"context_line":"               help\u003d\u0027Validation rules folder where the configuration\u0027"},{"line_number":225,"context_line":"                    \u0027 groups rules files live.\u0027),"},{"line_number":226,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":227,"context_line":"                help\u003d\u0027Attempts to apply the configuration dynamically \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWPU%3D","line":224,"in_reply_to":"AAAATn%2F%2FW2o%3D","updated":"2013-11-08 18:21:09.000000000","message":"i\u0027ll just remove this.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":229,"context_line":"               help\u003d\u0027Path which leads to datastore templates\u0027),"},{"line_number":230,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":231,"context_line":"                help\u003d\u0027Attempts to apply the configuration dynamically \u0027"},{"line_number":232,"context_line":"                     \u0027to the service that does not require a restart.\u0027),"},{"line_number":233,"context_line":"]"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bptg%3D","line":232,"updated":"2013-11-22 02:16:40.000000000","message":"see my comment in trove/common/configurations.py","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"5812dea32e93992946f832f400b1969ba30c3041","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                default\u003d[\u0027atom\u0027, \u0027json\u0027, \u0027xml\u0027],"},{"line_number":245,"context_line":"                help\u003d\u0027Filetype endings not to be reattached to an id \u0027"},{"line_number":246,"context_line":"                     \u0027by the utils method correct_id_with_req.\u0027),"},{"line_number":247,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":248,"context_line":"                help\u003d\u0027If False, no attempts are made to apply dynamic \u0027"},{"line_number":249,"context_line":"                     \u0027parameters (if any are present), instead a restart \u0027"},{"line_number":250,"context_line":"                     \u0027of the datastore is required for all changes to take \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAVg%3D","line":247,"updated":"2014-01-31 03:14:48.000000000","message":"Im curious, why is this even an option? Like, shouldnt the behavior be to _always_ apply dynamic configurations??","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                default\u003d[\u0027atom\u0027, \u0027json\u0027, \u0027xml\u0027],"},{"line_number":245,"context_line":"                help\u003d\u0027Filetype endings not to be reattached to an id \u0027"},{"line_number":246,"context_line":"                     \u0027by the utils method correct_id_with_req.\u0027),"},{"line_number":247,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":248,"context_line":"                help\u003d\u0027If False, no attempts are made to apply dynamic \u0027"},{"line_number":249,"context_line":"                     \u0027parameters (if any are present), instead a restart \u0027"},{"line_number":250,"context_line":"                     \u0027of the datastore is required for all changes to take \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F99fI%3D","line":247,"in_reply_to":"AAAAUH%2F%2BAVg%3D","updated":"2014-01-31 21:22:42.000000000","message":"Hmmmp... thats a good point. i was thinking there was a situation that we might need to not allow this and always force a restart for some databases. This would not require you to possibly change all the validation_rules to set restart_required. We can chat about it i guess?","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"fbcabd243291e773f5b0ab985b0dfbae4cfd4c49","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                default\u003d[\u0027atom\u0027, \u0027json\u0027, \u0027xml\u0027],"},{"line_number":245,"context_line":"                help\u003d\u0027Filetype endings not to be reattached to an id \u0027"},{"line_number":246,"context_line":"                     \u0027by the utils method correct_id_with_req.\u0027),"},{"line_number":247,"context_line":"    cfg.BoolOpt(\u0027apply_dynamic_configuration\u0027, default\u003dTrue,"},{"line_number":248,"context_line":"                help\u003d\u0027If False, no attempts are made to apply dynamic \u0027"},{"line_number":249,"context_line":"                     \u0027parameters (if any are present), instead a restart \u0027"},{"line_number":250,"context_line":"                     \u0027of the datastore is required for all changes to take \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F9704%3D","line":247,"in_reply_to":"AAAAUH%2F99fI%3D","updated":"2014-01-31 22:17:15.000000000","message":"this was in since day one, and i\u0027m not sure if i remember the original intent, but if i were to conjecture:\n\nthere might be a scenario in which you want to stage cnf changes to a fleet of machines, but trigger the application of them later (vs. using dynamic). if i were struggling to invent a scenario, perhaps you\u0027d want to deploy the latest cnf changes earlier in the day, but only trigger the database bounce during a strict maintenance window.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"trove/common/configurations.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from trove.common import cfg"},{"line_number":20,"context_line":"from trove.openstack.common import log as logging"},{"line_number":21,"context_line":"from ConfigParser import ConfigParser"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWzc%3D","line":21,"updated":"2013-11-08 11:20:04.000000000","message":"it would be better to use it from six lib, because it\u0027s incompability with Py3.\n\nhttp://docs.python.org/2/library/configparser.html","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"from trove.common import cfg"},{"line_number":20,"context_line":"from trove.openstack.common import log as logging"},{"line_number":21,"context_line":"from ConfigParser import ConfigParser"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWRs%3D","line":21,"in_reply_to":"AAAATn%2F%2FWzc%3D","updated":"2013-11-08 18:21:09.000000000","message":"ok","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"ENV \u003d jinja2.Environment(loader\u003djinja2.ChoiceLoader(["},{"line_number":28,"context_line":"    jinja2.FileSystemLoader(CONF.configuration_validation_rules_folder),"},{"line_number":29,"context_line":"    jinja2.PackageLoader(\"trove\", \"templates\")"},{"line_number":30,"context_line":"]))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWzw%3D","line":29,"updated":"2013-11-08 11:20:04.000000000","message":"since we would have 2 envs, it would be better to use one. It could be placed at common/utils","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":33,"context_line":"def _get_item(key, dictList):"},{"line_number":34,"context_line":"    for item in dictList:"},{"line_number":35,"context_line":"        if key \u003d\u003d item.get(\u0027name\u0027):"},{"line_number":36,"context_line":"            return item"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FW1c%3D","line":36,"updated":"2013-11-08 11:20:04.000000000","message":"I wonder if it could be moved to common/utils. \n\n    def _get_item(key, dictList):\n        for item in dictList:\n            if key in item.values():\n                return item\n\nlooks a bit cleaner","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"def _get_item(key, dictList):"},{"line_number":34,"context_line":"    for item in dictList:"},{"line_number":35,"context_line":"        if key \u003d\u003d item.get(\u0027name\u0027):"},{"line_number":36,"context_line":"            return item"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWIE%3D","line":36,"in_reply_to":"AAAATn%2F%2FW1c%3D","updated":"2013-11-08 18:21:09.000000000","message":"Since this is only used here it doesnt make sense to move this i dont think.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return item"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":40,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":41,"context_line":"        return True"},{"line_number":42,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FW1E%3D","line":39,"updated":"2013-11-08 11:20:04.000000000","message":"i suppose, since we are going to support multi-datastore-type we should not use defaults.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            return item"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":40,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":41,"context_line":"        return True"},{"line_number":42,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWRk%3D","line":39,"in_reply_to":"AAAATn%2F%2FW1E%3D","updated":"2013-11-08 18:21:09.000000000","message":"I made it like this so that it can be changed easily but the initial work I\u0027ve done is to make sure we support mysql configs.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    return False"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def get_validation_rules(datastore_type\u003d\u0027mysql\u0027):"},{"line_number":52,"context_line":"    config_location \u003d (\"%s-validation-rules.json\" % datastore_type)"},{"line_number":53,"context_line":"    template \u003d ENV.get_template(config_location)"},{"line_number":54,"context_line":"    return json.loads(template.render())"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWz8%3D","line":51,"updated":"2013-11-08 11:20:04.000000000","message":"same","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    return json.loads(template.render())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class MySQLParser(object):"},{"line_number":58,"context_line":"    \"\"\"MySQLParser\"\"\""},{"line_number":59,"context_line":"    def __init__(self, config):"},{"line_number":60,"context_line":"        self.config \u003d config"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FW0A%3D","line":57,"updated":"2013-11-08 11:20:04.000000000","message":"Should it be named like MySQLConfParser ?","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    return json.loads(template.render())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class MySQLParser(object):"},{"line_number":58,"context_line":"    \"\"\"MySQLParser\"\"\""},{"line_number":59,"context_line":"    def __init__(self, config):"},{"line_number":60,"context_line":"        self.config \u003d config"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWRo%3D","line":57,"in_reply_to":"AAAATn%2F%2FW0A%3D","updated":"2013-11-08 18:21:09.000000000","message":"sounds good.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"},{"line_number":39,"context_line":"    LOG.debug(\"overrides: %s\" % overrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpZo%3D","line":36,"updated":"2013-11-22 02:16:40.000000000","message":"this check/logic is fairly confusing.\n\nfrom cfg.py: \"Attempts to apply the configuration dynamically to the service that does not require a restart.\"\n\nit\u0027s not clear whether the behavior is:\n\n(1) to immediately apply dynamic parameters, but rely on non-dynamic to be picked up after a restart\n\nor\n\n(2) if a single non-dynamic parameter is found in a configuration group, no parameters are applied (even if some dynamic ones exist).\n\nor ?\n\nFrom the code, the true behavior becomes clear.\n\nI\u0027m a fan of the all-or-nothing approach (it makes it atomic vs. apply some dynamic, wait for reboot for others).\n\ncan the help for apply_dynamic_configuration in cfg.py be changed to:\n\n\"If False, no attempts are made to apply dynamic parameters (if any are present), instead a restart of the datastore is required for all changes to take effect. If True, and all parameters are dynamic for a configuration, all parameters will be applied immediately.\"","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"},{"line_number":39,"context_line":"    LOG.debug(\"overrides: %s\" % overrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj1g%3D","line":36,"in_reply_to":"AAAATn%2F%2BpZo%3D","updated":"2013-11-23 13:50:53.000000000","message":"Austom, good catch. Agreed.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"},{"line_number":39,"context_line":"    LOG.debug(\"overrides: %s\" % overrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BlXo%3D","line":36,"in_reply_to":"AAAATn%2F%2BpZo%3D","updated":"2013-12-02 05:03:15.000000000","message":"The more i\u0027ve worked with this \"special case\" of dynamically applying the configuration to the mysql db, it seems like it should be an atomic operation and i agree with your point. \n\nWhen i first walked through this blueprint, i thought it made more sense to apply everything that you can at the time of applying the configuration.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def _remove_commented_lines(self, config_str):"},{"line_number":67,"context_line":"        ret \u003d []"},{"line_number":68,"context_line":"        for line in config_str.splitlines():"},{"line_number":69,"context_line":"            if line.startswith(\u0027#\u0027):"},{"line_number":70,"context_line":"                continue"},{"line_number":71,"context_line":"            elif line.startswith(\u0027!\u0027):"},{"line_number":72,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpsI%3D","line":69,"updated":"2013-11-22 02:16:40.000000000","message":"this line might need to be enhanced a bit; afaik leading whitespace before a octothorpe is acceptable.\n\ntake a look at https://review.openstack.org/#/c/51884/17/trove/templates/cassandra.config.template, line #72-77 and #82-90. granted it\u0027s for cassandra (and this is for mysql), but i believe it\u0027s the same story.\n\nthe alternative is to force the templates to comply, but that\u0027s a bit more tedious and prone to human error.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def _remove_commented_lines(self, config_str):"},{"line_number":67,"context_line":"        ret \u003d []"},{"line_number":68,"context_line":"        for line in config_str.splitlines():"},{"line_number":69,"context_line":"            if line.startswith(\u0027#\u0027):"},{"line_number":70,"context_line":"                continue"},{"line_number":71,"context_line":"            elif line.startswith(\u0027!\u0027):"},{"line_number":72,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj1Y%3D","line":69,"in_reply_to":"AAAATn%2F%2BpsI%3D","updated":"2013-11-23 13:50:53.000000000","message":"I suppose whole config.template should come without any of comment, it would be smaller, clean etc. And i thought parser should be easier.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def _remove_commented_lines(self, config_str):"},{"line_number":67,"context_line":"        ret \u003d []"},{"line_number":68,"context_line":"        for line in config_str.splitlines():"},{"line_number":69,"context_line":"            if line.startswith(\u0027#\u0027):"},{"line_number":70,"context_line":"                continue"},{"line_number":71,"context_line":"            elif line.startswith(\u0027!\u0027):"},{"line_number":72,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BmqA%3D","line":69,"in_reply_to":"AAAATn%2F%2BpsI%3D","updated":"2013-12-02 05:03:15.000000000","message":"That sounds logical. I should probably first strip the empty chars then check the line starts with #.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"bca0b05f1b7cb5cb0b6e9b00219524ac69f558e3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            return item"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9O4Y%3D","line":35,"updated":"2013-12-13 18:13:58.000000000","message":"datastore_type should be datastore_manager.\n\ntreating the datastore_manager as a synonym of datastore_type is incorrect and will cause confusion. the datastore_manager is the logical key used to determine the manager class to be used (see https://github.com/openstack/trove/blob/d488e37a698d6f1727d3abeb31d7c6a7699af778/trove/guestagent/dbaas.py#L36-L39) whereas the datastore_type is the name of the datastore.\n\nit just so happens that the datastore_type and the datastore_manager can be the same value, i.e. \"mysql\". to avoid this confusion in the future, i think that the manager names should be suffixed with \"_manager\" or some sort of string literal.\n\nthis seems to also unearth an undiscovered issue with datastores: why is the manager at the datastore level, and not the datastore-version level? if a provider creates a datastore of \"mysql\" with two versions, \"5.5\" and \"5.6\", both versions must share the same manager, meaning there is no means of having separate validation-rules for the configuration-groups.","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d2461fc1d788217142313e3f53c9041f29502ff","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            return item"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9OyM%3D","line":35,"in_reply_to":"AAAATn%2F9O4Y%3D","updated":"2013-12-13 18:26:25.000000000","message":"now that i think about it, there\u0027s a way around this: if the datastore_manager + datastore_type + datastore_version are used to lookup the validation rules file, the problem vanishes.\n\nprecedence (order of attempted lookup):\n\n- (1) \u003ctype\u003e-\u003cversion\u003e/validation-rules.json\n- (2) \u003ctype\u003e/validation-rules.json\n- (3) \u003cmanager\u003e/validation-rules.json\n\ni still strongly suggest that the manager names are suffixed/prefixed with some sort of literal however.","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"2c99a7c3dcb948fb0b98c5af2f47f93a723610d8","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            return item"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def do_configs_require_restart(overrides, datastore_type\u003d\u0027mysql\u0027):"},{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_type\u003ddatastore_type)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9Oi0%3D","line":35,"in_reply_to":"AAAATn%2F9OyM%3D","updated":"2013-12-13 19:28:17.000000000","message":"i see where confusion could happen. I\u0027ll change it to make it datastore_manager instead.\n\nwrt the lookup for validation rules.\nWe could have separate validations for different DS-versions? If this is the case then we made run into issues having the config groups abstracted between DS-types and DS-versions. the provider would have to make sure that the validation rules for the DS-type be fully inclusive of all the validation rules to the DS-versions as well. \nThis would be a maintenance nightmare unless we do the merge of all of the versions of the DS-type in the code to validate a config group that is associated with just a DS-type.","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"bca0b05f1b7cb5cb0b6e9b00219524ac69f558e3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    return False"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_validation_rules(datastore_type\u003d\u0027mysql\u0027):"},{"line_number":50,"context_line":"    config_location \u003d (\"%s/validation-rules.json\" % datastore_type)"},{"line_number":51,"context_line":"    template \u003d ENV.get_template(config_location)"},{"line_number":52,"context_line":"    return json.loads(template.render())"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9O4Q%3D","line":49,"updated":"2013-12-13 18:13:58.000000000","message":"datastore_type should be renamed to datastore_manager","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    if not CONF.apply_dynamic_configuration:"},{"line_number":37,"context_line":"        return True"},{"line_number":38,"context_line":"    rules \u003d get_validation_rules(datastore_manager\u003ddatastore_manager)"},{"line_number":39,"context_line":"    LOG.debug(\"overrides: %s\" % overrides)"},{"line_number":40,"context_line":"    LOG.debug(\"rules?: %s\" % rules)"},{"line_number":41,"context_line":"    for key in overrides.keys():"},{"line_number":42,"context_line":"        rule \u003d _get_item(key, rules[\u0027configuration-parameters\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfHk%3D","line":39,"updated":"2014-01-13 12:49:18.000000000","message":"please _()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"5812dea32e93992946f832f400b1969ba30c3041","unresolved":false,"context_lines":[{"line_number":30,"context_line":"def _get_item(key, dictList):"},{"line_number":31,"context_line":"    for item in dictList:"},{"line_number":32,"context_line":"        if key \u003d\u003d item.get(\u0027name\u0027):"},{"line_number":33,"context_line":"            return item"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def do_configs_require_restart(overrides, datastore_manager\u003d\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAVQ%3D","line":33,"updated":"2014-01-31 03:14:48.000000000","message":"is this really needed? isint that just a 3 line list comprehension? Also, its only used in 1x place, which makes me think that we can nuke _get_item altogether and just put the list comp down in do_configs_require_restart.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":30,"context_line":"def _get_item(key, dictList):"},{"line_number":31,"context_line":"    for item in dictList:"},{"line_number":32,"context_line":"        if key \u003d\u003d item.get(\u0027name\u0027):"},{"line_number":33,"context_line":"            return item"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def do_configs_require_restart(overrides, datastore_manager\u003d\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F99d0%3D","line":33,"in_reply_to":"AAAAUH%2F%2BAVQ%3D","updated":"2014-01-31 21:22:42.000000000","message":"its not exactly list comprehension because i dont want a list i just want the item. I think i could move this in to the method but it just made the method look way tabbed and i thought it would look better like this.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"5812dea32e93992946f832f400b1969ba30c3041","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.config \u003d config"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def parse(self):"},{"line_number":62,"context_line":"        good_cfg \u003d self._remove_commented_lines(str(self.config))"},{"line_number":63,"context_line":"        cfg_parser \u003d configparser.ConfigParser()"},{"line_number":64,"context_line":"        cfg_parser.readfp(io.BytesIO(str(good_cfg)))"},{"line_number":65,"context_line":"        return cfg_parser.items(\"mysqld\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAUs%3D","line":62,"updated":"2014-01-31 03:14:48.000000000","message":"is there a reason to remove comments? A operator might want comments in their config.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.config \u003d config"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def parse(self):"},{"line_number":62,"context_line":"        good_cfg \u003d self._remove_commented_lines(str(self.config))"},{"line_number":63,"context_line":"        cfg_parser \u003d configparser.ConfigParser()"},{"line_number":64,"context_line":"        cfg_parser.readfp(io.BytesIO(str(good_cfg)))"},{"line_number":65,"context_line":"        return cfg_parser.items(\"mysqld\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F99ec%3D","line":62,"in_reply_to":"AAAAUH%2F%2BAUs%3D","updated":"2014-01-31 21:22:42.000000000","message":"yeah comments are bad in the config parser for py26. Its really a POS so this was a hack to get around it. py27 has all the fixes and you can tell it what lines you want to ignore when reading. And the oslo cfg reader was WAY over kill.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"trove/common/exception.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"class NoConfigParserFound(NotFound):"},{"line_number":369,"context_line":"    message \u003d _(\"No configuration parser found for service %(service_type)s\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bprg%3D","line":369,"updated":"2013-11-22 02:16:40.000000000","message":"needs to be updated to work with datastore, not service_type.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"class NoConfigParserFound(NotFound):"},{"line_number":369,"context_line":"    message \u003d _(\"No configuration parser found for service %(service_type)s\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj1Q%3D","line":369,"in_reply_to":"AAAATn%2F%2Bprg%3D","updated":"2013-11-23 13:50:53.000000000","message":"agreed.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"class NoConfigParserFound(NotFound):"},{"line_number":369,"context_line":"    message \u003d _(\"No configuration parser found for service \""},{"line_number":370,"context_line":"                \"%(datastore_manager)s\")"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BFE4%3D","line":369,"updated":"2013-12-02 21:29:29.000000000","message":"should \"service\" be \"datastore\"?","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c286861c609c1eac6d1fefcae93555fac99f01ee","unresolved":false,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"class NoConfigParserFound(NotFound):"},{"line_number":369,"context_line":"    message \u003d _(\"No configuration parser found for service \""},{"line_number":370,"context_line":"                \"%(datastore_manager)s\")"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEVA%3D","line":369,"in_reply_to":"AAAATn%2F%2BFE4%3D","updated":"2013-12-02 22:00:32.000000000","message":"yup","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5500b0b2583150477ecd85f5875ce991d0e4d504","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    message \u003d _(\u0027Unable to delete configuration since an instance is \u0027"},{"line_number":184,"context_line":"                \u0027currently assigned to the configuration.  Unassign the \u0027"},{"line_number":185,"context_line":"                \u0027instance from the configuration and try again.\u0027)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"class UnprocessableEntity(TroveError):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjs8%3D","line":185,"updated":"2014-01-11 07:26:15.000000000","message":"phrasing is a bit awkward.\n\nsuggestion: \"A configuration group cannot be deleted if it is associated with one or more active instances. Detach the configuration group from all active instances and please try again.\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"484ec52d54159778b8d1a151832fd98c2e9e28d6","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    message \u003d _(\u0027Unable to delete configuration since an instance is \u0027"},{"line_number":184,"context_line":"                \u0027currently assigned to the configuration.  Unassign the \u0027"},{"line_number":185,"context_line":"                \u0027instance from the configuration and try again.\u0027)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"class UnprocessableEntity(TroveError):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjsk%3D","line":185,"in_reply_to":"AAAAUH%2F%2Fjs8%3D","updated":"2014-01-11 07:57:36.000000000","message":"amending my suggestion to: \"A configuration group cannot be deleted if it is associated with one or more non-terminated instances. Detach the configuration group from all non-terminated instances and please try again.\".\n\nreason being is that \"active\" is technically not correct, it\u0027ll fail in the scenario of state\u003dbuild as well.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class ConfigKeyNotFound(NotFound):"},{"line_number":364,"context_line":"    message \u003d _(\"Config Key %(key)s not found\")"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"class NoConfigParserFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fju0%3D","line":364,"updated":"2014-01-11 06:58:03.000000000","message":"as mentioned in other places, the user is exposed to the terminology \"configuration parameter\", not \"configuration key\" or \"config key\". this error message is exposed to the user if they do a configuration-get-parameter on a bogus parameter:\n\n$ trove configuration-get-parameter key_buffer_sz\nERROR: Config Key key_buffer_sz not found\n\ncan this be changed to: \"%(key)s is not a supported configuration parameter\"?","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"2f646b42736a023943ce5f92bee59cd871e76368","unresolved":false,"context_lines":[{"line_number":380,"context_line":"    message \u003d _(\"Datastore Version on Configuration \""},{"line_number":381,"context_line":"                \"%(config_datastore_version)s does not \""},{"line_number":382,"context_line":"                \"match the Datastore Version on the instance \""},{"line_number":383,"context_line":"                \"%(instance_datastore_vesrion)s.\")"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"class ConfigurationParameterDeleted(object):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAUH%2F9duI%3D","line":383,"updated":"2014-02-06 18:27:27.000000000","message":"should be instance_datastore_version, not vesrion.","commit_id":"2b2b8d6abe15a187b81f92916394f69742f9224a"}],"trove/common/template.py":[{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"4596fe9aa882a699aefac27b84f7744a8f086e02","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        config \u003d self.render()"},{"line_number":61,"context_line":"        cfg \u003d ConfigParser.ConfigParser(allow_no_value\u003dTrue)"},{"line_number":62,"context_line":"        # convert unicode to ascii because config parse was not happy"},{"line_number":63,"context_line":"        cfgstr \u003d str(config)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        good_cfg \u003d self._remove_commented_lines(cfgstr)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FIW4%3D","line":63,"updated":"2013-10-22 18:37:33.000000000","message":"If that is the case, you may need to encode this as ascii and ignore errors. Otherwise this will fail if someone actually includes a unicode char.","commit_id":"b3db5e09f313c0f0a1dbf9873b17b7071802774a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"]))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ConfigParser import *"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class MyConfigParser(SafeConfigParser):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnKg%3D","line":24,"updated":"2013-10-31 14:45:06.000000000","message":"Please do not use * anywhere","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":21,"context_line":"]))"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from ConfigParser import *"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class MyConfigParser(SafeConfigParser):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmdE%3D","line":24,"in_reply_to":"AAAATn%2F%2FnKg%3D","updated":"2013-11-06 22:50:45.000000000","message":"This is required to be py26 compatible. I\u0027ll move this to a common place and only use it if you are using py26. \n\nIn order to use the ConfigParser from python you need support for reading a config file with only a key and no value. py27 has an option that supports this inheritently but in py26 you cannot. So i had to override this _read() method to support parsing a config file.\n\nThis is taken from the py26 library code and slightly modified.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ConfigParser import *"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class MyConfigParser(SafeConfigParser):"},{"line_number":28,"context_line":"    def _read(self, fp, fpname):"},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"          Parse a sectioned setup file."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnKM%3D","line":27,"updated":"2013-10-31 14:45:06.000000000","message":"Could we use more meaningful names ?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from ConfigParser import *"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class MyConfigParser(SafeConfigParser):"},{"line_number":28,"context_line":"    def _read(self, fp, fpname):"},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"          Parse a sectioned setup file."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaWE%3D","line":27,"in_reply_to":"AAAATn%2F%2FnKM%3D","updated":"2013-11-06 22:50:45.000000000","message":"I\u0027ve been able to remove all this code...","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class MyConfigParser(SafeConfigParser):"},{"line_number":28,"context_line":"    def _read(self, fp, fpname):"},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"          Parse a sectioned setup file."},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnFM%3D","line":28,"updated":"2013-10-31 14:45:06.000000000","message":"I\u0027d like to see tests if this parser able to parse complex yaml config","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2f6ad58d76f400b32359995bfa6ab577d696ac30","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                break"},{"line_number":48,"context_line":"            lineno \u003d lineno + 1"},{"line_number":49,"context_line":"            # comment or blank line?"},{"line_number":50,"context_line":"            if line.strip() \u003d\u003d \u0027\u0027 or line[0] in \u0027#;\u0027:"},{"line_number":51,"context_line":"                continue"},{"line_number":52,"context_line":"            if line.split(None, 1)[0].lower() \u003d\u003d \u0027rem\u0027 and line[0] in \"rR\":"},{"line_number":53,"context_line":"                # no leading whitespace"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm6g%3D","line":50,"updated":"2013-10-31 14:53:50.000000000","message":"i think should keep comments. they can contain sensitive information for deployers","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        self.flavor_dict \u003d flavor_dict"},{"line_number":133,"context_line":"        if overrides:"},{"line_number":134,"context_line":"            template_filename \u003d \"%s.override.config.template\" % service_type"},{"line_number":135,"context_line":"        else:"},{"line_number":136,"context_line":"            template_filename \u003d \"%s.config.template\" % service_type"},{"line_number":137,"context_line":"        self.template \u003d ENV.get_template(template_filename)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnJ0%3D","line":134,"updated":"2013-10-31 14:45:06.000000000","message":"Why do we need this at all ?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            flavor\u003dself.flavor_dict, server_id\u003dserver_id, **kwargs)"},{"line_number":149,"context_line":"        return self.config_contents"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def render_dict(self):"},{"line_number":152,"context_line":"        config \u003d self.render()"},{"line_number":153,"context_line":"        cfg \u003d MyConfigParser()"},{"line_number":154,"context_line":"        # convert unicode to ascii because config parse was not happy"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnE4%3D","line":151,"updated":"2013-10-31 14:45:06.000000000","message":"What if parser are not able to parse complex json/yaml/xml config? This this would be broken also.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            flavor\u003dself.flavor_dict, server_id\u003dserver_id, **kwargs)"},{"line_number":149,"context_line":"        return self.config_contents"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def render_dict(self):"},{"line_number":152,"context_line":"        config \u003d self.render()"},{"line_number":153,"context_line":"        cfg \u003d MyConfigParser()"},{"line_number":154,"context_line":"        # convert unicode to ascii because config parse was not happy"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmcA%3D","line":151,"in_reply_to":"AAAATn%2F%2FnE4%3D","updated":"2013-11-06 22:50:45.000000000","message":"Yes that would be correct. I do not know what all formats that are needed here. This was for mysql config. This can be changed later.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        cfg \u003d MyConfigParser()"},{"line_number":154,"context_line":"        # convert unicode to ascii because config parse was not happy"},{"line_number":155,"context_line":"        cfgstr \u003d str(config)"},{"line_number":156,"context_line":"        good_cfg \u003d self._remove_commented_lines(cfgstr)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        cfg.readfp(io.BytesIO(str(good_cfg)))"},{"line_number":159,"context_line":"        return cfg.items(\"mysqld\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnJo%3D","line":156,"updated":"2013-10-31 14:45:06.000000000","message":"i suppose we don\u0027t need such complex verifications.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2f6ad58d76f400b32359995bfa6ab577d696ac30","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        cfg.readfp(io.BytesIO(str(good_cfg)))"},{"line_number":159,"context_line":"        return cfg.items(\"mysqld\")"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _remove_commented_lines(self, config_str):"},{"line_number":162,"context_line":"        ret \u003d []"},{"line_number":163,"context_line":"        for line in config_str.splitlines():"},{"line_number":164,"context_line":"            if line.startswith(\u0027#\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm48%3D","line":161,"updated":"2013-10-31 14:53:50.000000000","message":"same for comments","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        cfg.readfp(io.BytesIO(str(good_cfg)))"},{"line_number":159,"context_line":"        return cfg.items(\"mysqld\")"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _remove_commented_lines(self, config_str):"},{"line_number":162,"context_line":"        ret \u003d []"},{"line_number":163,"context_line":"        for line in config_str.splitlines():"},{"line_number":164,"context_line":"            if line.startswith(\u0027#\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fmb4%3D","line":161,"in_reply_to":"AAAATn%2F%2Fm48%3D","updated":"2013-11-06 22:50:45.000000000","message":"this was required because config parser will not ignore the !includedir at the end of the mysql config. So it removes lines that cannot be parsed.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"SERVICE_PARSERS \u003d {"},{"line_number":28,"context_line":"    \u0027mysql\u0027: configurations.MySQLParser,"},{"line_number":29,"context_line":"    \u0027percona\u0027: configurations.MySQLParser,"},{"line_number":30,"context_line":"}"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWzU%3D","line":28,"updated":"2013-11-08 11:20:04.000000000","message":"same MySQLConfigParser","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"SERVICE_PARSERS \u003d {"},{"line_number":28,"context_line":"    \u0027mysql\u0027: configurations.MySQLParser,"},{"line_number":29,"context_line":"    \u0027percona\u0027: configurations.MySQLParser,"},{"line_number":30,"context_line":"}"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWRw%3D","line":28,"in_reply_to":"AAAATn%2F%2FWzU%3D","updated":"2013-11-08 18:21:09.000000000","message":"sounds good.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        self.service_type \u003d service_type"},{"line_number":52,"context_line":"        self.instance_id \u003d instance_id"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def render(self, **kwargs):"},{"line_number":55,"context_line":"        \"\"\" Renders the jinja template"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        :returns: str -- The rendered configuration file"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWzM%3D","line":54,"updated":"2013-11-08 11:20:04.000000000","message":"good point.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        cfg_parser \u003d SERVICE_PARSERS.get(self.service_type)"},{"line_number":73,"context_line":"        if not cfg_parser:"},{"line_number":74,"context_line":"            raise exception.NoConfigParserFound(service_type\u003dself.service_type)"},{"line_number":75,"context_line":"        return cfg_parser(config).parse()"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _calculate_unique_id(self):"},{"line_number":78,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWzI%3D","line":75,"updated":"2013-11-08 11:20:04.000000000","message":"Nice one.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"SERVICE_PARSERS \u003d {"},{"line_number":30,"context_line":"    \u0027mysql\u0027: configurations.MySQLConfParser,"},{"line_number":31,"context_line":"    \u0027percona\u0027: configurations.MySQLConfParser,"},{"line_number":32,"context_line":"}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfGQ%3D","line":31,"updated":"2014-01-13 12:49:18.000000000","message":"percona is not required any more, since we are not supporting it (no template file, no datastore for percona)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/common/wsgi.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        #mgmt/instance"},{"line_number":83,"context_line":"        \u0027id\u0027: \u0027\u0027,"},{"line_number":84,"context_line":"    },"},{"line_number":85,"context_line":"    \u0027configuration\u0027: {\u0027id\u0027: \u0027\u0027, \u0027name\u0027: \u0027\u0027, \u0027description\u0027: \u0027\u0027},"},{"line_number":86,"context_line":"    \u0027flavor\u0027: {\u0027id\u0027: \u0027\u0027, \u0027ram\u0027: \u0027\u0027, \u0027name\u0027: \u0027\u0027},"},{"line_number":87,"context_line":"    \u0027link\u0027: {\u0027href\u0027: \u0027\u0027, \u0027rel\u0027: \u0027\u0027},"},{"line_number":88,"context_line":"    \u0027database\u0027: {\u0027name\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bpmo%3D","line":85,"updated":"2013-11-22 02:16:40.000000000","message":"for the sake of argument, why no \"href\" field considering at the moment you support url_refs for configuration_ref?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        #mgmt/instance"},{"line_number":83,"context_line":"        \u0027id\u0027: \u0027\u0027,"},{"line_number":84,"context_line":"    },"},{"line_number":85,"context_line":"    \u0027configuration\u0027: {\u0027id\u0027: \u0027\u0027, \u0027name\u0027: \u0027\u0027, \u0027description\u0027: \u0027\u0027},"},{"line_number":86,"context_line":"    \u0027flavor\u0027: {\u0027id\u0027: \u0027\u0027, \u0027ram\u0027: \u0027\u0027, \u0027name\u0027: \u0027\u0027},"},{"line_number":87,"context_line":"    \u0027link\u0027: {\u0027href\u0027: \u0027\u0027, \u0027rel\u0027: \u0027\u0027},"},{"line_number":88,"context_line":"    \u0027database\u0027: {\u0027name\u0027: \u0027\u0027},"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BTOw%3D","line":85,"in_reply_to":"AAAATn%2F%2Bpmo%3D","updated":"2013-12-02 05:03:15.000000000","message":"well I did not return a href for the configuration. Maybe i was anticipating only using the id after all. ;)\n\nI added the datastore_version_id here.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/configuration/__init__.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace"},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ywA%3D","line":2,"updated":"2013-12-05 21:39:39.000000000","message":"please leave __init__.py empty","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"}],"trove/configuration/models.py":[{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"fb2f55580378eb131ffbb9b9a1982d619df9070b","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class Configurations(object):"},{"line_number":33,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @staticmethod"},{"line_number":36,"context_line":"    def load(context):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F9Kk%3D","line":33,"updated":"2013-10-24 16:52:04.000000000","message":"what are these?? This is for subclasses of DatabaseModelBase","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"44e7d9575ae116826893dcd21874cf2e77ae56f8","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class Configurations(object):"},{"line_number":33,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027name\u0027, \u0027description\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @staticmethod"},{"line_number":36,"context_line":"    def load(context):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F7dM%3D","line":33,"in_reply_to":"AAAATn%2F%2F9Kk%3D","updated":"2013-10-25 03:15:20.000000000","message":"wow... good point... not sure how those got there.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"fb2f55580378eb131ffbb9b9a1982d619df9070b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        elif id is None:"},{"line_number":40,"context_line":"            raise TypeError(\"Argument is not defined.\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        \"\"\" TODO(cp16net): Pagination support required! \"\"\""},{"line_number":43,"context_line":"        db_info \u003d DBConfiguration.find_all(tenant_id\u003dcontext.tenant)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        if db_info is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F9LU%3D","line":42,"updated":"2013-10-24 16:52:04.000000000","message":"should be: # TODO(cp16net): blah","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        elif id is None:"},{"line_number":40,"context_line":"            raise TypeError(\"Argument is not defined.\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        \"\"\" TODO(cp16net): Pagination support required! \"\"\""},{"line_number":43,"context_line":"        db_info \u003d DBConfiguration.find_all(tenant_id\u003dcontext.tenant)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        if db_info is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fotc%3D","line":42,"in_reply_to":"AAAATn%2F%2F9LU%3D","updated":"2013-10-31 05:03:32.000000000","message":"yup","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"fb2f55580378eb131ffbb9b9a1982d619df9070b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @staticmethod"},{"line_number":64,"context_line":"    def create(name, description, tenant_id):"},{"line_number":65,"context_line":"        configurationGroup \u003d DBConfiguration.create(name\u003dname,"},{"line_number":66,"context_line":"                                                    description\u003ddescription,"},{"line_number":67,"context_line":"                                                    tenant_id\u003dtenant_id)"},{"line_number":68,"context_line":"        return configurationGroup"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F9K8%3D","line":66,"updated":"2013-10-24 16:52:04.000000000","message":"pep8","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @staticmethod"},{"line_number":64,"context_line":"    def create(name, description, tenant_id):"},{"line_number":65,"context_line":"        configurationGroup \u003d DBConfiguration.create(name\u003dname,"},{"line_number":66,"context_line":"                                                    description\u003ddescription,"},{"line_number":67,"context_line":"                                                    tenant_id\u003dtenant_id)"},{"line_number":68,"context_line":"        return configurationGroup"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FotY%3D","line":66,"in_reply_to":"AAAATn%2F%2F9K8%3D","updated":"2013-10-31 05:03:32.000000000","message":"thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"fb2f55580378eb131ffbb9b9a1982d619df9070b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        config_items \u003d []"},{"line_number":76,"context_line":"        for key, val in values.iteritems():"},{"line_number":77,"context_line":"            config_item \u003d ConfigurationItem.create(configuration_id\u003dcfg_id,"},{"line_number":78,"context_line":"                                                   configuration_key\u003dkey,"},{"line_number":79,"context_line":"                                                   configuration_value\u003dval)"},{"line_number":80,"context_line":"            config_items.append(config_item)"},{"line_number":81,"context_line":"        return config_items"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F9LE%3D","line":78,"updated":"2013-10-24 16:52:04.000000000","message":"pep8","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        config_items \u003d []"},{"line_number":76,"context_line":"        for key, val in values.iteritems():"},{"line_number":77,"context_line":"            config_item \u003d ConfigurationItem.create(configuration_id\u003dcfg_id,"},{"line_number":78,"context_line":"                                                   configuration_key\u003dkey,"},{"line_number":79,"context_line":"                                                   configuration_value\u003dval)"},{"line_number":80,"context_line":"            config_items.append(config_item)"},{"line_number":81,"context_line":"        return config_items"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FotU%3D","line":78,"in_reply_to":"AAAATn%2F%2F9LE%3D","updated":"2013-10-31 05:03:32.000000000","message":"thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        elif id is None:"},{"line_number":39,"context_line":"            raise TypeError(\"Argument is not defined.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # TODO(cp16net): Pagination support required!"},{"line_number":42,"context_line":"        if context.is_admin:"},{"line_number":43,"context_line":"            db_info \u003d DBConfiguration.find_all()"},{"line_number":44,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe7I%3D","line":41,"updated":"2013-11-05 00:59:04.000000000","message":"as you noted, pagination support is needed to avoid an admin returning a gigantic list of configuration groups across all tenants.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        elif id is None:"},{"line_number":39,"context_line":"            raise TypeError(\"Argument is not defined.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # TODO(cp16net): Pagination support required!"},{"line_number":42,"context_line":"        if context.is_admin:"},{"line_number":43,"context_line":"            db_info \u003d DBConfiguration.find_all()"},{"line_number":44,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbec%3D","line":41,"in_reply_to":"AAAATn%2F%2Fe7I%3D","updated":"2013-11-06 10:59:05.000000000","message":"+1","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"e63137c05382bfdeb5333d46a5f36a2c3a90adcb","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        LOG.debug(\"values: %s\" % values)"},{"line_number":77,"context_line":"        config_items \u003d []"},{"line_number":78,"context_line":"        for key, val in values.iteritems():"},{"line_number":79,"context_line":"            config_item \u003d ConfigurationItem.create(configuration_id\u003dcfg_id,"},{"line_number":80,"context_line":"                                                   configuration_key\u003dkey,"},{"line_number":81,"context_line":"                                                   configuration_value\u003dval)"},{"line_number":82,"context_line":"            config_items.append(config_item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe4w%3D","line":79,"updated":"2013-11-05 01:29:25.000000000","message":"This should be a transaction, not one-by-one.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        LOG.debug(\"values: %s\" % values)"},{"line_number":77,"context_line":"        config_items \u003d []"},{"line_number":78,"context_line":"        for key, val in values.iteritems():"},{"line_number":79,"context_line":"            config_item \u003d ConfigurationItem.create(configuration_id\u003dcfg_id,"},{"line_number":80,"context_line":"                                                   configuration_key\u003dkey,"},{"line_number":81,"context_line":"                                                   configuration_value\u003dval)"},{"line_number":82,"context_line":"            config_items.append(config_item)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaV0%3D","line":79,"in_reply_to":"AAAATn%2F%2Fe4w%3D","updated":"2013-11-06 22:50:45.000000000","message":"i\u0027m not sure what you mean by this statement.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"e63137c05382bfdeb5333d46a5f36a2c3a90adcb","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        def _get_rule(key):"},{"line_number":114,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"},{"line_number":115,"context_line":"            for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":116,"context_line":"                LOG.debug(\"rule : %s\" % rule)"},{"line_number":117,"context_line":"                if str(rule[\u0027name\u0027]) \u003d\u003d key:"},{"line_number":118,"context_line":"                    return rule"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe3w%3D","line":115,"updated":"2013-11-05 01:29:25.000000000","message":"There\u0027s a problem with versioning here.\n\nExample:\n- Cloud provider deploys Trove with get_validation_rules() supporting properties \u0027a\u0027, \u0027b\u0027, and \u0027c\u0027.\n- User creates a Configuration, overriding \u0027a\u0027, \u0027b\u0027, and \u0027c\u0027.\n- User provisions a database instance with said Configuration\n- Weeks/Days later, cloud provider updates validation-rules.json such that the valid properties are \u0027a\u0027 and \u0027b\u0027 (because let\u0027s say \u0027c\u0027 is a security risk or is systemically causing performance issues)\n\nWhen the user asks for the Configuration\u0027s properties, should \u0027c\u0027 be reported?\n\nI would argue that omitting it completely isn\u0027t user-friendly, because they\u0027ll be aghast at perceived corruption/data-loss. Not only that, it\u0027s not true: some instances have the property \u0027c\u0027 overridden.\n\nMaybe validation-rules.json can have a \"deleted_at\" field for a property? That way, in the create-flow you can message the user that the field used to be supported, but now it\u0027s not; and in the get-flow you can still return it (until the user promptly drops it).","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        def _get_rule(key):"},{"line_number":114,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"},{"line_number":115,"context_line":"            for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":116,"context_line":"                LOG.debug(\"rule : %s\" % rule)"},{"line_number":117,"context_line":"                if str(rule[\u0027name\u0027]) \u003d\u003d key:"},{"line_number":118,"context_line":"                    return rule"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVk%3D","line":115,"in_reply_to":"AAAATn%2F%2Fe3w%3D","updated":"2013-11-06 22:50:45.000000000","message":"This is a good point about removing a parameter after deployment. I\u0027ll have to think more about this situation.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        for item in config_items:"},{"line_number":122,"context_line":"            rule \u003d _get_rule(str(item.configuration_key))"},{"line_number":123,"context_line":"            LOG.debug(\"rule : %s\" % rule)"},{"line_number":124,"context_line":"            if rule[\u0027type\u0027] \u003d\u003d \u0027boolean\u0027:"},{"line_number":125,"context_line":"                item.configuration_value \u003d bool(int(item.configuration_value))"},{"line_number":126,"context_line":"            elif rule[\u0027type\u0027] \u003d\u003d \u0027integer\u0027:"},{"line_number":127,"context_line":"                item.configuration_value \u003d int(item.configuration_value)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe6E%3D","line":124,"updated":"2013-11-05 00:59:04.000000000","message":"This will result in a TypeError if _get_rule(key) returns None, which is a legitimate scenario.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        for item in config_items:"},{"line_number":122,"context_line":"            rule \u003d _get_rule(str(item.configuration_key))"},{"line_number":123,"context_line":"            LOG.debug(\"rule : %s\" % rule)"},{"line_number":124,"context_line":"            if rule[\u0027type\u0027] \u003d\u003d \u0027boolean\u0027:"},{"line_number":125,"context_line":"                item.configuration_value \u003d bool(int(item.configuration_value))"},{"line_number":126,"context_line":"            elif rule[\u0027type\u0027] \u003d\u003d \u0027integer\u0027:"},{"line_number":127,"context_line":"                item.configuration_value \u003d int(item.configuration_value)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVw%3D","line":124,"in_reply_to":"AAAATn%2F%2Fe6E%3D","updated":"2013-11-06 22:50:45.000000000","message":"true.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            db_info \u003d DBConfiguration.find_all(tenant_id\u003dcontext.tenant)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if db_info is None:"},{"line_number":49,"context_line":"            LOG.debug(\"No configuration found for tenant % s\" % context.tenant)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        return db_info"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpmE%3D","line":49,"updated":"2013-11-22 02:16:40.000000000","message":"this debug message will be misleading if context.is_admin\u003d\u003dTrue, but find_all() returns None. Assuming context.tenant is even set, it will emit that the admin tenant has no configurations, when in fact you were searching for all configurations.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            db_info \u003d DBConfiguration.find_all(tenant_id\u003dcontext.tenant)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if db_info is None:"},{"line_number":49,"context_line":"            LOG.debug(\"No configuration found for tenant % s\" % context.tenant)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        return db_info"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj1M%3D","line":49,"in_reply_to":"AAAATn%2F%2BpmE%3D","updated":"2013-11-23 13:50:53.000000000","message":"agreed","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @staticmethod"},{"line_number":93,"context_line":"    def remove_all_items(context, id):"},{"line_number":94,"context_line":"        LOG.debug(\"removing the values from the database\")"},{"line_number":95,"context_line":"        items \u003d ConfigurationItem.find_all(configuration_id\u003did).all()"},{"line_number":96,"context_line":"        LOG.debug(\"removing items: %s\" % items)"},{"line_number":97,"context_line":"        for item in items:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bplk%3D","line":94,"updated":"2013-11-22 02:16:40.000000000","message":"can we amend this debug message to include the id?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        def _get_rule(key):"},{"line_number":116,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"},{"line_number":117,"context_line":"            for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":118,"context_line":"                if str(rule[\u0027name\u0027]) \u003d\u003d key:"},{"line_number":119,"context_line":"                    return rule"},{"line_number":120,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpdM%3D","line":117,"updated":"2013-11-22 02:16:40.000000000","message":"from patch-set #3:\n\n------\n\nThere\u0027s a problem with versioning here.\n\nExample:\n- Cloud provider deploys Trove with get_validation_rules() supporting properties \u0027a\u0027, \u0027b\u0027, and \u0027c\u0027.\n- User creates a Configuration, overriding \u0027a\u0027, \u0027b\u0027, and \u0027c\u0027.\n- User provisions a database instance with said Configuration\nWeeks/Days later, cloud provider updates validation-rules.json such that the valid properties are \u0027a\u0027 and \u0027b\u0027 (because let\u0027s say \u0027c\u0027 is a security risk or is systemically causing performance issues)\n- When the user asks for the Configuration\u0027s properties, should \u0027c\u0027 be reported?\n\nI would argue that omitting it completely isn\u0027t user-friendly, because they\u0027ll be aghast at perceived corruption/data-loss. Not only that, it\u0027s not true: some instances have the property \u0027c\u0027 overridden.\n\nMaybe validation-rules.json can have a \"deleted_at\" field for a property? That way, in the create-flow you can message the user that the field used to be supported, but now it\u0027s not; and in the get-flow you can still return it (until the user promptly drops it).\n\n-----","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        def _get_rule(key):"},{"line_number":116,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"},{"line_number":117,"context_line":"            for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":118,"context_line":"                if str(rule[\u0027name\u0027]) \u003d\u003d key:"},{"line_number":119,"context_line":"                    return rule"},{"line_number":120,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSNM%3D","line":117,"in_reply_to":"AAAATn%2F%2BpdM%3D","updated":"2013-12-02 05:03:15.000000000","message":"So it sounds like its more about the create validation here than it is about displaying the parameters. \n\nI\u0027ll just add support in the create validation to check if there is a `deleted_at` field to raise an exception for the parameter not able to be set any longer.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        for item in config_items:"},{"line_number":123,"context_line":"            rule \u003d _get_rule(str(item.configuration_key))"},{"line_number":124,"context_line":"            if rule[\u0027type\u0027] \u003d\u003d \u0027boolean\u0027:"},{"line_number":125,"context_line":"                item.configuration_value \u003d bool(int(item.configuration_value))"},{"line_number":126,"context_line":"            elif rule[\u0027type\u0027] \u003d\u003d \u0027integer\u0027:"},{"line_number":127,"context_line":"                item.configuration_value \u003d int(item.configuration_value)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bpc8%3D","line":124,"updated":"2013-11-22 02:16:40.000000000","message":"from patch-set #3\n\n--------\n\nThis will result in a TypeError if _get_rule(key) returns None, which is a legitimate scenario.\n\n--------","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                item.configuration_value \u003d bool(int(item.configuration_value))"},{"line_number":126,"context_line":"            elif rule[\u0027type\u0027] \u003d\u003d \u0027integer\u0027:"},{"line_number":127,"context_line":"                item.configuration_value \u003d int(item.configuration_value)"},{"line_number":128,"context_line":"            elif rule[\u0027type\u0027] \u003d\u003d \u0027string\u0027:"},{"line_number":129,"context_line":"                item.configuration_value \u003d str(item.configuration_value)"},{"line_number":130,"context_line":"        return config_items"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bpk0%3D","line":128,"updated":"2013-11-22 02:16:40.000000000","message":"this is being a bit paranoid, but the lack of an \"else\" here bothers me. you could add an else that defaults to str(item.configuration_value) with a warning log message, or change this elif to an else, or throwup.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yv4%3D","line":1,"updated":"2013-12-05 21:39:39.000000000","message":"please remove vim line","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"bca0b05f1b7cb5cb0b6e9b00219524ac69f558e3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        config_items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":132,"context_line":"                                                       deleted\u003dFalse).all()"},{"line_number":133,"context_line":"        # todo(cp16net) list of items values should not all be strings."},{"line_number":134,"context_line":"        rules \u003d configurations.get_validation_rules()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        def _get_rule(key):"},{"line_number":137,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9O7c%3D","line":134,"updated":"2013-12-13 18:13:58.000000000","message":"get_validation_rules should be passed the datastore_manager here, otherwise it will always default to \"mysql\".","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"2c99a7c3dcb948fb0b98c5af2f47f93a723610d8","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        config_items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":132,"context_line":"                                                       deleted\u003dFalse).all()"},{"line_number":133,"context_line":"        # todo(cp16net) list of items values should not all be strings."},{"line_number":134,"context_line":"        rules \u003d configurations.get_validation_rules()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        def _get_rule(key):"},{"line_number":137,"context_line":"            LOG.debug(\"finding rule with key : %s\" % key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9OjQ%3D","line":134,"in_reply_to":"AAAATn%2F9O7c%3D","updated":"2013-12-13 19:28:17.000000000","message":"doh i thought i did that... i\u0027ll fix it","commit_id":"01f44f10e7bac5b27c598a83e000886e62c5c405"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if context.is_admin:"},{"line_number":44,"context_line":"            db_info \u003d DBConfiguration.find_all(deleted\u003dFalse)"},{"line_number":45,"context_line":"            if db_info is None:"},{"line_number":46,"context_line":"                LOG.debug(\"No configurations found\")"},{"line_number":47,"context_line":"        else:"},{"line_number":48,"context_line":"            db_info \u003d DBConfiguration.find_all(tenant_id\u003dcontext.tenant,"},{"line_number":49,"context_line":"                                               deleted\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfF8%3D","line":46,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return data_view.collection, next_marker"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class Configuration(object):"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @property"},{"line_number":70,"context_line":"    def instances(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjuk%3D","line":67,"updated":"2014-01-11 06:58:03.000000000","message":"stack@redstack-147845:~$ trove configuration-delete 12345\nERROR: DBConfiguration Not Found\n\nstack@redstack-147845:~$ trove configuration-show 12345\nERROR: DBConfiguration Not Found\n\ncan a more user-friendly error be surfaced to the user, like:\n\n\"A configuration group with ID %(id)s could not be found.\"\n\n(putting the note here, but whether it\u0027s done in the api or the client or both is an implementation detail)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def create_items(cfg_id, values):"},{"line_number":88,"context_line":"        LOG.debug(\"saving the values to the database\")"},{"line_number":89,"context_line":"        LOG.debug(\"cfg_id: %s\" % cfg_id)"},{"line_number":90,"context_line":"        LOG.debug(\"values: %s\" % values)"},{"line_number":91,"context_line":"        config_items \u003d []"},{"line_number":92,"context_line":"        for key, val in values.iteritems():"},{"line_number":93,"context_line":"            config_item \u003d ConfigurationParameter.create("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfFk%3D","line":90,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @staticmethod"},{"line_number":109,"context_line":"    def remove_all_items(context, id, deleted_at):"},{"line_number":110,"context_line":"        LOG.debug(\"removing the values from the database with configuration\""},{"line_number":111,"context_line":"                  \" %s\" % id)"},{"line_number":112,"context_line":"        items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":113,"context_line":"                                                deleted\u003dFalse).all()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfFA%3D","line":110,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        LOG.debug(\"removing the values from the database with configuration\""},{"line_number":111,"context_line":"                  \" %s\" % id)"},{"line_number":112,"context_line":"        items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":113,"context_line":"                                                deleted\u003dFalse).all()"},{"line_number":114,"context_line":"        LOG.debug(\"removing items: %s\" % items)"},{"line_number":115,"context_line":"        for item in items:"},{"line_number":116,"context_line":"            item.deleted \u003d True"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEs%3D","line":113,"updated":"2014-01-13 12:49:18.000000000","message":"agreed with Auston, would be better to cover find_all with try:except block","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                  \" %s\" % id)"},{"line_number":112,"context_line":"        items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":113,"context_line":"                                                deleted\u003dFalse).all()"},{"line_number":114,"context_line":"        LOG.debug(\"removing items: %s\" % items)"},{"line_number":115,"context_line":"        for item in items:"},{"line_number":116,"context_line":"            item.deleted \u003d True"},{"line_number":117,"context_line":"            item.deleted_at \u003d deleted_at"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEo%3D","line":114,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        else:"},{"line_number":133,"context_line":"            config_info \u003d DBConfiguration.find_by(id\u003did,"},{"line_number":134,"context_line":"                                                  tenant_id\u003dcontext.tenant,"},{"line_number":135,"context_line":"                                                  deleted\u003dFalse)"},{"line_number":136,"context_line":"        return config_info"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEY%3D","line":135,"updated":"2014-01-13 12:49:18.000000000","message":"i\u0027d suggest to cover L#130-135 with try:except","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    @staticmethod"},{"line_number":139,"context_line":"    def load_items(context, id):"},{"line_number":140,"context_line":"        datastore \u003d Configuration.load_configuration_datastore(context, id)"},{"line_number":141,"context_line":"        config_items \u003d ConfigurationParameter.find_all(configuration_id\u003did,"},{"line_number":142,"context_line":"                                                       deleted\u003dFalse).all()"},{"line_number":143,"context_line":"        rules \u003d configurations.get_validation_rules("},{"line_number":144,"context_line":"            datastore_manager\u003ddatastore.manager)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEQ%3D","line":141,"updated":"2014-01-13 12:49:18.000000000","message":"same here","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":149,"context_line":"                if str(rule.get(\u0027name\u0027)) \u003d\u003d key:"},{"line_number":150,"context_line":"                    return rule"},{"line_number":151,"context_line":"            return None"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        for item in config_items:"},{"line_number":154,"context_line":"            rule \u003d _get_rule(str(item.configuration_key))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEI%3D","line":151,"updated":"2014-01-13 12:49:18.000000000","message":"no need to do this explicitly","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            ConfigurationParameter.save(item)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        for instance in instances:"},{"line_number":170,"context_line":"            LOG.debug(\"applying to instance: %s\" % instance.id)"},{"line_number":171,"context_line":"            overrides \u003d {}"},{"line_number":172,"context_line":"            for i in configuration_items:"},{"line_number":173,"context_line":"                overrides[i.configuration_key] \u003d i.configuration_value"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfEA%3D","line":170,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/configuration/service.py":[{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            configuration_id\u003did, deleted\u003dFalse).all()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # ensure group is empty before permitting the delete operation."},{"line_number":99,"context_line":"        # running_instances \u003d [x for x in instances if not x.deleted]"},{"line_number":100,"context_line":"        if instances:"},{"line_number":101,"context_line":"            raise exception.InstanceAssignedToConfiguration()"},{"line_number":102,"context_line":"        models.Configuration.delete(context, group)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0qM%3D","line":99,"updated":"2013-10-28 14:02:18.000000000","message":"Probably just want to remove the commented line.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            configuration_id\u003did, deleted\u003dFalse).all()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # ensure group is empty before permitting the delete operation."},{"line_number":99,"context_line":"        # running_instances \u003d [x for x in instances if not x.deleted]"},{"line_number":100,"context_line":"        if instances:"},{"line_number":101,"context_line":"            raise exception.InstanceAssignedToConfiguration()"},{"line_number":102,"context_line":"        models.Configuration.delete(context, group)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FotQ%3D","line":99,"in_reply_to":"AAAATn%2F%2F0qM%3D","updated":"2013-10-31 05:03:32.000000000","message":"yup thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        raise exception.UnprocessableEntity("},{"line_number":217,"context_line":"            message\u003d_(\"%s is not a supported configuration key. Please refer \""},{"line_number":218,"context_line":"                      \"to /configuration-parameters for a list of supported \""},{"line_number":219,"context_line":"                      \"keys.\" % key))"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0pQ%3D","line":218,"updated":"2013-10-28 14:02:18.000000000","message":"This should be /configurations/parameters","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        raise exception.UnprocessableEntity("},{"line_number":217,"context_line":"            message\u003d_(\"%s is not a supported configuration key. Please refer \""},{"line_number":218,"context_line":"                      \"to /configuration-parameters for a list of supported \""},{"line_number":219,"context_line":"                      \"keys.\" % key))"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FotM%3D","line":218,"in_reply_to":"AAAATn%2F%2F0pQ%3D","updated":"2013-10-31 05:03:32.000000000","message":"thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"e63137c05382bfdeb5333d46a5f36a2c3a90adcb","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        values \u003d body[\u0027configuration\u0027][\u0027values\u0027]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        configItems \u003d []"},{"line_number":83,"context_line":"        if values:"},{"line_number":84,"context_line":"            # validate that the values passed in are permitted by the operator."},{"line_number":85,"context_line":"            ConfigurationsController._validate_configuration("},{"line_number":86,"context_line":"                body[\u0027configuration\u0027][\u0027values\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe2s%3D","line":83,"updated":"2013-11-05 01:29:25.000000000","message":"The overall implementation is for overrides, not a deep-copy, so when would it make sense to allow a user to create a configuration without any values?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        values \u003d body[\u0027configuration\u0027][\u0027values\u0027]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        configItems \u003d []"},{"line_number":83,"context_line":"        if values:"},{"line_number":84,"context_line":"            # validate that the values passed in are permitted by the operator."},{"line_number":85,"context_line":"            ConfigurationsController._validate_configuration("},{"line_number":86,"context_line":"                body[\u0027configuration\u0027][\u0027values\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVY%3D","line":83,"in_reply_to":"AAAATn%2F%2Fe2s%3D","updated":"2013-11-06 22:50:45.000000000","message":"Its possible if they are removing/adding values for testing performance?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"107b25b06fcc9700b2ff907e2d6d8348b1b357d2","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        LOG.info(_(\"Updating configuration for tenant id %s\" % tenant_id))"},{"line_number":114,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":115,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":116,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":117,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":118,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":119,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe1A%3D","line":116,"updated":"2013-11-05 01:54:41.000000000","message":"You load cfg_items from the DB, and then do nothing with it?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        LOG.info(_(\"Updating configuration for tenant id %s\" % tenant_id))"},{"line_number":114,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":115,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":116,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":117,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":118,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":119,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVU%3D","line":116,"in_reply_to":"AAAATn%2F%2FbeQ%3D","updated":"2013-11-06 22:50:45.000000000","message":"hmmm i think this was some fall out after changing the database model from the first iteration of this feature.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        LOG.info(_(\"Updating configuration for tenant id %s\" % tenant_id))"},{"line_number":114,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":115,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":116,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":117,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":118,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":119,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FbeQ%3D","line":116,"in_reply_to":"AAAATn%2F%2Fe1A%3D","updated":"2013-11-06 10:59:05.000000000","message":"Agreed, there should validation/raising or something else.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"107b25b06fcc9700b2ff907e2d6d8348b1b357d2","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def edit(self, req, body, tenant_id, id):"},{"line_number":138,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":139,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":140,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":141,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":142,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":143,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe00%3D","line":140,"updated":"2013-11-05 01:54:41.000000000","message":"You load cfg_items from the DB, and then do nothing with it?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def edit(self, req, body, tenant_id, id):"},{"line_number":138,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":139,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":140,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":141,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":142,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":143,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVQ%3D","line":140,"in_reply_to":"AAAATn%2F%2FbeM%3D","updated":"2013-11-06 22:50:45.000000000","message":"same as above comment. fall out.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def edit(self, req, body, tenant_id, id):"},{"line_number":138,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":139,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":140,"context_line":"        cfg_items \u003d models.Configuration.load_items(context, id)"},{"line_number":141,"context_line":"        LOG.info(_(\"loaded configuration cfg_items: %s\" % cfg_items))"},{"line_number":142,"context_line":"        instances \u003d instances_models.DBInstance.find_all("},{"line_number":143,"context_line":"            tenant_id\u003dcontext.tenant,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FbeM%3D","line":140,"in_reply_to":"AAAATn%2F%2Fe00%3D","updated":"2013-11-06 10:59:05.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"31fc138423bfff4f8f3595b7ef228695687f29d7","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConfigurationsController(wsgi.Controller):"},{"line_number":43,"context_line":"    def index(self, req, tenant_id):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpS8%3D","line":40,"updated":"2013-11-22 02:30:48.000000000","message":"(this is an odd place to put this comment, but)\n\nthere are trove-owned and configurable per-tenant limits on instances \u0026 security-groups; there should be a limit on the # of configuration groups a tenant can create as well.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConfigurationsController(wsgi.Controller):"},{"line_number":43,"context_line":"    def index(self, req, tenant_id):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSMI%3D","line":40,"in_reply_to":"AAAATn%2F%2Bj1A%3D","updated":"2013-12-02 05:03:15.000000000","message":"I thought about this when i ran into some security group limits while testing but i came to my personal conclusion similar to denis where its not technically \"resources\" and if we have pagination and such it shouldnt be a big deal. I would compare this to users/databases. A customer can create \"almost\" as many as they like, within the system\u0027s limits.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"CONF \u003d cfg.CONF"},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConfigurationsController(wsgi.Controller):"},{"line_number":43,"context_line":"    def index(self, req, tenant_id):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj1A%3D","line":40,"in_reply_to":"AAAATn%2F%2BpS8%3D","updated":"2013-11-23 13:50:53.000000000","message":"I suppose we could limit amount, but is it really necassery, since configuration group is only a record in back-end. So it\u0027s very interesting question.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        configItems \u003d []"},{"line_number":95,"context_line":"        if values:"},{"line_number":96,"context_line":"            # validate that the values passed in are permitted by the operator."},{"line_number":97,"context_line":"            ConfigurationsController._validate_configuration("},{"line_number":98,"context_line":"                body[\u0027configuration\u0027][\u0027values\u0027])"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            for k, v in values.iteritems():"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEeI%3D","line":97,"updated":"2013-12-02 21:29:29.000000000","message":"datastore should be passed as an argument to _validate_configuration (see comment below as to why).","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    @staticmethod"},{"line_number":174,"context_line":"    def _validate_configuration(values):"},{"line_number":175,"context_line":"        rules \u003d configurations.get_validation_rules()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        LOG.info(_(\"Validating configuration values\"))"},{"line_number":178,"context_line":"        for k, v in values.iteritems():"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEds%3D","line":175,"updated":"2013-12-02 21:29:29.000000000","message":"get_validation_rules() has the following signature:\n\n    def get_validation_rules(datastore_type\u003d\u0027mysql\u0027):\n\nyou\u0027re not propagating the datastore, meaning it will always default to \u0027mysql\u0027, irrespective of the actual datastore provided.","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5500b0b2583150477ecd85f5875ce991d0e4d504","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                                   view, marker)"},{"line_number":46,"context_line":"        return wsgi.Result(paged.data(), 200)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def show(self, req, tenant_id, id):"},{"line_number":49,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":50,"context_line":"        configuration \u003d models.Configuration.load(context, id)"},{"line_number":51,"context_line":"        configuration_items \u003d models.Configuration.load_items(context, id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjt0%3D","line":48,"updated":"2014-01-11 07:26:15.000000000","message":"since configuration-instance-list returns a list of all instances associated with a configuration-group, i don\u0027t think configuration-show should.\n\nreference:\n\n    $ trove configuration-show 28861174-e2e3-4098-8e19-467037b4cab3\n    +----------------------+------------------------------------------------------------------------+\n    |       Property       |                                 Value                                  |\n    +----------------------+------------------------------------------------------------------------+\n    | datastore_version_id |                  dedcc62f-abc9-474f-b579-6ad06f38ce95                  |\n    |     description      |               Increase Max Connections and Set Server ID               |\n    |          id          |                  28861174-e2e3-4098-8e19-467037b4cab3                  |\n    |      instances       | [{u\u0027id\u0027: u\u0027f6b0f202-3155-47c0-8a56-2b0f675636dd\u0027, u\u0027name\u0027: u\u0027Batman\u0027}] |\n    |         name         |                              MaxConnAndId                              |\n    |        values        |              {u\u0027server_id\u0027: 5, u\u0027max_connections\u0027: 1000}               |\n    +----------------------+------------------------------------------------------------------------+\n\nin my opinion, \"show\" should only show detailed information about the configuration-group, not the configuration-group\u0027s relationships. outside of that philosophical point of view, it\u0027s expensive to fetch said information!","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"b8a13068b07e58a2075fd517b36e8306a6c0f9bf","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                                   view, marker)"},{"line_number":46,"context_line":"        return wsgi.Result(paged.data(), 200)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def show(self, req, tenant_id, id):"},{"line_number":49,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":50,"context_line":"        configuration \u003d models.Configuration.load(context, id)"},{"line_number":51,"context_line":"        configuration_items \u003d models.Configuration.load_items(context, id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FdWo%3D","line":48,"in_reply_to":"AAAAUH%2F%2Fjt0%3D","updated":"2014-01-13 18:56:51.000000000","message":"i thought i remove that...\n\nI was thinking maybe that it would be good to show the instance_count here instead of the list of instances. So you could know before querying for the instances on the configuration if there are any associated with this configuration. I liked this thought when i was testing but dont know what others think about it.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"484ec52d54159778b8d1a151832fd98c2e9e28d6","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        items \u003d self._configuration_items_list(group, body[\u0027configuration\u0027])"},{"line_number":145,"context_line":"        deleted_at \u003d datetime.utcnow()"},{"line_number":146,"context_line":"        models.Configuration.remove_all_items(context, group.id, deleted_at)"},{"line_number":147,"context_line":"        LOG.info(_(\"loaded configuration instances: %s\") % instances)"},{"line_number":148,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":149,"context_line":"        return wsgi.Result(None, 202)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjqo%3D","line":146,"updated":"2014-01-11 07:57:36.000000000","message":"there\u0027s a very sneaky data-bug lurking here.\n\n    $ trove configuration-create breakstuff \u0027{\"server_id\":33, \"wait_timeout\":4000}\u0027\n    $ trove configuration-update 168232a6-0249-429f-adbe-e037d5640c3e \u0027{\"wait_timeout\":2000}\u0027\n\nby setting deleted_at for all existing parameters, if a parameter is re-set, the deleted_at field is never cleared.\n\n    mysql\u003e select * from configuration_parameters;\n    +--------------------------------------+-------------------------+---------------------+---------+---------------------+\n    | configuration_id                     | configuration_key       | configuration_value | deleted | deleted_at          |\n    +--------------------------------------+-------------------------+---------------------+---------+---------------------+\n    | 168232a6-0249-429f-adbe-e037d5640c3e | server_id               | 33                  |       1 | 2014-01-11 07:48:43 |\n    | 168232a6-0249-429f-adbe-e037d5640c3e | wait_timeout            | 2000                |       0 | 2014-01-11 07:48:43 |\n\nas you can see above, deleted_at should not be set for wait_timeout, because deleted\u003d0 (as it should be).","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"b8a13068b07e58a2075fd517b36e8306a6c0f9bf","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        items \u003d self._configuration_items_list(group, body[\u0027configuration\u0027])"},{"line_number":145,"context_line":"        deleted_at \u003d datetime.utcnow()"},{"line_number":146,"context_line":"        models.Configuration.remove_all_items(context, group.id, deleted_at)"},{"line_number":147,"context_line":"        LOG.info(_(\"loaded configuration instances: %s\") % instances)"},{"line_number":148,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":149,"context_line":"        return wsgi.Result(None, 202)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FdWA%3D","line":146,"in_reply_to":"AAAAUH%2F%2Fjqo%3D","updated":"2014-01-13 18:56:51.000000000","message":"oh thats bad...","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"d398428216d4b5c06bb304e76500e54c8f305302","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            configuration_id\u003did,"},{"line_number":157,"context_line":"            deleted\u003dFalse).all()"},{"line_number":158,"context_line":"        LOG.info(_(\"loaded configuration instances: %s\") % instances)"},{"line_number":159,"context_line":"        items \u003d self._configuration_items_list(group, body[\u0027configuration\u0027])"},{"line_number":160,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _configuration_items_list(self, group, configuration):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjms%3D","line":159,"updated":"2014-01-11 09:17:45.000000000","message":"there\u0027s a show-stopping bug here: patch/edit doesn\u0027t patch, it completely wipes out /etc/mysql/conf.d/overrides.cnf.\n\n_configuration_items_list only returns configuration parameters from body[\u0027configuration\u0027]. instead, for patch, those should merge over the top of the existing configuration parameters.\n\nhow to reproduce:\n\n    $ trove create Rainicorn 7 --size 1\n    $ trove configuration-create FinnAndJake \u0027{\"server_id\":666,\"wait_timeout\":4000}\u0027\n    $ trove modify \u003cinstance_id\u003e --configuration \u003cconfiguration_id\u003e\n    # wait a couple of minutes\n    $ trove restart \u003cinstance_id\u003e\n    # wait til active\n    $ trove configuration-edit \u003cconfiguration_id\u003e \u0027{\"bulk_insert_buffer_size\":999999999}\u0027\n    # wait a minute or two\n    $ ssh stack@\u003cinstance_ip\u003e\n    $     sudo cat /etc/mysql/conf.d/overrides.cnf \n              [mysqld]\n              bulk_insert_buffer_size\u003d999999999\n\nwhich means after a restart, server_id and wait_timeout will reset:\n\n    $ trove restart \u003cinstance_id\u003e\n    $ ssh stack@\u003cinstance_ip\u003e\n    $     mysql -u os_admin -p\n    $     mysql\u003e SHOW VARIABLES;\n\nyou\u0027ll see that server_id and wait_timeout have been reset.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"9bb6810e1f94479a55ff22492e2c799b91451e57","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            configuration_id\u003did,"},{"line_number":157,"context_line":"            deleted\u003dFalse).all()"},{"line_number":158,"context_line":"        LOG.info(_(\"loaded configuration instances: %s\") % instances)"},{"line_number":159,"context_line":"        items \u003d self._configuration_items_list(group, body[\u0027configuration\u0027])"},{"line_number":160,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _configuration_items_list(self, group, configuration):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B64s%3D","line":159,"in_reply_to":"AAAAUH%2F%2Fjms%3D","updated":"2014-01-20 22:09:18.000000000","message":"damn good catch.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                    valueType)):"},{"line_number":202,"context_line":"                output \u003d {\"key\": k, \"type\": valueType}"},{"line_number":203,"context_line":"                raise exception.UnprocessableEntity("},{"line_number":204,"context_line":"                    message\u003d_(\"Incorrect data type supplied as a value for key\""},{"line_number":205,"context_line":"                              \" %(key)s. Expected type of %(type)s.\") % output)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"            # integer min/max checking"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjvU%3D","line":204,"updated":"2014-01-11 06:58:03.000000000","message":"as mentioned somewhere else, the user is exposed to the terminology \"configuration parameter\", not \"configuration key\"; that and the phrasing is a bit awkward.\n\nsuggestion: \"The value provided for the configuration parameter %(key)s is not of type %(type)s.\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                        \"Expected integer.\"))"},{"line_number":216,"context_line":"                if v \u003c min_value:"},{"line_number":217,"context_line":"                    raise exception.UnprocessableEntity("},{"line_number":218,"context_line":"                        message\u003d_(\"Value for %s less than min.\") % k)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"                try:"},{"line_number":221,"context_line":"                    max_value \u003d int(rule.get(\u0027max\u0027))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjvI%3D","line":218,"updated":"2014-01-11 06:58:03.000000000","message":"example returned to the user: \"Value for auto_increment_offset less than min.\". it\u0027d be nice to include the minimum value for reference.\n\nsuggestion: \"The value for the configuration parameter %(key)s is less than the minimum allowed: %(min)s\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                        \"Expected integer.\"))"},{"line_number":227,"context_line":"                if v \u003e max_value:"},{"line_number":228,"context_line":"                    raise exception.UnprocessableEntity("},{"line_number":229,"context_line":"                        message\u003d_(\"Value for %s greater than max.\") % k)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @staticmethod"},{"line_number":232,"context_line":"    def _find_type(valueType):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjvM%3D","line":229,"updated":"2014-01-11 06:58:03.000000000","message":"example returned to the user: \"Value for auto_increment_offset greater than max.\". it\u0027d be nice to include the maximum value for reference.\n\nsuggestion: \"The value for the configuration parameter %(key)s is greater than the maximum allowed: %(max)s\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            if key \u003d\u003d item.get(\u0027name\u0027):"},{"line_number":248,"context_line":"                return item"},{"line_number":249,"context_line":"        raise exception.UnprocessableEntity("},{"line_number":250,"context_line":"            message\u003d_(\"%s is not a supported configuration key. Please refer \""},{"line_number":251,"context_line":"                      \"to /configuration/parameters for a list of supported \""},{"line_number":252,"context_line":"                      \"keys.\") % key)"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjvo%3D","line":250,"updated":"2014-01-11 06:58:03.000000000","message":"this message is exposed to cli clients, and inevitably will be exposed to horizon users; therefore referring to \"/configuration/parameters\" is not appropriate. in addition, throughout the cli, it\u0027s referred to as a \"configuration parameter\" vs. a \"configuration key\".\n\ni\u0027d recommend something simple along the lines of:\n\n\"%s is not a supported configuration parameter.\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"class ParametersController(wsgi.Controller):"},{"line_number":256,"context_line":"    def index(self, req, tenant_id):"},{"line_number":257,"context_line":"        rules \u003d configurations.get_validation_rules()"},{"line_number":258,"context_line":"        return wsgi.Result(views.ConfigurationParametersView(rules).data(),"},{"line_number":259,"context_line":"                           200)"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjv0%3D","line":257,"updated":"2014-01-11 06:58:03.000000000","message":"a \"trove configuration-create\" will work without a datastore/datastore_version_id if default_datastore is set (and that datastore is real). however, the option to explicitly provide the datastore and/or datastore_version_id is still present.\n\nthe same should apply here. defaulting \"trove configuration-list-parameters\" to datastore_manager\u003dmysql is acceptable only if default_datastore is set to it. otherwise, you might have a provider that is only offering redis, but your \"configuration-list-parameters\" call will continue to return mysql related information, despite mysql not even being supported.\n\nit therefore follows that you need to add two optional arguments: datastore and datastore_version_id (like you did for configuration-create).\n\nnow, given that configuration-groups is not supported for anything other than mysql (for now), an Exception should be raised for non-mysql datastores indicating so to the user.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5e11e28a2aa05e3d6f2ed6c9c32f190393821672","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                           200)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def show(self, req, tenant_id, id):"},{"line_number":262,"context_line":"        rules \u003d configurations.get_validation_rules()"},{"line_number":263,"context_line":"        for rule in rules[\u0027configuration-parameters\u0027]:"},{"line_number":264,"context_line":"            if rule[\u0027name\u0027] \u003d\u003d id:"},{"line_number":265,"context_line":"                return wsgi.Result("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjxE%3D","line":262,"updated":"2014-01-11 06:58:03.000000000","message":"same principle as above, here.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a539b034be1c0c1d7191de430d0faf3c8d774e0f","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":143,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def edit(self, req, body, tenant_id, id):"},{"line_number":146,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":147,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":148,"context_line":"        instances \u003d instances_models.DBInstance.find_all("}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAU8%3D","line":145,"updated":"2014-01-31 03:10:43.000000000","message":"although the \"wipe\" bug was fixed in this patch, it\u0027s requiring unnecessary RESTART_REQUIRED scenarios.\n\nhow to reproduce:\n\n    $ trove create Rainicorn 7 --size 1\n    $ trove configuration-create FinnAndJake \u0027{\"server_id\":666,\"wait_timeout\":4000}\u0027\n    # note: requires fix i mentioned in common/api.py first\n    # before configuration-attach will work\n    $ trove configuration-attach \u003cconfiguration_id\u003e \u003cinstance_id\u003e\n    # wait a minute\n    $ trove restart \u003cinstance_id\u003e\n    # wait til active, then\n    $ trove configuration-patch \u003cconfiguration_id\u003e \u0027{\"bulk_insert_buffer_size\":999999999}\u0027\n    # wait a second or two\n    $ trove show \u003cinstance_id\u003e\n\nyou\u0027ll see that the status\u003dRESTART_REQUIRED, even though bulk_insert_buffer_size is a dynamic parameter, meaning no restart is required.\n\nthis is occurring because (1) the fully-actualized set of parameters is being used in the do_configs_require_restart() check, instead of just the ones provided in a PATCH scenario (2) there is no logic to determine if the only changed parameters are dynamic, and if so, use SET on mysql and swap the overrides file without setting RESTART_REQUIRED.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"c557eebcc06640dfc861c57bf859c1438f534e54","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        models.Configuration.save(context, group, items, instances)"},{"line_number":143,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def edit(self, req, body, tenant_id, id):"},{"line_number":146,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":147,"context_line":"        group \u003d models.Configuration.load(context, id)"},{"line_number":148,"context_line":"        instances \u003d instances_models.DBInstance.find_all("}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F98JY%3D","line":145,"in_reply_to":"AAAAUH%2F%2BAU8%3D","updated":"2014-01-31 21:22:42.000000000","message":"Ok so yeah thats the reason why it goes back to RESTART_REQUIRED because i was using the same code path to apply the configuration parameter group. (less code and trying to not overcomplicate the apply feature) I\u0027d like to ask the other core guys to weigh in here to see if its necessary now or can wait?","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa9276565cea9b0da066de245f26d5d99cbce1e8","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @staticmethod"},{"line_number":173,"context_line":"    def _validate_configuration(values, datastore_manager\u003dNone):"},{"line_number":174,"context_line":"        rules \u003d configurations.get_validation_rules("},{"line_number":175,"context_line":"            datastore_manager\u003ddatastore_manager)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        LOG.info(_(\"Validating configuration values\"))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BA2Q%3D","line":174,"updated":"2014-01-31 00:37:39.000000000","message":"in the scenario of multiple datastores, a \"$ trove configuration-create\" against a datastore with no config template results in a \"ERROR: Internal Server Error. Please keep this ID to help us figure out what went wrong: (50c31da6-2aee-4b4a-b2f6-3d3f3fa08274)\" being returned to the user.\n\ncan this be detected and a more appropriate message be returned to the user, like \"This operation is not supported for this datastore at this time\" ?\n\nstack-trace if it helps:\n\n      File \"/opt/stack/trove/trove/configuration/service.py\", line 93, in create\n        datastore_manager\u003ddatastore_version.manager)\n      File \"/opt/stack/trove/trove/configuration/service.py\", line 175, in _validate_configuration\n        datastore_manager\u003ddatastore_manager)\n      File \"/opt/stack/trove/trove/common/configurations.py\", line 52, in get_validation_rules\n        template \u003d ENV.get_template(config_location)\n      File \"/usr/lib/python2.7/dist-packages/jinja2/environment.py\", line 719, in get_template\n        return self._load_template(name, self.make_globals(globals))\n      File \"/usr/lib/python2.7/dist-packages/jinja2/environment.py\", line 693, in _load_template\n        template \u003d self.loader.load(self, name, globals)\n      File \"/usr/lib/python2.7/dist-packages/jinja2/loaders.py\", line 115, in load\n        source, filename, uptodate \u003d self.get_source(environment, name)\n      File \"/usr/lib/python2.7/dist-packages/jinja2/loaders.py\", line 377, in get_source\n        raise TemplateNotFound(template)\n    TemplateNotFound: mongodb/validation-rules.json","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"36e5641a901e8fa754fcc0fba44bff4d0c56bb38","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @staticmethod"},{"line_number":173,"context_line":"    def _validate_configuration(values, datastore_manager\u003dNone):"},{"line_number":174,"context_line":"        rules \u003d configurations.get_validation_rules("},{"line_number":175,"context_line":"            datastore_manager\u003ddatastore_manager)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        LOG.info(_(\"Validating configuration values\"))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F98HM%3D","line":174,"in_reply_to":"AAAAUH%2F%2BA2Q%3D","updated":"2014-02-03 19:25:16.000000000","message":"ah yeah damn good catch.. i need to add a test for that :)","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa9276565cea9b0da066de245f26d5d99cbce1e8","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            message\u003d_(\"%s is not a supported configuration parameter.\") % key)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"class ParametersController(wsgi.Controller):"},{"line_number":253,"context_line":"    def index(self, req, tenant_id, datastore, id):"},{"line_number":254,"context_line":"        ds, ds_version \u003d ds_models.get_datastore_version("},{"line_number":255,"context_line":"            type\u003ddatastore, version\u003did)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAxU%3D","line":252,"updated":"2014-01-31 00:37:39.000000000","message":"similarly (as mentioned above):\n\n(where 37adb5a8-6fde-45e9-9334-f297cddc17bc is a mongodb version)\n\n    $ trove configuration-parameter-version-list 37adb5a8-6fde-45e9-9334-f297cddc17bc\n    $ trove configuration-parameter-list mongodb mongodb-mongo\n    $ trove configuration-parameter-show mongodb mongodb-mongo noprealloc\n    $ trove configuration-parameter-version-show 37adb5a8-6fde-45e9-9334-f297cddc17bc noprealloc\n\nall result in:\n\n    ERROR: Internal Server Error. Please keep this ID to help us figure out what went wrong: (27ae4ebe-582d-4778-b9e6-a3d2e7f49eb7)\n\ncan this be detected and a more appropriate message be returned to the user, like \"This operation is not supported for this datastore at this time\" ?","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"36e5641a901e8fa754fcc0fba44bff4d0c56bb38","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            message\u003d_(\"%s is not a supported configuration parameter.\") % key)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"class ParametersController(wsgi.Controller):"},{"line_number":253,"context_line":"    def index(self, req, tenant_id, datastore, id):"},{"line_number":254,"context_line":"        ds, ds_version \u003d ds_models.get_datastore_version("},{"line_number":255,"context_line":"            type\u003ddatastore, version\u003did)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F902o%3D","line":252,"in_reply_to":"AAAAUH%2F%2BAxU%3D","updated":"2014-02-03 19:25:16.000000000","message":"I\u0027ll add a test for these calls as well.","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"trove/configuration/views.py":[{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        instances_list \u003d []"},{"line_number":63,"context_line":"        if self.instances:"},{"line_number":64,"context_line":"            for instance in self.instances:"},{"line_number":65,"context_line":"                LOG.debug(\"creating view: %r\" % instance)"},{"line_number":66,"context_line":"                instances_list.append("},{"line_number":67,"context_line":"                    {"},{"line_number":68,"context_line":"                        \"id\": instance.id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0oo%3D","line":65,"updated":"2013-10-28 14:02:18.000000000","message":"Do we really want debug statements for each instance? Maybe just one for creating view for self.instances.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        instances_list \u003d []"},{"line_number":63,"context_line":"        if self.instances:"},{"line_number":64,"context_line":"            for instance in self.instances:"},{"line_number":65,"context_line":"                LOG.debug(\"creating view: %r\" % instance)"},{"line_number":66,"context_line":"                instances_list.append("},{"line_number":67,"context_line":"                    {"},{"line_number":68,"context_line":"                        \"id\": instance.id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FotI%3D","line":65,"in_reply_to":"AAAATn%2F%2F0oo%3D","updated":"2013-10-31 05:03:32.000000000","message":"no this is not needed. it was me debugging","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                \"name\": self.configuration.name,"},{"line_number":98,"context_line":"                \"description\": self.configuration.description,"},{"line_number":99,"context_line":"                \"values\": values,"},{"line_number":100,"context_line":"                # \"instance_count\": len(self.instances),"},{"line_number":101,"context_line":"                \"instances\": DetailedConfigurationInstancesView(self.instances).instance_data(),"},{"line_number":102,"context_line":"            }"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0oM%3D","line":100,"updated":"2013-10-28 14:02:18.000000000","message":"Delete the above line?","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                \"name\": self.configuration.name,"},{"line_number":98,"context_line":"                \"description\": self.configuration.description,"},{"line_number":99,"context_line":"                \"values\": values,"},{"line_number":100,"context_line":"                # \"instance_count\": len(self.instances),"},{"line_number":101,"context_line":"                \"instances\": DetailedConfigurationInstancesView(self.instances).instance_data(),"},{"line_number":102,"context_line":"            }"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fos8%3D","line":100,"in_reply_to":"AAAATn%2F%2F0oM%3D","updated":"2013-10-31 05:03:32.000000000","message":"well yeah i will but this was something i was thinking about changing on the response of this call because we have the list of instances separately. It would give you a high level view if there are any instances assigned to the configuration group. I should bring this up on the ML (or die).","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":107,"context_line":"class ConfigurationParametersView(object):"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def __init__(self, configurationParameters):"},{"line_number":110,"context_line":"        self.configurationParameters \u003d configurationParameters"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def data(self):"},{"line_number":113,"context_line":"        return self.configurationParameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0oA%3D","line":110,"updated":"2013-10-28 14:02:18.000000000","message":"Should this be self.configuration_parameters?","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":107,"context_line":"class ConfigurationParametersView(object):"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def __init__(self, configurationParameters):"},{"line_number":110,"context_line":"        self.configurationParameters \u003d configurationParameters"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def data(self):"},{"line_number":113,"context_line":"        return self.configurationParameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Fos0%3D","line":110,"in_reply_to":"AAAATn%2F%2F0oA%3D","updated":"2013-10-31 05:03:32.000000000","message":"yup thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.configurationParameters \u003d configurationParameters"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def data(self):"},{"line_number":113,"context_line":"        return self.configurationParameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0n4%3D","line":113,"updated":"2013-10-28 14:02:18.000000000","message":"Same here.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.configurationParameters \u003d configurationParameters"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def data(self):"},{"line_number":113,"context_line":"        return self.configurationParameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Foss%3D","line":113,"in_reply_to":"AAAATn%2F%2F0n4%3D","updated":"2013-10-31 05:03:32.000000000","message":"thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Rackspace"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yvk%3D","line":1,"updated":"2013-12-05 21:39:39.000000000","message":"please remove vim lines.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"}],"trove/db/sqlalchemy/migrate_repo/versions/016_configurations.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"387a5415e5f50d1f6fa983638b980f9ea4afef84","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":"    # todo(cp16net) remvoe the foreignkey here"},{"line_number":57,"context_line":"    instances.create_column(Column(\u0027configuration_id\u0027, String(36),"},{"line_number":58,"context_line":"                                   ForeignKey(\"configuration.id\")))"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe6U%3D","line":58,"updated":"2013-11-05 00:59:04.000000000","message":"If there\u0027s a ForeignKey constraint on configuration.id, why do we not have deleted+deleted_at in the configuration table to tombstone dropped configurations? From what I can tell, you\u0027re hard deleting the row.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":"    # todo(cp16net) remvoe the foreignkey here"},{"line_number":57,"context_line":"    instances.create_column(Column(\u0027configuration_id\u0027, String(36),"},{"line_number":58,"context_line":"                                   ForeignKey(\"configuration.id\")))"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaVI%3D","line":58,"in_reply_to":"AAAATn%2F%2FbeE%3D","updated":"2013-11-06 22:50:45.000000000","message":"yes i am hard deleting the row. I think i need to revisit this.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":56,"context_line":"    # todo(cp16net) remvoe the foreignkey here"},{"line_number":57,"context_line":"    instances.create_column(Column(\u0027configuration_id\u0027, String(36),"},{"line_number":58,"context_line":"                                   ForeignKey(\"configuration.id\")))"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FbeE%3D","line":58,"in_reply_to":"AAAATn%2F%2Fe6U%3D","updated":"2013-11-06 10:59:05.000000000","message":"+1","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"}],"trove/db/sqlalchemy/migrate_repo/versions/017_configurations.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":29,"context_line":"meta \u003d MetaData()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"configuration \u003d Table("},{"line_number":32,"context_line":"    \u0027configuration\u0027,"},{"line_number":33,"context_line":"    meta,"},{"line_number":34,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027name\u0027, String(64)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BphM%3D","line":32,"updated":"2013-11-22 02:16:40.000000000","message":"name, tenant_id, and datastore should be Nullable\u003dFalse","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"meta \u003d MetaData()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"configuration \u003d Table("},{"line_number":32,"context_line":"    \u0027configuration\u0027,"},{"line_number":33,"context_line":"    meta,"},{"line_number":34,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":35,"context_line":"    Column(\u0027name\u0027, String(64)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj08%3D","line":32,"in_reply_to":"AAAATn%2F%2BphM%3D","updated":"2013-11-23 13:50:53.000000000","message":"Agreed","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    Column(\u0027name\u0027, String(64)),"},{"line_number":36,"context_line":"    Column(\u0027description\u0027, String(256)),"},{"line_number":37,"context_line":"    Column(\u0027tenant_id\u0027, String(36)),"},{"line_number":38,"context_line":"    Column(\u0027datastore\u0027, String(36))"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"configuration_items \u003d Table("}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bphs%3D","line":38,"updated":"2013-11-22 02:16:40.000000000","message":"this should be datastore_manager vs. datastore to give a stronger indication that it\u0027s the same as the datastore table\u0027s manager column (see https://review.openstack.org/#/c/47934/15/trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py)\n\nalso, needs to be String(255) to conform to datastore model.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    Column(\u0027name\u0027, String(64)),"},{"line_number":36,"context_line":"    Column(\u0027description\u0027, String(256)),"},{"line_number":37,"context_line":"    Column(\u0027tenant_id\u0027, String(36)),"},{"line_number":38,"context_line":"    Column(\u0027datastore\u0027, String(36))"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"configuration_items \u003d Table("}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSLg%3D","line":38,"in_reply_to":"AAAATn%2F%2Bj0w%3D","updated":"2013-12-02 05:03:15.000000000","message":"I slightly agree here. I think the name should be datastore_version_id because this is the most specific type of configuration you can make. Because you might not be able to use the same config group with an example i heard earlier was mysql 4 vs mysql 5.5.\n\nAnd this should just be the id of the datastore version. so String(36) would be fine.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    Column(\u0027name\u0027, String(64)),"},{"line_number":36,"context_line":"    Column(\u0027description\u0027, String(256)),"},{"line_number":37,"context_line":"    Column(\u0027tenant_id\u0027, String(36)),"},{"line_number":38,"context_line":"    Column(\u0027datastore\u0027, String(36))"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"configuration_items \u003d Table("}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0w%3D","line":38,"in_reply_to":"AAAATn%2F%2Bphs%3D","updated":"2013-11-23 13:50:53.000000000","message":"Agreed","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"configuration_items \u003d Table("},{"line_number":42,"context_line":"    \u0027configuration_item\u0027,"},{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027configuration_id\u0027, String(36), ForeignKey(\"configuration.id\"),"},{"line_number":45,"context_line":"           nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpjU%3D","line":42,"updated":"2013-11-22 02:16:40.000000000","message":"these are exposed to the user as \"configuration parameters\", so why call the table configuration_item?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":41,"context_line":"configuration_items \u003d Table("},{"line_number":42,"context_line":"    \u0027configuration_item\u0027,"},{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027configuration_id\u0027, String(36), ForeignKey(\"configuration.id\"),"},{"line_number":45,"context_line":"           nullable\u003dFalse),"},{"line_number":46,"context_line":"    Column(\u0027configuration_key\u0027, String(128), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":47,"context_line":"    Column(\u0027configuration_value\u0027, String(128))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpYw%3D","line":44,"updated":"2013-11-22 02:16:40.000000000","message":"why not \"key\" and \"value\" vs. \"configuration_key\" and \"configuration_value\". in looking at the other tables, the former naming scheme is adhered to more often than the latter.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":41,"context_line":"configuration_items \u003d Table("},{"line_number":42,"context_line":"    \u0027configuration_item\u0027,"},{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027configuration_id\u0027, String(36), ForeignKey(\"configuration.id\"),"},{"line_number":45,"context_line":"           nullable\u003dFalse),"},{"line_number":46,"context_line":"    Column(\u0027configuration_key\u0027, String(128), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":47,"context_line":"    Column(\u0027configuration_value\u0027, String(128))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSK8%3D","line":44,"in_reply_to":"AAAATn%2F%2BpYw%3D","updated":"2013-12-02 05:03:15.000000000","message":"Done","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027configuration_id\u0027, String(36), ForeignKey(\"configuration.id\"),"},{"line_number":45,"context_line":"           nullable\u003dFalse),"},{"line_number":46,"context_line":"    Column(\u0027configuration_key\u0027, String(128), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":47,"context_line":"    Column(\u0027configuration_value\u0027, String(128))"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bpgg%3D","line":46,"updated":"2013-11-22 02:16:40.000000000","message":"configuration_key isn\u0027t unique, so it shouldn\u0027t be the lone primary_key. perhaps (configuration_id,configuration_key) as a composite?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":57,"context_line":"    instances.create_column(Column(\u0027configuration_id\u0027, String(36),"},{"line_number":58,"context_line":"                                   ForeignKey(\"configuration.id\")))"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpY8%3D","line":58,"updated":"2013-11-22 02:16:40.000000000","message":"if there\u0027s a ForeignKey constraint on configuration.id, why do we not have deleted+deleted_at in the configuration table to tombstone dropped configurations? from what I can tell, you\u0027re hard deleting the row.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":57,"context_line":"    instances.create_column(Column(\u0027configuration_id\u0027, String(36),"},{"line_number":58,"context_line":"                                   ForeignKey(\"configuration.id\")))"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSKQ%3D","line":58,"in_reply_to":"AAAATn%2F%2BpY8%3D","updated":"2013-12-02 05:03:15.000000000","message":"you are right and i this was a big concern and i changed it.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def downgrade(migrate_engine):"},{"line_number":62,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":63,"context_line":"    drop_tables([configuration])"},{"line_number":64,"context_line":"    drop_tables([configuration_items])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BpiM%3D","line":63,"updated":"2013-11-22 02:16:40.000000000","message":"for the multiple-datastores-versions feature, we avoided dropping service_images to support a fallback scenario in which a provider tries to upgrade trove, finds issues, and wants to rollback the services to a known-good version.\n\nthis is a bit different, but imagine a rollback weeks after deploying trove with this feature. dropping user\u0027s configurations for a temporary rollback and asking them to re-create when the provider rolls forward isn\u0027t desirable.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    drop_tables([configuration_items])"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    instances \u003d Table(\u0027instances\u0027, meta, autoload\u003dTrue)"},{"line_number":67,"context_line":"    instances.drop_column(\u0027configuration_id\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bph8%3D","line":67,"updated":"2013-11-22 02:16:40.000000000","message":"same concern as above.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"484ec52d54159778b8d1a151832fd98c2e9e28d6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"           nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":45,"context_line":"    Column(\u0027configuration_key\u0027, String(128), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":46,"context_line":"    Column(\u0027configuration_value\u0027, String(128)),"},{"line_number":47,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":48,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":49,"context_line":")"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjsw%3D","line":47,"updated":"2014-01-11 07:57:36.000000000","message":"why is this different than the deleted column above, i.e. it doesn\u0027t match \"Column(\u0027deleted\u0027, Boolean(), nullable\u003dFalse, default\u003dFalse),\"","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":44,"context_line":"           nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":45,"context_line":"    Column(\u0027configuration_key\u0027, String(128), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":46,"context_line":"    Column(\u0027configuration_value\u0027, String(128)),"},{"line_number":47,"context_line":"    Column(\u0027deleted\u0027, Boolean(), default\u003d0),"},{"line_number":48,"context_line":"    Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":49,"context_line":")"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfCk%3D","line":47,"in_reply_to":"AAAAUH%2F%2Fjsw%3D","updated":"2014-01-13 12:49:18.000000000","message":"agreed","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/guestagent/api.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def prepare(self, memory_mb, packages, databases, users,"},{"line_number":216,"context_line":"                device_path\u003d\u0027/dev/vdb\u0027, mount_point\u003d\u0027/mnt/volume\u0027,"},{"line_number":217,"context_line":"                backup_id\u003dNone, config_contents\u003dNone, root_password\u003dNone,"},{"line_number":218,"context_line":"                overrides\u003dNone):"},{"line_number":219,"context_line":"        \"\"\"Make an asynchronous call to prepare the guest"},{"line_number":220,"context_line":"           as a database container optionally includes a backup id for restores"},{"line_number":221,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0g%3D","line":218,"updated":"2013-11-23 13:50:53.000000000","message":"overrides is not good name for parameter, it points us that historicaly it had from mysql, why not just call it post_configuration ?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            memory_mb\u003dmemory_mb, users\u003dusers, device_path\u003ddevice_path,"},{"line_number":226,"context_line":"            mount_point\u003dmount_point, backup_id\u003dbackup_id,"},{"line_number":227,"context_line":"            config_contents\u003dconfig_contents, root_password\u003droot_password,"},{"line_number":228,"context_line":"            overrides\u003doverrides)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def restart(self):"},{"line_number":231,"context_line":"        \"\"\"Restart the MySQL server.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0c%3D","line":228,"updated":"2013-11-23 13:50:53.000000000","message":"same","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                                       \u0027instance_id\u0027: self.id})"},{"line_number":277,"context_line":"        self._cast(\"create_backup\", backup_id\u003dbackup_id)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def update_overrides(self, overrides):"},{"line_number":280,"context_line":"        LOG.debug(_(\"Updating overrides values %s for instance %s\" %"},{"line_number":281,"context_line":"                    (overrides, self.id)))"},{"line_number":282,"context_line":"        self._cast(\"update_overrides\", overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0U%3D","line":279,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to name it update_configuration.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    def update_overrides(self, overrides):"},{"line_number":280,"context_line":"        LOG.debug(_(\"Updating overrides values %s for instance %s\" %"},{"line_number":281,"context_line":"                    (overrides, self.id)))"},{"line_number":282,"context_line":"        self._cast(\"update_overrides\", overrides\u003doverrides)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":285,"context_line":"        LOG.debug(_(\"Applying overrides values %s for instance %s\" %"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0I%3D","line":282,"updated":"2013-11-23 13:50:53.000000000","message":"same","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                    (overrides, self.id)))"},{"line_number":282,"context_line":"        self._cast(\"update_overrides\", overrides\u003doverrides)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":285,"context_line":"        LOG.debug(_(\"Applying overrides values %s for instance %s\" %"},{"line_number":286,"context_line":"                    (overrides, self.id)))"},{"line_number":287,"context_line":"        self._cast(\"apply_overrides\", overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0Q%3D","line":284,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to name it apply_configuration.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":285,"context_line":"        LOG.debug(_(\"Applying overrides values %s for instance %s\" %"},{"line_number":286,"context_line":"                    (overrides, self.id)))"},{"line_number":287,"context_line":"        self._cast(\"apply_overrides\", overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bj0M%3D","line":287,"updated":"2013-11-23 13:50:53.000000000","message":"same","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def update_overrides(self, overrides):"},{"line_number":287,"context_line":"        LOG.debug(_(\"Updating overrides on Instance %s\"), self.id)"},{"line_number":288,"context_line":"        LOG.debug(_(\"Updating overrides values %s\") % self.id)"},{"line_number":289,"context_line":"        self._cast(\"update_overrides\", overrides\u003doverrides)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def apply_overrides(self, overrides):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjmA%3D","line":288,"updated":"2014-01-11 09:51:34.000000000","message":"\"Updating overrides values %s\" is logging the id, not the overrides.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":292,"context_line":"        LOG.debug(_(\"Applying overrides on Instance %s\"), self.id)"},{"line_number":293,"context_line":"        LOG.debug(_(\"Applying overrides values %s\") % self.id)"},{"line_number":294,"context_line":"        self._cast(\"apply_overrides\", overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjl8%3D","line":293,"updated":"2014-01-11 09:51:34.000000000","message":"\"Updating overrides values %s\" is logging the id, not the overrides.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/guestagent/common/sql_query.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"},{"line_number":441,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 0)"},{"line_number":442,"context_line":"        elif self.value is None:"},{"line_number":443,"context_line":"            return \"SET GLOBAL %s\" % (self.key)"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWy4%3D","line":442,"updated":"2013-11-08 11:20:04.000000000","message":"elif not self.value:","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"},{"line_number":441,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 0)"},{"line_number":442,"context_line":"        elif self.value is None:"},{"line_number":443,"context_line":"            return \"SET GLOBAL %s\" % (self.key)"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWQk%3D","line":442,"in_reply_to":"AAAATn%2F%2FWpc%3D","updated":"2013-11-08 18:21:09.000000000","message":"I\u0027ve noticed that it doesnt really matter if you set a key with a blank or if you set the key with a \u00271\u0027 or true. Both ways evaluate  the value to being true.\n\nBut i still disagree with you denis because the else will catch the other values and still get expected results from this call.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b40abb766a4e398b13d6e3f590cb7a3e0685866","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"},{"line_number":441,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 0)"},{"line_number":442,"context_line":"        elif self.value is None:"},{"line_number":443,"context_line":"            return \"SET GLOBAL %s\" % (self.key)"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWpc%3D","line":442,"in_reply_to":"AAAATn%2F%2FWtI%3D","updated":"2013-11-08 12:40:24.000000000","message":"Yes, that is what i suggest, because it is not allowed to use empty values. I\u0027m still pointing at this issue, because it\u0027s not accepatable.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":7850,"name":"Kevin Conway","email":"kevinjacobconway@gmail.com","username":"kevinconway"},"change_message_id":"0ecc497b8fb24294399abde5fa9f98c7d526e7ee","unresolved":false,"context_lines":[{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"},{"line_number":441,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 0)"},{"line_number":442,"context_line":"        elif self.value is None:"},{"line_number":443,"context_line":"            return \"SET GLOBAL %s\" % (self.key)"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWtI%3D","line":442,"in_reply_to":"AAAATn%2F%2FWy4%3D","updated":"2013-11-08 11:59:59.000000000","message":"I disagree. He\u0027s specifically checking for None here, not all \"falsey\" values. That\u0027s what \"is None\" is for.\n\nYou suggestion would not allow the values of \"\" or 0 to be set.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"6b0fb60d368807a7f81e496ccc649564a4aad444","unresolved":false,"context_lines":[{"line_number":434,"context_line":"    def __repr__(self):"},{"line_number":435,"context_line":"        return str(self)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __str__(self):"},{"line_number":438,"context_line":"        if self.value is True:"},{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FVjk%3D","line":437,"updated":"2013-11-09 10:55:53.000000000","message":"we need to discuss dynamic variables, and personaly u think that this change could be done in separate patch (dependent on this)","commit_id":"b2470f9a8bc0913597b4d87a9f9c4b5b69cec420"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"09585e81ad9eb65fd3b664d5b2efefe00f7d07a0","unresolved":false,"context_lines":[{"line_number":434,"context_line":"    def __repr__(self):"},{"line_number":435,"context_line":"        return str(self)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __str__(self):"},{"line_number":438,"context_line":"        if self.value is True:"},{"line_number":439,"context_line":"            return \"SET GLOBAL %s\u003d%s\" % (self.key, 1)"},{"line_number":440,"context_line":"        elif self.value is False:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FSbk%3D","line":437,"in_reply_to":"AAAATn%2F%2FVjk%3D","updated":"2013-11-11 17:45:58.000000000","message":"this is configurable. `apply_dynamic_configuration` you can turn this off and on. Currently the default is on.","commit_id":"b2470f9a8bc0913597b4d87a9f9c4b5b69cec420"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        return \"DROP USER `%s`@`%s`;\" % (self.user, self.host)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"class SetServerVariable(object):"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def __init__(self, key, value):"},{"line_number":431,"context_line":"        self.key \u003d key"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjz4%3D","line":428,"updated":"2013-11-23 13:50:53.000000000","message":"to be precise, dynamic variables could have it\u0027s own review which would come after this review as dependent, because it\u0027s mysql specific, it\u0027s even requires it\u0027s own BP tho.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        return \"DROP USER `%s`@`%s`;\" % (self.user, self.host)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"class SetServerVariable(object):"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def __init__(self, key, value):"},{"line_number":431,"context_line":"        self.key \u003d key"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yu0%3D","line":428,"updated":"2013-12-05 21:39:39.000000000","message":"As i mention earlier. Please make 2 dependent reviews - one for configuration, another for dynamic variables.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"ed27cf929fd591bec4c4dcdecba9b5e80bd361e5","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        return \"DROP USER `%s`@`%s`;\" % (self.user, self.host)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"class SetServerVariable(object):"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def __init__(self, key, value):"},{"line_number":431,"context_line":"        self.key \u003d key"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yIE%3D","line":428,"in_reply_to":"AAAATn%2F9yu0%3D","updated":"2013-12-06 22:28:31.000000000","message":"thats going to be a big pain to spilt the logic out because its dependent on the rest of the configuration. Rather keep it together for now.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"}],"trove/guestagent/datastore/mysql/manager.py":[{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2f6ad58d76f400b32359995bfa6ab577d696ac30","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        backup.backup(context, backup_id)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def update_overrides(self, context, overrides):"},{"line_number":166,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":167,"context_line":"        app.update_overrides(overrides)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmvY%3D","line":165,"updated":"2013-10-31 14:53:50.000000000","message":"how about update also main my.cfn?\nin case if values changed in config template?","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        backup.backup(context, backup_id)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def update_overrides(self, context, overrides):"},{"line_number":166,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":167,"context_line":"        app.update_overrides(overrides)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fbdk%3D","line":165,"in_reply_to":"AAAATn%2F%2FmvY%3D","updated":"2013-11-06 10:59:05.000000000","message":"Disagreed. Configuration should not affect to any templates.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        backup.backup(context, backup_id)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def update_overrides(self, context, overrides):"},{"line_number":166,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":167,"context_line":"        app.update_overrides(overrides)"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmR4%3D","line":165,"in_reply_to":"AAAATn%2F%2FmvY%3D","updated":"2013-11-06 22:50:45.000000000","message":"there is another method for the main configuration file in the guest. \u0027reset_configuration\u0027\n\nWe may want to add a mgmt or public api call to do this.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def prepare(self, context, packages, databases, memory_mb, users,"},{"line_number":88,"context_line":"                device_path\u003dNone, mount_point\u003dNone, backup_id\u003dNone,"},{"line_number":89,"context_line":"                config_contents\u003dNone, root_password\u003dNone, overrides\u003dNone):"},{"line_number":90,"context_line":"        \"\"\"Makes ready DBAAS on a Guest container.\"\"\""},{"line_number":91,"context_line":"        MySqlAppStatus.get().begin_install()"},{"line_number":92,"context_line":"        # status end_mysql_install set with secure()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjz0%3D","line":89,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to rename it to configuration, post_configuration","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if backup_id:"},{"line_number":108,"context_line":"            self._perform_restore(backup_id, context, CONF.mount_point, app)"},{"line_number":109,"context_line":"        LOG.info(_(\"Securing mysql now.\"))"},{"line_number":110,"context_line":"        app.secure(config_contents, overrides)"},{"line_number":111,"context_line":"        enable_root_on_restore \u003d (backup_id and MySqlAdmin().is_root_enabled())"},{"line_number":112,"context_line":"        if root_password and not backup_id:"},{"line_number":113,"context_line":"            app.secure_root(secure_remote_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjzw%3D","line":110,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to rename it to configuration, post_configuration","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        backup.backup(context, backup_id)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def update_overrides(self, context, overrides):"},{"line_number":160,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":161,"context_line":"        app.update_overrides(overrides)"},{"line_number":162,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjzs%3D","line":159,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to rename it to configuration, post_configuration","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def update_overrides(self, context, overrides):"},{"line_number":160,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":161,"context_line":"        app.update_overrides(overrides)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def apply_overrides(self, context, overrides):"},{"line_number":164,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjzg%3D","line":161,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to rename it to configuration, post_configuration","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":161,"context_line":"        app.update_overrides(overrides)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def apply_overrides(self, context, overrides):"},{"line_number":164,"context_line":"        app \u003d MySqlApp(MySqlAppStatus.get())"},{"line_number":165,"context_line":"        app.apply_overrides(overrides)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjzY%3D","line":163,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to rename it to configuration, post_configuration, also same about method name.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/guestagent/datastore/mysql/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d \"/var/lib/mysql\""},{"line_number":52,"context_line":"MYCNF_OVERRIDES \u003d \"/etc/mysql/conf.d/overrides.cnf\""},{"line_number":53,"context_line":"MYCNF_OVERRIDES_TMP \u003d \"/tmp/overrides.cnf.tmp\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"CONF \u003d cfg.CONF"},{"line_number":56,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FbdU%3D","line":53,"updated":"2013-11-06 10:59:05.000000000","message":"please move lines #42-53 into mysql/system","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":826,"context_line":"                        \"MySQL state \u003d\u003d %s!\") % self.status)"},{"line_number":827,"context_line":"            raise RuntimeError(\"MySQL not stopped.\")"},{"line_number":828,"context_line":"        LOG.info(_(\"Initiating config.\"))"},{"line_number":829,"context_line":"        self._write_mycnf(None, config_contents, None)"},{"line_number":830,"context_line":"        self.start_mysql(True)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def reset_configuration(self, configuration):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnIo%3D","line":829,"updated":"2013-10-31 14:45:06.000000000","message":"i suppose, it would be better make overrides parameter equals None at the def section.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":826,"context_line":"                        \"MySQL state \u003d\u003d %s!\") % self.status)"},{"line_number":827,"context_line":"            raise RuntimeError(\"MySQL not stopped.\")"},{"line_number":828,"context_line":"        LOG.info(_(\"Initiating config.\"))"},{"line_number":829,"context_line":"        self._write_mycnf(None, config_contents, None)"},{"line_number":830,"context_line":"        self.start_mysql(True)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def reset_configuration(self, configuration):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmRY%3D","line":829,"in_reply_to":"AAAATn%2F%2FnIo%3D","updated":"2013-11-06 22:50:45.000000000","message":"sounds good.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":832,"context_line":"    def reset_configuration(self, configuration):"},{"line_number":833,"context_line":"        config_contents \u003d configuration[\u0027config_contents\u0027]"},{"line_number":834,"context_line":"        LOG.info(_(\"Resetting configuration\"))"},{"line_number":835,"context_line":"        self._write_mycnf(None, config_contents, None)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def is_installed(self):"},{"line_number":838,"context_line":"        #(cp16net) could raise an exception, does it need to be handled here?"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnIg%3D","line":835,"updated":"2013-10-31 14:45:06.000000000","message":"Same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":50,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d \"/var/lib/mysql\""},{"line_number":52,"context_line":"MYCNF_OVERRIDES \u003d \"/etc/mysql/conf.d/overrides.cnf\""},{"line_number":53,"context_line":"MYCNF_OVERRIDES_TMP \u003d \"/tmp/overrides.cnf.tmp\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"CONF \u003d cfg.CONF"},{"line_number":56,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWy0%3D","line":53,"updated":"2013-11-08 11:20:04.000000000","message":"as i said, please move them into system.py","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d \"/var/lib/mysql\""},{"line_number":52,"context_line":"MYCNF_OVERRIDES \u003d \"/etc/mysql/conf.d/overrides.cnf\""},{"line_number":53,"context_line":"MYCNF_OVERRIDES_TMP \u003d \"/tmp/overrides.cnf.tmp\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"CONF \u003d cfg.CONF"},{"line_number":56,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWPk%3D","line":53,"in_reply_to":"AAAATn%2F%2FWy0%3D","updated":"2013-11-08 18:21:09.000000000","message":"ok","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":759,"context_line":"            self._write_config_overrides(overrides)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _write_config_overrides(self, overrideValues):"},{"line_number":762,"context_line":"        LOG.info(_(\"Writing new temp overrides.cnf file.\"))"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"        with open(MYCNF_OVERRIDES_TMP, \u0027w\u0027) as overrides:"},{"line_number":765,"context_line":"            overrides.write(overrideValues)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWyI%3D","line":762,"updated":"2013-11-08 11:20:04.000000000","message":"I suppose it\u0027s a worth idea to change whole config file at all, suppose we have some kind of post-configuration after installing. And when new config would come from server side he would override whole config and database would loose network connectivity from outside of instance. So, i\u0027d like to see part overriding, only changed parameters, not all config.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"6f060e8dba478db0f31c1dbd03d28e50dfd9c38c","unresolved":false,"context_lines":[{"line_number":759,"context_line":"            self._write_config_overrides(overrides)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _write_config_overrides(self, overrideValues):"},{"line_number":762,"context_line":"        LOG.info(_(\"Writing new temp overrides.cnf file.\"))"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"        with open(MYCNF_OVERRIDES_TMP, \u0027w\u0027) as overrides:"},{"line_number":765,"context_line":"            overrides.write(overrideValues)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWPo%3D","line":762,"in_reply_to":"AAAATn%2F%2FWyI%3D","updated":"2013-11-08 18:21:09.000000000","message":"So... we are setting all the overrides that are given on a configuration group here. My approach is to make the guest as dumb as possible. We give the guest the configuration, it writes them and sets the state for a restart required. We will not make the user lose connectivity until they expect it by doing a restart.","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"6b0fb60d368807a7f81e496ccc649564a4aad444","unresolved":false,"context_lines":[{"line_number":48,"context_line":"UUID \u003d False"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d \"/var/lib/mysql\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"CONF \u003d cfg.CONF"},{"line_number":54,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FVjc%3D","line":51,"updated":"2013-11-09 10:55:53.000000000","message":"MYSQL_BASE_DIR - this one is equal with CONF.mount_point","commit_id":"b2470f9a8bc0913597b4d87a9f9c4b5b69cec420"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"CONF \u003d cfg.CONF"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"MYSQL_BASE_DIR \u003d CONF.mount_point"},{"line_number":53,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjzE%3D","line":52,"updated":"2013-11-23 13:50:53.000000000","message":"it would be better to store constants in mysql/system.py, reason - keep code clean as it possible.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"CONF \u003d cfg.CONF"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"MYSQL_BASE_DIR \u003d CONF.mount_point"},{"line_number":53,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BSBo%3D","line":52,"in_reply_to":"AAAATn%2F%2BjzE%3D","updated":"2013-12-02 05:03:15.000000000","message":"This used to be there but it was dismantled in the datastore review.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        finally:"},{"line_number":688,"context_line":"            self.status.end_install_or_restart()"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def update_overrides(self, overrides_file, remove\u003dFalse):"},{"line_number":691,"context_line":"        \"\"\""},{"line_number":692,"context_line":"        This function will either update or remove the MySQL overrides.cnf file"},{"line_number":693,"context_line":"        If remove is set to True the function will remove the overrides file."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjzU%3D","line":690,"updated":"2013-11-23 13:50:53.000000000","message":"same about method name","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":4,"context_line":"# Copyright 2013 Rackspace Hosting"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yuo%3D","line":1,"updated":"2013-12-05 21:39:39.000000000","message":"please remove vim lines.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CONF \u003d cfg.CONF"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d CONF.mount_point"},{"line_number":52,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjlk%3D","line":51,"updated":"2014-01-11 09:51:34.000000000","message":"although changes like this seem innocent enough, since they\u0027re technically unrelated to your patch-set, they should be submitted as a standalone review.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CONF \u003d cfg.CONF"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"MYSQL_BASE_DIR \u003d CONF.mount_point"},{"line_number":52,"context_line":"TMP_MYCNF \u003d \"/tmp/my.cnf.tmp\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"INCLUDE_MARKER_OPERATORS \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfCU%3D","line":51,"in_reply_to":"AAAAUH%2F%2Fjlk%3D","updated":"2014-01-13 12:49:18.000000000","message":"agreed, please do not change them.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        \"\"\""},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        if overrides_file:"},{"line_number":709,"context_line":"            LOG.debug(\"writing new overrides.cnf config file\")"},{"line_number":710,"context_line":"            self._write_config_overrides(overrides_file)"},{"line_number":711,"context_line":"        if remove:"},{"line_number":712,"context_line":"            LOG.debug(\"removing overrides.cnf config file\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlQ%3D","line":709,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":709,"context_line":"            LOG.debug(\"writing new overrides.cnf config file\")"},{"line_number":710,"context_line":"            self._write_config_overrides(overrides_file)"},{"line_number":711,"context_line":"        if remove:"},{"line_number":712,"context_line":"            LOG.debug(\"removing overrides.cnf config file\")"},{"line_number":713,"context_line":"            self._remove_overrides()"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def apply_overrides(self, overrides):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlM%3D","line":712,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":713,"context_line":"            self._remove_overrides()"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":716,"context_line":"        LOG.debug(\"applying overrides to mysql\")"},{"line_number":717,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":718,"context_line":"            LOG.debug(\"updating overrides values in running daemon\")"},{"line_number":719,"context_line":"            for k, v in overrides.iteritems():"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlI%3D","line":716,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":715,"context_line":"    def apply_overrides(self, overrides):"},{"line_number":716,"context_line":"        LOG.debug(\"applying overrides to mysql\")"},{"line_number":717,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":718,"context_line":"            LOG.debug(\"updating overrides values in running daemon\")"},{"line_number":719,"context_line":"            for k, v in overrides.iteritems():"},{"line_number":720,"context_line":"                q \u003d sql_query.SetServerVariable(key\u003dk, value\u003dv)"},{"line_number":721,"context_line":"                t \u003d text(str(q))"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlE%3D","line":718,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":722,"context_line":"                try:"},{"line_number":723,"context_line":"                    client.execute(t)"},{"line_number":724,"context_line":"                except exc.OperationalError:"},{"line_number":725,"context_line":"                    LOG.exception(\"Unable to set %s with value %s\" % (k, v))"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"    def _replace_mycnf_with_template(self, template_path, original_path):"},{"line_number":728,"context_line":"        LOG.debug(\"replacing the mycnf with template\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlU%3D","line":725,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":818,"context_line":"        try:"},{"line_number":819,"context_line":"            utils.execute_with_timeout(\"sudo\", \"rm\", MYCNF_OVERRIDES)"},{"line_number":820,"context_line":"        except exception.ProcessExecutionError as pe:"},{"line_number":821,"context_line":"            LOG.error(\"Could not delete overrides configuration.\")"},{"line_number":822,"context_line":"            LOG.error(pe)"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            # if the overrides file simply doesn\u0027t exist, we will proceed"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FjlA%3D","line":821,"updated":"2014-01-11 09:51:34.000000000","message":"wrap with underscore (from gettextutils)","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"657fd030f294d17d9f92f9d996c98a105d46bacc","unresolved":false,"context_lines":[{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            # if the overrides file simply doesn\u0027t exist, we will proceed"},{"line_number":825,"context_line":"            # anyway since the file is removed."},{"line_number":826,"context_line":"            if \"No such file or directory\" not in str(pe):"},{"line_number":827,"context_line":"                raise"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"    def start_mysql(self, update_db\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fjk8%3D","line":826,"updated":"2014-01-11 09:51:34.000000000","message":"there\u0027s got to be a cleaner way to do this (vs. relying on an english string).... i think.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":823,"context_line":""},{"line_number":824,"context_line":"            # if the overrides file simply doesn\u0027t exist, we will proceed"},{"line_number":825,"context_line":"            # anyway since the file is removed."},{"line_number":826,"context_line":"            if \"No such file or directory\" not in str(pe):"},{"line_number":827,"context_line":"                raise"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"    def start_mysql(self, update_db\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfB8%3D","line":826,"in_reply_to":"AAAAUH%2F%2Fjk8%3D","updated":"2014-01-13 12:49:18.000000000","message":"agreed, i\u0027d suggest to use os.path.exists method","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa9276565cea9b0da066de245f26d5d99cbce1e8","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                                    \"%(value)s\") % output)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def _replace_mycnf_with_template(self, template_path, original_path):"},{"line_number":729,"context_line":"        LOG.debug(\"replacing the mycnf with template\")"},{"line_number":730,"context_line":"        LOG.debug(\"template_path(%s) original_path(%s)\""},{"line_number":731,"context_line":"                  % (template_path, original_path))"},{"line_number":732,"context_line":"        if os.path.isfile(template_path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAvE%3D","line":729,"updated":"2014-01-31 00:37:39.000000000","message":"wrap with underscore","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"669e46a2ccc67b3e08ac7e07cb69b2a2505e163d","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                                    \"%(value)s\") % output)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def _replace_mycnf_with_template(self, template_path, original_path):"},{"line_number":729,"context_line":"        LOG.debug(\"replacing the mycnf with template\")"},{"line_number":730,"context_line":"        LOG.debug(\"template_path(%s) original_path(%s)\""},{"line_number":731,"context_line":"                  % (template_path, original_path))"},{"line_number":732,"context_line":"        if os.path.isfile(template_path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F98I4%3D","line":729,"in_reply_to":"AAAAUH%2F%2BAvE%3D","updated":"2014-01-31 21:24:35.000000000","message":"NOT MY CODE! :-P but.... ok...","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa9276565cea9b0da066de245f26d5d99cbce1e8","unresolved":false,"context_lines":[{"line_number":727,"context_line":""},{"line_number":728,"context_line":"    def _replace_mycnf_with_template(self, template_path, original_path):"},{"line_number":729,"context_line":"        LOG.debug(\"replacing the mycnf with template\")"},{"line_number":730,"context_line":"        LOG.debug(\"template_path(%s) original_path(%s)\""},{"line_number":731,"context_line":"                  % (template_path, original_path))"},{"line_number":732,"context_line":"        if os.path.isfile(template_path):"},{"line_number":733,"context_line":"            if os.path.isfile(original_path):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BAu8%3D","line":730,"updated":"2014-01-31 00:37:39.000000000","message":"wrap with underscore","commit_id":"ffba4ad5911ab80a7042f5b4c0489ac9e3832331"}],"trove/guestagent/manager/mysql_service.py":[{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        \"\"\""},{"line_number":661,"context_line":"        This function will either update or remove the MySQL overrides.cnf file"},{"line_number":662,"context_line":"        If an empty dictionary is provided for overrides, the function will"},{"line_number":663,"context_line":"        remove the overrides file."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        When updating, the agent will also attempt to dynamically set"},{"line_number":666,"context_line":"        the corresponding global variables."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0nM%3D","line":663,"updated":"2013-10-28 14:02:18.000000000","message":"Looks like the comment should be updated, an empty dictionary no longer removes the overrides file if I understand correctly.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        \"\"\""},{"line_number":661,"context_line":"        This function will either update or remove the MySQL overrides.cnf file"},{"line_number":662,"context_line":"        If an empty dictionary is provided for overrides, the function will"},{"line_number":663,"context_line":"        remove the overrides file."},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        When updating, the agent will also attempt to dynamically set"},{"line_number":666,"context_line":"        the corresponding global variables."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Foso%3D","line":663,"in_reply_to":"AAAATn%2F%2F0nM%3D","updated":"2013-10-31 05:03:32.000000000","message":"good catch.","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"}],"trove/instance/models.py":[{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                    return True"},{"line_number":661,"context_line":"            return False"},{"line_number":662,"context_line":"        need_restart \u003d _do_configs_require_restart(overrides)"},{"line_number":663,"context_line":"        LOG.debug(\"do we need a restart?: %s\" % need_restart)"},{"line_number":664,"context_line":"        if need_restart:"},{"line_number":665,"context_line":"            self.update_db(task_status\u003dInstanceTasks.RESTART_REQUIRED)"},{"line_number":666,"context_line":"        task_api.API(self.context).update_overrides(self.id, overrides)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0lw%3D","line":663,"updated":"2013-10-28 14:02:18.000000000","message":"I\u0027d suggest a slightly more informative statement, something like \"my.cnf has non-dynamic settings, which requires a restart\"","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":660,"context_line":"                    return True"},{"line_number":661,"context_line":"            return False"},{"line_number":662,"context_line":"        need_restart \u003d _do_configs_require_restart(overrides)"},{"line_number":663,"context_line":"        LOG.debug(\"do we need a restart?: %s\" % need_restart)"},{"line_number":664,"context_line":"        if need_restart:"},{"line_number":665,"context_line":"            self.update_db(task_status\u003dInstanceTasks.RESTART_REQUIRED)"},{"line_number":666,"context_line":"        task_api.API(self.context).update_overrides(self.id, overrides)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2ForE%3D","line":663,"in_reply_to":"AAAATn%2F%2F0lw%3D","updated":"2013-10-31 05:03:32.000000000","message":"thx","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"107b25b06fcc9700b2ff907e2d6d8348b1b357d2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    BACKUP \u003d \"BACKUP\""},{"line_number":70,"context_line":"    SHUTDOWN \u003d \"SHUTDOWN\""},{"line_number":71,"context_line":"    ERROR \u003d \"ERROR\""},{"line_number":72,"context_line":"    RESTART_REQUIRED \u003d \"RESTART_REQUIRED\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def validate_volume_size(size):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fe1E%3D","line":72,"updated":"2013-11-05 01:54:41.000000000","message":"RESTART_REQUIRED is fairly scary sounding. It makes it sound like a restart is compulsory, or extremely bad things will happen (which isn\u0027t true). Also, overloading the purpose of this state flag is dangerous:\n\nExample:\n\n- User initiates a Configuration change, flipping the state from ACTIVE to RESTART_REQUIRED.\n- User initiates a backup, flipping the state from RESTART_REQUIRED to BACKUP.\n- BACKUP will flip back to ACTIVE\n\nNow the user is unaware of a RESTART_REQUIRED.\n\nThere are multiple permutations of this problem (see RESIZE, etc.)\n\nWorst case, rename it to something resembling \"PENDING_CHANGES\". Best case, add a bitmask\u0027able column for these various state changes (or another column, or another table, or ?)","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    BACKUP \u003d \"BACKUP\""},{"line_number":70,"context_line":"    SHUTDOWN \u003d \"SHUTDOWN\""},{"line_number":71,"context_line":"    ERROR \u003d \"ERROR\""},{"line_number":72,"context_line":"    RESTART_REQUIRED \u003d \"RESTART_REQUIRED\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def validate_volume_size(size):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FaUw%3D","line":72,"in_reply_to":"AAAATn%2F%2Fe1E%3D","updated":"2013-11-06 22:50:45.000000000","message":"So we want the user to beware that the service needs to the be restarted in order for the changes to take affect. This could be a bigger issue with the way we are reporting the state of the service to the user.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"3cc239cf21edac3ec72631c0e55d060f2244691e","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    BACKUP \u003d \"BACKUP\""},{"line_number":70,"context_line":"    SHUTDOWN \u003d \"SHUTDOWN\""},{"line_number":71,"context_line":"    ERROR \u003d \"ERROR\""},{"line_number":72,"context_line":"    RESTART_REQUIRED \u003d \"RESTART_REQUIRED\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def validate_volume_size(size):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FbdM%3D","line":72,"in_reply_to":"AAAATn%2F%2Fe1E%3D","updated":"2013-11-06 10:59:05.000000000","message":"agreed","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            return Configuration.load(self.context,"},{"line_number":245,"context_line":"                                      self.db_info.configuration_id)"},{"line_number":246,"context_line":"        else:"},{"line_number":247,"context_line":"            return None"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class DetailInstance(SimpleInstance):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnEs%3D","line":247,"updated":"2013-10-31 14:45:06.000000000","message":"last 2 line are meaningless","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":648,"context_line":""},{"line_number":649,"context_line":"        def _get_item(key, dictList):"},{"line_number":650,"context_line":"            for item in dictList:"},{"line_number":651,"context_line":"                if key \u003d\u003d item[\u0027name\u0027]:"},{"line_number":652,"context_line":"                    return item"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        def _do_configs_require_restart(overrides):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnEI%3D","line":651,"updated":"2013-10-31 14:45:06.000000000","message":"please use dict method .get(key, default), and does we need such method at all, why cant we use: \n         if key in dict.keys():\n               dict.get(key, None)","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":648,"context_line":""},{"line_number":649,"context_line":"        def _get_item(key, dictList):"},{"line_number":650,"context_line":"            for item in dictList:"},{"line_number":651,"context_line":"                if key \u003d\u003d item[\u0027name\u0027]:"},{"line_number":652,"context_line":"                    return item"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        def _do_configs_require_restart(overrides):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmPg%3D","line":651,"in_reply_to":"AAAATn%2F%2FnEI%3D","updated":"2013-11-06 22:50:45.000000000","message":"I can sorta change this to use that format but its a list of dictionaries so the last part wont work with the structure as is.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":654,"context_line":"        def _do_configs_require_restart(overrides):"},{"line_number":655,"context_line":"            if not CONF.apply_dynamic_configuration:"},{"line_number":656,"context_line":"                return True"},{"line_number":657,"context_line":"            rules \u003d cfg.get_validation_rules()"},{"line_number":658,"context_line":"            for key in overrides.iterkeys():"},{"line_number":659,"context_line":"                rule \u003d _get_item(key, rules[\u0027configuration-parameters\u0027])"},{"line_number":660,"context_line":"                LOG.debug(\"checking the rule: %s\" % rule)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnD0%3D","line":657,"updated":"2013-10-31 14:45:06.000000000","message":"Applicapable only for mysql/precona, missing flexibility","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":655,"context_line":"            if not CONF.apply_dynamic_configuration:"},{"line_number":656,"context_line":"                return True"},{"line_number":657,"context_line":"            rules \u003d cfg.get_validation_rules()"},{"line_number":658,"context_line":"            for key in overrides.iterkeys():"},{"line_number":659,"context_line":"                rule \u003d _get_item(key, rules[\u0027configuration-parameters\u0027])"},{"line_number":660,"context_line":"                LOG.debug(\"checking the rule: %s\" % rule)"},{"line_number":661,"context_line":"                if not rule[\u0027dynamic\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnDs%3D","line":658,"updated":"2013-10-31 14:45:06.000000000","message":"please, could you use key in overrides.keys()","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                return True"},{"line_number":657,"context_line":"            rules \u003d cfg.get_validation_rules()"},{"line_number":658,"context_line":"            for key in overrides.iterkeys():"},{"line_number":659,"context_line":"                rule \u003d _get_item(key, rules[\u0027configuration-parameters\u0027])"},{"line_number":660,"context_line":"                LOG.debug(\"checking the rule: %s\" % rule)"},{"line_number":661,"context_line":"                if not rule[\u0027dynamic\u0027]:"},{"line_number":662,"context_line":"                    return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnDg%3D","line":659,"updated":"2013-10-31 14:45:06.000000000","message":"take a look at comment on line #651","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":662,"context_line":"                    return True"},{"line_number":663,"context_line":"            return False"},{"line_number":664,"context_line":"        need_restart \u003d _do_configs_require_restart(overrides)"},{"line_number":665,"context_line":"        LOG.debug(\"my.cnf has non-dynamic settings, requires a restart: %s\""},{"line_number":666,"context_line":"                  % need_restart)"},{"line_number":667,"context_line":"        if need_restart:"},{"line_number":668,"context_line":"            self.update_db(task_status\u003dInstanceTasks.RESTART_REQUIRED)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnDY%3D","line":665,"updated":"2013-10-31 14:45:06.000000000","message":"mysql specific, missing flexibility","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":503,"context_line":"                                                        id\u003dconfiguration_id)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"                for i in config_items:"},{"line_number":506,"context_line":"                    overrides[i.configuration_key] \u003d i.configuration_value"},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"            service_status \u003d InstanceServiceStatus.create("},{"line_number":509,"context_line":"                instance_id\u003ddb_info.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjys%3D","line":506,"updated":"2013-11-23 13:50:53.000000000","message":"could we call this another way ? (overrides - mysql specific name)","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":653,"context_line":"                                                          config_id)"},{"line_number":654,"context_line":"        self.update_db(configuration_id\u003dNone)"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def update_overrides(self, overrides):"},{"line_number":657,"context_line":"        LOG.debug(\"Updating or removing overrides for instance %s\" % self.id)"},{"line_number":658,"context_line":"        need_restart \u003d do_configs_require_restart("},{"line_number":659,"context_line":"            overrides, datastore_type\u003dself.service_type)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjyo%3D","line":656,"updated":"2013-11-23 13:50:53.000000000","message":"could it be update_configuration ?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                        \"Trove instance %(db)s...\") %"},{"line_number":509,"context_line":"                      {\u0027tenant\u0027: context.tenant, \u0027db\u0027: db_info.id})"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"            # if a configuration group is associated with this instance,"},{"line_number":512,"context_line":"            # generate an overrides dict to pass into the instance creation"},{"line_number":513,"context_line":"            # method"},{"line_number":514,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfBo%3D","line":511,"updated":"2014-01-13 12:49:18.000000000","message":"an instance","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        raise exception.UnprocessableEntity(msg)"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def unassign_configuration(self):"},{"line_number":663,"context_line":"        LOG.debug(\"Unassigning the configuration id (%s) to the instance %s\""},{"line_number":664,"context_line":"                  % (self.configuration.id, self.id))"},{"line_number":665,"context_line":"        flavor \u003d self.get_flavor()"},{"line_number":666,"context_line":"        config_id \u003d self.configuration.id"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfBk%3D","line":663,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                                                          config_id)"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"    def update_overrides(self, overrides):"},{"line_number":672,"context_line":"        LOG.debug(\"Updating or removing overrides for instance %s\" % self.id)"},{"line_number":673,"context_line":"        need_restart \u003d do_configs_require_restart("},{"line_number":674,"context_line":"            overrides, datastore_manager\u003dself.datastore.manager)"},{"line_number":675,"context_line":"        LOG.debug(\"config overrides has non-dynamic settings, \""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfBc%3D","line":672,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":672,"context_line":"        LOG.debug(\"Updating or removing overrides for instance %s\" % self.id)"},{"line_number":673,"context_line":"        need_restart \u003d do_configs_require_restart("},{"line_number":674,"context_line":"            overrides, datastore_manager\u003dself.datastore.manager)"},{"line_number":675,"context_line":"        LOG.debug(\"config overrides has non-dynamic settings, \""},{"line_number":676,"context_line":"                  \"requires a restart: %s\" % need_restart)"},{"line_number":677,"context_line":"        if need_restart:"},{"line_number":678,"context_line":"            self.update_db(task_status\u003dInstanceTasks.RESTART_REQUIRED)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfBU%3D","line":675,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":522,"context_line":"                                                        id\u003dconfiguration_id)"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"                for i in config_items:"},{"line_number":525,"context_line":"                    overrides[i.configuration_key] \u003d i.configuration_value"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"            service_status \u003d InstanceServiceStatus.create("},{"line_number":528,"context_line":"                instance_id\u003ddb_info.id,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mr8%3D","line":525,"updated":"2014-02-05 19:28:15.000000000","message":"Lines 519-525 should be in their own function which produces the \"overrides\" variable.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"}],"trove/instance/service.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"},{"line_number":192,"context_line":"        flavor_id \u003d utils.get_id_from_href(flavor_ref)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        if \u0027configuration\u0027 in body[\u0027instance\u0027]:"},{"line_number":195,"context_line":"            configuration_id \u003d body[\u0027instance\u0027][\u0027configuration\u0027]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"            # ensure a valid configuration has been passed in and that it"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEbI%3D","line":194,"updated":"2013-12-02 21:29:29.000000000","message":"shouldn\u0027t this be configuration_id vs. configuration?","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        # the new configuration.  If configuration_ref is empty, we want to"},{"line_number":257,"context_line":"        # disassociate the instance from the configuration group and remove the"},{"line_number":258,"context_line":"        # active overrides file."},{"line_number":259,"context_line":"        if \u0027configuration_ref\u0027 in body[\"instance\"]:"},{"line_number":260,"context_line":"            # Assigning configuration"},{"line_number":261,"context_line":"            configuration_ref \u003d body[\"instance\"][\"configuration_ref\"]"},{"line_number":262,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEb4%3D","line":259,"updated":"2013-12-02 21:29:29.000000000","message":"configuration_ref was changed to configuration_id, so the field names should be updated and the get_id_from_href logic can be removed.","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f98e2d6ff9b521543b5b2f5b16b7d586f0ca9b0b","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                config \u003d models.Configuration.load(context, conf)"},{"line_number":268,"context_line":"                if (config.datastore_version_id !\u003d"},{"line_number":269,"context_line":"                        instance.db_info.datastore_version_id):"},{"line_number":270,"context_line":"                    raise exception.DatastoreDoNotMatchException("},{"line_number":271,"context_line":"                        config_datastore\u003dconfig.datastore,"},{"line_number":272,"context_line":"                        instance_datastore\u003dinstance.datastore)"},{"line_number":273,"context_line":"                config_items \u003d models.Configuration.load_items(context, conf)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BEXw%3D","line":270,"updated":"2013-12-02 21:29:29.000000000","message":"DatastoreDoNotMatchException does not exist in trove.common.exception","commit_id":"fc5d96dfa836e21a4629e713dff396c178e46326"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"38020ce70a19496f0b7f0b02ddcfd9005af21c03","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                    message\u003d\u0027Configuration group id: %s could not be found\u0027"},{"line_number":204,"context_line":"                    % configuration_id)"},{"line_number":205,"context_line":"        else:"},{"line_number":206,"context_line":"            configuration_id \u003d None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        databases \u003d populate_validated_databases("},{"line_number":209,"context_line":"            body[\u0027instance\u0027].get(\u0027databases\u0027, []))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FurI%3D","line":206,"updated":"2014-01-09 04:40:03.000000000","message":"It seems most of this block of code is also present in the update(), should be another method.","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"a369c7dd74deb973faa610d32d453457b97ba19f","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                    message\u003d\u0027Configuration group id: %s could not be found\u0027"},{"line_number":204,"context_line":"                    % configuration_id)"},{"line_number":205,"context_line":"        else:"},{"line_number":206,"context_line":"            configuration_id \u003d None"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        databases \u003d populate_validated_databases("},{"line_number":209,"context_line":"            body[\u0027instance\u0027].get(\u0027databases\u0027, []))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fr8w%3D","line":206,"in_reply_to":"AAAAUH%2F%2FurI%3D","updated":"2014-01-09 16:09:03.000000000","message":"I\u0027ll see if i can make a common method around this.","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"38020ce70a19496f0b7f0b02ddcfd9005af21c03","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            raise exception.TroveError(msg)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @staticmethod"},{"line_number":350,"context_line":"    def _validate(body):"},{"line_number":351,"context_line":"        \"\"\"Validate that the request has all the required parameters\"\"\""},{"line_number":352,"context_line":"        InstanceController._validate_body_not_empty(body)"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FupM%3D","line":350,"updated":"2014-01-09 04:40:03.000000000","message":"I am confused why we need to re-introduce this validation code.  We have jsonschema validation that occurs prior to any of this code being invoked.  Can\u0027t we add to the schema validation instead?","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"a369c7dd74deb973faa610d32d453457b97ba19f","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            raise exception.TroveError(msg)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @staticmethod"},{"line_number":350,"context_line":"    def _validate(body):"},{"line_number":351,"context_line":"        \"\"\"Validate that the request has all the required parameters\"\"\""},{"line_number":352,"context_line":"        InstanceController._validate_body_not_empty(body)"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fr9Y%3D","line":350,"in_reply_to":"AAAAUH%2F%2FupM%3D","updated":"2014-01-09 16:09:03.000000000","message":"I think this was started so long ago that we had all these methods here and when rebasing i was afraid of just deleting all the code. :-/ Good catch.","commit_id":"31ebaacabefc3992f6d7b1bfc4fb58c66901a6eb"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"b2cbb90efb13a31da26316d5e58c21c2110185c5","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                        message\u003d\u0027Configuration group id: %s could not be found\u0027"},{"line_number":247,"context_line":"                        % configuration_id)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def update(self, req, id, body, tenant_id):"},{"line_number":250,"context_line":"        LOG.info(_(\"Updating instance for tenant id %s\") % tenant_id)"},{"line_number":251,"context_line":"        LOG.info(_(\"req: %s\") % req)"},{"line_number":252,"context_line":"        LOG.info(_(\"body: %s\") % body)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fits%3D","line":249,"updated":"2014-01-12 04:51:06.000000000","message":"missing docstring.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"b2cbb90efb13a31da26316d5e58c21c2110185c5","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        else:"},{"line_number":295,"context_line":"            LOG.debug(\"no configuration found on instance skipping.\")"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def configuration(self, req, tenant_id, id):"},{"line_number":298,"context_line":"        LOG.debug(\"getting default configuration for the instance(%s)\" % id)"},{"line_number":299,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":300,"context_line":"        instance \u003d models.Instance.load(context, id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fito%3D","line":297,"updated":"2014-01-12 04:51:06.000000000","message":"missing docstring.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"90875d1bd29f74bd64fe8c5496cf3f68e74fec8f","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            raise exception.TroveError(msg)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    @staticmethod"},{"line_number":345,"context_line":"    def _validate(body):"},{"line_number":346,"context_line":"        \"\"\"Validate that the request has all the required parameters\"\"\""},{"line_number":347,"context_line":"        InstanceController._validate_body_not_empty(body)"},{"line_number":348,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FkIs%3D","line":345,"updated":"2014-01-11 01:54:36.000000000","message":"looks like you forgot to remove this code still.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"            overrides \u003d {}"},{"line_number":285,"context_line":"            for i in config_items:"},{"line_number":286,"context_line":"                overrides[i.configuration_key] \u003d i.configuration_value"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            LOG.info(overrides)"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mn8%3D","line":286,"updated":"2014-02-05 19:28:15.000000000","message":"Lines 281-286 are identical to the code in trove/instance/models.py, lines 519-525. This kind of thing should happen in the models code and not the controller.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"            instance.update_overrides(overrides)"},{"line_number":291,"context_line":"            models.Instance.update_db(instance,"},{"line_number":292,"context_line":"                                      configuration_id\u003dconfiguration.id)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mnM%3D","line":292,"updated":"2014-02-05 19:28:15.000000000","message":"The majority of this code should be in the models.py file, located at trove/configurations/models.py. In general we want to avoid putting heavy logic into the Controllers.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"99fcb932ee60238763414c9baef3efe64e94311d","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"            instance.update_overrides(overrides)"},{"line_number":291,"context_line":"            models.Instance.update_db(instance,"},{"line_number":292,"context_line":"                                      configuration_id\u003dconfiguration.id)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        return wsgi.Result(None, 202)"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9lLI%3D","line":292,"in_reply_to":"AAAAUH%2F9mnM%3D","updated":"2014-02-06 03:32:09.000000000","message":"ok yeah that makes sense. done.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        if instance.configuration and instance.configuration.id:"},{"line_number":301,"context_line":"            instance.unassign_configuration()"},{"line_number":302,"context_line":"        else:"},{"line_number":303,"context_line":"            LOG.debug(\"no configuration found on instance skipping.\")"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def configuration(self, req, tenant_id, id):"},{"line_number":306,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mTo%3D","line":303,"updated":"2014-02-05 19:28:15.000000000","message":"This should be in models.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            instance.ds_version.manager, flavor, id)"},{"line_number":317,"context_line":"        ret \u003d config.render_dict()"},{"line_number":318,"context_line":"        LOG.debug(\"default config for instance is: %s\" % ret)"},{"line_number":319,"context_line":"        return wsgi.Result(views.DefaultConfigurationView("},{"line_number":320,"context_line":"                           ret).data(), 200)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mTU%3D","line":319,"updated":"2014-02-05 19:28:15.000000000","message":"Code from 311-318 should be in models.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"}],"trove/instance/tasks.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    BUILDING \u003d InstanceTask(0x05, \u0027BUILDING\u0027, \u0027The instance is building.\u0027)"},{"line_number":72,"context_line":"    MIGRATING \u003d InstanceTask(0x06, \u0027MIGRATING\u0027, \u0027Migrating the instance.\u0027)"},{"line_number":73,"context_line":"    RESTART_REQUIRED \u003d InstanceTask(0x07, \u0027RESTART_REQUIRED\u0027,"},{"line_number":74,"context_line":"                                    \u0027Config requires restart.\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    BUILDING_ERROR_DNS \u003d InstanceTask(0x50, \u0027BUILDING\u0027, \u0027Build error: DNS.\u0027,"},{"line_number":77,"context_line":"                                      is_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAs%3D","line":74,"updated":"2014-01-13 12:49:18.000000000","message":"instance requires restart","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/instance/views.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                                                      datastore_version.name)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if self.instance.configuration is not None:"},{"line_number":96,"context_line":"            result[\u0027instance\u0027][\u0027configuration\u0027] \u003d self.\\"},{"line_number":97,"context_line":"                _build_configuration_info()"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        dns_support \u003d CONF.trove_dns_support"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjyk%3D","line":96,"updated":"2013-11-23 13:50:53.000000000","message":"please, use pythonic way, do not use \\, use instead ()","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/taskmanager/api.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                root_password\u003droot_password,"},{"line_number":119,"context_line":"                                overrides\u003doverrides))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def update_overrides(self, instance_id, overrides\u003dNone):"},{"line_number":122,"context_line":"        LOG.debug(\"Making async call to update configuration overrides for \""},{"line_number":123,"context_line":"                  \"instance %s\" % instance_id)"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FnGw%3D","line":121,"updated":"2013-10-31 14:45:06.000000000","message":"Could we please use more meaningful naming of classes/functions/parameters.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                                root_password\u003droot_password,"},{"line_number":121,"context_line":"                                overrides\u003doverrides))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def update_overrides(self, instance_id, overrides\u003dNone):"},{"line_number":124,"context_line":"        LOG.debug(\"Making async call to update configuration overrides for \""},{"line_number":125,"context_line":"                  \"instance %s\" % instance_id)"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjyc%3D","line":123,"updated":"2013-11-23 13:50:53.000000000","message":"same with method names","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                                overrides\u003doverrides))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def update_overrides(self, instance_id, overrides\u003dNone):"},{"line_number":124,"context_line":"        LOG.debug(\"Making async call to update configuration overrides for \""},{"line_number":125,"context_line":"                  \"instance %s\" % instance_id)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        self.cast(self.context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAo%3D","line":124,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                                overrides\u003doverrides))"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def unassign_configuration(self, instance_id, flavor, configuration_id):"},{"line_number":133,"context_line":"        LOG.debug(\"Making async call to unassign configuration for \""},{"line_number":134,"context_line":"                  \"instance %s\" % instance_id)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        self.cast(self.context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAg%3D","line":133,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/taskmanager/manager.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                                       availability_zone, root_password,"},{"line_number":92,"context_line":"                                       overrides)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def update_overrides(self, context, instance_id, overrides):"},{"line_number":95,"context_line":"        instance_tasks \u003d models.BuiltInstanceTasks.load(context, instance_id)"},{"line_number":96,"context_line":"        instance_tasks.update_overrides(overrides)"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyU%3D","line":94,"updated":"2013-11-23 13:50:53.000000000","message":"same with method names","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/taskmanager/models.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":755,"context_line":"        def _get_item(key, dictList):"},{"line_number":756,"context_line":"            for item in dictList:"},{"line_number":757,"context_line":"                if key \u003d\u003d item[\u0027name\u0027]:"},{"line_number":758,"context_line":"                    return item"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"        def _do_configs_require_restart(overrides):"},{"line_number":761,"context_line":"            if not CONF.apply_dynamic_configuration:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm84%3D","line":758,"updated":"2013-10-31 14:45:06.000000000","message":"Same. Even more, this code is a dublicate.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":762,"context_line":"                return True"},{"line_number":763,"context_line":"            rules \u003d cfg.get_validation_rules()"},{"line_number":764,"context_line":"            for key, val in overrides.iteritems():"},{"line_number":765,"context_line":"                rule \u003d _get_item(str(key), rules[\u0027configuration-parameters\u0027])"},{"line_number":766,"context_line":"                LOG.debug(\"checking the rule: %s\" % rule)"},{"line_number":767,"context_line":"                # if rule[\u0027type\u0027] \u003d\u003d \u0027boolean\u0027:"},{"line_number":768,"context_line":"                #     if tolower(val) \u003d\u003d \u0027false\u0027 or val \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm8w%3D","line":765,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":804,"context_line":"                    return i"},{"line_number":805,"context_line":"            return None"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"        def _convert_value(value):"},{"line_number":808,"context_line":"            # split the value and the size e.g. 512M\u003d[\u0027512\u0027,\u0027M\u0027]"},{"line_number":809,"context_line":"            pattern \u003d re.compile(\u0027(\\d+)(\\w+)\u0027)"},{"line_number":810,"context_line":"            split \u003d pattern.findall(value)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm8k%3D","line":807,"updated":"2013-10-31 14:45:06.000000000","message":"i suppose it would be moved to common","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":823,"context_line":"        LOG.debug(\"default mysqld section: %s\" % default_config)"},{"line_number":824,"context_line":""},{"line_number":825,"context_line":"        overrides \u003d {}"},{"line_number":826,"context_line":"        for item in self.configuration.items:"},{"line_number":827,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":828,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":829,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm8M%3D","line":826,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":825,"context_line":"        overrides \u003d {}"},{"line_number":826,"context_line":"        for item in self.configuration.items:"},{"line_number":827,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":828,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":829,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"},{"line_number":830,"context_line":"        LOG.debug(\"setting the default variables in dict: %s\" % overrides)"},{"line_number":831,"context_line":"        self.update_overrides(overrides, remove\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm8c%3D","line":828,"updated":"2013-10-31 14:45:06.000000000","message":"please, use python dict built-it functionality","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":825,"context_line":"        overrides \u003d {}"},{"line_number":826,"context_line":"        for item in self.configuration.items:"},{"line_number":827,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":828,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":829,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"},{"line_number":830,"context_line":"        LOG.debug(\"setting the default variables in dict: %s\" % overrides)"},{"line_number":831,"context_line":"        self.update_overrides(overrides, remove\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FmKQ%3D","line":828,"in_reply_to":"AAAATn%2F%2Fm8c%3D","updated":"2013-11-06 22:50:45.000000000","message":"Thats the thing... this is not a normal dict otherwise i would have.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def _render_override_config(self, service_type, flavor, instance_id,"},{"line_number":146,"context_line":"                                overrides\u003dNone):"},{"line_number":147,"context_line":"        config \u003d template.OverrideConfigTemplate("},{"line_number":148,"context_line":"            service_type, flavor, instance_id)"},{"line_number":149,"context_line":"        config.render(overrides\u003doverrides)"},{"line_number":150,"context_line":"        return config"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyQ%3D","line":147,"updated":"2013-11-23 13:50:53.000000000","message":"Could it be called PostConfigurationTemplate ?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                availability_zone)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        config \u003d self._render_config(datastore_manager, flavor, self.id)"},{"line_number":212,"context_line":"        config_overrides \u003d self._render_override_config(service_type, None,"},{"line_number":213,"context_line":"                                                        self.id,"},{"line_number":214,"context_line":"                                                        overrides\u003doverrides"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyM%3D","line":212,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    def _guest_prepare(self, server, flavor_ram, volume_info,"},{"line_number":532,"context_line":"                       packages, databases, users, backup_id\u003dNone,"},{"line_number":533,"context_line":"                       config_contents\u003dNone, root_password\u003dNone,"},{"line_number":534,"context_line":"                       overrides\u003dNone):"},{"line_number":535,"context_line":"        LOG.info(_(\"Entering guest_prepare\"))"},{"line_number":536,"context_line":"        # Now wait for the response from the create to do additional work"},{"line_number":537,"context_line":"        self.guest.prepare(flavor_ram, packages, databases, users,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyI%3D","line":534,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":540,"context_line":"                           backup_id\u003dbackup_id,"},{"line_number":541,"context_line":"                           config_contents\u003dconfig_contents,"},{"line_number":542,"context_line":"                           root_password\u003droot_password,"},{"line_number":543,"context_line":"                           overrides\u003doverrides)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def _create_dns_entry(self):"},{"line_number":546,"context_line":"        LOG.debug(_(\"%(gt)s: Creating dns entry for instance: %(id)s\") %"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyE%3D","line":543,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":802,"context_line":"            LOG.debug(_(\"Restarting FINALLY  %s \") % self.id)"},{"line_number":803,"context_line":"            self.update_db(task_status\u003dinst_models.InstanceTasks.NONE)"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def update_overrides(self, overrides):"},{"line_number":806,"context_line":"        LOG.debug(\"Updating configuration overrides on instance %s\" % self.id)"},{"line_number":807,"context_line":"        LOG.debug(\"overrides: %s\" % overrides)"},{"line_number":808,"context_line":"        # todo(cp16net) How do we know what datastore type we have?"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BjyA%3D","line":805,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":818,"context_line":"                                                        self.id,"},{"line_number":819,"context_line":"                                                        overrides\u003doverrides)"},{"line_number":820,"context_line":"        try:"},{"line_number":821,"context_line":"            self.guest.update_overrides(config_overrides.config_contents)"},{"line_number":822,"context_line":"            if CONF.apply_dynamic_configuration:"},{"line_number":823,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":824,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjx8%3D","line":821,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":819,"context_line":"                                                        overrides\u003doverrides)"},{"line_number":820,"context_line":"        try:"},{"line_number":821,"context_line":"            self.guest.update_overrides(config_overrides.config_contents)"},{"line_number":822,"context_line":"            if CONF.apply_dynamic_configuration:"},{"line_number":823,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":824,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"},{"line_number":825,"context_line":"        except GuestError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Bjx4%3D","line":822,"updated":"2013-11-23 13:50:53.000000000","message":"same with dynamic stuff (another review)","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                availability_zone)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        config \u003d self._render_config(datastore_manager, flavor, self.id)"},{"line_number":211,"context_line":"        config_overrides \u003d self._render_override_config(datastore_manager,"},{"line_number":212,"context_line":"                                                        None,"},{"line_number":213,"context_line":"                                                        self.id,"},{"line_number":214,"context_line":"                                                        overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yng%3D","line":211,"updated":"2013-12-05 21:39:39.000000000","message":"it would be better to use dict instead of raw string.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"ed27cf929fd591bec4c4dcdecba9b5e80bd361e5","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                availability_zone)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        config \u003d self._render_config(datastore_manager, flavor, self.id)"},{"line_number":211,"context_line":"        config_overrides \u003d self._render_override_config(datastore_manager,"},{"line_number":212,"context_line":"                                                        None,"},{"line_number":213,"context_line":"                                                        self.id,"},{"line_number":214,"context_line":"                                                        overrides\u003doverrides)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9xpQ%3D","line":211,"in_reply_to":"AAAATn%2F9yng%3D","updated":"2013-12-06 22:28:31.000000000","message":"I have not understood why or what use case this would really help.\n\nSo there are 2 calls made to the guest. One for writing the file and another to set the values.\n\nOn the prepare we really only need a single call to send the overrides file. We can apply the config group to the config file before starting up the db service. So hence no call to apply the config group. \n\n*** i\u0027ll comment where the other calls are ***","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"ed27cf929fd591bec4c4dcdecba9b5e80bd361e5","unresolved":false,"context_lines":[{"line_number":827,"context_line":"                                                        self.id,"},{"line_number":828,"context_line":"                                                        overrides\u003doverrides)"},{"line_number":829,"context_line":"        try:"},{"line_number":830,"context_line":"            self.guest.update_overrides(config_overrides.config_contents)"},{"line_number":831,"context_line":"            if CONF.apply_dynamic_configuration and not need_restart:"},{"line_number":832,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":833,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9xos%3D","line":830,"updated":"2013-12-06 22:28:31.000000000","message":"This is sending the config group as the override.cnf file.\n\nconfig_overrides.config_contents \u003d LONG_CONFIG_STRING","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"ed27cf929fd591bec4c4dcdecba9b5e80bd361e5","unresolved":false,"context_lines":[{"line_number":829,"context_line":"        try:"},{"line_number":830,"context_line":"            self.guest.update_overrides(config_overrides.config_contents)"},{"line_number":831,"context_line":"            if CONF.apply_dynamic_configuration and not need_restart:"},{"line_number":832,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":833,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"},{"line_number":834,"context_line":"        except GuestError:"},{"line_number":835,"context_line":"            LOG.error(\"Failed to update configuration overrides.\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9xnk%3D","line":832,"updated":"2013-12-06 22:28:31.000000000","message":"This is sending the config group as a {key: value, ... } \n\nThis is to be able to apply the config group dynamically. Since it is way easier to iterate of the dictionary of keys and values. \n\nI\u0027m trying to see if there would be a way to get the desired behavior out of this and i suspect that you can because you could either get the values from the files string or the dictionary if you have it apply the dynamic configuration.","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        config \u003d template.SingleInstanceConfigTemplate("},{"line_number":154,"context_line":"            datastore_manager, flavor, instance_id)"},{"line_number":155,"context_line":"        ret \u003d config.render_dict()"},{"line_number":156,"context_line":"        LOG.debug(\"the default template dict of mysqld section: %s\" % ret)"},{"line_number":157,"context_line":"        return ret"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAc%3D","line":156,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":816,"context_line":"            self.update_db(task_status\u003dinst_models.InstanceTasks.NONE)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def update_overrides(self, overrides):"},{"line_number":819,"context_line":"        LOG.debug(\"Updating configuration overrides on instance %s\" % self.id)"},{"line_number":820,"context_line":"        LOG.debug(\"overrides: %s\" % overrides)"},{"line_number":821,"context_line":"        LOG.debug(\"self.ds: %s\" % self.ds.__dict__)"},{"line_number":822,"context_line":"        # todo(cp16net) How do we know what datastore type we have?"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAU%3D","line":819,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def update_overrides(self, overrides):"},{"line_number":819,"context_line":"        LOG.debug(\"Updating configuration overrides on instance %s\" % self.id)"},{"line_number":820,"context_line":"        LOG.debug(\"overrides: %s\" % overrides)"},{"line_number":821,"context_line":"        LOG.debug(\"self.ds: %s\" % self.ds.__dict__)"},{"line_number":822,"context_line":"        # todo(cp16net) How do we know what datastore type we have?"},{"line_number":823,"context_line":"        need_restart \u003d do_configs_require_restart("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAM%3D","line":820,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":818,"context_line":"    def update_overrides(self, overrides):"},{"line_number":819,"context_line":"        LOG.debug(\"Updating configuration overrides on instance %s\" % self.id)"},{"line_number":820,"context_line":"        LOG.debug(\"overrides: %s\" % overrides)"},{"line_number":821,"context_line":"        LOG.debug(\"self.ds: %s\" % self.ds.__dict__)"},{"line_number":822,"context_line":"        # todo(cp16net) How do we know what datastore type we have?"},{"line_number":823,"context_line":"        need_restart \u003d do_configs_require_restart("},{"line_number":824,"context_line":"            overrides, datastore_manager\u003dself.ds.manager)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAI%3D","line":821,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        # todo(cp16net) How do we know what datastore type we have?"},{"line_number":823,"context_line":"        need_restart \u003d do_configs_require_restart("},{"line_number":824,"context_line":"            overrides, datastore_manager\u003dself.ds.manager)"},{"line_number":825,"context_line":"        LOG.debug(\"do we need a restart?: %s\" % need_restart)"},{"line_number":826,"context_line":"        if need_restart:"},{"line_number":827,"context_line":"            status \u003d inst_models.InstanceTasks.RESTART_REQUIRED"},{"line_number":828,"context_line":"            self.update_db(task_status\u003dstatus)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAE%3D","line":825,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":835,"context_line":"            self.guest.update_overrides(config_overrides.config_contents)"},{"line_number":836,"context_line":"            if CONF.apply_dynamic_configuration and not need_restart:"},{"line_number":837,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":838,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"},{"line_number":839,"context_line":"        except GuestError:"},{"line_number":840,"context_line":"            LOG.error(\"Failed to update configuration overrides.\")"},{"line_number":841,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2FfAA%3D","line":838,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":837,"context_line":"                self.guest.apply_overrides(overrides)"},{"line_number":838,"context_line":"            LOG.debug(\"Configuration overrides update successful.\")"},{"line_number":839,"context_line":"        except GuestError:"},{"line_number":840,"context_line":"            LOG.error(\"Failed to update configuration overrides.\")"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def unassign_configuration(self, flavor, configuration_id):"},{"line_number":843,"context_line":"        LOG.debug(\"Unassigning the configuration id (%s) to the instance %s\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2F8%3D","line":840,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":840,"context_line":"            LOG.error(\"Failed to update configuration overrides.\")"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def unassign_configuration(self, flavor, configuration_id):"},{"line_number":843,"context_line":"        LOG.debug(\"Unassigning the configuration id (%s) to the instance %s\""},{"line_number":844,"context_line":"                  % (self.configuration.id, self.id))"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        def _find_item(items, item_name):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2F0%3D","line":843,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":868,"context_line":"        default_config \u003d self._render_config_dict(self.ds.manager,"},{"line_number":869,"context_line":"                                                  flavor,"},{"line_number":870,"context_line":"                                                  self.id)"},{"line_number":871,"context_line":"        LOG.debug(\"default mysqld section: %s\" % default_config)"},{"line_number":872,"context_line":"        LOG.debug(\"self.configuration: %s\" % self.configuration)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        overrides \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2FU%3D","line":871,"updated":"2014-01-13 12:49:18.000000000","message":"_()\n\nAlso, i\u0027d not suggest you to use hardcoded datastore manager names.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"9bb6810e1f94479a55ff22492e2c799b91451e57","unresolved":false,"context_lines":[{"line_number":868,"context_line":"        default_config \u003d self._render_config_dict(self.ds.manager,"},{"line_number":869,"context_line":"                                                  flavor,"},{"line_number":870,"context_line":"                                                  self.id)"},{"line_number":871,"context_line":"        LOG.debug(\"default mysqld section: %s\" % default_config)"},{"line_number":872,"context_line":"        LOG.debug(\"self.configuration: %s\" % self.configuration)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        overrides \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B50M%3D","line":871,"in_reply_to":"AAAAUH%2F%2Fe%2FU%3D","updated":"2014-01-20 22:09:18.000000000","message":"good point thx","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                                                  flavor,"},{"line_number":870,"context_line":"                                                  self.id)"},{"line_number":871,"context_line":"        LOG.debug(\"default mysqld section: %s\" % default_config)"},{"line_number":872,"context_line":"        LOG.debug(\"self.configuration: %s\" % self.configuration)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        overrides \u003d {}"},{"line_number":875,"context_line":"        config_items \u003d Configuration.load_items(self.context, configuration_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2FM%3D","line":872,"updated":"2014-01-13 12:49:18.000000000","message":"_()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"b2cbb90efb13a31da26316d5e58c21c2110185c5","unresolved":false,"context_lines":[{"line_number":875,"context_line":"        config_items \u003d Configuration.load_items(self.context, configuration_id)"},{"line_number":876,"context_line":"        for item in config_items:"},{"line_number":877,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":878,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":879,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"},{"line_number":880,"context_line":"        LOG.debug(\"setting the default variables in dict: %s\" % overrides)"},{"line_number":881,"context_line":"        self.update_overrides(overrides)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fih8%3D","line":878,"updated":"2014-01-12 04:51:06.000000000","message":"there\u0027s a show-stopper bug in this _find_item call logic.\n\ndefault_config only containers parameters that have defaults, it\u0027s not an exhaustive list of all parameters that can be set. therefore, if a configuration-parameter like \"auto_increment_offset\" was set, _find_item() will return None, which will then cause a TypeError.\n\nhow to reproduce:\n\n    $ trove create Monster 7 --size 1\n    $ trove configuration-create Dos \u0027{\"auto_increment_offset\":3000}\u0027\n    $ trove modify \u003cinstance_id\u003e --configuration \u003cconfiguration_id\u003e\n    # confirm that the configuration has been applied, then\n    $ trove modify \u003cinstance_id\u003e\n\nthen in trove-taskmanager.log you\u0027ll see:\n\n    2014-01-12 04:12:15.077 DEBUG trove.taskmanager.models [req-a3005688-7828-4a8c-8c54-ac41c02bfe7e f2500945f045493f90c404e612269086 73932f61b7564433ba92fc47bf15cc64] self.configuration: \u003ctrove.configuration.models    .DBConfiguration object at 0x4c982d0\u003e from (pid\u003d10192) unassign_configuration /opt/stack/trove/trove/taskmanager/models.py:872\n    2014-01-12 04:12:15.087 DEBUG trove.configuration.models [req-a3005688-7828-4a8c-8c54-ac41c02bfe7e f2500945f045493f90c404e612269086 73932f61b7564433ba92fc47bf15cc64] finding rule with key :     auto_increment_offset from (pid\u003d10192) _get_rule /opt/stack/trove/trove/configuration/models.py:147\n    2014-01-12 04:12:15.088 DEBUG trove.taskmanager.models [req-a3005688-7828-4a8c-8c54-ac41c02bfe7e f2500945f045493f90c404e612269086 73932f61b7564433ba92fc47bf15cc64] finding item(\u003ctrove.configuration.models.    ConfigurationParameter object at 0x4e22790\u003e) from (pid\u003d10192) unassign_configuration /opt/stack/trove/trove/taskmanager/models.py:877\n    2014-01-12 04:12:15.088 ERROR trove.openstack.common.rpc.amqp [req-a3005688-7828-4a8c-8c54-ac41c02bfe7e f2500945f045493f90c404e612269086 73932f61b7564433ba92fc47bf15cc64] Exception during message handling\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp Traceback (most recent call last):\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp   File \"/opt/stack/trove/trove/openstack/common/rpc/amqp.py\", line 440, in _process_data\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp     **args)\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp   File \"/opt/stack/trove/trove/openstack/common/rpc/dispatcher.py\", line 172, in dispatch\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp     result \u003d getattr(proxyobj, method)(ctxt, **kwargs)\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp   File \"/opt/stack/trove/trove/taskmanager/manager.py\", line 101, in unassign_configuration\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp     instance_tasks.unassign_configuration(flavor, configuration_id)\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp   File \"/opt/stack/trove/trove/taskmanager/models.py\", line 878, in unassign_configuration\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp     key, val \u003d _find_item(default_config, item.configuration_key)\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp TypeError: \u0027NoneType\u0027 object is not iterable\n    2014-01-12 04:12:15.088 TRACE trove.openstack.common.rpc.amqp","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"9bb6810e1f94479a55ff22492e2c799b91451e57","unresolved":false,"context_lines":[{"line_number":875,"context_line":"        config_items \u003d Configuration.load_items(self.context, configuration_id)"},{"line_number":876,"context_line":"        for item in config_items:"},{"line_number":877,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":878,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":879,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"},{"line_number":880,"context_line":"        LOG.debug(\"setting the default variables in dict: %s\" % overrides)"},{"line_number":881,"context_line":"        self.update_overrides(overrides)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B5zI%3D","line":878,"in_reply_to":"AAAAUH%2F%2Fih8%3D","updated":"2014-01-20 22:09:18.000000000","message":"i caught this bug too when i was just testing something.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":877,"context_line":"            LOG.debug(\"finding item(%s)\" % item)"},{"line_number":878,"context_line":"            key, val \u003d _find_item(default_config, item.configuration_key)"},{"line_number":879,"context_line":"            overrides[item.configuration_key] \u003d _convert_value(val)"},{"line_number":880,"context_line":"        LOG.debug(\"setting the default variables in dict: %s\" % overrides)"},{"line_number":881,"context_line":"        self.update_overrides(overrides)"},{"line_number":882,"context_line":"        self.update_db(configuration_id\u003dNone)"},{"line_number":883,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2B0%3D","line":880,"updated":"2014-01-13 12:49:18.000000000","message":"()","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            if size \u003d\u003d \u0027M\u0027:"},{"line_number":931,"context_line":"                ret \u003d int(digits) * 1024 ** 2"},{"line_number":932,"context_line":"            if size \u003d\u003d \u0027G\u0027:"},{"line_number":933,"context_line":"                ret \u003d int(digits) * 1024 ** 3"},{"line_number":934,"context_line":"            return str(ret)"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        default_config \u003d self._render_config_dict(self.ds_version.manager,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mMQ%3D","line":933,"updated":"2014-02-05 19:28:15.000000000","message":"There is no default value for ret if \"size\" does not equal any of these values.\n\nHow about:\nconversions\u003d {\u0027K\u0027:1024, \u0027M\u0027: 1024 ** 2, \u0027G\u0027: 1024 ** 3}\nret \u003d int(digits) * conversions[size]\n\nThis way a KeyError will be raised if it isn\u0027t found.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"99fcb932ee60238763414c9baef3efe64e94311d","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            if size \u003d\u003d \u0027M\u0027:"},{"line_number":931,"context_line":"                ret \u003d int(digits) * 1024 ** 2"},{"line_number":932,"context_line":"            if size \u003d\u003d \u0027G\u0027:"},{"line_number":933,"context_line":"                ret \u003d int(digits) * 1024 ** 3"},{"line_number":934,"context_line":"            return str(ret)"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        default_config \u003d self._render_config_dict(self.ds_version.manager,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9lZ0%3D","line":933,"in_reply_to":"AAAAUH%2F9mMQ%3D","updated":"2014-02-06 03:32:09.000000000","message":"ok yeah otherwise there is a undefined variable returned. sounds good.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"}],"trove/templates/mysql-validation-rules.json":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"ada95fb646f46c48c07cd311e87d62c9195dcb83","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FWx4%3D","line":2,"updated":"2013-11-08 11:20:04.000000000","message":"you have validaion rules in two places","commit_id":"ca5c5481c9a4de2a0d9e1f5e7ecea6f3baece509"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"6d45e61f53f26d4c97dea470992267338862be58","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2BpeQ%3D","line":1,"updated":"2013-11-22 02:16:40.000000000","message":"copy/pasting my comments from patch-set #3:\n\n------\n\n\"The list of types thus far are boolean, string, and integer. Considering quite a few parameters have a closed-set of acceptable values, can we introduce the equivalent of a set or enum type?\n\nSomething like:\n\n\"type\": \"enum\", \"values\": [\"one\", \"two\", \"three\"]\n\nThat way the validation can be generalized and the scope is fully inclusive.\"\n\n--------------\n\ni still believe this to be important, because inevitably, without its existence, code will creep into the project to check for various \"known-bad values\" for particular datastores, etc.\n\nnot only that, the validation guarantees here are, from a user\u0027s perspective, oddly strict in some areas and lenient in others. for example, you have bounds checking for integers, but no validation for a field that can only have 3 possible valid values?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a8e909af60e3f38c4f7a3f87ac450463d8b2f7a2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2BEQU%3D","line":1,"in_reply_to":"AAAATn%2F%2BI0o%3D","updated":"2013-12-02 21:49:26.000000000","message":"Sounds good to me, filed https://blueprints.launchpad.net/trove/+spec/configurations-enum-validation as a follow-on.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"58aad14f442c6b584688b4de76d8eed37c046375","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2BI0o%3D","line":1,"in_reply_to":"AAAATn%2F%2Bjxo%3D","updated":"2013-12-02 05:03:15.000000000","message":"Auston I like this idea as well.\n\nCan i purpose this as a new patch set after this one since it is already looking pretty long?","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2Bjxo%3D","line":1,"in_reply_to":"AAAATn%2F%2BkjU%3D","updated":"2013-11-23 13:50:53.000000000","message":"Agreed with Auston, there could be more complex configuration, not only key:value","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":6423,"name":"daniel-morris","username":"daniel-morris"},"change_message_id":"dbfcd0e681b94e9ec13d8f05d8b202f423ea2b39","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2BkjU%3D","line":1,"in_reply_to":"AAAATn%2F%2Bmao%3D","updated":"2013-11-23 00:03:39.000000000","message":"Got it, I misunderstood.  Your logic makes sense and I concur on the value of being able to validate against a set.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"dc275ca7e03e87af4762105fba0b112d8a48ab77","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2Bmao%3D","line":1,"in_reply_to":"AAAATn%2F%2Bo7E%3D","updated":"2013-11-22 16:28:54.000000000","message":"i\u0027m not referring to parameters that require multiple values, i\u0027m referring to parameters that take a single value, but the list of acceptable/valid values for said parameter is a closed-set (vs. free-form).\n\narbitrary examples from mysql 5.5: binlog-format can only be ROW, STATEMENT, or MIXED; delay-key-write can only be ON, OFF, or ALL; etc.\n\nin short, look at every example at http://dev.mysql.com/doc/refman/5.5/en/server-options.html with the type as \"enumeration\".\n\nan example in mongodb is replIndexPrefetch, examples for cassandra include partioner, endpoint_snitch, \u0026 rcp_server_type. riak has storage_backend, etc.\n\nregarding: \"could be added as later enhancement rather than holding up the initial support for configuration\" \u003d\u003e i agree it can be added later, but there\u0027s no better place to have the initial discussion than the code-review, no? it\u0027s worthwhile to have the conversation to assess the validity of the opinion since the stage/context is already set.\n\ncloud providers will find this feature useful for another reason: limiting the set of permitted values for parameters considered \"dangerous\", vs. removing it from this file altogether.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"},{"author":{"_account_id":6423,"name":"daniel-morris","username":"daniel-morris"},"change_message_id":"9e2775df6ec62f56539b7fdbe2e3c3b4c6bdd994","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":9,"id":"AAAATn%2F%2Bo7E%3D","line":1,"in_reply_to":"AAAATn%2F%2BpeQ%3D","updated":"2013-11-22 14:39:02.000000000","message":"Hopefully I am understanding your ask correctly, but can you provide a config example where this type would be applicable?\n\nOne example I can think of that fits this scenario is a save in Redis.  In the redis.conf you can set the following:\n\nsave 60 10000\n\nIn this example, there are two unique values that you must specify for the \"save\" option.  You could do this with a \"set\" or \"enum\", but you could also just send it the string \"60 10000\".  Technically, this is a bit more error prone \n\nGiven that this can be easily accomplished via the String type (in the short-term), the addition of a \"set\" type seems to me like something that could be added as later enhancement rather than holding up the initial support for configuration.   \n\nThe one caveat here is that I am assuming we could add this additional type without having to modify the API spec later, but someone check me on that assumption.  It occurs to me now after writing that that if you pegged something to a \"String\" type and later try to change it, then you would be changing the behavior.","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/templates/mysql.override.config.template":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"{%- else -%}"},{"line_number":10,"context_line":"{{key}}\u003d{{value}}"},{"line_number":11,"context_line":"{%- endif %}"},{"line_number":12,"context_line":"{% endfor %}"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F%2Fm74%3D","line":12,"updated":"2013-10-31 14:45:06.000000000","message":"Why do we need to store another template? It would be better to take config.template and make on-the-go modifications with copy of it.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":9,"context_line":"{%- else -%}"},{"line_number":10,"context_line":"{{key}}\u003d{{value}}"},{"line_number":11,"context_line":"{%- endif %}"},{"line_number":12,"context_line":"{% endfor %}"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"AAAATn%2F%2Fltc%3D","line":12,"in_reply_to":"AAAATn%2F%2Fm74%3D","updated":"2013-11-06 22:50:45.000000000","message":"No that is not the idea of the implementation. \nWe are making a configuration file (overrides.cnf) that will be applied after the default. (included at the end of the my.cnf file) So that we can remove it and then the instance is still with a default working configuration.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"6b0fb60d368807a7f81e496ccc649564a4aad444","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[mysqld]"},{"line_number":2,"context_line":"{% for key, value in overrides.iteritems() -%}"},{"line_number":3,"context_line":"{%- if value \u003d\u003d True -%}"},{"line_number":4,"context_line":"{{key}} \u003d 1"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAATn%2F%2FVjA%3D","line":1,"updated":"2013-11-09 10:55:53.000000000","message":"as i told in IRC, only mysql could be launched with more then 1 conf file","commit_id":"b2470f9a8bc0913597b4d87a9f9c4b5b69cec420"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"744a8026277d836a143da6fdb8ad4f4bafa25da1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[mysqld]"},{"line_number":2,"context_line":"{% for key, value in overrides.iteritems() -%}"},{"line_number":3,"context_line":"{%- if value \u003d\u003d True -%}"},{"line_number":4,"context_line":"{{key}} \u003d 1"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2Bjxk%3D","line":1,"updated":"2013-11-23 13:50:53.000000000","message":"same with naming, override is mysql specific","commit_id":"d840b743b119e35f5bf21d0835f755a81a3cdecd"}],"trove/templates/mysql/validation-rules.json":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"71cafa238a03a46811a58388f74ee67b3202527b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FhNw%3D","line":1,"updated":"2014-01-13 00:15:25.000000000","message":"variables like key_buffer_size, max_allowed_packet\n\u0026 innodb_log_buffer_size are defaulted using config.template, but\ncan still be overridden by the user (since these variables are also\npresent in validation-rules.json).\n\nvariables like basedir and datadir are defaulted using config.template,\nbut are NOT allowed to be overridden by the user (and for obvious\nreasons).\n\nit\u0027s not understood however, as to why *some* of the defaulted variables\nare not allowed to be overriden. examples include: thread_stack,\nthread_cache_size, query_cache_type, query_cache_limit,\nquery_cache_size, innodb_flush_log_at_trx_commit, innodb_log_file_size,\nread_buffer_size, read_rnd_buffer_size, tmp_table_size,\nmax_heap_table_size, table_open_cache, table_definition_cache,\n\u0026 open_files_limit. why?\n\nalso, if you compare validation-rules.json to\nhttp://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html,\nit\u0027s clear that many variables were excluded. can you elaborate on the\ncriteria used to determine what was included/excluded?","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"9bb6810e1f94479a55ff22492e2c799b91451e57","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FKqE%3D","line":1,"in_reply_to":"AAAAUH%2F%2FhNw%3D","updated":"2014-01-20 22:09:18.000000000","message":"This was a partial list to show what we you could set as configurable. Some of the variables require some special cases and this was described in the wiki page https://wiki.openstack.org/wiki/Trove/Configurations/mysql-options \n\nIt will require some custom guest agent code to handle these unique scenarios.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"71cafa238a03a46811a58388f74ee67b3202527b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"    \"configuration-parameters\": ["},{"line_number":3,"context_line":"        {"},{"line_number":4,"context_line":"            \"name\": \"innodb_file_per_table\","},{"line_number":5,"context_line":"            \"dynamic\": false,"},{"line_number":6,"context_line":"            \"max\": 1,"},{"line_number":7,"context_line":"            \"min\": 0,"},{"line_number":8,"context_line":"            \"type\": \"boolean\""}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FhLc%3D","line":5,"updated":"2014-01-13 00:15:25.000000000","message":"the term \"dynamic\" is very mysql-centric. after reviewing multiple datastores, it seems \"restart_required\" is a better option, because it\u0027s extremely clear to the user and the provider what\u0027s at stake. note: if you use restart_required, this means you need to switch true to false and vice versa in this file.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"7724ad22a4e7cca11792767212c4c6d52aa02f4b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"            \"dynamic\": true,"},{"line_number":13,"context_line":"            \"max\": 1,"},{"line_number":14,"context_line":"            \"min\": 0,"},{"line_number":15,"context_line":"            \"type\": \"boolean\""},{"line_number":16,"context_line":"        },"},{"line_number":17,"context_line":"        {"},{"line_number":18,"context_line":"            \"name\": \"local_infile\","}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FhAU%3D","line":15,"updated":"2014-01-13 02:40:52.000000000","message":"There are some problems with configuration parameter datatypes.\n\n    $ trove configuration-list-parameters\n    +--------------------------------+---------+---------+----------------------+---------+\n    |              name              |   type  |   min   |         max          | dynamic |\n    +--------------------------------+---------+---------+----------------------+---------+\n    |           autocommit           | boolean |    0    |          1           |   True  |\n\n\n    $ trove configuration-create Test \u0027{\"autocommit\":0}\u0027\n    ERROR: Incorrect data type supplied as a value for key autocommit. Expected type of boolean.\n\n\nNote: 0/1 do not work, only true/false (must be lowercase) do:\n\n\n    $ trove configuration-create Test \u0027{\"autocommit\":false}\u0027\n    +----------------------+--------------------------------------+\n    |       Property       |                Value                 |\n    +----------------------+--------------------------------------+\n    | datastore_version_id | dedcc62f-abc9-474f-b579-6ad06f38ce95 |\n    |     description      |                 None                 |\n    |          id          | a93bc001-8f6c-4180-8e68-b7066d54fe73 |\n    |      instances       |                  []                  |\n    |         name         |                 Test                 |\n    |        values        |        {u\u0027autocommit\u0027: False}        |\n    +----------------------+--------------------------------------+\n\n\nNote: Printed as False vs. false (even though it was sent in as lowercase)\n\n\n    $ trove configuration-show a93bc001-8f6c-4180-8e68-b7066d54fe73\n    +----------------------+---------------------------------------------------------------------------+\n    |       Property       |                                   Value                                   |\n    +----------------------+---------------------------------------------------------------------------+\n    |         name         |                                   Test                                    |\n    |        values        |                           {u\u0027autocommit\u0027: False}                          |\n    +----------------------+---------------------------------------------------------------------------+\n\n\nNote: true/false was required inbound, yet 0/1 is set in overrides.cnf\n\n    stack@instance:~$ sudo cat /etc/mysql/conf.d/overrides.cnf \n    [mysqld]\n    autocommit \u003d 0\n\n\nNotes:\n\n\u003e MongoDB 2.0+ true/false work as expected, but in MongoDB \u003c2.0 they register as true if they appear in the configuration file, regardless of their value!\n\n\u003e Cassandra uses true/false vs. 0/1\n\n\u003e Riak uses true/false vs. 0/1\n\n\u003e Redis uses no/yes vs. true/false/0/1\n\n\u003e Postgres uses on/off vs. true/false/0/1\n\n\u003e For MySQL, you can often use 0/1 or true/false for the same variable without consequence, but I\u0027ve seen bugs with certain flags that require one over the other.\n\nArgument:\n\n\u003e To avoid confusion, the value provided should always be set as-is (no uppercase/lowercase/cap-case\u0027ing or implicit conversions), and the representation of the value should be the same.\n\nSteps Forward:\n\n\u003e Change boolean to be true/false (lowercase). min/max should not show 0 or 1 (it should be empty, like is seen for string)\n\n\u003e All cli pretty-print table output for configurations should keep the boolean values lowercase in the \u0027values\u0027 field.\n\n\u003e If a value absolutely needs to be set to 0/1 for MySQL, then represent it as an integer with min/max as 0/1 vs. as a boolean\n\n\u003e To support other datastores, add an \"enum\" type (see https://blueprints.launchpad.net/trove/+spec/configurations-enum-validation)\non/off, no/yes, and other boolean-esque types will be set as an \"enum\" type (to enforce strict typing and avoid type coercion/conversion)\nnote: this does not need to be done as a part of this patch-set.\n\n\u003e *Requires Discussion*\nShould configuration parameter-values all be returned as strings, or attempt to cast to boolean/number for JSON?\nExample: If a datastore requires True or TRUE vs true, the value must be returned as a string anyway.\nExample: If a datastore requires 1 vs true, should the value be returned as a number or a string?","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"7ae0d1149ec7047af6c8e0f3d7fee2ebfc7b77c7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"            \"dynamic\": true,"},{"line_number":13,"context_line":"            \"max\": 1,"},{"line_number":14,"context_line":"            \"min\": 0,"},{"line_number":15,"context_line":"            \"type\": \"boolean\""},{"line_number":16,"context_line":"        },"},{"line_number":17,"context_line":"        {"},{"line_number":18,"context_line":"            \"name\": \"local_infile\","}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2BtfY%3D","line":15,"in_reply_to":"AAAAUH%2F%2FhAU%3D","updated":"2014-01-22 22:37:58.000000000","message":"we had a discussion (see http://eavesdrop.openstack.org/irclogs/%23openstack-trove/%23openstack-trove.2014-01-13.log) that led to only supporting what the datastore supports and only the types they support. \n\nThis means that the change i need to make moving forward is to store the 0/1 value for booleans for now until we work on the enum bp.","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"5500b0b2583150477ecd85f5875ce991d0e4d504","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            \"type\": \"integer\""},{"line_number":121,"context_line":"        },"},{"line_number":122,"context_line":"        {"},{"line_number":123,"context_line":"            \"name\": \"connect_timeout\","},{"line_number":124,"context_line":"            \"dynamic\": true,"},{"line_number":125,"context_line":"            \"max\": 65535,"},{"line_number":126,"context_line":"            \"min\": 1,"}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FjuU%3D","line":123,"updated":"2014-01-11 07:26:15.000000000","message":"connect_timeout already exists on line 32, this should be removed (and a test should be added to check for duplicate names).","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"9bb6810e1f94479a55ff22492e2c799b91451e57","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            \"type\": \"integer\""},{"line_number":121,"context_line":"        },"},{"line_number":122,"context_line":"        {"},{"line_number":123,"context_line":"            \"name\": \"connect_timeout\","},{"line_number":124,"context_line":"            \"dynamic\": true,"},{"line_number":125,"context_line":"            \"max\": 65535,"},{"line_number":126,"context_line":"            \"min\": 1,"}],"source_content_type":"application/json","patch_set":18,"id":"AAAAUH%2F%2FKBc%3D","line":123,"in_reply_to":"AAAAUH%2F%2FjuU%3D","updated":"2014-01-20 22:09:18.000000000","message":"good point i added a test case for this. \n\n    # check for duplicate configuration parameters","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}],"trove/tests/api/configurations.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def _test_configuration_is_applied_to_instance(instance, configuration_id):"},{"line_number":70,"context_line":"    instance_test \u003d instance_info.dbaas.instances.get(instance.id)"},{"line_number":71,"context_line":"    assert_equal(configuration_id, instance_test.configuration[\u0027id\u0027])"},{"line_number":72,"context_line":"    testconfig_info \u003d instance_info.dbaas.configurations.get(configuration_id)"},{"line_number":73,"context_line":"    config_instance_ids \u003d [inst[\u0027id\u0027] for inst in testconfig_info.instances]"},{"line_number":74,"context_line":"    assert_true(instance_test.id in config_instance_ids)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7o%3D","line":71,"updated":"2013-10-31 14:45:06.000000000","message":"please use built-in functions for dict","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    host \u003d _get_address(instance.id)"},{"line_number":80,"context_line":"    for user in instance.users:"},{"line_number":81,"context_line":"        username \u003d user[\u0027name\u0027]"},{"line_number":82,"context_line":"        password \u003d user[\u0027password\u0027]"},{"line_number":83,"context_line":"        concat_variables \u003d \"\u0027,\u0027\".join(cfg_names)"},{"line_number":84,"context_line":"        query \u003d (\"show variables where Variable_name \""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7U%3D","line":81,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    host \u003d _get_address(instance.id)"},{"line_number":80,"context_line":"    for user in instance.users:"},{"line_number":81,"context_line":"        username \u003d user[\u0027name\u0027]"},{"line_number":82,"context_line":"        password \u003d user[\u0027password\u0027]"},{"line_number":83,"context_line":"        concat_variables \u003d \"\u0027,\u0027\".join(cfg_names)"},{"line_number":84,"context_line":"        query \u003d (\"show variables where Variable_name \""},{"line_number":85,"context_line":"                 \"in (\u0027%s\u0027);\" % concat_variables)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7Q%3D","line":82,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        expected_attrs \u003d [\"configuration-parameters\"]"},{"line_number":127,"context_line":"        instance_info.dbaas.configurations_parameters.parameters()"},{"line_number":128,"context_line":"        resp, body \u003d instance_info.dbaas.client.last_response"},{"line_number":129,"context_line":"        attrcheck \u003d AttrCheck()"},{"line_number":130,"context_line":"        config_parameters_dict \u003d json.loads(body)"},{"line_number":131,"context_line":"        attrcheck.attrs_exist(config_parameters_dict, expected_attrs,"},{"line_number":132,"context_line":"                              msg\u003d\"Configurations parameters\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7I%3D","line":129,"updated":"2013-10-31 14:45:06.000000000","message":"please could you use: with AttrCheck ...","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        expected_attrs \u003d [\"configuration-parameters\"]"},{"line_number":127,"context_line":"        instance_info.dbaas.configurations_parameters.parameters()"},{"line_number":128,"context_line":"        resp, body \u003d instance_info.dbaas.client.last_response"},{"line_number":129,"context_line":"        attrcheck \u003d AttrCheck()"},{"line_number":130,"context_line":"        config_parameters_dict \u003d json.loads(body)"},{"line_number":131,"context_line":"        attrcheck.attrs_exist(config_parameters_dict, expected_attrs,"},{"line_number":132,"context_line":"                              msg\u003d\"Configurations parameters\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FluQ%3D","line":129,"in_reply_to":"AAAATn%2F%2Fm7I%3D","updated":"2013-11-06 22:50:45.000000000","message":"This will just make the test method indented more. It doesnt really help.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        attrcheck.attrs_exist(config_parameters_dict, expected_attrs,"},{"line_number":132,"context_line":"                              msg\u003d\"Configurations parameters\")"},{"line_number":133,"context_line":"        # sanity check that a few options are in the list"},{"line_number":134,"context_line":"        config_params_list \u003d config_parameters_dict[\u0027configuration-parameters\u0027]"},{"line_number":135,"context_line":"        config_params_keys \u003d []"},{"line_number":136,"context_line":"        for param in config_params_list:"},{"line_number":137,"context_line":"            config_params_keys.append(param[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm7E%3D","line":134,"updated":"2013-10-31 14:45:06.000000000","message":"same here with built-in\u0027s","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        assert_equal(instance.configuration[\u0027name\u0027], configuration_info.name)"},{"line_number":270,"context_line":"        # expecting two things in links, href and bookmark"},{"line_number":271,"context_line":"        assert_equal(2, len(instance.configuration[\u0027links\u0027]))"},{"line_number":272,"context_line":"        link \u003d instance.configuration[\u0027links\u0027][0]"},{"line_number":273,"context_line":"        global configuration_href"},{"line_number":274,"context_line":"        configuration_href \u003d link[\u0027href\u0027]"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm6Y%3D","line":272,"updated":"2013-10-31 14:45:06.000000000","message":"same here with built-in\u0027s","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":287,"context_line":"            print(\"item_val: %s\" % item_val)"},{"line_number":288,"context_line":"            dbaas \u003d instance_info.dbaas"},{"line_number":289,"context_line":"            param \u003d dbaas.configurations_parameters.get_parameter(item_key)"},{"line_number":290,"context_line":"            if param.type \u003d\u003d \u0027integer\u0027:"},{"line_number":291,"context_line":"                assert_true(isinstance(item_val, int))"},{"line_number":292,"context_line":"            if param.type \u003d\u003d \u0027string\u0027:"},{"line_number":293,"context_line":"                assert_true(isinstance(item_val, basestring))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm6A%3D","line":290,"updated":"2013-10-31 14:45:06.000000000","message":"please use TypeCheck class for this","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":287,"context_line":"            print(\"item_val: %s\" % item_val)"},{"line_number":288,"context_line":"            dbaas \u003d instance_info.dbaas"},{"line_number":289,"context_line":"            param \u003d dbaas.configurations_parameters.get_parameter(item_key)"},{"line_number":290,"context_line":"            if param.type \u003d\u003d \u0027integer\u0027:"},{"line_number":291,"context_line":"                assert_true(isinstance(item_val, int))"},{"line_number":292,"context_line":"            if param.type \u003d\u003d \u0027string\u0027:"},{"line_number":293,"context_line":"                assert_true(isinstance(item_val, basestring))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Flv4%3D","line":290,"in_reply_to":"AAAATn%2F%2Fm6A%3D","updated":"2013-11-06 22:50:45.000000000","message":"thats a good idea","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":295,"context_line":"                assert_true(isinstance(item_val, bool))"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        conf_instances \u003d result.instances"},{"line_number":298,"context_line":"        assert_equal(conf_instances[0][\u0027id\u0027], instance_info.id)"},{"line_number":299,"context_line":"        assert_equal(conf_instances[0][\u0027name\u0027], instance_info.name)"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        # Test to make sure that another user is not able to GET this config"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm58%3D","line":298,"updated":"2013-10-31 14:45:06.000000000","message":"same here with built-in\u0027s","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        conf_instances \u003d result.instances"},{"line_number":298,"context_line":"        assert_equal(conf_instances[0][\u0027id\u0027], instance_info.id)"},{"line_number":299,"context_line":"        assert_equal(conf_instances[0][\u0027name\u0027], instance_info.name)"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        # Test to make sure that another user is not able to GET this config"},{"line_number":302,"context_line":"        reqs \u003d Requirements(is_admin\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm54%3D","line":299,"updated":"2013-10-31 14:45:06.000000000","message":"same here with built-in\u0027s","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            raise SkipTest(\"Skipping instance start with configuration \""},{"line_number":394,"context_line":"                           \"test for fake mode.\")"},{"line_number":395,"context_line":"        global configuration_instance"},{"line_number":396,"context_line":"        databases \u003d []"},{"line_number":397,"context_line":"        databases.append({\"name\": \"firstdbconfig\", \"character_set\": \"latin2\","},{"line_number":398,"context_line":"                          \"collate\": \"latin2_general_ci\"})"},{"line_number":399,"context_line":"        databases.append({\"name\": \"db2\"})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm5c%3D","line":396,"updated":"2013-10-31 14:45:06.000000000","message":"Could you please write it according py-code style.\n\n        databases \u003d {\"name\": \"firstdbconfig\", \"character_set\": \"latin2\",\n\t\t\t    \"collate\": \"latin2_general_ci\"}","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"4f577cb01b2c5a5d07268a900948127c8f730eab","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            raise SkipTest(\"Skipping instance start with configuration \""},{"line_number":394,"context_line":"                           \"test for fake mode.\")"},{"line_number":395,"context_line":"        global configuration_instance"},{"line_number":396,"context_line":"        databases \u003d []"},{"line_number":397,"context_line":"        databases.append({\"name\": \"firstdbconfig\", \"character_set\": \"latin2\","},{"line_number":398,"context_line":"                          \"collate\": \"latin2_general_ci\"})"},{"line_number":399,"context_line":"        databases.append({\"name\": \"db2\"})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Flt0%3D","line":396,"in_reply_to":"AAAATn%2F%2Fm5c%3D","updated":"2013-11-06 22:50:45.000000000","message":"I dont think you understand that this is an array of databases.\nLook at the main instance create for a reference.","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        databases \u003d []"},{"line_number":397,"context_line":"        databases.append({\"name\": \"firstdbconfig\", \"character_set\": \"latin2\","},{"line_number":398,"context_line":"                          \"collate\": \"latin2_general_ci\"})"},{"line_number":399,"context_line":"        databases.append({\"name\": \"db2\"})"},{"line_number":400,"context_line":"        configuration_instance.databases \u003d databases"},{"line_number":401,"context_line":"        users \u003d []"},{"line_number":402,"context_line":"        users.append({\"name\": \"liteconf\", \"password\": \"liteconfpass\","}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm5U%3D","line":399,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":398,"context_line":"                          \"collate\": \"latin2_general_ci\"})"},{"line_number":399,"context_line":"        databases.append({\"name\": \"db2\"})"},{"line_number":400,"context_line":"        configuration_instance.databases \u003d databases"},{"line_number":401,"context_line":"        users \u003d []"},{"line_number":402,"context_line":"        users.append({\"name\": \"liteconf\", \"password\": \"liteconfpass\","},{"line_number":403,"context_line":"                      \"databases\": [{\"name\": \"firstdbconfig\"}]})"},{"line_number":404,"context_line":"        configuration_instance.users \u003d users"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm5Q%3D","line":401,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d5998da2af540461a31352b1d92d2163223e374e","unresolved":false,"context_lines":[{"line_number":399,"context_line":"        databases.append({\"name\": \"db2\"})"},{"line_number":400,"context_line":"        configuration_instance.databases \u003d databases"},{"line_number":401,"context_line":"        users \u003d []"},{"line_number":402,"context_line":"        users.append({\"name\": \"liteconf\", \"password\": \"liteconfpass\","},{"line_number":403,"context_line":"                      \"databases\": [{\"name\": \"firstdbconfig\"}]})"},{"line_number":404,"context_line":"        configuration_instance.users \u003d users"},{"line_number":405,"context_line":"        configuration_instance.name \u003d \"TEST_\" + str(datetime.now()) + \"_config\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Fm5M%3D","line":402,"updated":"2013-10-31 14:45:06.000000000","message":"same","commit_id":"6036e72508cfbca7486492d99b7eb2075b5a1daa"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Copyright 2013 Rackspace Hosting"},{"line_number":4,"context_line":"#    All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ynY%3D","line":1,"updated":"2013-12-05 21:39:39.000000000","message":"please, remove vim line","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"}],"trove/tests/api/instances.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                check.guest_status()"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    @test"},{"line_number":471,"context_line":"    def test_create_failure_with_datastore_default_notfound(self):"},{"line_number":472,"context_line":"        if not FAKE:"},{"line_number":473,"context_line":"            raise SkipTest(\"This test only for fake mode.\")"},{"line_number":474,"context_line":"        if VOLUME_SUPPORT:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9ynM%3D","side":"PARENT","line":471,"updated":"2013-12-05 21:39:39.000000000","message":"any reasons to remove this test ?","commit_id":"2daad86fa934f3b76df1ec8be44dcbab86550d83"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"ed27cf929fd591bec4c4dcdecba9b5e80bd361e5","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                check.guest_status()"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    @test"},{"line_number":471,"context_line":"    def test_create_failure_with_datastore_default_notfound(self):"},{"line_number":472,"context_line":"        if not FAKE:"},{"line_number":473,"context_line":"            raise SkipTest(\"This test only for fake mode.\")"},{"line_number":474,"context_line":"        if VOLUME_SUPPORT:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yIY%3D","side":"PARENT","line":471,"in_reply_to":"AAAATn%2F9ynM%3D","updated":"2013-12-06 22:28:31.000000000","message":"yes. Because it does not work and does not belong here.\n\nI moved this test to the unit tests because its modifying the CONF in line and you should not do this in the integration tests.","commit_id":"2daad86fa934f3b76df1ec8be44dcbab86550d83"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"0f9b39843785cb677dd30d946b23b2d1522fea32","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            assert_equal(e.message,"},{"line_number":490,"context_line":"                         \"Please specify datastore.\")"},{"line_number":491,"context_line":"        datastore_models.CONF.default_datastore \u003d \\"},{"line_number":492,"context_line":"            origin_default_datastore"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    @test"},{"line_number":495,"context_line":"    def test_create_failure_with_datastore_default_version_notfound(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fkow%3D","side":"PARENT","line":492,"updated":"2014-01-10 21:53:53.000000000","message":"any reasons for dropping this test ?","commit_id":"17d9bd5fbe5619609a1d3443d24e2431e809dc79"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"b8a13068b07e58a2075fd517b36e8306a6c0f9bf","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            assert_equal(e.message,"},{"line_number":490,"context_line":"                         \"Please specify datastore.\")"},{"line_number":491,"context_line":"        datastore_models.CONF.default_datastore \u003d \\"},{"line_number":492,"context_line":"            origin_default_datastore"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    @test"},{"line_number":495,"context_line":"    def test_create_failure_with_datastore_default_version_notfound(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fc1Y%3D","side":"PARENT","line":492,"in_reply_to":"AAAAUH%2F%2Fkow%3D","updated":"2014-01-13 18:56:51.000000000","message":"yes because it does not belong here but rather in the unit tests because its modifying the configuration and can have adverse affects if it fails to following tests. \n\nI think there is another review out there that move this as well.","commit_id":"17d9bd5fbe5619609a1d3443d24e2431e809dc79"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"61e05f9b2548536c573623400e04d7f48be5206f","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                check.flavor()"},{"line_number":479,"context_line":"                check.datastore()"},{"line_number":480,"context_line":"                check.guest_status()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    @test"},{"line_number":483,"context_line":"    def test_create_failure_with_datastore_default_version_notfound(self):"},{"line_number":484,"context_line":"        if VOLUME_SUPPORT:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9mGU%3D","line":481,"updated":"2014-02-05 19:28:15.000000000","message":"Can you restore this test? The unit test you added comes close but this test is also testing that the REST api behaves as expected when this config value changes.\n\nI think the issue is that this is really a unit test that is taking advantage of all the stuff set up for Fake Mode run via Tox. It shouldn\u0027t be in the groups we try to run in the VM, but put in it\u0027s own class which isn\u0027t part of any groups at all. This way we wouldn\u0027t have to work around it when we ran the \"blackbox\" group.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"99fcb932ee60238763414c9baef3efe64e94311d","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                check.flavor()"},{"line_number":479,"context_line":"                check.datastore()"},{"line_number":480,"context_line":"                check.guest_status()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    @test"},{"line_number":483,"context_line":"    def test_create_failure_with_datastore_default_version_notfound(self):"},{"line_number":484,"context_line":"        if VOLUME_SUPPORT:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F9lbs%3D","line":481,"in_reply_to":"AAAAUH%2F9mGU%3D","updated":"2014-02-06 03:32:09.000000000","message":"alright after talking with you i understand the point of this test but i still do not agree that we are changing the CONF.default_datastore value in the test and restoring it. But we can make this better later.","commit_id":"c8778533b347d705c0ffc7ea439ddd0d0b46d120"}],"trove/tests/fakes/guestagent.py":[{"author":{"_account_id":4954,"name":"Paul Marshall","email":"paul.marshall@rackspace.com","username":"paulvmarshall"},"change_message_id":"e74de5d5aa79cda8e0c80463b9887591ecb2b894","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            backup.save()"},{"line_number":309,"context_line":"        eventlet.spawn_after(1.0, finish_create_backup)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_overrides(self, overrides):"},{"line_number":312,"context_line":"        self.overrides \u003d overrides"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2F0j4%3D","line":311,"updated":"2013-10-28 14:02:18.000000000","message":"Shouldn\u0027t this have a remove parameter? And maybe some simple fake mode remove configuration test(s)?","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"},{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"52c915ebd9e5fef132715266773bce4489fc2c45","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            backup.save()"},{"line_number":309,"context_line":"        eventlet.spawn_after(1.0, finish_create_backup)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_overrides(self, overrides):"},{"line_number":312,"context_line":"        self.overrides \u003d overrides"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Foq8%3D","line":311,"in_reply_to":"AAAATn%2F%2F0j4%3D","updated":"2013-10-31 05:03:32.000000000","message":"yeah it will need them for the tests","commit_id":"0fa4d2269ccceb105797de169bc036771b129d31"}],"trove/tests/unittests/configuration/__init__.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"df5752a5f03f1953db132441bbd3af1c45c1f922","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 Rackspace"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9yms%3D","line":1,"updated":"2013-12-05 21:39:39.000000000","message":"Please keep __init__.py clean (if there\u0027s no logic in it)","commit_id":"3d35b5a74641f6bc73d35a830320bc29c7d03fd1"}],"trove/tests/unittests/configuration/test_configuration_controller.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        validator \u003d jsonschema.Draft4Validator(schema)"},{"line_number":70,"context_line":"        self.assertFalse(validator.is_valid(body))"},{"line_number":71,"context_line":"        errors \u003d sorted(validator.iter_errors(body), key\u003dlambda e: e.path)"},{"line_number":72,"context_line":"        self.assertThat(errors[0].message,"},{"line_number":73,"context_line":"                        Equals(\"\u0027\u0027 is not of type \u0027object\u0027\"))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_validate_create_invalid_name_param(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2BQ%3D","line":72,"updated":"2014-01-13 12:49:18.000000000","message":"self.assertEquals","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d4426053213b7252481edad5e179ea13a30f41be","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        validator \u003d jsonschema.Draft4Validator(schema)"},{"line_number":89,"context_line":"        self.assertFalse(validator.is_valid(body))"},{"line_number":90,"context_line":"        errors \u003d sorted(validator.iter_errors(body), key\u003dlambda e: e.path)"},{"line_number":91,"context_line":"        self.assertThat(errors[0].message,"},{"line_number":92,"context_line":"                        Equals(\"\u0027\u0027 is too short\"))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def test_validate_edit_configuration(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2Fe%2BM%3D","line":91,"updated":"2014-01-13 12:49:18.000000000","message":"self.assertEquals","commit_id":"cfc58ec9e24d09ad0209c494049b2394acc8ad34"}]}
