)]}'
{"test-requirements.txt":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"fd803dabedc282a8cfe7478cc148e7d6b9f56486","unresolved":false,"context_lines":[{"line_number":24,"context_line":"psycopg2\u003e\u003d2.5 # LGPL/ZPL"},{"line_number":25,"context_line":"cassandra-driver\u003e\u003d2.1.4 # Apache-2.0"},{"line_number":26,"context_line":"pycrypto\u003e\u003d2.6 # Public Domain"},{"line_number":27,"context_line":"couchdb\u003e\u003d0.8 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":10,"id":"1af94dfe_a13c5130","line":27,"updated":"2016-03-16 01:11:37.000000000","message":"odd, I\u0027d have thought something would install this on the guest also ... but I don\u0027t see it as a requirement anywhere.","commit_id":"65917f3ec06c0c5c615518b7072c3a31c19d6001"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"81aac75a134a24d38ebcf742319cc296c8b6a46f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"psycopg2\u003e\u003d2.5 # LGPL/ZPL"},{"line_number":25,"context_line":"cassandra-driver\u003e\u003d2.1.4 # Apache-2.0"},{"line_number":26,"context_line":"pycrypto\u003e\u003d2.6 # Public Domain"},{"line_number":27,"context_line":"couchdb\u003e\u003d0.8 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":10,"id":"1af94dfe_44ae2986","line":27,"in_reply_to":"1af94dfe_a13c5130","updated":"2016-03-16 10:45:37.000000000","message":"This library has been added here to help with the integration tests. Currently we dont need/use this on the guest agent side. If we were to do something like what MySQL does (use the python MySQL client for managing users \u0026 databases), we would want to get this library on the guest as well. My understanding is that if we wanted to get this on the guest, we could do this through the dib elements.","commit_id":"65917f3ec06c0c5c615518b7072c3a31c19d6001"}],"trove/common/cfg.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"79c8cc16ae7bbdbc588efa2fd94a083b2a21268b","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"               help\u003d\u0027Device path for volume if volume support is enabled.\u0027),"},{"line_number":1072,"context_line":"    cfg.StrOpt(\u0027backup_strategy\u0027, default\u003d\u0027CouchDBBackup\u0027,"},{"line_number":1073,"context_line":"               help\u003d\u0027Default strategy to perform backups.\u0027),"},{"line_number":1074,"context_line":"    cfg.StrOpt(\u0027replication_strategy\u0027, default\u003dNone,"},{"line_number":1075,"context_line":"               help\u003d\u0027Default strategy for replication.\u0027),"},{"line_number":1076,"context_line":"    cfg.StrOpt(\u0027backup_namespace\u0027, default\u003d\u0027trove.guestagent.strategies\u0027"},{"line_number":1077,"context_line":"               \u0027.backup.experimental.couchdb_impl\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_0dee2622","line":1074,"updated":"2016-03-07 15:48:55.000000000","message":"don\u0027t you have to set this as well?","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"52245346f2c1fc1a01b8ced45632264ceacb9232","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"               help\u003d\u0027Device path for volume if volume support is enabled.\u0027),"},{"line_number":1072,"context_line":"    cfg.StrOpt(\u0027backup_strategy\u0027, default\u003d\u0027CouchDBBackup\u0027,"},{"line_number":1073,"context_line":"               help\u003d\u0027Default strategy to perform backups.\u0027),"},{"line_number":1074,"context_line":"    cfg.StrOpt(\u0027replication_strategy\u0027, default\u003dNone,"},{"line_number":1075,"context_line":"               help\u003d\u0027Default strategy for replication.\u0027),"},{"line_number":1076,"context_line":"    cfg.StrOpt(\u0027backup_namespace\u0027, default\u003d\u0027trove.guestagent.strategies\u0027"},{"line_number":1077,"context_line":"               \u0027.backup.experimental.couchdb_impl\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_8d2236b8","line":1074,"in_reply_to":"5aef4532_0dee2622","updated":"2016-03-07 15:57:26.000000000","message":"If we are doing just backups \u0026 restore, then we dont need to set replication_strategy. This needs to be set to enable replication","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"}],"trove/guestagent/datastore/experimental/couchdb/manager.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"e2cf7f58e155e531e7167d85e2468e62fdfe38ef","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            backup.restore(context, backup_info, restore_location)"},{"line_number":98,"context_line":"        except Exception as e:"},{"line_number":99,"context_line":"            LOG.error(_(\"Error performing restore from backup %s\") %"},{"line_number":100,"context_line":"                      backup_info[\u0027id\u0027])"},{"line_number":101,"context_line":"            LOG.error(e)"},{"line_number":102,"context_line":"            self.status.set_status(rd_instance.ServiceStatuses.FAILED)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_063e6e8b","line":99,"updated":"2016-02-29 19:26:37.000000000","message":"would be better as LOG.exception; two consecutive LOG.error lines can be merged into one.","commit_id":"bc3f5183f83eb7cea55a7cb19d29a2b8be3969f1"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"a3ddede90bd385beb2519bef6bd461c545d9b808","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            backup.restore(context, backup_info, restore_location)"},{"line_number":98,"context_line":"        except Exception as e:"},{"line_number":99,"context_line":"            LOG.error(_(\"Error performing restore from backup %s\") %"},{"line_number":100,"context_line":"                      backup_info[\u0027id\u0027])"},{"line_number":101,"context_line":"            LOG.error(e)"},{"line_number":102,"context_line":"            self.status.set_status(rd_instance.ServiceStatuses.FAILED)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_66401535","line":99,"in_reply_to":"9aed3d3a_063e6e8b","updated":"2016-02-29 21:10:35.000000000","message":"+1 amrith. This one is important since if we left this as is then more log lines can pop in the middle of the description and the trace.","commit_id":"bc3f5183f83eb7cea55a7cb19d29a2b8be3969f1"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"fd803dabedc282a8cfe7478cc148e7d6b9f56486","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            self.app.start_db()"},{"line_number":62,"context_line":"        self.app.change_permissions()"},{"line_number":63,"context_line":"        self.app.make_host_reachable()"},{"line_number":64,"context_line":"        if backup_info:"},{"line_number":65,"context_line":"            self._perform_restore(backup_info, context, mount_point)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def stop_db(self, context, do_not_start_on_reboot\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1af94dfe_618889e8","line":64,"updated":"2016-03-16 01:11:37.000000000","message":"hmm ... wouldn\u0027t this mean that you\u0027d be doing a restore with a running database? the start is above ...\n\nBut, I look at the mysql code and it looks like it is the same. I\u0027m not sure whether this is right (there) either. I don\u0027t see anything in this _perform_restore code path that stops the database.","commit_id":"65917f3ec06c0c5c615518b7072c3a31c19d6001"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"81aac75a134a24d38ebcf742319cc296c8b6a46f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            self.app.start_db()"},{"line_number":62,"context_line":"        self.app.change_permissions()"},{"line_number":63,"context_line":"        self.app.make_host_reachable()"},{"line_number":64,"context_line":"        if backup_info:"},{"line_number":65,"context_line":"            self._perform_restore(backup_info, context, mount_point)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def stop_db(self, context, do_not_start_on_reboot\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1af94dfe_6479a593","line":64,"in_reply_to":"1af94dfe_618889e8","updated":"2016-03-16 10:45:37.000000000","message":"The CouchDB server does not need to be stopped before doing a restore. This is a new instance with no user databases and all restore does is copy the database files over. However after the restore, we restart the server in post_restore","commit_id":"65917f3ec06c0c5c615518b7072c3a31c19d6001"}],"trove/guestagent/strategies/backup/experimental/couchdb_impl.py":[{"author":{"_account_id":14823,"name":"Pete MacKinnon","email":"pmackinn@redhat.com","username":"pmackinn"},"change_message_id":"6005512a04acac008a4eb4d056104eff13920558","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def cmd(self):"},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        CouchDB backup is based on a simple filesystem copy of the database"},{"line_number":29,"context_line":"        files. Each database is a single fully contained append only file."},{"line_number":30,"context_line":"        For example, if a user creates a database \u0027foo\u0027, then a corresponding"},{"line_number":31,"context_line":"        \u0027foo.couch\u0027 file will be created in the database directory which by"},{"line_number":32,"context_line":"        default is in \u0027/var/lib/couchdb\u0027."}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_c32d9d47","line":29,"updated":"2016-02-29 17:53:43.000000000","message":"Is the service stopped during this time? Is the file system in quiescence?","commit_id":"bc3f5183f83eb7cea55a7cb19d29a2b8be3969f1"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"7617ef75233bbcb589d257ae5635d593fdc6bcac","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def cmd(self):"},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        CouchDB backup is based on a simple filesystem copy of the database"},{"line_number":29,"context_line":"        files. Each database is a single fully contained append only file."},{"line_number":30,"context_line":"        For example, if a user creates a database \u0027foo\u0027, then a corresponding"},{"line_number":31,"context_line":"        \u0027foo.couch\u0027 file will be created in the database directory which by"},{"line_number":32,"context_line":"        default is in \u0027/var/lib/couchdb\u0027."}],"source_content_type":"text/x-python","patch_set":4,"id":"9aed3d3a_31292a38","line":29,"in_reply_to":"9aed3d3a_c32d9d47","updated":"2016-02-29 19:46:17.000000000","message":"The service does not need to be stopped to do a filesystem copy. CouchDB\u0027s never over-write storage format makes it possible to do a live database file copy even while its being updated.","commit_id":"bc3f5183f83eb7cea55a7cb19d29a2b8be3969f1"}],"trove/tests/unittests/backup/test_backupagent.py":[{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"a6d55ffc5fece181d385298d4a92c27443ed3d87","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        str_redis_backup_cmd \u003d ("},{"line_number":277,"context_line":"            \"sudo cat /var/lib/redis/dump.rdb | \""},{"line_number":278,"context_line":"            \"gzip | openssl enc -aes-256-cbc -salt -pass \""},{"line_number":279,"context_line":"            \"pass:default_aes_cbc_key\")"},{"line_number":280,"context_line":"        self.assertEqual(str_redis_backup_cmd, redis_backup.cmd)"},{"line_number":281,"context_line":"        self.assertIsNotNone(redis_backup.manifest)"},{"line_number":282,"context_line":"        self.assertIn(\u0027gz.enc\u0027, redis_backup.manifest)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a57f1b5_2b587d87","line":279,"updated":"2016-02-12 19:37:14.000000000","message":"Since you reformatted this, why not re-layout the strings?","commit_id":"dcec4f10efabac726f3c34a7f6187dd65d207e96"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"c40d9146b655a6717e75a28236c891f980bfd090","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        str_redis_backup_cmd \u003d ("},{"line_number":277,"context_line":"            \"sudo cat /var/lib/redis/dump.rdb | \""},{"line_number":278,"context_line":"            \"gzip | openssl enc -aes-256-cbc -salt -pass \""},{"line_number":279,"context_line":"            \"pass:default_aes_cbc_key\")"},{"line_number":280,"context_line":"        self.assertEqual(str_redis_backup_cmd, redis_backup.cmd)"},{"line_number":281,"context_line":"        self.assertIsNotNone(redis_backup.manifest)"},{"line_number":282,"context_line":"        self.assertIn(\u0027gz.enc\u0027, redis_backup.manifest)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_43434d42","line":279,"in_reply_to":"3a57f1b5_2b587d87","updated":"2016-02-29 17:49:15.000000000","message":"Morgan, not sure I understand what you mean by re-layout.","commit_id":"dcec4f10efabac726f3c34a7f6187dd65d207e96"},{"author":{"_account_id":9782,"name":"Morgan Jones","email":"morgan@tesora.com","username":"vgnbkr"},"change_message_id":"a6d55ffc5fece181d385298d4a92c27443ed3d87","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        str_couchdb_backup_cmd \u003d ("},{"line_number":290,"context_line":"            \"sudo tar cpPf - /var/lib/couchdb | \""},{"line_number":291,"context_line":"            \"gzip | openssl enc -aes-256-cbc -salt -pass \""},{"line_number":292,"context_line":"            \"pass:default_aes_cbc_key\")"},{"line_number":293,"context_line":"        self.assertEqual(str_couchdb_backup_cmd, couchdb_backup.cmd)"},{"line_number":294,"context_line":"        self.assertIsNotNone(couchdb_backup.manifest)"},{"line_number":295,"context_line":"        self.assertIn(\u0027gz.enc\u0027, couchdb_backup.manifest)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a57f1b5_0b4901b7","line":292,"updated":"2016-02-12 19:37:14.000000000","message":"Reformat this, too.","commit_id":"dcec4f10efabac726f3c34a7f6187dd65d207e96"},{"author":{"_account_id":10440,"name":"Alex Tomic","email":"atomic777@gmail.com","username":"atomic77"},"change_message_id":"fbb32383687faa2100bdeeb3293a670aff449710","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            \u0027couchdbbackup\u0027,"},{"line_number":287,"context_line":"            extra_opts\u003d\u0027\u0027)"},{"line_number":288,"context_line":"        self.assertIsNotNone(couchdb_backup)"},{"line_number":289,"context_line":"        str_couchdb_backup_cmd \u003d ("},{"line_number":290,"context_line":"            \"sudo tar cpPf - /var/lib/couchdb | \""},{"line_number":291,"context_line":"            \"gzip | openssl enc -aes-256-cbc -salt -pass \""},{"line_number":292,"context_line":"            \"pass:default_aes_cbc_key\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_9e953e42","line":289,"updated":"2016-03-07 16:31:44.000000000","message":"I think it would be good to start phasing out testcases like this - and I say this fully aware that I have done the same thing at another point in this file :) No one wants to submit \u0027untested\u0027 code. \n\nBut really all we\u0027re doing here is hardcoding, in another place in the codebase, the current implementation of properties like BackupRunner.zip_cmd etc. Not only does this not really test anything useful, it creates an additional maintenance headache for someone in the future who may have to change any of those implementations and have to figure out why all the test cases broke.","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"ae632fe379313b1c5f9b206f9a4a2ea122661570","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            \u0027couchdbbackup\u0027,"},{"line_number":287,"context_line":"            extra_opts\u003d\u0027\u0027)"},{"line_number":288,"context_line":"        self.assertIsNotNone(couchdb_backup)"},{"line_number":289,"context_line":"        str_couchdb_backup_cmd \u003d ("},{"line_number":290,"context_line":"            \"sudo tar cpPf - /var/lib/couchdb | \""},{"line_number":291,"context_line":"            \"gzip | openssl enc -aes-256-cbc -salt -pass \""},{"line_number":292,"context_line":"            \"pass:default_aes_cbc_key\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_d9de696c","line":289,"in_reply_to":"5aef4532_9e953e42","updated":"2016-03-14 21:04:43.000000000","message":"Removed this test.","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"}],"trove/tests/unittests/guestagent/test_backups.py":[{"author":{"_account_id":17360,"name":"Ishita Mandhan","email":"imandha@us.ibm.com","username":"imandhan"},"change_message_id":"f6324aec048d95038a3bb6a88b75f1655e2a7c06","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        self.assertEqual("},{"line_number":899,"context_line":"            expected_content_length, actual_content_length)"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    def test_restore_failed_due_to_pre_restore(self):"},{"line_number":902,"context_line":"        self.restore_runner.post_restore \u003d mock.Mock()"},{"line_number":903,"context_line":"        self.restore_runner.pre_restore \u003d mock.Mock("},{"line_number":904,"context_line":"            side_effect\u003dexception.ProcessExecutionError(\u0027Error\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_fbbba40c","line":901,"range":{"start_line":901,"start_character":8,"end_line":901,"end_character":46},"updated":"2016-03-12 07:21:24.000000000","message":"I don\u0027t think this function is necessary since there is no pre_restore for couchdb backup and restore.","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"},{"author":{"_account_id":10295,"name":"mariam john","email":"mariamj@us.ibm.com","username":"mariamj"},"change_message_id":"ae632fe379313b1c5f9b206f9a4a2ea122661570","unresolved":false,"context_lines":[{"line_number":898,"context_line":"        self.assertEqual("},{"line_number":899,"context_line":"            expected_content_length, actual_content_length)"},{"line_number":900,"context_line":""},{"line_number":901,"context_line":"    def test_restore_failed_due_to_pre_restore(self):"},{"line_number":902,"context_line":"        self.restore_runner.post_restore \u003d mock.Mock()"},{"line_number":903,"context_line":"        self.restore_runner.pre_restore \u003d mock.Mock("},{"line_number":904,"context_line":"            side_effect\u003dexception.ProcessExecutionError(\u0027Error\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_f95ec510","line":901,"range":{"start_line":901,"start_character":8,"end_line":901,"end_character":46},"in_reply_to":"3afc51ec_fbbba40c","updated":"2016-03-14 21:04:43.000000000","message":"CouchDBBackup is a subclass of RestoreRunner which has the default implementation of pre_restore and post_restore methods and they get called by the restore method in the base class, which is why those are mocked. Given that CouchDB doesn\u0027t override those implementations, I agree that this doesn\u0027t add much value.","commit_id":"f4267e56097b1486df90efddf84b603047b4a951"}]}
