)]}'
{"bin/trove-guestagent":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_engine)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager not found for datastore engine \" +"},{"line_number":59,"context_line":"                   CONF.datastore_engine)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FfL4%3D","line":56,"updated":"2013-11-04 22:37:57.000000000","message":"1) CONF.datastore_engine doesn\u0027t have a sample value in the conf, only in cfg.py.\n\n2) From your doc patch-set @ https://review.openstack.org/#/c/54921/1/doc/source/dev/datastores.rst: \"Datastore is mapped to \u0027datastore_engine\u0027, this is manager class which provides support of this database.\u0027 This is fairly confusing because the previous implementation found a manager for the specified service-type, but this one is stuck with a hardcoded one? cfg.py has \"mysql\" as the default, with no help text, leaving the user to guess as to how to have multiple managers for different service-types.\n\n3) I\u0027m not a fan of introducing the word \"engine\" here. The term \"engine\" has a very specific datastore-centric meaning, which we purposefully avoided with the use of \"datastore\". Why not datastore_manager?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_engine)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager not found for datastore engine \" +"},{"line_number":59,"context_line":"                   CONF.datastore_engine)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FR7I%3D","line":56,"in_reply_to":"AAAATn%2F%2FbYk%3D","updated":"2013-11-11 20:53:52.000000000","message":"Your rebuttal for (2) doesn\u0027t address my concern(s).","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_engine)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager not found for datastore engine \" +"},{"line_number":59,"context_line":"                   CONF.datastore_engine)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FbYk%3D","line":56,"in_reply_to":"AAAATn%2F%2FfL4%3D","updated":"2013-11-06 12:17:04.000000000","message":"1. this parameter setting up by taskmanager, user dont need to configure it\n2. again, this parameter needs only for GA to load specified manager.\n3. good point, we discussed it before, one more variant was datastore_module","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    try:"},{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_engine)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager not found for datastore engine \" +"},{"line_number":59,"context_line":"                   CONF.datastore_engine)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FfD0%3D","line":56,"in_reply_to":"AAAATn%2F%2FfL4%3D","updated":"2013-11-04 22:56:25.000000000","message":"Hm, very good point.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_manager)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager class not found for datastore manager \" +"},{"line_number":59,"context_line":"                   CONF.datastore_manager)"},{"line_number":60,"context_line":"            raise RuntimeError(msg)"},{"line_number":61,"context_line":"        server \u003d rpc_service.RpcService(manager\u003dmanager, host\u003dCONF.guest_id)"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAATn%2F%2FAjs%3D","line":58,"updated":"2013-11-15 21:11:41.000000000","message":"change to \"Manager class not registered for datastore manager \"","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        get_db_api().configure_db(CONF)"},{"line_number":56,"context_line":"        manager \u003d dbaas.datastore_registry().get(CONF.datastore_manager)"},{"line_number":57,"context_line":"        if not manager:"},{"line_number":58,"context_line":"            msg \u003d (\"Manager class not found for datastore manager \" +"},{"line_number":59,"context_line":"                   CONF.datastore_manager)"},{"line_number":60,"context_line":"            raise RuntimeError(msg)"},{"line_number":61,"context_line":"        server \u003d rpc_service.RpcService(manager\u003dmanager, host\u003dCONF.guest_id)"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAATn%2F%2B%2F%2Fo%3D","line":58,"in_reply_to":"AAAATn%2F%2FAjs%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"}],"bin/trove-manage":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        datastore_type_models.update_datastore_type(type_name, type_engine,"},{"line_number":76,"context_line":"                                                    type_image_id,"},{"line_number":77,"context_line":"                                                    type_default_version)"},{"line_number":78,"context_line":"        print \"Datastore type %s updated.\" % type_name"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def datastore_version_update(self, version_type, version_name,"},{"line_number":81,"context_line":"                                 version_image_id, version_packages,"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAATX%2F%2F9yI%3D","line":78,"updated":"2013-10-23 16:54:59.000000000","message":"Since Python 3 compatibility is getting hotter everyday we should probably start using the print function.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        datastore_type_models.update_datastore_type(type_name, type_engine,"},{"line_number":76,"context_line":"                                                    type_image_id,"},{"line_number":77,"context_line":"                                                    type_default_version)"},{"line_number":78,"context_line":"        print \"Datastore type %s updated.\" % type_name"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def datastore_version_update(self, version_type, version_name,"},{"line_number":81,"context_line":"                                 version_image_id, version_packages,"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAATX%2F%2F9WY%3D","line":78,"in_reply_to":"AAAATX%2F%2F9yI%3D","updated":"2013-10-23 17:04:07.000000000","message":"Done","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def actions(subparser):"},{"line_number":108,"context_line":"        parser \u003d subparser.add_parser(\u0027db_sync\u0027)"},{"line_number":109,"context_line":"        parser.add_argument(\u0027--repo_path\u0027)"},{"line_number":110,"context_line":"        parser \u003d subparser.add_parser(\u0027db_upgrade\u0027)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FfLM%3D","line":107,"updated":"2013-11-04 22:37:57.000000000","message":"This might be the time to introduce named parameters (e.g. --packages). Forcing the user to get 5+ parameters in the correct order is asking a bit much.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def actions(subparser):"},{"line_number":108,"context_line":"        parser \u003d subparser.add_parser(\u0027db_sync\u0027)"},{"line_number":109,"context_line":"        parser.add_argument(\u0027--repo_path\u0027)"},{"line_number":110,"context_line":"        parser \u003d subparser.add_parser(\u0027db_upgrade\u0027)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FfDw%3D","line":107,"in_reply_to":"AAAATn%2F%2FfLM%3D","updated":"2013-11-04 22:56:25.000000000","message":"hm, should we discuss it in IRC ?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def actions(subparser):"},{"line_number":108,"context_line":"        parser \u003d subparser.add_parser(\u0027db_sync\u0027)"},{"line_number":109,"context_line":"        parser.add_argument(\u0027--repo_path\u0027)"},{"line_number":110,"context_line":"        parser \u003d subparser.add_parser(\u0027db_upgrade\u0027)"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FeX0%3D","line":107,"in_reply_to":"AAAATn%2F%2FfLM%3D","updated":"2013-11-06 12:17:04.000000000","message":"i thought about subcommands\nsame should be for \"db\"","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"99bd5b59b7d9567fe1cacb77423df4409a2aaf11","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        parser \u003d subparser.add_parser(\u0027db_downgrade\u0027)"},{"line_number":109,"context_line":"        parser.add_argument(\u0027version\u0027)"},{"line_number":110,"context_line":"        parser.add_argument(\u0027--repo_path\u0027)"},{"line_number":111,"context_line":"        parser \u003d subparser.add_parser(\u0027image_update\u0027)"},{"line_number":112,"context_line":"        parser.add_argument(\u0027service_name\u0027)"},{"line_number":113,"context_line":"        parser.add_argument(\u0027image_id\u0027)"},{"line_number":114,"context_line":"        parser \u003d subparser.add_parser(\u0027db_wipe\u0027)"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAATn%2F%2B3oA%3D","side":"PARENT","line":111,"updated":"2013-11-19 06:16:55.000000000","message":"It seems that the reddwarf gate is failing due to the rename of this to datastore_update.  During setup, we register the image ID to associate with a service_type currently, this logic needs to be updated in redstack first before this will cleanly pass.","commit_id":"12f2b0d47c6183a8988774b0002f8c070906455b"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"f59496ec18afd65481dd3abf4f7e7be984981470","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        parser \u003d subparser.add_parser(\u0027db_downgrade\u0027)"},{"line_number":109,"context_line":"        parser.add_argument(\u0027version\u0027)"},{"line_number":110,"context_line":"        parser.add_argument(\u0027--repo_path\u0027)"},{"line_number":111,"context_line":"        parser \u003d subparser.add_parser(\u0027image_update\u0027)"},{"line_number":112,"context_line":"        parser.add_argument(\u0027service_name\u0027)"},{"line_number":113,"context_line":"        parser.add_argument(\u0027image_id\u0027)"},{"line_number":114,"context_line":"        parser \u003d subparser.add_parser(\u0027db_wipe\u0027)"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAATn%2F%2B2sI%3D","side":"PARENT","line":111,"in_reply_to":"AAAATn%2F%2B3oA%3D","updated":"2013-11-19 10:31:15.000000000","message":"here is separate review for -integration\n\nhttps://review.openstack.org/#/c/56647/","commit_id":"12f2b0d47c6183a8988774b0002f8c070906455b"}],"etc/trove/trove.conf.test":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"http_delete_rate \u003d 200"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"# default datastore"},{"line_number":95,"context_line":"default_datastore \u003d a00000a0-00a0-0a00-00a0-000a000000aa"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"# Auth"},{"line_number":98,"context_line":"admin_roles \u003d admin"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FfLE%3D","line":95,"updated":"2013-11-04 22:37:57.000000000","message":"Why can\u0027t the default_datastore here refer to the name vs. the UUID? Reason being is that for a DevStack situation, you\u0027ll likely want \u0027default_datastore \u003d mysql\u0027.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":92,"context_line":"http_delete_rate \u003d 200"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"# default datastore"},{"line_number":95,"context_line":"default_datastore \u003d a00000a0-00a0-0a00-00a0-000a000000aa"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"# Auth"},{"line_number":98,"context_line":"admin_roles \u003d admin"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FR7A%3D","line":95,"in_reply_to":"AAAATn%2F%2FeXY%3D","updated":"2013-11-11 20:53:52.000000000","message":"Ah, this is trove.conf.test, not trove.conf.sample, my mistake.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":92,"context_line":"http_delete_rate \u003d 200"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"# default datastore"},{"line_number":95,"context_line":"default_datastore \u003d a00000a0-00a0-0a00-00a0-000a000000aa"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"# Auth"},{"line_number":98,"context_line":"admin_roles \u003d admin"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAATn%2F%2FeXY%3D","line":95,"in_reply_to":"AAAATn%2F%2FfLE%3D","updated":"2013-11-06 12:17:04.000000000","message":"you can specify name in config, here specified ID coz tests asserts ID","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"run_tests.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    db_api.db_sync(CONF)"},{"line_number":62,"context_line":"    session.configure_db(CONF)"},{"line_number":63,"context_line":"    # Adds the datastore for mysql (needed to make most calls work)."},{"line_number":64,"context_line":"    models.DBDatastore.create(id\u003dCONFIG.dbaas_datastore,"},{"line_number":65,"context_line":"                              name\u003d\u0027Test Mysql\u0027, manager\u003d\u0027mysql\u0027,"},{"line_number":66,"context_line":"                              default_version_id\u003d"},{"line_number":67,"context_line":"                              CONFIG.dbaas_datastore_version)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FEVM%3D","line":64,"updated":"2013-11-14 22:22:46.000000000","message":"Can u break these out into a separate method?","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"}],"trove/common/api.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        mapper.connect(\"/\", controller\u003dversions_resource, action\u003d\"show\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _datastore_router(self, mapper):"},{"line_number":43,"context_line":"        datastore_resource \u003d DatastoreController().create_resource()"},{"line_number":44,"context_line":"        mapper.resource(\"datastore\", \"/{tenant_id}/datastores\","},{"line_number":45,"context_line":"                        controller\u003ddatastore_resource)"},{"line_number":46,"context_line":"        mapper.connect(\"/{tenant_id}/datastores/{datastore}/versions\","}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAjI%3D","line":43,"updated":"2013-11-15 21:11:41.000000000","message":"shouldn\u0027t there be /{tenant_id}/datastores/{id} as well?\n\nhttps://review.openstack.org/#/c/47934/11/trove/datastore/service.py has \u0027 def show(...) \u0027, which seems to indicate \"yes\".","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"32b8aa9edf6bfb4b7d9355abef9c228b799dccc0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        mapper.connect(\"/\", controller\u003dversions_resource, action\u003d\"show\")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _datastore_router(self, mapper):"},{"line_number":43,"context_line":"        datastore_resource \u003d DatastoreController().create_resource()"},{"line_number":44,"context_line":"        mapper.resource(\"datastore\", \"/{tenant_id}/datastores\","},{"line_number":45,"context_line":"                        controller\u003ddatastore_resource)"},{"line_number":46,"context_line":"        mapper.connect(\"/{tenant_id}/datastores/{datastore}/versions\","}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FACM%3D","line":43,"in_reply_to":"AAAATn%2F%2FAjI%3D","updated":"2013-11-15 22:11:22.000000000","message":"show/index are defaulted for datastores, ignore.","commit_id":"5df61800394be238c189749515716810a810d0ec"}],"trove/common/apischema.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        \"properties\": {"},{"line_number":175,"context_line":"            \"instance\": {"},{"line_number":176,"context_line":"                \"type\": \"object\","},{"line_number":177,"context_line":"                \"required\": [\"name\", \"flavorRef\", \"service_type_id\","},{"line_number":178,"context_line":"                             \"volume\" if CONF.trove_volume_support else None],"},{"line_number":179,"context_line":"                \"additionalProperties\": True,"},{"line_number":180,"context_line":"                \"properties\": {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FTBk%3D","line":177,"updated":"2013-09-30 22:02:33.000000000","message":"API change. \n\n10:00 AM hub_cap instead, it should be optional, and you should be able to specify a default_service_type in teh config","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        \"properties\": {"},{"line_number":175,"context_line":"            \"instance\": {"},{"line_number":176,"context_line":"                \"type\": \"object\","},{"line_number":177,"context_line":"                \"required\": [\"name\", \"flavorRef\", \"service_type_id\","},{"line_number":178,"context_line":"                             \"volume\" if CONF.trove_volume_support else None],"},{"line_number":179,"context_line":"                \"additionalProperties\": True,"},{"line_number":180,"context_line":"                \"properties\": {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRPM%3D","line":177,"in_reply_to":"AAAAS3%2F%2FTBk%3D","updated":"2013-10-01 07:18:29.000000000","message":"Done","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                        \"additionalProperties\": True,"},{"line_number":198,"context_line":"                        \"properties\": {"},{"line_number":199,"context_line":"                            \"type\": non_empty_string,"},{"line_number":200,"context_line":"                            \"version\": non_empty_string"},{"line_number":201,"context_line":"                        }"},{"line_number":202,"context_line":"                    }"},{"line_number":203,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfLA%3D","line":200,"updated":"2013-11-04 22:37:57.000000000","message":"Per the agreed upon design, \"version\" should be an optional property.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"834320953f6dce88cf2bb82d8182de6d5dad7fa5","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                        \"additionalProperties\": True,"},{"line_number":198,"context_line":"                        \"properties\": {"},{"line_number":199,"context_line":"                            \"type\": non_empty_string,"},{"line_number":200,"context_line":"                            \"version\": non_empty_string"},{"line_number":201,"context_line":"                        }"},{"line_number":202,"context_line":"                    }"},{"line_number":203,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FPpE%3D","line":200,"in_reply_to":"AAAATn%2F%2FR68%3D","updated":"2013-11-13 11:43:16.000000000","message":"if we see filed \"version\" then we need to validate it. same as \"type\"","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                        \"additionalProperties\": True,"},{"line_number":198,"context_line":"                        \"properties\": {"},{"line_number":199,"context_line":"                            \"type\": non_empty_string,"},{"line_number":200,"context_line":"                            \"version\": non_empty_string"},{"line_number":201,"context_line":"                        }"},{"line_number":202,"context_line":"                    }"},{"line_number":203,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FR68%3D","line":200,"in_reply_to":"AAAATn%2F%2FeXM%3D","updated":"2013-11-11 20:53:52.000000000","message":"Then why do we see non_empty_string for version here?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                        \"additionalProperties\": True,"},{"line_number":198,"context_line":"                        \"properties\": {"},{"line_number":199,"context_line":"                            \"type\": non_empty_string,"},{"line_number":200,"context_line":"                            \"version\": non_empty_string"},{"line_number":201,"context_line":"                        }"},{"line_number":202,"context_line":"                    }"},{"line_number":203,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfD4%3D","line":200,"in_reply_to":"AAAATn%2F%2FfLA%3D","updated":"2013-11-04 22:56:25.000000000","message":"Agreed","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                        \"additionalProperties\": True,"},{"line_number":198,"context_line":"                        \"properties\": {"},{"line_number":199,"context_line":"                            \"type\": non_empty_string,"},{"line_number":200,"context_line":"                            \"version\": non_empty_string"},{"line_number":201,"context_line":"                        }"},{"line_number":202,"context_line":"                    }"},{"line_number":203,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FeXM%3D","line":200,"in_reply_to":"AAAATn%2F%2FfLA%3D","updated":"2013-11-06 12:17:04.000000000","message":"type and version and datastore are optional properties","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"trove/common/cfg.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027),"},{"line_number":113,"context_line":"    cfg.StrOpt(\u0027datastore_engine\u0027, default\u003d\u0027mysql\u0027),"},{"line_number":114,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"},{"line_number":115,"context_line":"    cfg.IntOpt(\u0027server_delete_time_out\u0027, default\u003d60),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfK8%3D","line":112,"updated":"2013-11-04 22:37:57.000000000","message":"Agreed, default_datastore and datastore_engine should have help text. Can you explain why you don\u0027t want to default default_datastore, yet you want to do so for datastore_engine?\n\nAlso, it\u0027s not very clear the relationship between default_datastore + datastore_engine + datastore_registry_ext (from your datastores.rst patch-set or this one).","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027),"},{"line_number":113,"context_line":"    cfg.StrOpt(\u0027datastore_engine\u0027, default\u003d\u0027mysql\u0027),"},{"line_number":114,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"},{"line_number":115,"context_line":"    cfg.IntOpt(\u0027server_delete_time_out\u0027, default\u003d60),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjeA%3D","line":112,"updated":"2013-11-01 15:02:26.000000000","message":"It would be nice not to use empty default value, and please provide help description","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027),"},{"line_number":113,"context_line":"    cfg.StrOpt(\u0027datastore_engine\u0027, default\u003d\u0027mysql\u0027),"},{"line_number":114,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"},{"line_number":115,"context_line":"    cfg.IntOpt(\u0027server_delete_time_out\u0027, default\u003d60),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FR6s%3D","line":112,"in_reply_to":"AAAATn%2F%2FbYc%3D","updated":"2013-11-11 20:53:52.000000000","message":"Whether the user configures it directly or not, the option should be clearly explained and defined.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027),"},{"line_number":113,"context_line":"    cfg.StrOpt(\u0027datastore_engine\u0027, default\u003d\u0027mysql\u0027),"},{"line_number":114,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"},{"line_number":115,"context_line":"    cfg.IntOpt(\u0027server_delete_time_out\u0027, default\u003d60),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfDk%3D","line":112,"in_reply_to":"AAAATn%2F%2FfK8%3D","updated":"2013-11-04 22:56:25.000000000","message":"Thanks for support","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027),"},{"line_number":113,"context_line":"    cfg.StrOpt(\u0027datastore_engine\u0027, default\u003d\u0027mysql\u0027),"},{"line_number":114,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"},{"line_number":115,"context_line":"    cfg.IntOpt(\u0027server_delete_time_out\u0027, default\u003d60),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbYc%3D","line":112,"in_reply_to":"AAAATn%2F%2FfK8%3D","updated":"2013-11-06 12:17:04.000000000","message":"user dont need to configure datastore_engine, it will overwrites by taskmanager\nand default_datastore will overwrites by operator\ni not sure is any sense to set default \u0027Mysql\u0027 or something like this","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027,"},{"line_number":113,"context_line":"               help\u003d\"default datastore id or name, this will used when user \""},{"line_number":114,"context_line":"               \"didn\u0027t specified certain datastore\"),"},{"line_number":115,"context_line":"    cfg.StrOpt(\u0027datastore_manager\u0027, default\u003d\u0027mysql\u0027,"},{"line_number":116,"context_line":"               help\u003d\u0027manager class in guestagent, setup by taskmanager on \u0027"},{"line_number":117,"context_line":"               \u0027instance provision\u0027),"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FEU4%3D","line":114,"updated":"2013-11-14 22:22:46.000000000","message":"\"default datastore id or name, this is used if the user doesn\u0027t specify a default datastore\"","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027,"},{"line_number":113,"context_line":"               help\u003d\"default datastore id or name, this is used if the user \""},{"line_number":114,"context_line":"               \"doesn\u0027t specify a datastore\"),"},{"line_number":115,"context_line":"    cfg.StrOpt(\u0027datastore_manager\u0027, default\u003d\u0027mysql\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAhc%3D","line":112,"updated":"2013-11-15 21:11:41.000000000","message":"this should be None vs. empty-string.\n\nalso change help to \"The default datastore id or name to use if one is not provided by the user. If the default value is None, the field becomes required in the instance-create request.\"","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    cfg.BoolOpt(\u0027use_heat\u0027, default\u003dFalse),"},{"line_number":110,"context_line":"    cfg.StrOpt(\u0027device_path\u0027, default\u003d\u0027/dev/vdb\u0027),"},{"line_number":111,"context_line":"    cfg.StrOpt(\u0027mount_point\u0027, default\u003d\u0027/var/lib/mysql\u0027),"},{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027,"},{"line_number":113,"context_line":"               help\u003d\"default datastore id or name, this is used if the user \""},{"line_number":114,"context_line":"               \"doesn\u0027t specify a datastore\"),"},{"line_number":115,"context_line":"    cfg.StrOpt(\u0027datastore_manager\u0027, default\u003d\u0027mysql\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2Fc%3D","line":112,"in_reply_to":"AAAATn%2F%2FAhc%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027,"},{"line_number":113,"context_line":"               help\u003d\"default datastore id or name, this is used if the user \""},{"line_number":114,"context_line":"               \"doesn\u0027t specify a datastore\"),"},{"line_number":115,"context_line":"    cfg.StrOpt(\u0027datastore_manager\u0027, default\u003d\u0027mysql\u0027,"},{"line_number":116,"context_line":"               help\u003d\u0027manager class in guestagent, setup by taskmanager on \u0027"},{"line_number":117,"context_line":"               \u0027instance provision\u0027),"},{"line_number":118,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAfQ%3D","line":115,"updated":"2013-11-15 21:11:41.000000000","message":"if service_type is being ripped out, then backwards compatibility is not a concern, which brings me to my question: why is there a need to default the manager class? the default_datastore should automatically map to a proper datastore_manager, and if the user provides a datastore name/id that\u0027s invalid then the request is failed, so why is this defaulting necessary?","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    cfg.StrOpt(\u0027default_datastore\u0027, default\u003d\u0027\u0027,"},{"line_number":113,"context_line":"               help\u003d\"default datastore id or name, this is used if the user \""},{"line_number":114,"context_line":"               \"doesn\u0027t specify a datastore\"),"},{"line_number":115,"context_line":"    cfg.StrOpt(\u0027datastore_manager\u0027, default\u003d\u0027mysql\u0027,"},{"line_number":116,"context_line":"               help\u003d\u0027manager class in guestagent, setup by taskmanager on \u0027"},{"line_number":117,"context_line":"               \u0027instance provision\u0027),"},{"line_number":118,"context_line":"    cfg.StrOpt(\u0027block_device_mapping\u0027, default\u003d\u0027vdb\u0027),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2FY%3D","line":115,"in_reply_to":"AAAATn%2F%2FAfQ%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"}],"trove/common/exception.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    message \u003d _(\"Datastore version \u0027%(version)s\u0027 is not active.\")"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"class OverLimit(TroveError):"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    internal_message \u003d _(\"The server rejected the request due to its size or \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9xM%3D","line":128,"updated":"2013-10-23 16:54:59.000000000","message":"Nice!","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"}],"trove/common/template.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":67,"context_line":"  Flavor: {Type: String}"},{"line_number":68,"context_line":"  VolumeSize: {Type: Number}"},{"line_number":69,"context_line":"  ImageId: {Type: String}"},{"line_number":70,"context_line":"  DatastoreEngine: {Type: String}"},{"line_number":71,"context_line":"  InstanceId: {Type: String}"},{"line_number":72,"context_line":"  AvailabilityZone : {Type: String}"},{"line_number":73,"context_line":"Resources:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FETM%3D","line":70,"updated":"2013-11-14 22:22:46.000000000","message":"We should probably change this to DatastoreManager, right?","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"}],"trove/datastore/models.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027datastore_id\u0027, \u0027name\u0027, \u0027image_id\u0027, \u0027packages\u0027,"},{"line_number":27,"context_line":"                    \u0027active\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Datastore(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, db_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfGQ%3D","line":29,"updated":"2013-11-04 22:37:57.000000000","message":"datastores and datastore_versions both have image_id. Considering that each datastore has to have at least one datastore_version, why don\u0027t we drop image_id on datastores and enforce it on datastore_versions? If there\u0027s a valid reason why inheritance is extremely useful, then at a minimum validation has to be put in place to ensure that if datastores/image_id is NULL, then any related row\u0027s datastore_versions/image_id is not. You\u0027ll also have to add the reverse validation logic: if an update is changing the image_id to null for datastores, then you must ensure that each related datastore_versions row has an image_id. Given the complexity of this validation, I reemphasize my suggestion that image_id be dropped from datastores.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027datastore_id\u0027, \u0027name\u0027, \u0027image_id\u0027, \u0027packages\u0027,"},{"line_number":27,"context_line":"                    \u0027active\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Datastore(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, db_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FR6U%3D","line":29,"in_reply_to":"AAAATn%2F%2FbYE%3D","updated":"2013-11-11 20:53:52.000000000","message":"Before replying, please read my comment in full.\n\n\"If there\u0027s a valid reason why inheritance is extremely useful, then at a minimum validation has to be put in place to ensure that if datastores/image_id is NULL, then any related row\u0027s datastore_versions/image_id is not. You\u0027ll also have to add the reverse validation logic: if an update is changing the image_id to null for datastores, then you must ensure that each related datastore_versions row has an image_id.\"","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027datastore_id\u0027, \u0027name\u0027, \u0027image_id\u0027, \u0027packages\u0027,"},{"line_number":27,"context_line":"                    \u0027active\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Datastore(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, db_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfDY%3D","line":29,"in_reply_to":"AAAATn%2F%2FfGQ%3D","updated":"2013-11-04 22:56:25.000000000","message":"Agreed, good point on attribute storing.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    _data_fields \u003d [\u0027id\u0027, \u0027datastore_id\u0027, \u0027name\u0027, \u0027image_id\u0027, \u0027packages\u0027,"},{"line_number":27,"context_line":"                    \u0027active\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class Datastore(object):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, db_info):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbYE%3D","line":29,"in_reply_to":"AAAATn%2F%2FfGQ%3D","updated":"2013-11-06 12:17:04.000000000","message":"it is usecase, operator wants to define one default image for type and dont setup same image_id for each version","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            try:"},{"line_number":41,"context_line":"                return cls(DBDatastore.find_by(name\u003did_or_name))"},{"line_number":42,"context_line":"            except exception.ModelNotFoundError:"},{"line_number":43,"context_line":"                raise exception.DatastoreNotFound(datastore\u003did_or_name)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @property"},{"line_number":46,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjZQ%3D","line":43,"updated":"2013-11-01 15:02:26.000000000","message":"To be presice, I suppose, it should raise DatastoreModelNotFound","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    db_api.configure_db(CONF)"},{"line_number":157,"context_line":"    default_version_id \u003d \"\""},{"line_number":158,"context_line":"    if default_version:"},{"line_number":159,"context_line":"        default_version_id \u003d DatastoreVersion.load(default_version).id"},{"line_number":160,"context_line":"    try:"},{"line_number":161,"context_line":"        datastore \u003d DBDatastore.find_by(name\u003dname)"},{"line_number":162,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfHA%3D","line":159,"updated":"2013-11-04 22:37:57.000000000","message":"Checking for existence is not enough, it should also be \u0027active\u0027. Defaulting to an inactive version is nonsensical.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    db_api.configure_db(CONF)"},{"line_number":157,"context_line":"    default_version_id \u003d \"\""},{"line_number":158,"context_line":"    if default_version:"},{"line_number":159,"context_line":"        default_version_id \u003d DatastoreVersion.load(default_version).id"},{"line_number":160,"context_line":"    try:"},{"line_number":161,"context_line":"        datastore \u003d DBDatastore.find_by(name\u003dname)"},{"line_number":162,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbX4%3D","line":159,"in_reply_to":"AAAATn%2F%2FfHA%3D","updated":"2013-11-06 12:17:04.000000000","message":"good point","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    db_api.save(datastore)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":174,"context_line":"    db_api.configure_db(CONF)"},{"line_number":175,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":176,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfGc%3D","line":173,"updated":"2013-11-04 22:37:57.000000000","message":"Is there a reason why we can\u0027t check the image_id against glance to make sure it\u0027s real?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    db_api.save(datastore)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":174,"context_line":"    db_api.configure_db(CONF)"},{"line_number":175,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":176,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbXw%3D","line":173,"in_reply_to":"AAAATn%2F%2FfCM%3D","updated":"2013-11-06 12:17:04.000000000","message":"i think DBAAS user shouldn\u0027t take care of operating systems (at least we can show only image_id)","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"0090a7683f215557bb7a54c358bc116bc72c1fec","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    db_api.save(datastore)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":174,"context_line":"    db_api.configure_db(CONF)"},{"line_number":175,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":176,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfCM%3D","line":173,"in_reply_to":"AAAATn%2F%2FfGc%3D","updated":"2013-11-04 23:03:26.000000000","message":"Also, I noticed in your datastores.rst patch-set, you mention operating-system. Should the user on a GET /datastores/:id/versions/:id be able to see the backing operating-system? If so, you might want to consider using glance\u0027s image metadata to get said information vs. redundantly storing it in trove tables.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    db_api.save(datastore)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":174,"context_line":"    db_api.configure_db(CONF)"},{"line_number":175,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":176,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbXo%3D","line":173,"in_reply_to":"AAAATn%2F%2FfGc%3D","updated":"2013-11-06 12:17:04.000000000","message":"i think no reason","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def __init__(self, db_info):"},{"line_number":65,"context_line":"        self.db_info \u003d db_info"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"},{"line_number":68,"context_line":"    def load(cls):"},{"line_number":69,"context_line":"        return cls(DBDatastore.find_all())"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAYQ%3D","line":67,"updated":"2013-11-15 21:11:41.000000000","message":"i couldn\u0027t find a perfect place to put this comment, but here goes: GET /{tenant_id}/datastores will return a datastore, even if it has no versions, or no active versions. i\u0027m thinking a datastore should be excluded from the list if it has no recorded versions, or no active versions.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def __init__(self, db_info):"},{"line_number":65,"context_line":"        self.db_info \u003d db_info"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"},{"line_number":68,"context_line":"    def load(cls):"},{"line_number":69,"context_line":"        return cls(DBDatastore.find_all())"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2FQ%3D","line":67,"in_reply_to":"AAAATn%2F%2FAYQ%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        datastore \u003d DBDatastore()"},{"line_number":163,"context_line":"        datastore.id \u003d uuidutils.generate_uuid()"},{"line_number":164,"context_line":"        datastore.name \u003d name"},{"line_number":165,"context_line":"    datastore.manager \u003d manager"},{"line_number":166,"context_line":"    if default_version:"},{"line_number":167,"context_line":"        datastore.default_version_id \u003d version.id"},{"line_number":168,"context_line":"    db_api.save(datastore)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAMg%3D","line":165,"updated":"2013-11-15 21:11:41.000000000","message":"there should be some sort of validation here to prevent a provider from assigning a manager that simply does not exist.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"32b8aa9edf6bfb4b7d9355abef9c228b799dccc0","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        datastore \u003d DBDatastore()"},{"line_number":163,"context_line":"        datastore.id \u003d uuidutils.generate_uuid()"},{"line_number":164,"context_line":"        datastore.name \u003d name"},{"line_number":165,"context_line":"    datastore.manager \u003d manager"},{"line_number":166,"context_line":"    if default_version:"},{"line_number":167,"context_line":"        datastore.default_version_id \u003d version.id"},{"line_number":168,"context_line":"    db_api.save(datastore)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAB4%3D","line":165,"in_reply_to":"AAAATn%2F%2FAMg%3D","updated":"2013-11-15 22:11:22.000000000","message":"agreed on irc that this can be handled in a later iteration by moving the manager-name \u003d\u003e manager-class mapping to the database, and/or introducing a mgmt api.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    db_api.save(datastore)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":172,"context_line":"    db_api.configure_db(CONF)"},{"line_number":173,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":174,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAM4%3D","line":171,"updated":"2013-11-15 21:11:41.000000000","message":"i\u0027m thinking that on an update-datastore-version request that the user should be able to specify \"make this version the default\". this is a hugely helpful convenience flag that will update the datastore table to point to this version as the default.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"32b8aa9edf6bfb4b7d9355abef9c228b799dccc0","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    db_api.save(datastore)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"def update_datastore_version(datastore, name, image_id, packages, active):"},{"line_number":172,"context_line":"    db_api.configure_db(CONF)"},{"line_number":173,"context_line":"    datastore \u003d Datastore.load(datastore)"},{"line_number":174,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FABs%3D","line":171,"in_reply_to":"AAAATn%2F%2FAM4%3D","updated":"2013-11-15 22:11:22.000000000","message":"agreed on irc that this is a nice-to-have that can be introduced in a later iteration.","commit_id":"5df61800394be238c189749515716810a810d0ec"}],"trove/datastore_type/models.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class DatastoreType(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, datastore_type_id):"},{"line_number":26,"context_line":"        self.datastore_type \u003d DBDatastoreType.find_by(id\u003ddatastore_type_id)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @property"},{"line_number":29,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FRZw%3D","line":26,"updated":"2013-10-18 17:44:03.000000000","message":"Loading these items in the initializer could make extending this class in the future kind of confusing. For example, what will the code to create a new DatastoreType\u0027s look like? I assume there will be a MGMT API method to do that.\n\nI think instead there should be @classmethod or @staticmethods to create new types, and others to load instances of these types.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"355571469a6f524d2b5f1b6d68008ef03a3dd658","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class DatastoreType(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, datastore_type_id):"},{"line_number":26,"context_line":"        self.datastore_type \u003d DBDatastoreType.find_by(id\u003ddatastore_type_id)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @property"},{"line_number":29,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FNYc%3D","line":26,"in_reply_to":"AAAATH%2F%2FPtQ%3D","updated":"2013-10-21 12:37:29.000000000","message":"good point, ok","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"5db7a8fbdb88755606694b0bd9b7c1bf05fe6e99","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class DatastoreType(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, datastore_type_id):"},{"line_number":26,"context_line":"        self.datastore_type \u003d DBDatastoreType.find_by(id\u003ddatastore_type_id)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @property"},{"line_number":29,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FPtQ%3D","line":26,"in_reply_to":"AAAATH%2F%2FQBI%3D","updated":"2013-10-19 14:57:30.000000000","message":"I think the code to add and update these items should be moved from trove-manage to this module. The trove-manage command could still work the same, it would just call the code here.\n\nThis would offer the benefit of putting much of the logic code for datastore types and versions in the same place. It would also allow us to easily add mgmt api functions easier in the future than if the code was stuck inside a bin script.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class DatastoreType(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, datastore_type_id):"},{"line_number":26,"context_line":"        self.datastore_type \u003d DBDatastoreType.find_by(id\u003ddatastore_type_id)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @property"},{"line_number":29,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBI%3D","line":26,"in_reply_to":"AAAATH%2F%2FRZw%3D","updated":"2013-10-19 08:38:52.000000000","message":"add new types and versions in onetime operation for operator, i dont think we need implement extra API for it.\nits already implemented in trove-manage","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @property"},{"line_number":41,"context_line":"    def image_id(self):"},{"line_number":42,"context_line":"        return self.datastore_type.image_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class DatastoreTypes(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUMs%3D","line":42,"updated":"2013-10-18 17:44:03.000000000","message":"Why does this need an \"image_id\" when DatastoreVersion already has one?","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"355571469a6f524d2b5f1b6d68008ef03a3dd658","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @property"},{"line_number":41,"context_line":"    def image_id(self):"},{"line_number":42,"context_line":"        return self.datastore_type.image_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class DatastoreTypes(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FNYg%3D","line":42,"in_reply_to":"AAAATH%2F%2FPtI%3D","updated":"2013-10-21 12:37:29.000000000","message":"to store default image_id","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"5db7a8fbdb88755606694b0bd9b7c1bf05fe6e99","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @property"},{"line_number":41,"context_line":"    def image_id(self):"},{"line_number":42,"context_line":"        return self.datastore_type.image_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class DatastoreTypes(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FPtI%3D","line":42,"in_reply_to":"AAAATH%2F%2FQBU%3D","updated":"2013-10-19 14:57:30.000000000","message":"My question isn\u0027t why DatastoreVersion has one, but why DatastoreType has one.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @property"},{"line_number":41,"context_line":"    def image_id(self):"},{"line_number":42,"context_line":"        return self.datastore_type.image_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class DatastoreTypes(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBU%3D","line":42,"in_reply_to":"AAAATH%2F%2FUMs%3D","updated":"2013-10-19 08:38:52.000000000","message":"version has image_id to override type`s one.\nthere is usecase, please look BP","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":55,"context_line":"class DatastoreVersion(object):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, datastore_version_id):"},{"line_number":58,"context_line":"        self.datastore_version \u003d (DBDatastoreVersion."},{"line_number":59,"context_line":"                                  find_by(id\u003ddatastore_version_id))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUJc%3D","line":58,"updated":"2013-10-18 17:44:03.000000000","message":"Let\u0027s rename \"self.datastore_version\" to something simpler, like \"self.db_info\".","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":55,"context_line":"class DatastoreVersion(object):"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def __init__(self, datastore_version_id):"},{"line_number":58,"context_line":"        self.datastore_version \u003d (DBDatastoreVersion."},{"line_number":59,"context_line":"                                  find_by(id\u003ddatastore_version_id))"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBY%3D","line":58,"in_reply_to":"AAAATH%2F%2FUJc%3D","updated":"2013-10-19 08:38:52.000000000","message":"Done","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            yield item"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FULM%3D","line":99,"updated":"2013-10-18 17:44:03.000000000","message":"\"datastore_type_id\" and \"datastore_version_id\" can be shortened to \"type_id\" and \"version_id\". That would be clear enough given the context here (the name already refers to datastore).","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            yield item"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQCE%3D","line":99,"in_reply_to":"AAAATH%2F%2FULM%3D","updated":"2013-10-19 08:38:52.000000000","message":"Done","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUKg%3D","line":101,"updated":"2013-10-18 17:44:03.000000000","message":"Coming from Java, I was a fan of checks like these but found that they actually don\u0027t make as much sense in Python, since using them in ernest would mean they\u0027d have to go almost everywhere. This check should be removed.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"355571469a6f524d2b5f1b6d68008ef03a3dd658","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FNYM%3D","line":101,"in_reply_to":"AAAATH%2F%2FPso%3D","updated":"2013-10-21 12:37:29.000000000","message":"we cannot add this validation to schema, coz it brakes existent api contract (its why decided to use default value)","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"5db7a8fbdb88755606694b0bd9b7c1bf05fe6e99","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FPso%3D","line":101,"in_reply_to":"AAAATH%2F%2FQB4%3D","updated":"2013-10-19 14:57:30.000000000","message":"The JSON schema code can be used to prevent None from arriving from the request.\n\nAs for the fact the config value may be None, I think the decision to raise an error if it is None should be placed right next to where the config value is fetched (which is currently in the service code). Also, if a Trove operator has not set a default service, then the raised exception should be BadRequest.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def get_datastore_version(datastore_type_id, datastore_version_id):"},{"line_number":100,"context_line":"    if not datastore_type_id:"},{"line_number":101,"context_line":"        raise exception.TroveError(\"Please specify datastore type.\")"},{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQB4%3D","line":101,"in_reply_to":"AAAATH%2F%2FUKg%3D","updated":"2013-10-19 08:38:52.000000000","message":"type can be None (when not specified in request nor default in config)","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"},{"line_number":105,"context_line":"        raise exception.TroveError(\"Datastore type %s not found.\" %"},{"line_number":106,"context_line":"                                   datastore_type_id)"},{"line_number":107,"context_line":"    if datastore_version_id:"},{"line_number":108,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUJE%3D","line":105,"updated":"2013-10-18 17:44:03.000000000","message":"If the exception is being re-raised, it should be a different type- maybe NotFound- so it will surface to the user as a resource not found error.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    try:"},{"line_number":103,"context_line":"        datastore_type \u003d DatastoreType(datastore_type_id)"},{"line_number":104,"context_line":"    except exception.ModelNotFoundError:"},{"line_number":105,"context_line":"        raise exception.TroveError(\"Datastore type %s not found.\" %"},{"line_number":106,"context_line":"                                   datastore_type_id)"},{"line_number":107,"context_line":"    if datastore_version_id:"},{"line_number":108,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQB0%3D","line":105,"in_reply_to":"AAAATH%2F%2FUJE%3D","updated":"2013-10-19 08:38:52.000000000","message":"Done","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            datastore_version \u003d DatastoreVersion(datastore_version_id)"},{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUJA%3D","line":112,"updated":"2013-10-18 17:44:03.000000000","message":"My comment from line 105 applies here as well.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            datastore_version \u003d DatastoreVersion(datastore_version_id)"},{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBw%3D","line":112,"in_reply_to":"AAAATH%2F%2FUJA%3D","updated":"2013-10-19 08:38:52.000000000","message":"Done","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"},{"line_number":116,"context_line":"                                                  datastore_version.name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUIw%3D","line":113,"updated":"2013-10-18 17:44:03.000000000","message":"This check would only be necessary if there was a break in the function \"find_by,\" which is used on line 58. It should be removed.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"355571469a6f524d2b5f1b6d68008ef03a3dd658","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"},{"line_number":116,"context_line":"                                                  datastore_version.name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FNXw%3D","line":113,"in_reply_to":"AAAATH%2F%2FPsg%3D","updated":"2013-10-21 12:37:29.000000000","message":"maybe, but type_id specified not all times","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"5db7a8fbdb88755606694b0bd9b7c1bf05fe6e99","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"},{"line_number":116,"context_line":"                                                  datastore_version.name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FPsg%3D","line":113,"in_reply_to":"AAAATH%2F%2FQBo%3D","updated":"2013-10-19 14:57:30.000000000","message":"Aha, I see now. I wonder if it would be possible to pass in the id to the \"find_by\" method, which would prevent an object from the db being returned if the type id was different.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        except exception.ModelNotFoundError:"},{"line_number":111,"context_line":"            raise exception.TroveError(\"Datastore version %s not found.\" %"},{"line_number":112,"context_line":"                                       datastore_version_id)"},{"line_number":113,"context_line":"        if datastore_version.datastore_type_id !\u003d datastore_type_id:"},{"line_number":114,"context_line":"            raise exception.TroveError(\"Datastore type \u0027%s\u0027 has no version \""},{"line_number":115,"context_line":"                                       \"\u0027%s\u0027.\" % (datastore_type.name,"},{"line_number":116,"context_line":"                                                  datastore_version.name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBo%3D","line":113,"in_reply_to":"AAAATH%2F%2FUIw%3D","updated":"2013-10-19 08:38:52.000000000","message":"user can specify type and version from another type, to avoid confusing i added this check","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif active_versions.count() \u003e 1:"},{"line_number":129,"context_line":"            raise exception.TroveError(\"Found multiple active versions for \""},{"line_number":130,"context_line":"                                       \"datastore type \u0027%s\u0027.\" %"},{"line_number":131,"context_line":"                                       datastore_type.name)"},{"line_number":132,"context_line":"        else:"},{"line_number":133,"context_line":"            datastore_version \u003d active_versions.first()"},{"line_number":134,"context_line":"    return (datastore_type, datastore_version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FUIU%3D","line":131,"updated":"2013-10-18 17:44:03.000000000","message":"Again, these exceptions should be changed to different types if the idea is to surface them as user errors (this may be useful for example in the create instance code path).","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"c9c15923572d34bc41814b3462174799367cbd86","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif active_versions.count() \u003e 1:"},{"line_number":129,"context_line":"            raise exception.TroveError(\"Found multiple active versions for \""},{"line_number":130,"context_line":"                                       \"datastore type \u0027%s\u0027.\" %"},{"line_number":131,"context_line":"                                       datastore_type.name)"},{"line_number":132,"context_line":"        else:"},{"line_number":133,"context_line":"            datastore_version \u003d active_versions.first()"},{"line_number":134,"context_line":"    return (datastore_type, datastore_version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQ%2B8%3D","line":131,"updated":"2013-10-18 19:08:50.000000000","message":"I also think the datastore_type should have a default version associated with it in the database.","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif active_versions.count() \u003e 1:"},{"line_number":129,"context_line":"            raise exception.TroveError(\"Found multiple active versions for \""},{"line_number":130,"context_line":"                                       \"datastore type \u0027%s\u0027.\" %"},{"line_number":131,"context_line":"                                       datastore_type.name)"},{"line_number":132,"context_line":"        else:"},{"line_number":133,"context_line":"            datastore_version \u003d active_versions.first()"},{"line_number":134,"context_line":"    return (datastore_type, datastore_version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBg%3D","line":131,"in_reply_to":"AAAATH%2F%2FQ%2B8%3D","updated":"2013-10-19 08:38:52.000000000","message":"yes, good point, i thought about it too.\nwe can discuss this one","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif active_versions.count() \u003e 1:"},{"line_number":129,"context_line":"            raise exception.TroveError(\"Found multiple active versions for \""},{"line_number":130,"context_line":"                                       \"datastore type \u0027%s\u0027.\" %"},{"line_number":131,"context_line":"                                       datastore_type.name)"},{"line_number":132,"context_line":"        else:"},{"line_number":133,"context_line":"            datastore_version \u003d active_versions.first()"},{"line_number":134,"context_line":"    return (datastore_type, datastore_version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBk%3D","line":131,"in_reply_to":"AAAATH%2F%2FUIU%3D","updated":"2013-10-19 08:38:52.000000000","message":"Done","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            try:"},{"line_number":37,"context_line":"                self.db_info \u003d DBDatastoreType.find_by(id\u003dtype)"},{"line_number":38,"context_line":"            except exception.ModelNotFoundError:"},{"line_number":39,"context_line":"                raise exception.DatastoreTypeNotFound(type\u003dtype)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @property"},{"line_number":42,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9ak%3D","line":39,"updated":"2013-10-23 16:54:59.000000000","message":"I think this should use a function (either global or a @classmethod or @staticmethod) to load from the database. This code should also check if if the type argument is None, and if so check CONF.default_datastore_type to see if it can be used. If neither are set it should raise an error.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            try:"},{"line_number":37,"context_line":"                self.db_info \u003d DBDatastoreType.find_by(id\u003dtype)"},{"line_number":38,"context_line":"            except exception.ModelNotFoundError:"},{"line_number":39,"context_line":"                raise exception.DatastoreTypeNotFound(type\u003dtype)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @property"},{"line_number":42,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F87A%3D","line":39,"in_reply_to":"AAAATX%2F%2F9Xk%3D","updated":"2013-10-23 21:37:28.000000000","message":"Sure: \n\n https://gist.github.com/anonymous/6e93800a65f22e212abd \n\n(Note: copy and past the line above from \"https\" onward into your browser and it should work- not sure why Gerrit puts that other stuff in front of it).","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            try:"},{"line_number":37,"context_line":"                self.db_info \u003d DBDatastoreType.find_by(id\u003dtype)"},{"line_number":38,"context_line":"            except exception.ModelNotFoundError:"},{"line_number":39,"context_line":"                raise exception.DatastoreTypeNotFound(type\u003dtype)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @property"},{"line_number":42,"context_line":"    def id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9Xk%3D","line":39,"in_reply_to":"AAAATX%2F%2F9ak%3D","updated":"2013-10-23 17:04:07.000000000","message":"can you gist function?\nvalue validates before pass here, and default picking up before too","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def image_id(self):"},{"line_number":55,"context_line":"        return self.db_info.image_id"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @property"},{"line_number":58,"context_line":"    def default_version_id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9dU%3D","line":55,"updated":"2013-10-23 16:54:59.000000000","message":"You said this was to store a default image ID- however why not just use the image ID attached to the default version instead?","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def image_id(self):"},{"line_number":55,"context_line":"        return self.db_info.image_id"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @property"},{"line_number":58,"context_line":"    def default_version_id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8SQ%3D","line":55,"in_reply_to":"AAAATX%2F%2F8ec%3D","updated":"2013-10-23 22:06:14.000000000","message":"i dont think so,\nif you have few versions which uses default image \"centos\"\nand if you changing default version to new which uses \"ubuntu\"\nother versions will not works","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def image_id(self):"},{"line_number":55,"context_line":"        return self.db_info.image_id"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @property"},{"line_number":58,"context_line":"    def default_version_id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8ec%3D","line":55,"in_reply_to":"AAAATX%2F%2F9X0%3D","updated":"2013-10-23 21:37:28.000000000","message":"So in that case, shouldn\u0027t there instead be a default_version property that referes to a datastore_version?","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @property"},{"line_number":54,"context_line":"    def image_id(self):"},{"line_number":55,"context_line":"        return self.db_info.image_id"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @property"},{"line_number":58,"context_line":"    def default_version_id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9X0%3D","line":55,"in_reply_to":"AAAATX%2F%2F9dU%3D","updated":"2013-10-23 17:04:07.000000000","message":"coz default version and current version can use different images, like default 5.1 on centos and current 5.5 on ubuntu","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":122,"context_line":"    type \u003d datastore.get(\u0027type\u0027) or CONF.default_datastore_type"},{"line_number":123,"context_line":"    datastore_type \u003d DatastoreType(type)"},{"line_number":124,"context_line":"    version \u003d datastore.get(\u0027version\u0027) or datastore_type.default_version_id"},{"line_number":125,"context_line":"    datastore_version \u003d DatastoreVersion(version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9bw%3D","line":122,"updated":"2013-10-23 16:54:59.000000000","message":"This could be \"datastore.get(\u0027type\u0027, CONF.default_datastore_type)\".\n\nHowever, thinking about it more, maybe the code to use the default datastore type should be in the DatastoreType class- and if no type is given, and no default datastore is defined, an exception should be raised from the class.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":122,"context_line":"    type \u003d datastore.get(\u0027type\u0027) or CONF.default_datastore_type"},{"line_number":123,"context_line":"    datastore_type \u003d DatastoreType(type)"},{"line_number":124,"context_line":"    version \u003d datastore.get(\u0027version\u0027) or datastore_type.default_version_id"},{"line_number":125,"context_line":"    datastore_version \u003d DatastoreVersion(version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8Rg%3D","line":122,"in_reply_to":"AAAATX%2F%2F8Y0%3D","updated":"2013-10-23 22:06:14.000000000","message":"sure ill change to get(..., ...)\nwhat exception you mean?\nclass will raise exception if type not found","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":122,"context_line":"    type \u003d datastore.get(\u0027type\u0027) or CONF.default_datastore_type"},{"line_number":123,"context_line":"    datastore_type \u003d DatastoreType(type)"},{"line_number":124,"context_line":"    version \u003d datastore.get(\u0027version\u0027) or datastore_type.default_version_id"},{"line_number":125,"context_line":"    datastore_version \u003d DatastoreVersion(version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8Y0%3D","line":122,"in_reply_to":"AAAATX%2F%2F9XU%3D","updated":"2013-10-23 21:37:28.000000000","message":"Ok, so the code stays here - what about my comments for changing that line (\"datastore.get(\u0027type\u0027, CONF.default_datastore_type)\") as well as raising an exception.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":122,"context_line":"    type \u003d datastore.get(\u0027type\u0027) or CONF.default_datastore_type"},{"line_number":123,"context_line":"    datastore_type \u003d DatastoreType(type)"},{"line_number":124,"context_line":"    version \u003d datastore.get(\u0027version\u0027) or datastore_type.default_version_id"},{"line_number":125,"context_line":"    datastore_version \u003d DatastoreVersion(version)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9XU%3D","line":122,"in_reply_to":"AAAATX%2F%2F9bw%3D","updated":"2013-10-23 17:04:07.000000000","message":"id prefer to keep this logic in this function, and use init only to get type with specified id","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            yield item"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":137,"context_line":"    type \u003d datastore.get(\u0027type\u0027, CONF.default_datastore_type)"},{"line_number":138,"context_line":"    datastore_type \u003d DatastoreType.load(type)"},{"line_number":139,"context_line":"    version \u003d datastore.get(\u0027version\u0027, datastore_type.default_version_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3zY%3D","line":136,"updated":"2013-10-25 21:06:20.000000000","message":"This is only a dictionary because you know it will be called by the REST API code.\n\nTry this: change this method to accept two arguments: \"type\" and \"version\".\n\nThen where the REST API code calls this function, use the double star syntax to change the dictionary values into keyword arguments.","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"bf98a7b570b7eba7d1c22cf5ed91c0d6305f063b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            yield item"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":137,"context_line":"    type \u003d datastore.get(\u0027type\u0027, CONF.default_datastore_type)"},{"line_number":138,"context_line":"    datastore_type \u003d DatastoreType.load(type)"},{"line_number":139,"context_line":"    version \u003d datastore.get(\u0027version\u0027, datastore_type.default_version_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3wY%3D","line":136,"in_reply_to":"AAAATn%2F%2F3zY%3D","updated":"2013-10-25 21:51:29.000000000","message":"ok, will do","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"def get_datastore_type_version(datastore):"},{"line_number":137,"context_line":"    type \u003d datastore.get(\u0027type\u0027, CONF.default_datastore_type)"},{"line_number":138,"context_line":"    datastore_type \u003d DatastoreType.load(type)"},{"line_number":139,"context_line":"    version \u003d datastore.get(\u0027version\u0027, datastore_type.default_version_id)"},{"line_number":140,"context_line":"    datastore_version \u003d DatastoreVersion.load(version)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3yM%3D","line":137,"updated":"2013-10-25 21:06:20.000000000","message":"Btw, if you go with my previous suggestion, this becomes \"type \u003d type or CONF.default_datastore_type\"\n\nversion (on line 139) would work in a similar way.","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    datastore_version \u003d DatastoreVersion.load(version)"},{"line_number":141,"context_line":"    if datastore_version.datastore_type_id !\u003d datastore_type.id:"},{"line_number":142,"context_line":"        raise exception.DatastoreTypeNoVersion(type\u003ddatastore_type.name,"},{"line_number":143,"context_line":"                                               version\u003ddatastore_version.name)"},{"line_number":144,"context_line":"    if not datastore_version.active:"},{"line_number":145,"context_line":"        raise exception.DatastoreVersionInactive(version\u003d"},{"line_number":146,"context_line":"                                                 datastore_version.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F39g%3D","line":143,"updated":"2013-10-25 21:06:20.000000000","message":"Is there any way to enforce this via SqlAlchemy?","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"bf98a7b570b7eba7d1c22cf5ed91c0d6305f063b","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    datastore_version \u003d DatastoreVersion.load(version)"},{"line_number":141,"context_line":"    if datastore_version.datastore_type_id !\u003d datastore_type.id:"},{"line_number":142,"context_line":"        raise exception.DatastoreTypeNoVersion(type\u003ddatastore_type.name,"},{"line_number":143,"context_line":"                                               version\u003ddatastore_version.name)"},{"line_number":144,"context_line":"    if not datastore_version.active:"},{"line_number":145,"context_line":"        raise exception.DatastoreVersionInactive(version\u003d"},{"line_number":146,"context_line":"                                                 datastore_version.name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3wc%3D","line":143,"in_reply_to":"AAAATn%2F%2F39g%3D","updated":"2013-10-25 21:51:29.000000000","message":"no ideas yet, but ill research some","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"}],"trove/db/sqlalchemy/migrate_repo/versions/016_add_datastore_type.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"135b32b25679f525bca37c14f71244ec9fb4cba9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FRZg%3D","line":46,"updated":"2013-10-18 17:44:03.000000000","message":"What is the purpose of the \"engine\" field if there is already a \"name\" field?","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"eb571dc70a96d89251f9d6c581638209facc112d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FNPw%3D","line":46,"in_reply_to":"AAAATH%2F%2FPsQ%3D","updated":"2013-10-21 13:11:51.000000000","message":"i think name is name, but we can rename \"engine\" to \"module\" or \"class\"","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"5db7a8fbdb88755606694b0bd9b7c1bf05fe6e99","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FPsQ%3D","line":46,"in_reply_to":"AAAATH%2F%2FQBE%3D","updated":"2013-10-19 14:57:30.000000000","message":"Ah, ok. This is probably a discussion for the mailing list but I think the \"engine\" sounds like a nickname that could be used in API requests. Maybe we could change \"engine\" to \"name\" and then \"name\" to \"description?\" \"description\" would then be the long, fancy name that users could see when they listed it (it could be surfaced that way to Horizon users for example).","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"047fd93eb6610fd5273ac2eefad533e84479e529","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FQBE%3D","line":46,"in_reply_to":"AAAATH%2F%2FRZg%3D","updated":"2013-10-19 08:38:52.000000000","message":"name is for user (like \"Oracle Mysql\")\nwhen engine is name of manager class (like \"mysql\")\nplease look BP","commit_id":"d03c04a30852fa57ea3bb46134b4cae8086fde75"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    instances.drop_column(\u0027datastore_version_id\u0027)"},{"line_number":80,"context_line":"    service_type \u003d Column(\u0027service_type\u0027, String(36))"},{"line_number":81,"context_line":"    instances.create_column(service_type)"},{"line_number":82,"context_line":"    instances.update().values({\u0027service_type\u0027: \u0027mysql\u0027}).execute()"},{"line_number":83,"context_line":"    create_tables([service_images])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8W8%3D","line":82,"updated":"2013-10-23 21:37:28.000000000","message":"All deployments of Trove I know of already set this to mysql when provisioning an instance, so this may be unnecessary.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    instances.drop_column(\u0027datastore_version_id\u0027)"},{"line_number":80,"context_line":"    service_type \u003d Column(\u0027service_type\u0027, String(36))"},{"line_number":81,"context_line":"    instances.create_column(service_type)"},{"line_number":82,"context_line":"    instances.update().values({\u0027service_type\u0027: \u0027mysql\u0027}).execute()"},{"line_number":83,"context_line":"    create_tables([service_images])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8RI%3D","line":82,"in_reply_to":"AAAATX%2F%2F8W8%3D","updated":"2013-10-23 22:06:14.000000000","message":"i think it will set \"mysql\" for newly created column for existing instances (its downgrade)","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"64713cf68f07d06a1db8c0fbb5d4ce84269ccc55","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \u0027datastores\u0027,"},{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":"    Column(\u0027default_version_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfEM%3D","line":45,"updated":"2013-11-04 22:44:10.000000000","message":"There needs to be a unique constraint on \u0027name\u0027","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \u0027datastores\u0027,"},{"line_number":43,"context_line":"    meta,"},{"line_number":44,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":45,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":46,"context_line":"    Column(\u0027engine\u0027, String(255)),"},{"line_number":47,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":48,"context_line":"    Column(\u0027default_version_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbXU%3D","line":45,"in_reply_to":"AAAATn%2F%2FfEM%3D","updated":"2013-11-06 12:17:04.000000000","message":"hm, but ok","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"64713cf68f07d06a1db8c0fbb5d4ce84269ccc55","unresolved":false,"context_lines":[{"line_number":52,"context_line":"datastore_versions \u003d Table("},{"line_number":53,"context_line":"    \u0027datastore_versions\u0027,"},{"line_number":54,"context_line":"    meta,"},{"line_number":55,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":56,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":57,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":58,"context_line":"    Column(\u0027image_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfEA%3D","line":55,"updated":"2013-11-04 22:44:10.000000000","message":"There needs to be a unique constraint on (datastore_id, name)","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                  ForeignKey(\u0027datastore_versions.id\u0027))"},{"line_number":70,"context_line":"    instances.create_column(datastore_version_id)"},{"line_number":71,"context_line":"    instances.drop_column(\u0027service_type\u0027)"},{"line_number":72,"context_line":"    drop_tables([service_images])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfFM%3D","line":72,"updated":"2013-11-04 22:37:57.000000000","message":"Dropping the service_images table seems overly aggressive. Example: If an administrator attempts an upgrade from havana to icehouse, but experiences catastrophic problems, they\u0027ll want to rollback. Except with this line, you\u0027ve dropped the table, meaning they have to panic and re-\u0027trove manage\u0027 all of the old glance images. I\u0027d suggest we leave the table around for a release or two.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                  ForeignKey(\u0027datastore_versions.id\u0027))"},{"line_number":70,"context_line":"    instances.create_column(datastore_version_id)"},{"line_number":71,"context_line":"    instances.drop_column(\u0027service_type\u0027)"},{"line_number":72,"context_line":"    drop_tables([service_images])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbXA%3D","line":72,"in_reply_to":"AAAATn%2F%2FfFM%3D","updated":"2013-11-06 12:17:04.000000000","message":"good point","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    instances.create_column(datastore_version_id)"},{"line_number":70,"context_line":"    instances.drop_column(\u0027service_type\u0027)"},{"line_number":71,"context_line":"    # Table \u0027service_images\u0027 is deprecated since this version."},{"line_number":72,"context_line":"    # Leave it for few releases."},{"line_number":73,"context_line":"    #drop_tables([service_images])"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FESs%3D","line":72,"updated":"2013-11-14 22:22:46.000000000","message":"cool. good to note this here.","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"meta \u003d MetaData()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"service_images \u003d Table("},{"line_number":34,"context_line":"    \u0027service_images\u0027,"},{"line_number":35,"context_line":"    meta,"},{"line_number":36,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAb4%3D","line":33,"updated":"2013-11-15 21:11:41.000000000","message":"this table definition isn\u0027t needed because the drop_tables([service_images]) line was commented-out.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"meta \u003d MetaData()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"service_images \u003d Table("},{"line_number":34,"context_line":"    \u0027service_images\u0027,"},{"line_number":35,"context_line":"    meta,"},{"line_number":36,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2FI%3D","line":33,"in_reply_to":"AAAATn%2F%2FAb4%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    meta,"},{"line_number":54,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAbQ%3D","line":56,"updated":"2013-11-15 21:11:41.000000000","message":"this unique constraint is not correct because two different datastore types should be able to have the same version name. example: datastore \"mysql\" should be able to have a version \"5.5\", and \"percona\" should be able to have a version \"5.5\".\n\nthe unique constraint should be on the tuple (datastore_id, name)","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    meta,"},{"line_number":54,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2FE%3D","line":56,"in_reply_to":"AAAATn%2F%2FAbQ%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAaw%3D","line":57,"updated":"2013-11-15 21:11:41.000000000","message":"shouldn\u0027t image_id be NOT NULL now that image_id has been removed from the datastore table?","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2FA%3D","line":57,"in_reply_to":"AAAATn%2F%2FAaw%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAag%3D","line":58,"updated":"2013-11-15 21:11:41.000000000","message":"shouldn\u0027t packages be NOT NULL? or is this to support the use-case in which the cloud provider pre-bakes all packages into the image itself, thus removing the need to install packages on the fly?","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    Column(\u0027datastore_id\u0027, String(36), ForeignKey(\u0027datastores.id\u0027)),"},{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2B8%3D","line":58,"in_reply_to":"AAAATn%2F%2FAag%3D","updated":"2013-11-15 22:29:14.000000000","message":"should support null packages to avoid any installations","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAaY%3D","line":59,"updated":"2013-11-15 21:11:41.000000000","message":"should follow the established pattern of deleted and deleted_at, but since it\u0027s not truly a \"delete\", i suggest \"deactivated\" and \"deactivated_at\".","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8188,"name":"Ilya Sviridov","email":"sviridov.ilya@gmail.com","username":"isviridov"},"change_message_id":"14bab8b51857474d3a3564a62bfd40c5f2faf592","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B6t0%3D","line":59,"in_reply_to":"AAAATn%2F%2FAaY%3D","updated":"2013-11-18 15:57:54.000000000","message":"Better to make it in another review as an improvement","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    Column(\u0027name\u0027, String(255), unique\u003dTrue),"},{"line_number":57,"context_line":"    Column(\u0027image_id\u0027, String(36)),"},{"line_number":58,"context_line":"    Column(\u0027packages\u0027, String(511)),"},{"line_number":59,"context_line":"    Column(\u0027active\u0027, Boolean())"},{"line_number":60,"context_line":")"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2Bo%3D","line":59,"in_reply_to":"AAAATn%2F%2FAaY%3D","updated":"2013-11-15 22:29:14.000000000","message":"need to discuss, there can be complex change","commit_id":"5df61800394be238c189749515716810a810d0ec"}],"trove/db/sqlalchemy/migrate_repo/versions/016_add_service_type.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    meta,"},{"line_number":46,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":47,"context_line":"    Column(\u0027service_type_id\u0027, String(36), ForeignKey(\u0027service_types.id\u0027,"},{"line_number":48,"context_line":"                                                     ondelete\u003d\"CASCADE\","},{"line_number":49,"context_line":"                                                     onupdate\u003d\"CASCADE\")),"},{"line_number":50,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":51,"context_line":"    Column(\u0027image_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSWw%3D","line":48,"updated":"2013-09-30 22:02:33.000000000","message":"Do we need these?","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    meta,"},{"line_number":46,"context_line":"    Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":47,"context_line":"    Column(\u0027service_type_id\u0027, String(36), ForeignKey(\u0027service_types.id\u0027,"},{"line_number":48,"context_line":"                                                     ondelete\u003d\"CASCADE\","},{"line_number":49,"context_line":"                                                     onupdate\u003d\"CASCADE\")),"},{"line_number":50,"context_line":"    Column(\u0027name\u0027, String(255)),"},{"line_number":51,"context_line":"    Column(\u0027image_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRPI%3D","line":48,"in_reply_to":"AAAAS3%2F%2FSWw%3D","updated":"2013-10-01 07:18:29.000000000","message":"no, will remove in next ps\nDone","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"}],"trove/extensions/mgmt/instances/models.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if context is None:"},{"line_number":135,"context_line":"            raise TypeError(\"Argument context not defined.\")"},{"line_number":136,"context_line":"        find_server \u003d imodels.create_server_list_matcher(servers)"},{"line_number":137,"context_line":"        instances \u003d imodels.Instances._load_servers_info(load_instance,"},{"line_number":138,"context_line":"                                                         context,"},{"line_number":139,"context_line":"                                                         db_infos,"},{"line_number":140,"context_line":"                                                         find_server)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSVM%3D","line":137,"updated":"2013-09-30 22:02:33.000000000","message":"Why did this get renamed?","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if context is None:"},{"line_number":135,"context_line":"            raise TypeError(\"Argument context not defined.\")"},{"line_number":136,"context_line":"        find_server \u003d imodels.create_server_list_matcher(servers)"},{"line_number":137,"context_line":"        instances \u003d imodels.Instances._load_servers_info(load_instance,"},{"line_number":138,"context_line":"                                                         context,"},{"line_number":139,"context_line":"                                                         db_infos,"},{"line_number":140,"context_line":"                                                         find_server)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRPQ%3D","line":137,"in_reply_to":"AAAAS3%2F%2FSVM%3D","updated":"2013-10-01 07:18:29.000000000","message":"coz i added line in that function to load info about service_types, so now that function not only for status","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"}],"trove/guestagent/common/operating_system.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        return REDHAT"},{"line_number":26,"context_line":"    else:"},{"line_number":27,"context_line":"        return DEBIAN"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def service_discovery(service_candidates):"},{"line_number":31,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjPg%3D","line":28,"updated":"2013-11-01 15:02:26.000000000","message":"Also, you two sets of parameters:\n1. cmd_\n2. sudo start/stop, \n3. systemctl ...\n\nyou could name this fuction a bit shorter and faster if you:\n1. Make separete list of string for each block described below\n2. Use itertools.izip\n      example:\n     d \u003d {key: value for key, value in itertools.izip([\u0027afsadg\u0027, \u0027dfgdfgh\u0027, \u0027adfgsdf\u0027],\n                                                                      [\u0027dfghfgh\u0027, \u0027dfgdfhgh\u0027, \u0027dsfgdfghas\u0027])}\n\n    output: {\u0027afsadg\u0027: \u0027dfghfgh\u0027, \u0027adfgsdf\u0027: \u0027dsfgdfghas\u0027, \u0027dfgdfgh\u0027: \u0027dfgdfhgh\u0027}","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            break"},{"line_number":63,"context_line":"        # check systemd"},{"line_number":64,"context_line":"        if os.path.isfile(\"/lib/systemd/system/%s.service\" % service):"},{"line_number":65,"context_line":"            result[\u0027cmd_start\u0027] \u003d \"sudo systemctl start %s\" % service"},{"line_number":66,"context_line":"            result[\u0027cmd_stop\u0027] \u003d \"sudo systemctl stop %s\" % service"},{"line_number":67,"context_line":"            result[\u0027cmd_enable\u0027] \u003d \"sudo systemctl enable %s\" % service"},{"line_number":68,"context_line":"            result[\u0027cmd_disable\u0027] \u003d \"sudo systemctl disable %s\" % service"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjY0%3D","line":65,"updated":"2013-11-01 15:02:26.000000000","message":"please, use result.update({key: value})","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"trove/guestagent/datastore/mysql/manager.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FvuA%3D","line":104,"updated":"2013-10-29 17:52:33.000000000","message":"If you are fixing line #100, please fix line #104","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        app.install_if_needed(packages)"},{"line_number":95,"context_line":"        if device_path:"},{"line_number":96,"context_line":"            #stop and do not update database"},{"line_number":97,"context_line":"            app.stop_db()"},{"line_number":98,"context_line":"            device \u003d volume.VolumeDevice(device_path)"},{"line_number":99,"context_line":"            device.format()"},{"line_number":100,"context_line":"            if os.path.exists(CONF.mount_point):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfKU%3D","line":97,"updated":"2013-11-04 22:37:57.000000000","message":"Executing stop_db() before checking for os.path.exists(CONF.mount_point) doesn\u0027t seem to be intrinsically tied to this patch-set\u0027s desired functionality: so why was it done?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"834320953f6dce88cf2bb82d8182de6d5dad7fa5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        app.install_if_needed(packages)"},{"line_number":95,"context_line":"        if device_path:"},{"line_number":96,"context_line":"            #stop and do not update database"},{"line_number":97,"context_line":"            app.stop_db()"},{"line_number":98,"context_line":"            device \u003d volume.VolumeDevice(device_path)"},{"line_number":99,"context_line":"            device.format()"},{"line_number":100,"context_line":"            if os.path.exists(CONF.mount_point):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FLBk%3D","line":97,"in_reply_to":"AAAATn%2F%2FRvo%3D","updated":"2013-11-13 11:43:16.000000000","message":"this is important part for deployment,\nfirst we should ensure dbms is installed, then move data to new device.\n\nif we do stop/start when packages not installed, then service_discovery will found no commands to perform start/stop and prepare will failed,\n\nwe can try ignore that fails, but i think its not good","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        app.install_if_needed(packages)"},{"line_number":95,"context_line":"        if device_path:"},{"line_number":96,"context_line":"            #stop and do not update database"},{"line_number":97,"context_line":"            app.stop_db()"},{"line_number":98,"context_line":"            device \u003d volume.VolumeDevice(device_path)"},{"line_number":99,"context_line":"            device.format()"},{"line_number":100,"context_line":"            if os.path.exists(CONF.mount_point):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FRvo%3D","line":97,"in_reply_to":"AAAATn%2F%2FbWY%3D","updated":"2013-11-11 20:53:52.000000000","message":"It\u0027s generally frowned upon to mix two completely distinct and unrelated changes in the same patch-set.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        app.install_if_needed(packages)"},{"line_number":95,"context_line":"        if device_path:"},{"line_number":96,"context_line":"            #stop and do not update database"},{"line_number":97,"context_line":"            app.stop_db()"},{"line_number":98,"context_line":"            device \u003d volume.VolumeDevice(device_path)"},{"line_number":99,"context_line":"            device.format()"},{"line_number":100,"context_line":"            if os.path.exists(CONF.mount_point):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbWY%3D","line":97,"in_reply_to":"AAAATn%2F%2FfKU%3D","updated":"2013-11-06 12:17:04.000000000","message":"device mount runs not depends on existing directory. for safety will good to stop db first.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(CONF.mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjO4%3D","line":104,"updated":"2013-11-01 15:02:26.000000000","message":"if we relaying on multiple datastores, should we make mount point a dictionary which would bring moun point per service type","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"834320953f6dce88cf2bb82d8182de6d5dad7fa5","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(CONF.mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FLBc%3D","line":104,"in_reply_to":"AAAATn%2F%2FRvc%3D","updated":"2013-11-13 11:43:16.000000000","message":"i tried to catch any logic with mount points, but no sense\n\nill rollback it in next PS","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"f2b65d3e6ba00d218ae2285a3411c75cc7629618","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(CONF.mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FRvc%3D","line":104,"in_reply_to":"AAAATn%2F%2FbW8%3D","updated":"2013-11-11 20:53:52.000000000","message":"Then why was the original behavior of using the passed parameter changed?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(CONF.mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfKY%3D","line":104,"in_reply_to":"AAAATn%2F%2FjO4%3D","updated":"2013-11-04 22:37:57.000000000","message":"Agreed.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                #rsync exiting data"},{"line_number":102,"context_line":"                device.migrate_data(CONF.mount_point)"},{"line_number":103,"context_line":"            #mount the volume"},{"line_number":104,"context_line":"            device.mount(CONF.mount_point)"},{"line_number":105,"context_line":"            LOG.debug(_(\"Mounted the volume.\"))"},{"line_number":106,"context_line":"            app.start_mysql()"},{"line_number":107,"context_line":"        if backup_id:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbW8%3D","line":104,"in_reply_to":"AAAATn%2F%2FjO4%3D","updated":"2013-11-06 12:17:04.000000000","message":"any mount point differ of \"/var/lib/mysql\" doensnt works now, we have two related bug reports on launchpad, and they are not related to this changes.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"trove/guestagent/datastore/mysql/service.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":622,"context_line":"                MYSQL_SERVICE_CANDIDATES)"},{"line_number":623,"context_line":"            utils.execute_with_timeout(mysql_service[\u0027cmd_disable\u0027],"},{"line_number":624,"context_line":"                                       shell\u003dTrue)"},{"line_number":625,"context_line":"        except KeyError:"},{"line_number":626,"context_line":"            raise RuntimeError(\"Service is not discovered.\")"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"    def stop_db(self, update_db\u003dFalse, do_not_start_on_reboot\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Fvr0%3D","line":625,"updated":"2013-10-29 17:52:33.000000000","message":"except statemant should catch ProcessingError. KeyError could be ignored in here by checking: if not \u0027cmd_disable\u0027 in mysql_service.keys(): raise SomeException (but not KeyError - it\u0027s meaningless for user)","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":623,"context_line":"            utils.execute_with_timeout(mysql_service[\u0027cmd_disable\u0027],"},{"line_number":624,"context_line":"                                       shell\u003dTrue)"},{"line_number":625,"context_line":"        except KeyError:"},{"line_number":626,"context_line":"            raise RuntimeError(\"Service is not discovered.\")"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"    def stop_db(self, update_db\u003dFalse, do_not_start_on_reboot\u003dFalse):"},{"line_number":629,"context_line":"        LOG.info(_(\"Stopping mysql...\"))"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FvrU%3D","line":626,"updated":"2013-10-29 17:52:33.000000000","message":"It would be nice to choose another type of exeception, because RuntimeError has a bit another meaning.","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":633,"context_line":"            mysql_service \u003d operating_system.service_discovery("},{"line_number":634,"context_line":"                MYSQL_SERVICE_CANDIDATES)"},{"line_number":635,"context_line":"            utils.execute_with_timeout(mysql_service[\u0027cmd_stop\u0027], shell\u003dTrue)"},{"line_number":636,"context_line":"        except KeyError:"},{"line_number":637,"context_line":"            raise RuntimeError(\"Service is not discovered.\")"},{"line_number":638,"context_line":"        if not self.status.wait_for_real_status_to_change_to("},{"line_number":639,"context_line":"                rd_instance.ServiceStatuses.SHUTDOWN,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Fvrw%3D","line":636,"updated":"2013-10-29 17:52:33.000000000","message":"Same here","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":634,"context_line":"                MYSQL_SERVICE_CANDIDATES)"},{"line_number":635,"context_line":"            utils.execute_with_timeout(mysql_service[\u0027cmd_stop\u0027], shell\u003dTrue)"},{"line_number":636,"context_line":"        except KeyError:"},{"line_number":637,"context_line":"            raise RuntimeError(\"Service is not discovered.\")"},{"line_number":638,"context_line":"        if not self.status.wait_for_real_status_to_change_to("},{"line_number":639,"context_line":"                rd_instance.ServiceStatuses.SHUTDOWN,"},{"line_number":640,"context_line":"                self.state_change_wait_time, update_db):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2FvrI%3D","line":637,"updated":"2013-10-29 17:52:33.000000000","message":"Same here","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":742,"context_line":"            mysql_service \u003d operating_system.service_discovery("},{"line_number":743,"context_line":"                MYSQL_SERVICE_CANDIDATES)"},{"line_number":744,"context_line":"            utils.execute_with_timeout(mysql_service[\u0027cmd_start\u0027], shell\u003dTrue)"},{"line_number":745,"context_line":"        except KeyError:"},{"line_number":746,"context_line":"            raise RuntimeError(\"Service is not discovered.\")"},{"line_number":747,"context_line":"        if not self.status.wait_for_real_status_to_change_to("},{"line_number":748,"context_line":"                rd_instance.ServiceStatuses.RUNNING,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Fvq8%3D","line":745,"updated":"2013-10-29 17:52:33.000000000","message":"same here","commit_id":"9d8336e43bdb389f8cd0cf91fa0a5447b6e35dbc"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":41,"context_line":"MYSQL_SERVICE_CANDIDATES \u003d [\"mysql\", \"mysqld\", \"mysql-server\"]"},{"line_number":42,"context_line":"MYSQL_BIN_CANDIDATES \u003d [\"/usr/sbin/mysqld\", \"/usr/libexec/mysqld\"]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"# Create a package impl"},{"line_number":46,"context_line":"packager \u003d pkg.Package()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjOA%3D","line":44,"updated":"2013-11-01 15:02:26.000000000","message":"It would be nice to move this constants to datastore/mysql/system.py","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return str(uuid.uuid4())"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def clear_expired_password():"},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":"    Some mysql installations generating random root password"},{"line_number":56,"context_line":"    and saving it in /root/.mysql_secret, this password is"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfKQ%3D","line":53,"updated":"2013-11-04 22:37:57.000000000","message":"This change should be included in a different patch-set. It has nothing to do with multiple service-type support.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d6b17d72a1f173f0d6f620998024fdbbe1ceecf8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return str(uuid.uuid4())"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def clear_expired_password():"},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":"    Some mysql installations generating random root password"},{"line_number":56,"context_line":"    and saving it in /root/.mysql_secret, this password is"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfDM%3D","line":53,"in_reply_to":"AAAATn%2F%2FfKQ%3D","updated":"2013-11-04 22:56:25.000000000","message":"agreed","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    return str(uuid.uuid4())"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def clear_expired_password():"},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":"    Some mysql installations generating random root password"},{"line_number":56,"context_line":"    and saving it in /root/.mysql_secret, this password is"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbVw%3D","line":53,"in_reply_to":"AAAATn%2F%2FfKQ%3D","updated":"2013-11-06 12:17:04.000000000","message":"if we do support of multiple types and versions, we should care of correct package installation. without clearing expired password mysql 5.6 will not works","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":560,"context_line":"            LOG.debug(_(\"Installing mysql server\"))"},{"line_number":561,"context_line":"            # before install, old configs should be removed,"},{"line_number":562,"context_line":"            # coz new version of package can unsupport it."},{"line_number":563,"context_line":"            self._clear_mysql_config()"},{"line_number":564,"context_line":"            # set blank password on pkg configuration stage"},{"line_number":565,"context_line":"            pkg_opts \u003d {\u0027root_password\u0027: \u0027\u0027,"},{"line_number":566,"context_line":"                        \u0027root_password_again\u0027: \u0027\u0027}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfJg%3D","line":563,"updated":"2013-11-04 22:37:57.000000000","message":"This seems extremely bold. Have we considered parking the files somewhere for a rollback scenario? From what I see, if the user passes a garbage pkg by accident, say \u0027msql-server-5.5\u0027 vs. \u0027mysql-server-5.5\u0027, the pkg_install will barf, leaving the database completely offline. Or better yet, why not validate that the packages exist in the repo before attempting anything?","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"7f483b532e6e530151e2788bf210fee0654f2280","unresolved":false,"context_lines":[{"line_number":560,"context_line":"            LOG.debug(_(\"Installing mysql server\"))"},{"line_number":561,"context_line":"            # before install, old configs should be removed,"},{"line_number":562,"context_line":"            # coz new version of package can unsupport it."},{"line_number":563,"context_line":"            self._clear_mysql_config()"},{"line_number":564,"context_line":"            # set blank password on pkg configuration stage"},{"line_number":565,"context_line":"            pkg_opts \u003d {\u0027root_password\u0027: \u0027\u0027,"},{"line_number":566,"context_line":"                        \u0027root_password_again\u0027: \u0027\u0027}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FbVg%3D","line":563,"in_reply_to":"AAAATn%2F%2FfJg%3D","updated":"2013-11-06 12:17:04.000000000","message":"1. for example using centos, be default here can be configs for mysql 5.1 which is not compatible with 5.5 (wich will be installed), so need to remove old configs before install.\n2. user can do \"rm -rf /\", trove is not panacea.\n3. some conflicts can occurs due install even if all checks passed (like file conflicts)","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"2679b6b4168856e7e395cdbe0002e8a93f9e9076","unresolved":false,"context_lines":[{"line_number":717,"context_line":"        try:"},{"line_number":718,"context_line":"            utils.execute_with_timeout(system."},{"line_number":719,"context_line":"                                       MYSQL_CMD_START, shell\u003dTrue)"},{"line_number":720,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":721,"context_line":"            # it seems mysql (percona, at least) might come back with [Fail]"},{"line_number":722,"context_line":"            # but actually come up ok. we\u0027re looking into the timing issue on"},{"line_number":723,"context_line":"            # parallel, but for now, we\u0027d like to give it one more chance to"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2B5gc%3D","side":"PARENT","line":720,"updated":"2013-11-18 20:47:20.000000000","message":"Why are we no longer catching this error?  We need to ensure that this does not break, otherwise Percona which seems to always exceed this timeout will never go active.","commit_id":"4455746d657f0a2fe47a9782d7c20aad1aa708a8"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def clear_expired_password():"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Some mysql installations generating random root password"},{"line_number":57,"context_line":"    and saving it in /root/.mysql_secret, this password is"},{"line_number":58,"context_line":"    expired and should be changed by client that supports expired passwords."},{"line_number":59,"context_line":"    \"\"\""},{"line_number":60,"context_line":"    LOG.debug(\"Removing expired password.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FESk%3D","line":57,"updated":"2013-11-14 22:22:46.000000000","message":"\"and save it in...\"","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":602,"context_line":"        random_uuid \u003d str(uuid.uuid4())"},{"line_number":603,"context_line":"        configs \u003d [\"/etc/my.cnf\", \"/etc/mysql/conf.d\", \"/etc/mysql/my.cnf\"]"},{"line_number":604,"context_line":"        for config in configs:"},{"line_number":605,"context_line":"            command \u003d \"mv %s %s_%s\" % (config, config, random_uuid)"},{"line_number":606,"context_line":"            try:"},{"line_number":607,"context_line":"                utils.execute_with_timeout(command, shell\u003dTrue,"},{"line_number":608,"context_line":"                                           root_helper\u003d\"sudo\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FESA%3D","line":605,"updated":"2013-11-14 22:22:46.000000000","message":"do we never remove the config_randomUUID? Shouldnt we remove these instead of just moving them?","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":561,"context_line":"            LOG.debug(_(\"Installing mysql server\"))"},{"line_number":562,"context_line":"            # before install, old configs should be removed,"},{"line_number":563,"context_line":"            # coz new version of package can unsupport it."},{"line_number":564,"context_line":"            self._clear_mysql_config()"},{"line_number":565,"context_line":"            # set blank password on pkg configuration stage"},{"line_number":566,"context_line":"            pkg_opts \u003d {\u0027root_password\u0027: \u0027\u0027,"},{"line_number":567,"context_line":"                        \u0027root_password_again\u0027: \u0027\u0027}"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAPE%3D","line":564,"updated":"2013-11-15 21:11:41.000000000","message":"clear_mysql_config was updated to move \"old\" cnfs during an install, so why not return the uuid and in the scenario in which packager.pkg_install() fails, you copy back over the \"old\" cnfs (aka attempt to perform a rollback).","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":561,"context_line":"            LOG.debug(_(\"Installing mysql server\"))"},{"line_number":562,"context_line":"            # before install, old configs should be removed,"},{"line_number":563,"context_line":"            # coz new version of package can unsupport it."},{"line_number":564,"context_line":"            self._clear_mysql_config()"},{"line_number":565,"context_line":"            # set blank password on pkg configuration stage"},{"line_number":566,"context_line":"            pkg_opts \u003d {\u0027root_password\u0027: \u0027\u0027,"},{"line_number":567,"context_line":"                        \u0027root_password_again\u0027: \u0027\u0027}"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2Bk%3D","line":564,"in_reply_to":"AAAATn%2F%2FAPE%3D","updated":"2013-11-15 22:29:14.000000000","message":"need to discuss","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":597,"context_line":"            if secure_remote_root:"},{"line_number":598,"context_line":"                self._remove_remote_root_access(client)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def _clear_mysql_config(self):"},{"line_number":601,"context_line":"        LOG.debug(\"Clearing old mysql config\")"},{"line_number":602,"context_line":"        random_uuid \u003d str(uuid.uuid4())"},{"line_number":603,"context_line":"        configs \u003d [\"/etc/my.cnf\", \"/etc/mysql/conf.d\", \"/etc/mysql/my.cnf\"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FAPM%3D","line":600,"updated":"2013-11-15 21:11:41.000000000","message":"please add a docstring to this method explaining the purpose (to move old cnfs for easy recovery)","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":597,"context_line":"            if secure_remote_root:"},{"line_number":598,"context_line":"                self._remove_remote_root_access(client)"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def _clear_mysql_config(self):"},{"line_number":601,"context_line":"        LOG.debug(\"Clearing old mysql config\")"},{"line_number":602,"context_line":"        random_uuid \u003d str(uuid.uuid4())"},{"line_number":603,"context_line":"        configs \u003d [\"/etc/my.cnf\", \"/etc/mysql/conf.d\", \"/etc/mysql/my.cnf\"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2Bc%3D","line":600,"in_reply_to":"AAAATn%2F%2FAPM%3D","updated":"2013-11-15 22:29:14.000000000","message":"Done","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":1925,"name":"Vipul Sabhaya","email":"vipuls@gmail.com","username":"vipuls"},"change_message_id":"af2514acd7da8869054eb0cb6f9a15b5348b5a33","unresolved":false,"context_lines":[{"line_number":717,"context_line":"        try:"},{"line_number":718,"context_line":"            utils.execute_with_timeout(system."},{"line_number":719,"context_line":"                                       MYSQL_CMD_START, shell\u003dTrue)"},{"line_number":720,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":721,"context_line":"            # it seems mysql (percona, at least) might come back with [Fail]"},{"line_number":722,"context_line":"            # but actually come up ok. we\u0027re looking into the timing issue on"},{"line_number":723,"context_line":"            # parallel, but for now, we\u0027d like to give it one more chance to"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2B5dw%3D","side":"PARENT","line":720,"updated":"2013-11-18 20:52:11.000000000","message":"Why are we no longer catching this error? We need to ensure that this does not break, otherwise Percona which seems to always exceed this timeout will never go active.","commit_id":"12f2b0d47c6183a8988774b0002f8c070906455b"}],"trove/guestagent/datastore/mysql/system.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","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 (c) 2011 OpenStack Foundation"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Fvqs%3D","side":"PARENT","line":1,"updated":"2013-10-29 17:52:33.000000000","message":"Why not to store mysql deployment specific stuff in here and keep manager more clean and readable ?","commit_id":"8f88998d4090ebf8a4f15211eaf4219fb6bfc186"}],"trove/guestagent/manager/mysql_service.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              \"cmd_stop\": None,"},{"line_number":51,"context_line":"              \"cmd_enable\": None,"},{"line_number":52,"context_line":"              \"cmd_disable\": None}"},{"line_number":53,"context_line":"    for bin in bin_candidates:"},{"line_number":54,"context_line":"        if os.path.isfile(bin):"},{"line_number":55,"context_line":"            result[\u0027bin\u0027] \u003d bin"},{"line_number":56,"context_line":"            break"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSSM%3D","line":53,"updated":"2013-09-30 22:02:33.000000000","message":"I understand what is happening here, but plz add comments to tell people you are finding the \"one\" of them that is actually a file on the filesystem","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":50,"context_line":"              \"cmd_stop\": None,"},{"line_number":51,"context_line":"              \"cmd_enable\": None,"},{"line_number":52,"context_line":"              \"cmd_disable\": None}"},{"line_number":53,"context_line":"    for bin in bin_candidates:"},{"line_number":54,"context_line":"        if os.path.isfile(bin):"},{"line_number":55,"context_line":"            result[\u0027bin\u0027] \u003d bin"},{"line_number":56,"context_line":"            break"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRPE%3D","line":53,"in_reply_to":"AAAAS3%2F%2FSSM%3D","updated":"2013-10-01 07:18:29.000000000","message":"Done","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    return str(uuid.uuid4())"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def clear_secret_password():"},{"line_number":105,"context_line":"    \"\"\""},{"line_number":106,"context_line":"    Some mysql installations generating random root password"},{"line_number":107,"context_line":"    and saving it in /root/.mysql_secret, this password is"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSKg%3D","line":104,"updated":"2013-09-30 22:02:33.000000000","message":"Hmm i was not aware of this. Wouldnt it make more sense to just put the mysql root password in a conf.d file?","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    return str(uuid.uuid4())"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def clear_secret_password():"},{"line_number":105,"context_line":"    \"\"\""},{"line_number":106,"context_line":"    Some mysql installations generating random root password"},{"line_number":107,"context_line":"    and saving it in /root/.mysql_secret, this password is"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FRO0%3D","line":104,"in_reply_to":"AAAAS3%2F%2FSKg%3D","updated":"2013-10-01 07:18:29.000000000","message":"this is expired password. it should be changed my mysqladmin. and to create os_admin we need root access without password.","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":710,"context_line":"    def install_if_needed(self, packages):"},{"line_number":711,"context_line":"        \"\"\"Prepare the guest machine with a secure mysql server installation\"\"\""},{"line_number":712,"context_line":"        LOG.info(_(\"Preparing Guest as MySQL Server\"))"},{"line_number":713,"context_line":"        if not packager.pkg_is_installed(packages):"},{"line_number":714,"context_line":"            LOG.debug(_(\"Installing mysql server\"))"},{"line_number":715,"context_line":"            packager.pkg_install(packages, self.TIME_OUT)"},{"line_number":716,"context_line":"            self._create_mysql_confd_dir()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSKY%3D","line":713,"updated":"2013-09-30 22:02:33.000000000","message":"nice cleanup here.","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":758,"context_line":"        utils.execute_with_timeout(mysql_service.get(\u0027cmd_enable\u0027), shell\u003dTrue)"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"    def _disable_mysql_on_boot(self):"},{"line_number":761,"context_line":"        utils.execute_with_timeout(mysql_service.get(\u0027cmd_disable\u0027),"},{"line_number":762,"context_line":"                                   shell\u003dTrue)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def stop_db(self, update_db\u003dFalse, do_not_start_on_reboot\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSKM%3D","line":761,"updated":"2013-09-30 22:02:33.000000000","message":"Do you think we should use .get, or just [\u0027cmd_disable\u0027]... it seems to me that it would fail miserably if it cant find mysql_service.get(\u0027blah\u0027) anyway, right? Why not make the error message easier to understand, like KeyError instead of whatever utils.execute_with_timeout(None..) throws.\n\nThere are a few instances of this in the module","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":758,"context_line":"        utils.execute_with_timeout(mysql_service.get(\u0027cmd_enable\u0027), shell\u003dTrue)"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"    def _disable_mysql_on_boot(self):"},{"line_number":761,"context_line":"        utils.execute_with_timeout(mysql_service.get(\u0027cmd_disable\u0027),"},{"line_number":762,"context_line":"                                   shell\u003dTrue)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def stop_db(self, update_db\u003dFalse, do_not_start_on_reboot\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FROs%3D","line":761,"in_reply_to":"AAAAS3%2F%2FSKM%3D","updated":"2013-10-01 07:18:29.000000000","message":"Done","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"}],"trove/guestagent/pkg.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                raise PkgPackageStateError(\"Packages is in a bad state.\")"},{"line_number":345,"context_line":"        # even after successful install, packages can stay unconfigured"},{"line_number":346,"context_line":"        # config_opts - is dict with name/value for questions asked by"},{"line_number":347,"context_line":"        # interactive configure script"},{"line_number":348,"context_line":"        self._fix_package_selections(packages, config_opts)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def pkg_version(self, package_name):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjNM%3D","line":347,"updated":"2013-11-01 15:02:26.000000000","message":"i suppose, it should be better to make this call by the choise. \"If\" would preferable","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"trove/instance/models.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    service_status \u003d InstanceServiceStatus.find_by(instance_id\u003did)"},{"line_number":321,"context_line":"    LOG.info(\"service status\u003d%s\" % service_status)"},{"line_number":322,"context_line":"    load_instance_service_type(db_info)"},{"line_number":323,"context_line":"    return cls(context, db_info, server, service_status)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSKA%3D","line":322,"updated":"2013-09-30 22:02:33.000000000","message":"Shouldn\u0027t this be in get_db_info() ?","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    type \u003d datastore_type_models.DatastoreType(version.datastore_type_id)"},{"line_number":275,"context_line":"    db_info.datastore_version_name \u003d version.name"},{"line_number":276,"context_line":"    db_info.datastore_type_name \u003d type.name"},{"line_number":277,"context_line":"    db_info.datastore_engine \u003d type.engine"},{"line_number":278,"context_line":"    return db_info"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9Z8%3D","line":277,"updated":"2013-10-23 16:54:59.000000000","message":"Is it necessary to store both the type_name and engine in the instances table?","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    type \u003d datastore_type_models.DatastoreType(version.datastore_type_id)"},{"line_number":275,"context_line":"    db_info.datastore_version_name \u003d version.name"},{"line_number":276,"context_line":"    db_info.datastore_type_name \u003d type.name"},{"line_number":277,"context_line":"    db_info.datastore_engine \u003d type.engine"},{"line_number":278,"context_line":"    return db_info"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8Wo%3D","line":277,"in_reply_to":"AAAATX%2F%2F9W0%3D","updated":"2013-10-23 21:37:28.000000000","message":"Ok, I see it now.\n\nI don\u0027t think these extra fields should be stuck onto the db_info, since until now that\u0027s been all info from the database. See my comments below.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    type \u003d datastore_type_models.DatastoreType(version.datastore_type_id)"},{"line_number":275,"context_line":"    db_info.datastore_version_name \u003d version.name"},{"line_number":276,"context_line":"    db_info.datastore_type_name \u003d type.name"},{"line_number":277,"context_line":"    db_info.datastore_engine \u003d type.engine"},{"line_number":278,"context_line":"    return db_info"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9W0%3D","line":277,"in_reply_to":"AAAATX%2F%2F9Z8%3D","updated":"2013-10-23 17:04:07.000000000","message":"in instances table stores only version_id. and this function loads appropriate type and names","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        db_info \u003d DBInstance.find_by(context\u003dcontext, id\u003did, deleted\u003dFalse)"},{"line_number":288,"context_line":"    except exception.NotFound:"},{"line_number":289,"context_line":"        raise exception.NotFound(uuid\u003did)"},{"line_number":290,"context_line":"    load_instance_datastore_type(db_info)"},{"line_number":291,"context_line":"    return db_info"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8WI%3D","line":290,"updated":"2013-10-23 21:37:28.000000000","message":"Please don\u0027t add extra stuff onto \"db_info\" as that object is just for representing the Instances table row.\n\nInstead, grab the DatastoreVersion and save it as a property for the SimpleInstance class.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        db_info \u003d DBInstance.find_by(context\u003dcontext, id\u003did, deleted\u003dFalse)"},{"line_number":288,"context_line":"    except exception.NotFound:"},{"line_number":289,"context_line":"        raise exception.NotFound(uuid\u003did)"},{"line_number":290,"context_line":"    load_instance_datastore_type(db_info)"},{"line_number":291,"context_line":"    return db_info"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8N8%3D","line":290,"in_reply_to":"AAAATX%2F%2F8WI%3D","updated":"2013-10-23 22:06:14.000000000","message":"ill try research different way","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":494,"context_line":""},{"line_number":495,"context_line":"            db_info.datastore_type_name \u003d datastore_type.name"},{"line_number":496,"context_line":"            db_info.datastore_version_name \u003d datastore_version.name"},{"line_number":497,"context_line":"            db_info.datastore_engine \u003d datastore_type.engine"},{"line_number":498,"context_line":"            service_status \u003d InstanceServiceStatus.create("},{"line_number":499,"context_line":"                instance_id\u003ddb_info.id,"},{"line_number":500,"context_line":"                status\u003drd_instance.ServiceStatuses.NEW)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8WE%3D","line":497,"updated":"2013-10-23 21:37:28.000000000","message":"Again, please keep this seperated from the existing db_info variable, as that relates to the db info from the Instances table.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.version \u003d (datastore_type_models.DatastoreVersion."},{"line_number":126,"context_line":"                        load(self.db_info.datastore_version_id))"},{"line_number":127,"context_line":"        self.type \u003d (datastore_type_models.DatastoreType."},{"line_number":128,"context_line":"                     load(self.version.datastore_type_id))"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def addresses(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F32g%3D","line":128,"updated":"2013-10-25 21:06:20.000000000","message":"Thanks for the change, I think this will be much easier to manage.","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @property"},{"line_number":235,"context_line":"    def datastore_version(self):"},{"line_number":236,"context_line":"        return self.version"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    @property"},{"line_number":239,"context_line":"    def datastore_type(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F32s%3D","line":236,"updated":"2013-10-25 21:06:20.000000000","message":"Great!","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"}],"trove/instance/service.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":180,"context_line":"        LOG.info(_(\"body : \u0027%s\u0027\\n\\n\") % body)"},{"line_number":181,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":182,"context_line":"        service_type_id \u003d body[\u0027instance\u0027].get(\u0027service_type_id\u0027)"},{"line_number":183,"context_line":"        service_type \u003d service_type_models.ServiceType(service_type_id)"},{"line_number":184,"context_line":"        if not service_type:"},{"line_number":185,"context_line":"            raise exception.BadRequest(_(\"Service type not found.\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSJs%3D","line":182,"updated":"2013-09-30 22:02:33.000000000","message":"I think we would need a default here. We spoke about this on IRC.","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        LOG.info(_(\"req : \u0027%s\u0027\\n\\n\") % req)"},{"line_number":180,"context_line":"        LOG.info(_(\"body : \u0027%s\u0027\\n\\n\") % body)"},{"line_number":181,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":182,"context_line":"        service_type_id \u003d body[\u0027instance\u0027].get(\u0027service_type_id\u0027)"},{"line_number":183,"context_line":"        service_type \u003d service_type_models.ServiceType(service_type_id)"},{"line_number":184,"context_line":"        if not service_type:"},{"line_number":185,"context_line":"            raise exception.BadRequest(_(\"Service type not found.\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FROc%3D","line":182,"in_reply_to":"AAAAS3%2F%2FSJs%3D","updated":"2013-10-01 07:18:29.000000000","message":"Done","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"e305f0c12cacadf3df093b47626462b705183d37","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                raise exception.BadRequest(_(\"Specify service type version\"))"},{"line_number":200,"context_line":"            else:"},{"line_number":201,"context_line":"                service_version \u003d active_versions.first()"},{"line_number":202,"context_line":"        image_id \u003d service_type.image_id"},{"line_number":203,"context_line":"        if service_version.image_id:"},{"line_number":204,"context_line":"            image_id \u003d service_version.image_id"},{"line_number":205,"context_line":"        service_engine \u003d service_type.engine"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FSJo%3D","line":202,"updated":"2013-09-30 22:02:33.000000000","message":"All of this code could be in a model. And then checks/raise could be here.","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"5f40c579ada9e46e32cfd266caa53db409eb21ad","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                raise exception.BadRequest(_(\"Specify service type version\"))"},{"line_number":200,"context_line":"            else:"},{"line_number":201,"context_line":"                service_version \u003d active_versions.first()"},{"line_number":202,"context_line":"        image_id \u003d service_type.image_id"},{"line_number":203,"context_line":"        if service_version.image_id:"},{"line_number":204,"context_line":"            image_id \u003d service_version.image_id"},{"line_number":205,"context_line":"        service_engine \u003d service_type.engine"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FROY%3D","line":202,"in_reply_to":"AAAAS3%2F%2FSJo%3D","updated":"2013-10-01 07:18:29.000000000","message":"Done","commit_id":"db510a8d70ab547bd8eba265e88c85cc1e9ea87a"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"4018b7d84a2ca25ba01e1f65d166acb23bdca143","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        datastore_type, datastore_version \u003d \\"},{"line_number":183,"context_line":"            datastore_type_models.get_datastore_type_version(body[\u0027instance\u0027]."},{"line_number":184,"context_line":"                                                             get(\u0027datastore\u0027,"},{"line_number":185,"context_line":"                                                                 {}))"},{"line_number":186,"context_line":"        image_id \u003d (datastore_version.image_id or datastore_type.image_id)"},{"line_number":187,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"},{"line_number":188,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9Zs%3D","line":185,"updated":"2013-10-23 16:54:59.000000000","message":"Is this being passed into the instance create call yet?","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        datastore_type, datastore_version \u003d \\"},{"line_number":183,"context_line":"            datastore_type_models.get_datastore_type_version(body[\u0027instance\u0027]."},{"line_number":184,"context_line":"                                                             get(\u0027datastore\u0027,"},{"line_number":185,"context_line":"                                                                 {}))"},{"line_number":186,"context_line":"        image_id \u003d (datastore_version.image_id or datastore_type.image_id)"},{"line_number":187,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"},{"line_number":188,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8Ws%3D","line":185,"in_reply_to":"AAAATX%2F%2F9Wg%3D","updated":"2013-10-23 21:37:28.000000000","message":"Ok, I missed it earlier. I see it now.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"6031f670d724fb3359c0835ddcc37cfeca44736a","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        datastore_type, datastore_version \u003d \\"},{"line_number":183,"context_line":"            datastore_type_models.get_datastore_type_version(body[\u0027instance\u0027]."},{"line_number":184,"context_line":"                                                             get(\u0027datastore\u0027,"},{"line_number":185,"context_line":"                                                                 {}))"},{"line_number":186,"context_line":"        image_id \u003d (datastore_version.image_id or datastore_type.image_id)"},{"line_number":187,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"},{"line_number":188,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F9Wg%3D","line":185,"in_reply_to":"AAAATX%2F%2F9Zs%3D","updated":"2013-10-23 17:04:07.000000000","message":"\"datastore\" is new optional object in body","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        datastore_type, datastore_version \u003d \\"},{"line_number":183,"context_line":"            datastore_type_models.get_datastore_type_version(body[\u0027instance\u0027]."},{"line_number":184,"context_line":"                                                             get(\u0027datastore\u0027,"},{"line_number":185,"context_line":"                                                                 {}))"},{"line_number":186,"context_line":"        image_id \u003d (datastore_version.image_id or datastore_type.image_id)"},{"line_number":187,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"},{"line_number":188,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3yU%3D","line":185,"updated":"2013-10-25 21:06:20.000000000","message":"Try this instead:\n\ndatastore_args \u003d body[\u0027instance\u0027].get(\u0027datastore\u0027, {})\n datastore_type, datastore_version \u003d \\         datastore_type_models.get_datastore_type_version(**datastore_args)\n\n\nThis will cause the dictionary keys to be passed as keyword args to the get_datastore_type_version which should make that function clearer.","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"bf98a7b570b7eba7d1c22cf5ed91c0d6305f063b","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        datastore_type, datastore_version \u003d \\"},{"line_number":183,"context_line":"            datastore_type_models.get_datastore_type_version(body[\u0027instance\u0027]."},{"line_number":184,"context_line":"                                                             get(\u0027datastore\u0027,"},{"line_number":185,"context_line":"                                                                 {}))"},{"line_number":186,"context_line":"        image_id \u003d (datastore_version.image_id or datastore_type.image_id)"},{"line_number":187,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"},{"line_number":188,"context_line":"        flavor_ref \u003d body[\u0027instance\u0027][\u0027flavorRef\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F3wI%3D","line":185,"in_reply_to":"AAAATn%2F%2F3yU%3D","updated":"2013-10-25 21:51:29.000000000","message":"ok","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"2ddea65fdcb0bf0ea751234e114c8e0337a1c9ab","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        LOG.info(_(\"body : \u0027%s\u0027\\n\\n\") % body)"},{"line_number":181,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":182,"context_line":"        datastore_args \u003d body[\u0027instance\u0027].get(\u0027datastore\u0027, {})"},{"line_number":183,"context_line":"        datastore, datastore_version \u003d \\"},{"line_number":184,"context_line":"            datastore_models.get_datastore_version(**datastore_args)"},{"line_number":185,"context_line":"        image_id \u003d (datastore_version.image_id or datastore.image_id)"},{"line_number":186,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FjMU%3D","line":183,"updated":"2013-11-01 15:02:26.000000000","message":"please, follow Google pythonic coding style, do not use indent \\","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"49e37a433268420f39ae9f71dc42bcebcb687f3f","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        LOG.info(_(\"body : \u0027%s\u0027\\n\\n\") % body)"},{"line_number":181,"context_line":"        context \u003d req.environ[wsgi.CONTEXT_KEY]"},{"line_number":182,"context_line":"        datastore_args \u003d body[\u0027instance\u0027].get(\u0027datastore\u0027, {})"},{"line_number":183,"context_line":"        datastore, datastore_version \u003d \\"},{"line_number":184,"context_line":"            datastore_models.get_datastore_version(**datastore_args)"},{"line_number":185,"context_line":"        image_id \u003d (datastore_version.image_id or datastore.image_id)"},{"line_number":186,"context_line":"        name \u003d body[\u0027instance\u0027][\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2FfJM%3D","line":183,"in_reply_to":"AAAATn%2F%2FjMU%3D","updated":"2013-11-04 22:37:57.000000000","message":"Agreed.","commit_id":"6feab22cf41e8859caf35fa186a6276d4199f7b5"}],"trove/taskmanager/models.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        if server:"},{"line_number":188,"context_line":"            self._guest_prepare(server, flavor[\u0027ram\u0027], volume_info,"},{"line_number":189,"context_line":"                                packages, databases, users, backup_id,"},{"line_number":190,"context_line":"                                config.config_contents, root_password)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if not self.db_info.task_status.is_error:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8TM%3D","line":189,"updated":"2013-10-23 21:37:28.000000000","message":"Rather than splitting this out into a list in the API daemon, it would be easier to follow if that either happened here or was a helper method on the SimpleInstance class in trove/instance/models.py.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        if server:"},{"line_number":188,"context_line":"            self._guest_prepare(server, flavor[\u0027ram\u0027], volume_info,"},{"line_number":189,"context_line":"                                packages, databases, users, backup_id,"},{"line_number":190,"context_line":"                                config.config_contents, root_password)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if not self.db_info.task_status.is_error:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8OA%3D","line":189,"in_reply_to":"AAAATX%2F%2F8TM%3D","updated":"2013-10-23 22:06:14.000000000","message":"Done","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"75d78d8a6af0b26f459be2beb30dfcb7770965ed","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            utils.poll_until(self._service_is_active,"},{"line_number":214,"context_line":"                             sleep_time\u003dUSAGE_SLEEP_TIME,"},{"line_number":215,"context_line":"                             time_out\u003dUSAGE_TIMEOUT)"},{"line_number":216,"context_line":"            inst_models.load_instance_datastore_type(self.db_info)"},{"line_number":217,"context_line":"            self.send_usage_event(\u0027create\u0027, instance_size\u003dflavor[\u0027ram\u0027])"},{"line_number":218,"context_line":"        except PollTimeOut:"},{"line_number":219,"context_line":"            LOG.error(_(\"Timeout for service changing to active. \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8TU%3D","line":216,"updated":"2013-10-23 21:37:28.000000000","message":"If this gets loaded again anyway, why send in the various type info? Just pass the datastore_type version ID and load it again at the top of this function. Or even better, let the line \"instance_tasks \u003d FreshInstanceTasks.load(context, instance_id)\" on line 87 of trove/taskmanager/manager.py do it.","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"2ebcfdb2226cd08b608777f2453ba7704a7e8a4b","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            utils.poll_until(self._service_is_active,"},{"line_number":214,"context_line":"                             sleep_time\u003dUSAGE_SLEEP_TIME,"},{"line_number":215,"context_line":"                             time_out\u003dUSAGE_TIMEOUT)"},{"line_number":216,"context_line":"            inst_models.load_instance_datastore_type(self.db_info)"},{"line_number":217,"context_line":"            self.send_usage_event(\u0027create\u0027, instance_size\u003dflavor[\u0027ram\u0027])"},{"line_number":218,"context_line":"        except PollTimeOut:"},{"line_number":219,"context_line":"            LOG.error(_(\"Timeout for service changing to active. \""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATX%2F%2F8OE%3D","line":216,"in_reply_to":"AAAATX%2F%2F8TU%3D","updated":"2013-10-23 22:06:14.000000000","message":"this info needs for send usage events","commit_id":"55e6b0d5f395ca02d3d3be7371b8cfb44e5d7b16"}],"trove/templates/percona.config.template":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"7b1bde78f30a416e2165f15a8763175948e8ac20","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[client]"},{"line_number":2,"context_line":"port \u003d 3306"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[mysqld_safe]"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F%2Fvn4%3D","side":"PARENT","line":1,"updated":"2013-10-29 17:52:33.000000000","message":"why is this one delete ?","commit_id":"8f88998d4090ebf8a4f15211eaf4219fb6bfc186"}],"trove/tests/api/datastore_types.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"e246a1efdba0acabfeb1395e17a5a30bee240fe2","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @test"},{"line_number":48,"context_line":"    def test_datastore_type_list_attrs(self):"},{"line_number":49,"context_line":"        expected_attrs \u003d [\u0027id\u0027, \u0027name\u0027, \u0027links\u0027]"},{"line_number":50,"context_line":"        types \u003d self.rd_client.datastore_types.list()"},{"line_number":51,"context_line":"        attrcheck \u003d AttrCheck()"},{"line_number":52,"context_line":"        for type in types:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FwMs%3D","line":49,"updated":"2013-10-29 14:56:21.000000000","message":"The AttrCheck class is pretty ok, but if you use TypeCheck, a class found next to AttrCheck, you can use \"has_field\" which will also verify the type. I think it would be worth it to confirm that these come back as strings now, so if we accidentally change that in the future (and break the API) the tests will catch it.\n\nThis commend applies to datastore versions as well.","commit_id":"a1aa51e577165293f30cdab5e4257f1ad01c8c55"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"e246a1efdba0acabfeb1395e17a5a30bee240fe2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        type_dict \u003d type._info"},{"line_number":65,"context_line":"        attrcheck.attrs_exist(type_dict, expected_attrs,"},{"line_number":66,"context_line":"                              msg\u003d\"Type Get\")"},{"line_number":67,"context_line":"        attrcheck.links(type_dict[\u0027links\u0027])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @test"},{"line_number":70,"context_line":"    def test_datastore_type_not_found(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FwOc%3D","line":67,"updated":"2013-10-29 14:56:21.000000000","message":"If the datastore_type name or ID is already being stored in test config, why not actually check that it matches what is returned?","commit_id":"a1aa51e577165293f30cdab5e4257f1ad01c8c55"},{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"e246a1efdba0acabfeb1395e17a5a30bee240fe2","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        version_dict \u003d version._info"},{"line_number":97,"context_line":"        attrcheck.attrs_exist(version_dict, expected_attrs,"},{"line_number":98,"context_line":"                              msg\u003d\"Version Get\")"},{"line_number":99,"context_line":"        attrcheck.links(version_dict[\u0027links\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test"},{"line_number":102,"context_line":"    def test_datastore_version_not_found(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FwOM%3D","line":99,"updated":"2013-10-29 14:56:21.000000000","message":"Similarly, since the dbaas_datastore_version is in the test config, you should check that the version string is identical here.","commit_id":"a1aa51e577165293f30cdab5e4257f1ad01c8c55"}],"trove/tests/api/datastores.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"aea6beeab71d1d346f394623c0b294149c4a3541","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            assert_raises(exceptions.NotFound,"},{"line_number":99,"context_line":"                          self.rd_client.datastore_versions.get,"},{"line_number":100,"context_line":"                          \"nonexistent\","},{"line_number":101,"context_line":"                          \"nonexistent\")"},{"line_number":102,"context_line":"        except exceptions.BadRequest as e:"},{"line_number":103,"context_line":"            assert_equal(e.message,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2FEQY%3D","line":100,"updated":"2013-11-14 22:22:46.000000000","message":"since this \"nonexistent\" is used over and over, lets make it a constant.","commit_id":"bd088e2992b22cd7a64f47e046d9ae6aac365390"}],"trove/tests/api/mgmt/malformed_json.py":[{"author":{"_account_id":694,"name":"Tim Simpson","email":"tim.simpson@rackspace.com","username":"tim-simpson"},"change_message_id":"3c44bb3921d488ac13a7791da6cba2ffc908f84e","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                             \" u\u0027%s\u0027 does not match \u0027^.*[0-9a-zA-Z]+.*$\u0027; \""},{"line_number":285,"context_line":"                             \"instance[\u0027datastore\u0027][\u0027version\u0027] u\u0027%s\u0027 does not\""},{"line_number":286,"context_line":"                             \" match \u0027^.*[0-9a-zA-Z]+.*$\u0027\" %"},{"line_number":287,"context_line":"                             (datastore_type, datastore_version))"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    @test"},{"line_number":290,"context_line":"    def test_bad_body_volsize_create_instance(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2F31s%3D","line":287,"updated":"2013-10-25 21:06:20.000000000","message":"Nice!","commit_id":"223988fdaeedb85b0675a061549fed033ac4dee8"}],"trove/tests/unittests/guestagent/test_pkg.py":[{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"a97af5e9667f225419b111638217e7f0135bac4a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class PkgDEBInstallTestCase(testtools.TestCase):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        super(PkgDEBInstallTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2FANk%3D","line":33,"updated":"2013-11-15 21:11:41.000000000","message":"i\u0027m not very confident that pkg.py handles the scenario in which packages is None/empty-string (which is quite possible, considering the user could pre-bake the image with all required packages, and the db model doesn\u0027t enforce NOT NULL on the packages column). please add tests that ensure pkg_is_installed() + others works well with no provided packages.","commit_id":"5df61800394be238c189749515716810a810d0ec"},{"author":{"_account_id":8259,"name":"Andrey Shestakov","email":"ashestakov@mirantis.com","username":"ashestakov"},"change_message_id":"56e5e1fe898085fe24d8ac5d22ed756e5082c96e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class PkgDEBInstallTestCase(testtools.TestCase):"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        super(PkgDEBInstallTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2F%2BU%3D","line":33,"in_reply_to":"AAAATn%2F%2FANk%3D","updated":"2013-11-15 22:29:14.000000000","message":"it should works. but ok, ill add test for this case","commit_id":"5df61800394be238c189749515716810a810d0ec"}]}
