def test_create_first_backup_for_new_volume(self): h = backup.BackupHelper(self.conf) def callback(): callback.ran = True snapshot = { 'id': 'bak1', 'timestamp': 1.0, } snapshot['path'] = os.path.join(self.scratch, 'bak1') snapshot['origin'] = 'vol1' snapshot['size'] = 4 * 1024 * 1024 with open(snapshot['path'], 'w') as f: f.write('\x00' * snapshot['size']) backup_id = 'backup1' with mock_spawn() as j: h.create(snapshot, backup_id, callback) j.run_job() self.assert_(callback.ran) conn = get_conn(self.conf) _headers, raw_json_string = conn.get_object('vol1', 'manifest', newest=True) m = Manifest.loads(raw_json_string) self.assertEquals(m.block_count, 1) self.assertEquals(m.backups['backup1'], 1.0) self.assertEquals(m.history, [1.0]) self.assert_(isinstance(m[m.history[0]], list)) stats_path = h._stats_file('vol1') self.assertFalse(os.path.exists(stats_path))
def test_status_client_exception(self): h = backup.BackupHelper(self.conf) conn = get_conn(self.conf) def mock_head_account(*args, **kwargs): raise conn.ClientException('unable to connect') conn.head_account = mock_head_account with patch(backup, 'get_conn', lambda *args: conn): self.assertRaises(ServiceUnavailable, h.status)
def test_prune_missing_backup_id(self): h = backup.BackupHelper(self.conf) volume = {'id': 'vol1', 'size': 1} existing_backup_id = 'backup1' missing_backup_id = 'something_else' m = Manifest.blank(volume['size']) b = m.create_backup(existing_backup_id, timestamp=1.0) for i in range(volume['size']): b[i] = '00' conn = get_conn(self.conf) conn.put_container('vol1') conn.put_object('vol1', '00', 'asdf') conn.put_object('vol1', 'manifest', m.dumps()) h.prune(volume, missing_backup_id) # Shouldn't blow up on missing backup_id. self.assert_(True)
def test_create_first_backup_create_container(self): h = backup.BackupHelper(self.conf) conn = get_conn(self.conf) _orig_put_container = conn.put_container def mock_put_container(*args, **kwargs): # force the race sleep(0.2) mock_put_container.called.append(*args, **kwargs) _orig_put_container(*args, **kwargs) conn.put_container = mock_put_container mock_put_container.called = [] with patch(backup, 'get_conn', lambda *args: conn): snapshot = { 'id': 'bak1', 'timestamp': 1.0, } snapshot['path'] = os.path.join(self.scratch, 'bak1') snapshot['origin'] = 'vol1' snapshot['size'] = 16 * 1024**2 with open(snapshot['path'], 'w') as f: f.write('\x00') f.seek(4 * 1024**2, 1) f.write('\x01') f.seek(4 * 1024**2, 1) f.write('\x02') backup_id = 'backup1' with mock_spawn() as j: h.create(snapshot, backup_id, lambda *args, **kwargs: None) j.run_job() # return doesn't matter, check it doesn't raise ClientException _headers, listing = conn.get_container(snapshot['origin']) # wrote 3 blocks + manifest. self.assertEquals(len(listing), 4) self.assertEquals(len(mock_put_container.called), 1) stats_path = h._stats_file('vol1') self.assertFalse(os.path.exists(stats_path))
def test_create_first_backup_create_container(self): h = backup.BackupHelper(self.conf) conn = get_conn(self.conf) _orig_put_container = conn.put_container def mock_put_container(*args, **kwargs): # force the race sleep(0.2) mock_put_container.called.append(*args, **kwargs) _orig_put_container(*args, **kwargs) conn.put_container = mock_put_container mock_put_container.called = [] with patch(backup, 'get_conn', lambda *args: conn): snapshot = { 'id': 'bak1', 'timestamp': 1.0, } snapshot['path'] = os.path.join(self.scratch, 'bak1') snapshot['origin'] = 'vol1' snapshot['size'] = 16 * 1024 ** 2 with open(snapshot['path'], 'w') as f: f.write('\x00') f.seek(4 * 1024 ** 2, 1) f.write('\x01') f.seek(4 * 1024 ** 2, 1) f.write('\x02') backup_id = 'backup1' with mock_spawn() as j: h.create(snapshot, backup_id, lambda *args, **kwargs: None) j.run_job() # return doesn't matter, check it doesn't raise ClientException _headers, listing = conn.get_container(snapshot['origin']) # wrote 3 blocks + manifest. self.assertEquals(len(listing), 4) self.assertEquals(len(mock_put_container.called), 1) stats_path = h._stats_file('vol1') self.assertFalse(os.path.exists(stats_path))
from lunr.common.config import LunrConfig from lunr.db.console import DBConsole as ManifestConsole from lunr.storage.helper.utils.client import get_conn parser = OptionParser('%prog [options] volume_id') parser.add_option('-C', '--config', default=LunrConfig.lunr_storage_config, help="override config file") options, args = parser.parse_args() try: conf = LunrConfig.from_conf(options.config) except IOError, e: return 'ERROR: %s' % e try: volume_id = args.pop(0) except IndexError: return 'ERROR: Specify volume_id' conn = get_conn(conf) _headers, raw_json_string = conn.get_object(volume_id, 'manifest', newest=True) manifest = Manifest.loads(raw_json_string) banner = "manifest for volume %s available as 'm'" % volume_id c = ManifestConsole(banner=banner, locals={'m': manifest}) return c() if __name__ == "__main__": import sys sys.exit(main())