コード例 #1
0
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()
コード例 #2
0
ファイル: test_snapshot.py プロジェクト: shibingli/longhorn
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
コード例 #3
0
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")
コード例 #4
0
ファイル: test_snapshot.py プロジェクト: shibingli/longhorn
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
コード例 #5
0
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()
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
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
コード例 #10
0
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]
コード例 #11
0
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)
コード例 #12
0
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])
コード例 #13
0
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]
コード例 #14
0
ファイル: common.py プロジェクト: macduff23/longhorn-engine
def snapshot_revert_with_frontend(url, engine_name, name):
    shutdown_engine_frontend(engine_name)
    cmd.snapshot_revert(url, name)
    start_engine_frontend(engine_name)