)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"e9c887f81db9bdbcd5c7b3ffe424c1249ca5e2d6","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This change causes the guest agent to move the datadir into a"},{"line_number":16,"context_line":"sub-directory called \"data\" on the mounted volume."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ica628012a5708374d73e5394e370da2514300939"},{"line_number":19,"context_line":"Co-Authored-By: Simon Chang \u003cschang@tesora.com\u003e"},{"line_number":20,"context_line":"Closes-bug: 1370646"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa32b979_f75d427d","line":17,"updated":"2015-06-26 15:32:50.000000000","message":"I think this needs to have a docimpact tag because a deployer should not update to the new default shipped template blindly to their existing instances.","commit_id":"ad42de03d3c3438fe00971d168405075cf1d6b14"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"c98096e6aa994e106e73922a7de9c5b2e1ad1613","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This change causes the guest agent to move the datadir into a"},{"line_number":16,"context_line":"sub-directory called \"data\" on the mounted volume."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ica628012a5708374d73e5394e370da2514300939"},{"line_number":19,"context_line":"Co-Authored-By: Simon Chang \u003cschang@tesora.com\u003e"},{"line_number":20,"context_line":"Closes-bug: 1370646"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"ba3cc151_d9c9305c","line":17,"in_reply_to":"fa32b979_f75d427d","updated":"2015-07-06 13:59:13.000000000","message":"Craig, I\u0027m not clear how the newer config.template would get sent down to an existing instance - isn\u0027t it only sent down on create?","commit_id":"ad42de03d3c3438fe00971d168405075cf1d6b14"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"bf0f7070fb376e662449fb66e18a6bfadc7b32a6","unresolved":false,"context_lines":[{"line_number":15,"context_line":"This change causes the guest agent to move the datadir into a"},{"line_number":16,"context_line":"sub-directory called \"data\" on the mounted volume."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ica628012a5708374d73e5394e370da2514300939"},{"line_number":19,"context_line":"Co-Authored-By: Simon Chang \u003cschang@tesora.com\u003e"},{"line_number":20,"context_line":"Closes-bug: 1370646"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa32b979_05a8028b","line":18,"updated":"2015-06-24 11:34:40.000000000","message":"Original author name missing.\n\nNeed to add Authored-By before Co-Authored-By","commit_id":"ad42de03d3c3438fe00971d168405075cf1d6b14"}],"trove/guestagent/common/operating_system.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"2b16d7476eb3e4273ac3c03dfa65e927d2c45aba","unresolved":false,"context_lines":[{"line_number":492,"context_line":"def update_owner(user, group, path):"},{"line_number":493,"context_line":"    \"\"\""},{"line_number":494,"context_line":"       Changes the owner and group for the path (recursively)"},{"line_number":495,"context_line":"    \"\"\""},{"line_number":496,"context_line":"    utils.execute_with_timeout(\"chown\", \"-R\", \"%s:%s\" % (user, group), path,"},{"line_number":497,"context_line":"                               run_as_root\u003dTrue, root_helper\u003d\"sudo\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_5ee042fa","line":495,"updated":"2015-06-17 06:50:47.000000000","message":"Why do you need a separate function, chown is already there in this module.","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":492,"context_line":"def update_owner(user, group, path):"},{"line_number":493,"context_line":"    \"\"\""},{"line_number":494,"context_line":"       Changes the owner and group for the path (recursively)"},{"line_number":495,"context_line":"    \"\"\""},{"line_number":496,"context_line":"    utils.execute_with_timeout(\"chown\", \"-R\", \"%s:%s\" % (user, group), path,"},{"line_number":497,"context_line":"                               run_as_root\u003dTrue, root_helper\u003d\"sudo\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_d95130da","line":495,"in_reply_to":"fa32b979_5ee042fa","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"}],"trove/guestagent/datastore/mysql/manager.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4e4a0e4460bb765813187e247d185c0642ca67ce","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                          \u0027mysql\u0027,"},{"line_number":137,"context_line":"                                          mount_point)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"            LOG.debug(\"Mounted the volume at %s\" % mount_point)"},{"line_number":140,"context_line":"            # We need to temporarily update the default my.cnf so that"},{"line_number":141,"context_line":"            # mysql will start after the volume is mounted. Later on it"},{"line_number":142,"context_line":"            # will be changed based on the config template and restart."}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c43a17e5","line":139,"updated":"2015-01-17 12:39:25.000000000","message":"please stick a period at the end of this line.","commit_id":"d5e2e468a143ed2334e5cc5a533a6061bd8f7d5c"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4e4a0e4460bb765813187e247d185c0642ca67ce","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # We need to temporarily update the default my.cnf so that"},{"line_number":141,"context_line":"            # mysql will start after the volume is mounted. Later on it"},{"line_number":142,"context_line":"            # will be changed based on the config template and restart."},{"line_number":143,"context_line":"            app.update_overrides(\"[mysqld]\\ndatadir\u003d/var/lib/mysql/data\\n\")"},{"line_number":144,"context_line":"            app.start_mysql()"},{"line_number":145,"context_line":"        if backup_info:"},{"line_number":146,"context_line":"            self._perform_restore(backup_info, context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_64188384","line":143,"updated":"2015-01-17 12:39:25.000000000","message":"there are no less than a dozen places where we use the literal string /var/lib/mysql or /var/lib/mysql/data\n\nWouldn\u0027t it make sense to make it a manifest constant or a conf?","commit_id":"d5e2e468a143ed2334e5cc5a533a6061bd8f7d5c"},{"author":{"_account_id":10440,"name":"Alex Tomic","email":"atomic777@gmail.com","username":"atomic77"},"change_message_id":"b0430d38677b1585b9688524ef9225257ed87fe7","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                device.migrate_data(mount_point, target_subdir\u003d\"data\")"},{"line_number":137,"context_line":"            # mount the volume"},{"line_number":138,"context_line":"            device.mount(mount_point)"},{"line_number":139,"context_line":"            operating_system.update_owner(\u0027mysql\u0027,"},{"line_number":140,"context_line":"                                          \u0027mysql\u0027,"},{"line_number":141,"context_line":"                                          mount_point)"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_4dac33a0","line":139,"updated":"2015-06-16 16:21:17.000000000","message":"Maybe a good idea to extract the owner into a common place?","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"}],"trove/guestagent/datastore/mysql/service.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4e4a0e4460bb765813187e247d185c0642ca67ce","unresolved":false,"context_lines":[{"line_number":431,"context_line":"            ]"},{"line_number":432,"context_line":"            q.tables \u003d [\u0027information_schema.schemata\u0027]"},{"line_number":433,"context_line":"            q.where \u003d [\"schema_name NOT IN (\""},{"line_number":434,"context_line":"                       \"\u0027mysql\u0027, \u0027information_schema\u0027\""},{"line_number":435,"context_line":"                       \")\"]"},{"line_number":436,"context_line":"            q.order \u003d [\u0027schema_name ASC\u0027]"},{"line_number":437,"context_line":"            if limit:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_c411375d","line":434,"updated":"2015-01-17 12:39:25.000000000","message":"I thought there was a concept of ignored db\u0027s?","commit_id":"d5e2e468a143ed2334e5cc5a533a6061bd8f7d5c"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"4e4a0e4460bb765813187e247d185c0642ca67ce","unresolved":false,"context_lines":[{"line_number":766,"context_line":"                (utils."},{"line_number":767,"context_line":"                 execute_with_timeout(\"sudo\", \"rm\", \"-f\","},{"line_number":768,"context_line":"                                      \"%s/data/ib_logfile%d\""},{"line_number":769,"context_line":"                                      % (MYSQL_BASE_DIR, index)))"},{"line_number":770,"context_line":"            except exception.ProcessExecutionError:"},{"line_number":771,"context_line":"                LOG.exception(\"Could not delete logfile.\")"},{"line_number":772,"context_line":"                raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a40eeb3a","line":769,"updated":"2015-01-17 12:39:25.000000000","message":"why not change MYSQL_BASE_DIR to append the /data at the end.","commit_id":"d5e2e468a143ed2334e5cc5a533a6061bd8f7d5c"},{"author":{"_account_id":10440,"name":"Alex Tomic","email":"atomic777@gmail.com","username":"atomic77"},"change_message_id":"b0430d38677b1585b9688524ef9225257ed87fe7","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_8db79bd7","line":448,"updated":"2015-06-16 16:21:17.000000000","message":"Am I missing something -- why was the logic to filter out the ignored databases removed? Was the only reason we needed it for avoiding the problem with the lost+found dir? Looking at the default ignore_dbs cfg we have: \n\n\u0027lost+found\u0027, \u0027#mysql50#lost+found\u0027, \u0027mysql\u0027, \u0027information_schema\u0027","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_3aca234f","line":448,"in_reply_to":"fa32b979_8db79bd7","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"7b3e3c122f8354b4037716ce4a4fd7a3243a123b","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_cc5033d7","line":448,"in_reply_to":"fa32b979_8db79bd7","updated":"2015-06-17 00:39:34.000000000","message":"The lost+found dir exists only at the root of the volume, moving the data into the data subdir will eliminate the need of checking for lost+found. As for \u0027mysql\u0027 and \u0027information_schema\u0027, they have been added to the schema_name check in the where clause below.","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"2b16d7476eb3e4273ac3c03dfa65e927d2c45aba","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_dec3f255","line":448,"in_reply_to":"fa32b979_a7b70839","updated":"2015-06-17 06:50:47.000000000","message":"+1, CONF.ignore_dbs has other important job to filter out any databases that a deployer does not wants to show, so if you want to remove any entry form ignore_dbs, please use conf.","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_7ab3cbe9","line":448,"in_reply_to":"fa32b979_a7b70839","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"9213a07f649cabf413274481332bec8720c5f2b4","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_a7b70839","line":448,"in_reply_to":"fa32b979_cc5033d7","updated":"2015-06-17 00:47:20.000000000","message":"Simon - the \"ignored_database_names\" variable should contain the ones you hardcoded in here. Can you check this again? We should fix the ignore_dbs cfg entry to remove the lost+found stuff","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    def list_databases(self, limit\u003dNone, marker\u003dNone, include_marker\u003dFalse):"},{"line_number":446,"context_line":"        \"\"\"List databases the user created on this mysql instance.\"\"\""},{"line_number":447,"context_line":"        LOG.debug(\"---Listing Databases---\")"},{"line_number":448,"context_line":"        databases \u003d []"},{"line_number":449,"context_line":"        with LocalSqlClient(get_engine()) as client:"},{"line_number":450,"context_line":"            q \u003d sql_query.Query()"},{"line_number":451,"context_line":"            q.columns \u003d ["}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_1acddf65","line":448,"in_reply_to":"fa32b979_dec3f255","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"2b16d7476eb3e4273ac3c03dfa65e927d2c45aba","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            ]"},{"line_number":456,"context_line":"            q.tables \u003d [\u0027information_schema.schemata\u0027]"},{"line_number":457,"context_line":"            q.where \u003d [\"schema_name NOT IN (\""},{"line_number":458,"context_line":"                       \"\u0027mysql\u0027, \u0027information_schema\u0027\""},{"line_number":459,"context_line":"                       \")\"]"},{"line_number":460,"context_line":"            q.order \u003d [\u0027schema_name ASC\u0027]"},{"line_number":461,"context_line":"            if limit:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_5eb7e2f4","line":458,"updated":"2015-06-17 06:50:47.000000000","message":"These need to come from ignore_database_names","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            ]"},{"line_number":456,"context_line":"            q.tables \u003d [\u0027information_schema.schemata\u0027]"},{"line_number":457,"context_line":"            q.where \u003d [\"schema_name NOT IN (\""},{"line_number":458,"context_line":"                       \"\u0027mysql\u0027, \u0027information_schema\u0027\""},{"line_number":459,"context_line":"                       \")\"]"},{"line_number":460,"context_line":"            q.order \u003d [\u0027schema_name ASC\u0027]"},{"line_number":461,"context_line":"            if limit:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_babdd3b8","line":458,"in_reply_to":"fa32b979_5eb7e2f4","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"}],"trove/guestagent/strategies/backup/mysql_impl.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"41b2451dc6a8e5a45dd8e516e059160f2228a0fa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               \u0027 --incremental\u0027"},{"line_number":107,"context_line":"               \u0027 --incremental-lsn\u003d%(lsn)s\u0027"},{"line_number":108,"context_line":"               \u0027 %(extra_opts)s\u0027"},{"line_number":109,"context_line":"               \u0027 /var/lib/mysql/data\u0027"},{"line_number":110,"context_line":"               \u0027 2\u003e/tmp/innobackupex.log\u0027)"},{"line_number":111,"context_line":"        return cmd + self.zip_cmd + self.encrypt_cmd"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_26ff3936","line":109,"updated":"2015-01-21 12:55:40.000000000","message":"what if my.cnf \u0027s datadir is something else, that differes from /var/lib/mysql ?","commit_id":"a497088e820762651bdb98c72af96565a5f53c6a"},{"author":{"_account_id":8214,"name":"Auston McReynolds","email":"amcreynolds@ebaysf.com","username":"amcreynolds"},"change_message_id":"aa93ad6890c56ed949edd6b6647f1294e388cd46","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               \u0027 --incremental\u0027"},{"line_number":107,"context_line":"               \u0027 --incremental-lsn\u003d%(lsn)s\u0027"},{"line_number":108,"context_line":"               \u0027 %(extra_opts)s\u0027"},{"line_number":109,"context_line":"               \u0027 /var/lib/mysql/data\u0027"},{"line_number":110,"context_line":"               \u0027 2\u003e/tmp/innobackupex.log\u0027)"},{"line_number":111,"context_line":"        return cmd + self.zip_cmd + self.encrypt_cmd"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_3810244e","line":109,"in_reply_to":"1a930d6b_26ff3936","updated":"2015-01-21 18:43:12.000000000","message":"fair point, but that looks to be an existing issue, not something that\u0027s introduced as a part of this patch.","commit_id":"a497088e820762651bdb98c72af96565a5f53c6a"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"fdd2d93f1d66a409a2792b232d3dfcecccf3d997","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               \u0027 --incremental\u0027"},{"line_number":107,"context_line":"               \u0027 --incremental-lsn\u003d%(lsn)s\u0027"},{"line_number":108,"context_line":"               \u0027 %(extra_opts)s\u0027"},{"line_number":109,"context_line":"               \u0027 /var/lib/mysql/data\u0027"},{"line_number":110,"context_line":"               \u0027 2\u003e/tmp/innobackupex.log\u0027)"},{"line_number":111,"context_line":"        return cmd + self.zip_cmd + self.encrypt_cmd"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_4fcef284","line":109,"in_reply_to":"1a930d6b_2ee45e0c","updated":"2015-01-22 11:02:15.000000000","message":"as one of possible solution i\u0027d like to have implementation that looks at my.cnf and overriders.cnf for datadir","commit_id":"a497088e820762651bdb98c72af96565a5f53c6a"},{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"71e365b14f4a7c0df04b595bc2b496a349b3ef82","unresolved":false,"context_lines":[{"line_number":106,"context_line":"               \u0027 --incremental\u0027"},{"line_number":107,"context_line":"               \u0027 --incremental-lsn\u003d%(lsn)s\u0027"},{"line_number":108,"context_line":"               \u0027 %(extra_opts)s\u0027"},{"line_number":109,"context_line":"               \u0027 /var/lib/mysql/data\u0027"},{"line_number":110,"context_line":"               \u0027 2\u003e/tmp/innobackupex.log\u0027)"},{"line_number":111,"context_line":"        return cmd + self.zip_cmd + self.encrypt_cmd"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_2ee45e0c","line":109,"in_reply_to":"1a930d6b_3810244e","updated":"2015-01-21 20:11:55.000000000","message":"I agree with Auston and that is how I was viewing it when I did this work. I was going to file another bug (or BP?) about making the directory more configurable (or at least a constant so that this string isn\u0027t repeated throughout the code)","commit_id":"a497088e820762651bdb98c72af96565a5f53c6a"}],"trove/guestagent/strategies/restore/base.py":[{"author":{"_account_id":9746,"name":"Doug Shelley","email":"dougshelley66@gmail.com","username":"dougshelley"},"change_message_id":"725bee37146af937b24ca5b8ed625506b532491f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.location \u003d kwargs.pop(\u0027location\u0027)"},{"line_number":56,"context_line":"        self.checksum \u003d kwargs.pop(\u0027checksum\u0027)"},{"line_number":57,"context_line":"        self.restore_location \u003d kwargs.get(\u0027restore_location\u0027,"},{"line_number":58,"context_line":"                                           \u0027/var/lib/mysql/data\u0027)"},{"line_number":59,"context_line":"        self.restore_cmd \u003d (self.decrypt_cmd +"},{"line_number":60,"context_line":"                            self.unzip_cmd +"},{"line_number":61,"context_line":"                            (self.base_restore_cmd % kwargs))"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_82ce8bb2","line":58,"updated":"2015-06-16 14:57:52.000000000","message":"Shouldn\u0027t this use get_datadir() as well?","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.location \u003d kwargs.pop(\u0027location\u0027)"},{"line_number":56,"context_line":"        self.checksum \u003d kwargs.pop(\u0027checksum\u0027)"},{"line_number":57,"context_line":"        self.restore_location \u003d kwargs.get(\u0027restore_location\u0027,"},{"line_number":58,"context_line":"                                           \u0027/var/lib/mysql/data\u0027)"},{"line_number":59,"context_line":"        self.restore_cmd \u003d (self.decrypt_cmd +"},{"line_number":60,"context_line":"                            self.unzip_cmd +"},{"line_number":61,"context_line":"                            (self.base_restore_cmd % kwargs))"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_3e289b32","line":58,"in_reply_to":"fa32b979_82ce8bb2","updated":"2015-06-20 14:53:36.000000000","message":"I actually think this default should be removed. This base class is being inherited by various datastore implementations, and I don\u0027t think a MySql specific path belongs here.","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"}],"trove/guestagent/strategies/restore/mysql_impl.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"2b16d7476eb3e4273ac3c03dfa65e927d2c45aba","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            self._incremental_restore(parent_location, parent_checksum)"},{"line_number":294,"context_line":"            # for *this* backup set the incremental_dir"},{"line_number":295,"context_line":"            # just use the checksum for the incremental path as it is"},{"line_number":296,"context_line":"            # sufficently unique /var/lib/mysql/data/\u003cchecksum\u003e"},{"line_number":297,"context_line":"            incremental_dir \u003d os.path.join(self.restore_location, checksum)"},{"line_number":298,"context_line":"            operating_system.create_directory(incremental_dir, as_root\u003dTrue)"},{"line_number":299,"context_line":"            command \u003d self._incremental_restore_cmd(incremental_dir)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_be74ee35","line":296,"updated":"2015-06-17 06:50:47.000000000","message":"s/sufficently/sufficiently","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ed7a67128a4ef46f22c3a829789557ff2a2715bc","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            self._incremental_restore(parent_location, parent_checksum)"},{"line_number":294,"context_line":"            # for *this* backup set the incremental_dir"},{"line_number":295,"context_line":"            # just use the checksum for the incremental path as it is"},{"line_number":296,"context_line":"            # sufficently unique /var/lib/mysql/data/\u003cchecksum\u003e"},{"line_number":297,"context_line":"            incremental_dir \u003d os.path.join(self.restore_location, checksum)"},{"line_number":298,"context_line":"            operating_system.create_directory(incremental_dir, as_root\u003dTrue)"},{"line_number":299,"context_line":"            command \u003d self._incremental_restore_cmd(incremental_dir)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_7e314359","line":296,"in_reply_to":"fa32b979_be74ee35","updated":"2015-06-20 14:53:36.000000000","message":"Done","commit_id":"5bc8ba0131b0ecae430a3849685c32c4c37e2d71"}],"trove/tests/unittests/guestagent/test_backups.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ab28db225d36fd10b9045e82d9ba7263b874c287","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        mysql_impl.get_auth_password \u003d self.orig"},{"line_number":100,"context_line":"        utils.execute_with_timeout \u003d self.orig_exec_with_to"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch(\u0027trove.guestagent.strategies.backup.mysql_impl.get_datadir\u0027)"},{"line_number":103,"context_line":"    def test_backup_decrypted_xtrabackup_command(self, mock_datadir):"},{"line_number":104,"context_line":"        mock_datadir.return_value \u003d \u0027/var/lib/mysql/data\u0027"},{"line_number":105,"context_line":"        backupBase.BackupRunner.is_zipped \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_6f0359b9","line":102,"updated":"2015-06-22 12:31:46.000000000","message":"This deserves a place in setup method for the tests","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ea93226bb6497cf4bb1e6e397802da33dd6dacac","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        mysql_impl.get_auth_password \u003d self.orig"},{"line_number":100,"context_line":"        utils.execute_with_timeout \u003d self.orig_exec_with_to"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @mock.patch(\u0027trove.guestagent.strategies.backup.mysql_impl.get_datadir\u0027)"},{"line_number":103,"context_line":"    def test_backup_decrypted_xtrabackup_command(self, mock_datadir):"},{"line_number":104,"context_line":"        mock_datadir.return_value \u003d \u0027/var/lib/mysql/data\u0027"},{"line_number":105,"context_line":"        backupBase.BackupRunner.is_zipped \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_8f953a34","line":102,"in_reply_to":"fa32b979_6f0359b9","updated":"2015-06-24 04:05:07.000000000","message":"Done","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"}],"trove/tests/unittests/guestagent/test_dbaas.py":[{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ab28db225d36fd10b9045e82d9ba7263b874c287","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_get_datadir(self):"},{"line_number":230,"context_line":"        cnf_value \u003d \u0027[mysqld]\\ndatadir\u003d/var/lib/mysql/data\u0027"},{"line_number":231,"context_line":"        dbaas.read_mycnf \u003d Mock(return_value\u003dcnf_value)"},{"line_number":232,"context_line":"        self.assertEqual(\u0027/var/lib/mysql/data\u0027,"},{"line_number":233,"context_line":"                         dbaas.get_datadir(reset_cache\u003dTrue))"},{"line_number":234,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_0f440d19","line":231,"updated":"2015-06-22 12:31:46.000000000","message":"This is not unmocked anywhere","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ea93226bb6497cf4bb1e6e397802da33dd6dacac","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_get_datadir(self):"},{"line_number":230,"context_line":"        cnf_value \u003d \u0027[mysqld]\\ndatadir\u003d/var/lib/mysql/data\u0027"},{"line_number":231,"context_line":"        dbaas.read_mycnf \u003d Mock(return_value\u003dcnf_value)"},{"line_number":232,"context_line":"        self.assertEqual(\u0027/var/lib/mysql/data\u0027,"},{"line_number":233,"context_line":"                         dbaas.get_datadir(reset_cache\u003dTrue))"},{"line_number":234,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_8fc21ae8","line":231,"in_reply_to":"fa32b979_0f440d19","updated":"2015-06-24 04:05:07.000000000","message":"Done","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"}],"trove/tests/unittests/guestagent/test_mysql_manager.py":[{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"b86623734ad7c4f08ac9782e0e90319654578fc6","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        VolumeDevice.format \u003d MagicMock(return_value\u003dNone)"},{"line_number":216,"context_line":"        VolumeDevice.migrate_data \u003d MagicMock(return_value\u003dNone)"},{"line_number":217,"context_line":"        VolumeDevice.mount \u003d MagicMock(return_value\u003dNone)"},{"line_number":218,"context_line":"        mount_points \u003d []"},{"line_number":219,"context_line":"        if is_mounted:"},{"line_number":220,"context_line":"            mount_points \u003d [\u0027/mnt\u0027]"},{"line_number":221,"context_line":"        VolumeDevice.mount_points \u003d MagicMock(return_value\u003dmount_points)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_021dcdbc","line":218,"updated":"2015-06-22 08:58:36.000000000","message":"need to mock operating_system.chmod.","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ea93226bb6497cf4bb1e6e397802da33dd6dacac","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        VolumeDevice.format \u003d MagicMock(return_value\u003dNone)"},{"line_number":216,"context_line":"        VolumeDevice.migrate_data \u003d MagicMock(return_value\u003dNone)"},{"line_number":217,"context_line":"        VolumeDevice.mount \u003d MagicMock(return_value\u003dNone)"},{"line_number":218,"context_line":"        mount_points \u003d []"},{"line_number":219,"context_line":"        if is_mounted:"},{"line_number":220,"context_line":"            mount_points \u003d [\u0027/mnt\u0027]"},{"line_number":221,"context_line":"        VolumeDevice.mount_points \u003d MagicMock(return_value\u003dmount_points)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_edc2ce52","line":218,"in_reply_to":"fa32b979_021dcdbc","updated":"2015-06-24 04:05:07.000000000","message":"Done","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"},{"author":{"_account_id":7806,"name":"Sushil Kumar","email":"skm.net@gmail.com","username":"sushilkm"},"change_message_id":"ab28db225d36fd10b9045e82d9ba7263b874c287","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        VolumeDevice.format \u003d MagicMock(return_value\u003dNone)"},{"line_number":216,"context_line":"        VolumeDevice.migrate_data \u003d MagicMock(return_value\u003dNone)"},{"line_number":217,"context_line":"        VolumeDevice.mount \u003d MagicMock(return_value\u003dNone)"},{"line_number":218,"context_line":"        mount_points \u003d []"},{"line_number":219,"context_line":"        if is_mounted:"},{"line_number":220,"context_line":"            mount_points \u003d [\u0027/mnt\u0027]"},{"line_number":221,"context_line":"        VolumeDevice.mount_points \u003d MagicMock(return_value\u003dmount_points)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_2fb6b1dc","line":218,"in_reply_to":"fa32b979_021dcdbc","updated":"2015-06-22 12:31:46.000000000","message":"operating_system.chown needs to be mocked as the test log confirms the execution of actual chown command which then fails.","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"},{"author":{"_account_id":10266,"name":"Simon Chang","email":"schang@tesora.com","username":"changsimon"},"change_message_id":"ea93226bb6497cf4bb1e6e397802da33dd6dacac","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        VolumeDevice.format \u003d MagicMock(return_value\u003dNone)"},{"line_number":216,"context_line":"        VolumeDevice.migrate_data \u003d MagicMock(return_value\u003dNone)"},{"line_number":217,"context_line":"        VolumeDevice.mount \u003d MagicMock(return_value\u003dNone)"},{"line_number":218,"context_line":"        mount_points \u003d []"},{"line_number":219,"context_line":"        if is_mounted:"},{"line_number":220,"context_line":"            mount_points \u003d [\u0027/mnt\u0027]"},{"line_number":221,"context_line":"        VolumeDevice.mount_points \u003d MagicMock(return_value\u003dmount_points)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_8da222ad","line":218,"in_reply_to":"fa32b979_2fb6b1dc","updated":"2015-06-24 04:05:07.000000000","message":"Done","commit_id":"b3daa523750c0eeeb73b2a93b01b997ea0ee817b"}]}
