def test_snapshot_rm_basic(dev): # NOQA existings = {} snap1 = Snapshot(dev, generate_random_data(existings)) snap2 = Snapshot(dev, generate_random_data(existings)) snap3 = Snapshot(dev, generate_random_data(existings)) info = cmd.snapshot_info() assert len(info) == 4 assert VOLUME_HEAD in info assert snap1.name in info assert snap2.name in info assert snap3.name in info cmd.snapshot_rm(snap2.name) cmd.snapshot_purge() info = cmd.snapshot_info() assert len(info) == 3 assert snap1.name in info assert snap3.name in info snap3.verify_checksum() snap2.verify_data() snap1.verify_data() cmd.snapshot_revert(snap1.name) snap3.refute_data() snap2.refute_data() snap1.verify_checksum()
def test_snapshot_revert(dev): # NOQA offset = 0 length = 128 snap1_data = common.random_string(length) common.verify_data(dev, offset, snap1_data) snap1 = cmd.snapshot_create() snap2_data = common.random_string(length) common.verify_data(dev, offset, snap2_data) snap2 = cmd.snapshot_create() snap3_data = common.random_string(length) common.verify_data(dev, offset, snap3_data) snap3 = cmd.snapshot_create() snapList = cmd.snapshot_ls() assert snap1 in snapList assert snap2 in snapList assert snap3 in snapList cmd.snapshot_revert(snap2) readed = read_dev(dev, offset, length) assert readed == snap2_data cmd.snapshot_revert(snap1) readed = read_dev(dev, offset, length) assert readed == snap1_data
def test_snapshot_tree_basic(dev): # NOQA offset = 0 length = 128 snap, data = snapshot_tree_build(dev, offset, length) cmd.snapshot_revert(snap["1b"]) cmd.snapshot_rm(snap["0a"]) cmd.snapshot_rm(snap["0b"]) cmd.snapshot_rm(snap["1c"]) cmd.snapshot_rm(snap["2a"]) cmd.snapshot_rm(snap["2b"]) cmd.snapshot_rm(snap["2c"]) cmd.snapshot_rm(snap["3a"]) cmd.snapshot_rm(snap["3b"]) cmd.snapshot_rm(snap["3c"]) cmd.snapshot_purge() # the result should looks like this # snap["0b"](r) -> snap["0c"] # \-> snap["1a"] -> snap["1b"] -> head info = cmd.snapshot_info() assert len(info) == 5 assert snap["0b"] in info assert info[snap["0b"]]["parent"] == "" assert len(info[snap["0b"]]["children"]) == 2 assert snap["0c"] in info[snap["0b"]]["children"] assert snap["1a"] in info[snap["0b"]]["children"] assert info[snap["0b"]]["removed"] is True assert snap["0c"] in info assert info[snap["0c"]]["parent"] == snap["0b"] assert info[snap["0c"]]["children"] == [] assert snap["1a"] in info assert info[snap["1a"]]["parent"] == snap["0b"] assert info[snap["1a"]]["children"] == [snap["1b"]] assert snap["1b"] in info assert info[snap["1b"]]["parent"] == snap["1a"] assert info[snap["1b"]]["children"] == [VOLUME_HEAD] assert VOLUME_HEAD in info assert info[VOLUME_HEAD]["parent"] == snap["1b"] snapshot_tree_verify_node(dev, offset, length, snap, data, "0b") snapshot_tree_verify_node(dev, offset, length, snap, data, "0c") snapshot_tree_verify_node(dev, offset, length, snap, data, "1a") snapshot_tree_verify_node(dev, offset, length, snap, data, "1b")
def test_snapshot_revert_with_backing_file(backing_dev): # NOQA dev = backing_dev # NOQA offset = 0 length = 256 snap0 = cmd.snapshot_create() before = read_dev(dev, offset, length) assert before != "" exists = read_from_backing_file(offset, length) assert before == exists test_snapshot_revert(dev) cmd.snapshot_revert(snap0) after = read_dev(dev, offset, length) assert before == after
def test_snapshot_revert(dev): # NOQA existings = {} snap1 = Snapshot(dev, generate_random_data(existings)) snap2 = Snapshot(dev, generate_random_data(existings)) snap3 = Snapshot(dev, generate_random_data(existings)) snapList = cmd.snapshot_ls() assert snap1.name in snapList assert snap2.name in snapList assert snap3.name in snapList cmd.snapshot_revert(snap2.name) snap3.refute_data() snap2.verify_checksum() snap1.verify_data() cmd.snapshot_revert(snap1.name) snap3.refute_data() snap2.refute_data() snap1.verify_checksum()
def snapshot_tree_build(dev, offset, length, strict=True): # snap["0a"] -> snap["0b"] -> snap["0c"] # |-> snap["1a"] -> snap["1b"] -> snap["1c"] # \-> snap["2a"] -> snap["2b"] -> snap["2c"] # \-> snap["3a"] -> snap["3b"] -> snap["3c"] -> head snap = {} data = {} snapshot_tree_create_node(dev, offset, length, snap, data, "0a") snapshot_tree_create_node(dev, offset, length, snap, data, "0b") snapshot_tree_create_node(dev, offset, length, snap, data, "0c") cmd.snapshot_revert(snap["0b"]) snapshot_tree_create_node(dev, offset, length, snap, data, "1a") snapshot_tree_create_node(dev, offset, length, snap, data, "1b") snapshot_tree_create_node(dev, offset, length, snap, data, "1c") cmd.snapshot_revert(snap["0b"]) snapshot_tree_create_node(dev, offset, length, snap, data, "2a") snapshot_tree_create_node(dev, offset, length, snap, data, "2b") snapshot_tree_create_node(dev, offset, length, snap, data, "2c") cmd.snapshot_revert(snap["2a"]) snapshot_tree_create_node(dev, offset, length, snap, data, "3a") snapshot_tree_create_node(dev, offset, length, snap, data, "3b") snapshot_tree_create_node(dev, offset, length, snap, data, "3c") snapshot_tree_verify(dev, offset, length, snap, data, strict) return snap, data
def test_snapshot_revert_with_backing_file(backing_dev): # NOQA dev = backing_dev # NOQA offset = 0 length = 256 snap0 = cmd.snapshot_create() before = read_dev(dev, offset, length) assert before != "" info = cmd.snapshot_info() assert len(info) == 2 assert VOLUME_HEAD in info assert snap0 in info exists = read_from_backing_file(offset, length) assert before == exists test_snapshot_revert(dev) cmd.snapshot_revert(snap0) after = read_dev(dev, offset, length) assert before == after
def test_snapshot_rm_basic(dev): # NOQA offset = 0 length = 128 snap1_data = common.random_string(length) common.verify_data(dev, offset, snap1_data) snap1 = cmd.snapshot_create() snap2_data = common.random_string(length) common.verify_data(dev, offset, snap2_data) snap2 = cmd.snapshot_create() snap3_data = common.random_string(length) common.verify_data(dev, offset, snap3_data) snap3 = cmd.snapshot_create() info = cmd.snapshot_info() assert len(info) == 4 assert VOLUME_HEAD in info assert snap1 in info assert snap2 in info assert snap3 in info cmd.snapshot_rm(snap2) cmd.snapshot_purge() info = cmd.snapshot_info() assert len(info) == 3 assert snap1 in info assert snap3 in info readed = read_dev(dev, offset, length) assert readed == snap3_data cmd.snapshot_revert(snap1) readed = read_dev(dev, offset, length) assert readed == snap1_data
def snapshot_tree_verify_node(dev, offset, length, snap, data, name): cmd.snapshot_revert(snap[name]) readed = read_dev(dev, offset, length) assert readed == data[name]
def restore_to_file_with_backing_file_test(backing_dev, backup_target): length0 = 4 * 1024 length1 = 256 length2 = 128 offset0 = 0 offset1 = length1 + offset0 offset2 = length2 + offset0 output_raw_path = file(OUTPUT_FILE_RAW) output_qcow2_path = file(OUTPUT_FILE_QCOW2) # create 1 empty snapshot. # data in output image == data in backing check_backing() check_empty_volume(backing_dev) snap0 = cmd.snapshot_create() backup = create_backup(backup_target, snap0) volume_data = read_dev(backing_dev, offset0, length0) backing_data = read_from_backing_file(offset0, length0) dev_checksum = common.checksum_dev(backing_dev) assert volume_data != "" assert volume_data == backing_data cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_raw_path, IMAGE_FORMAT_RAW) output0_raw = read_file(output_raw_path, offset0, length0) output0_checksum = checksum_data( read_file(output_raw_path, 0, SIZE)) assert output0_raw == backing_data assert output0_checksum == dev_checksum os.remove(output_raw_path) assert not os.path.exists(output_raw_path) cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_qcow2_path, IMAGE_FORMAT_QCOW2) output0_qcow2 = read_qcow2_file_without_backing_file( output_qcow2_path, offset0, length0) output0_checksum = checksum_data( read_qcow2_file_without_backing_file(output_qcow2_path, 0, SIZE)) assert output0_qcow2 == backing_data assert output0_qcow2 == volume_data assert output0_checksum == dev_checksum os.remove(output_qcow2_path) assert not os.path.exists(output_qcow2_path) rm_backups([backup]) # create 1 snapshot with 256B data. # output = snap1(offset0, length1) + backing(offset1, ...) snap1_data = common.random_string(length1) common.verify_data(backing_dev, offset0, snap1_data) snap1 = cmd.snapshot_create() backup = create_backup(backup_target, snap1) volume_data = read_dev(backing_dev, offset0, length0) backing_data = read_from_backing_file( offset1, length0 - offset1) dev_checksum = common.checksum_dev(backing_dev) cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_raw_path, IMAGE_FORMAT_RAW) output1_raw_snap1 = read_file( output_raw_path, offset0, length1) output1_raw_backing = read_file( output_raw_path, offset1, length0 - offset1) output1_checksum = checksum_data( read_file(output_raw_path, 0, SIZE)) assert output1_raw_snap1 == snap1_data assert output1_raw_backing == backing_data assert output1_raw_snap1 + output1_raw_backing == volume_data assert output1_checksum == dev_checksum os.remove(output_raw_path) assert not os.path.exists(output_raw_path) cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_qcow2_path, IMAGE_FORMAT_QCOW2) output1_qcow2_snap1 = read_qcow2_file_without_backing_file( output_qcow2_path, offset0, length1) output1_qcow2_backing = read_qcow2_file_without_backing_file( output_qcow2_path, offset1, length0 - offset1) output1_checksum = checksum_data( read_qcow2_file_without_backing_file(output_qcow2_path, 0, SIZE)) assert output1_qcow2_snap1 == snap1_data assert output1_qcow2_backing == backing_data assert output1_qcow2_snap1 + output1_qcow2_backing == volume_data assert output1_checksum == dev_checksum os.remove(output_qcow2_path) assert not os.path.exists(output_qcow2_path) cmd.snapshot_revert(snap0) rm_snaps([snap1]) rm_backups([backup]) check_backing() check_empty_volume(backing_dev) # create 2 snapshots with 256B data and 128B data # output = snap2(offset0, length1 - length2) + # snap1(offset2, length2) + backing(offset2, ...) snap1_data = common.random_string(length1) common.verify_data(backing_dev, offset0, snap1_data) snap1 = cmd.snapshot_create() snap2_data = common.random_string(length2) common.verify_data(backing_dev, offset0, snap2_data) snap2 = cmd.snapshot_create() backup = create_backup(backup_target, snap2) volume_data = read_dev(backing_dev, offset0, length0) backing_data = read_from_backing_file( offset1, length0 - offset1) dev_checksum = common.checksum_dev(backing_dev) cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_raw_path, IMAGE_FORMAT_RAW) output2_raw_snap2 = read_file( output_raw_path, offset0, length2) output2_raw_snap1 = read_file( output_raw_path, offset2, length1 - length2) output2_raw_backing = read_file( output_raw_path, offset1, length0 - offset1) output2_checksum = checksum_data( read_file(output_raw_path, 0, SIZE)) assert output2_raw_snap2 == snap2_data assert output2_raw_snap1 == snap1_data[offset2: length1] assert output2_raw_backing == backing_data assert \ volume_data == \ output2_raw_snap2 + output2_raw_snap1 + output2_raw_backing assert output2_checksum == dev_checksum os.remove(output_raw_path) assert not os.path.exists(output_raw_path) cmd.restore_to_file(backup, file(BACKING_FILE_QCOW2), output_qcow2_path, IMAGE_FORMAT_QCOW2) output2_qcow2_snap2 = read_qcow2_file_without_backing_file( output_qcow2_path, offset0, length2) output2_qcow2_snap1 = read_qcow2_file_without_backing_file( output_qcow2_path, offset2, length1 - length2) output2_qcow2_backing = read_qcow2_file_without_backing_file( output_qcow2_path, offset1, length0 - offset1) output2_checksum = checksum_data( read_qcow2_file_without_backing_file(output_qcow2_path, 0, SIZE)) assert output2_qcow2_snap2 == snap2_data assert output2_qcow2_snap1 == snap1_data[offset2: length1] assert output2_qcow2_backing == backing_data assert \ volume_data == \ output2_qcow2_snap2 + output2_qcow2_snap1 + output1_qcow2_backing assert output2_checksum == dev_checksum os.remove(output_qcow2_path) assert not os.path.exists(output_qcow2_path) cmd.snapshot_revert(snap0) rm_snaps([snap1, snap2]) rm_backups([backup]) check_backing() check_empty_volume(backing_dev)
def restore_to_file_without_backing_file_test(dev, backup_target): length0 = 256 length1 = 128 offset0 = 0 offset1 = length1 + offset0 output_raw_path = file(OUTPUT_FILE_RAW) output_qcow2_path = file(OUTPUT_FILE_QCOW2) # create 1 empty snapshot for converting to init state. snap0 = cmd.snapshot_create() # create 1 snapshot with 256B data. # output = snap2(offset0, length1) snap1_data = common.random_string(length0) common.verify_data(dev, offset0, snap1_data) snap1 = cmd.snapshot_create() backup = create_backup(backup_target, snap1) cmd.restore_to_file(backup, "", output_raw_path, IMAGE_FORMAT_RAW) output1_raw = read_file(output_raw_path, offset0, length0) assert output1_raw == snap1_data os.remove(output_raw_path) assert not os.path.exists(output_raw_path) cmd.restore_to_file(backup, "", output_qcow2_path, IMAGE_FORMAT_QCOW2) output1_qcow2 = read_qcow2_file_without_backing_file( output_qcow2_path, offset0, length0) assert output1_qcow2 == snap1_data os.remove(output_qcow2_path) assert not os.path.exists(output_qcow2_path) cmd.snapshot_revert(snap0) rm_snaps([snap1]) rm_backups([backup]) # create 2 snapshots with 256B data and 128B data # output = snap2(offset0, length1 - length2) + # snap1(offset2, length2) snap1_data = common.random_string(length0) common.verify_data(dev, offset0, snap1_data) snap1 = cmd.snapshot_create() snap2_data = common.random_string(length1) common.verify_data(dev, offset0, snap2_data) snap2 = cmd.snapshot_create() backup = create_backup(backup_target, snap2) cmd.restore_to_file(backup, "", output_raw_path, IMAGE_FORMAT_RAW) output2_raw_snap2 = read_file( output_raw_path, offset0, length1) output2_raw_snap1 = read_file( output_raw_path, offset1, length0 - length1) assert output2_raw_snap2 == snap2_data assert output2_raw_snap1 == snap1_data[offset1: length0] cmd.restore_to_file(backup, "", output_qcow2_path, IMAGE_FORMAT_QCOW2) output2_qcow2_snap2 = read_qcow2_file_without_backing_file( output_qcow2_path, offset0, length1) output2_qcow2_snap1 = read_qcow2_file_without_backing_file( output_qcow2_path, offset1, length0 - length1) assert output2_qcow2_snap2 == snap2_data assert output2_qcow2_snap1 == snap1_data[offset1: length0] os.remove(output_qcow2_path) assert not os.path.exists(output_qcow2_path) cmd.snapshot_revert(snap0) rm_snaps([snap1, snap2]) rm_backups([backup])
def snapshot_revert_with_frontend(url, engine_name, name): shutdown_engine_frontend(engine_name) cmd.snapshot_revert(url, name) start_engine_frontend(engine_name)