Example #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()
Example #2
0
def test_ha_single_replica_rebuild(controller, replica1, replica2):  # NOQA
    open_replica(replica1)
    open_replica(replica2)

    replicas = controller.list_replica()
    assert len(replicas) == 0

    v = controller.list_volume()[0]
    v = v.start(replicas=[common.REPLICA1, common.REPLICA2])
    assert v.replicaCount == 2

    replicas = controller.list_replica()
    assert len(replicas) == 2
    assert replicas[0].mode == "RW"
    assert replicas[1].mode == "RW"

    dev = get_blockdev()

    data = common.random_string(128)
    data_offset = 1024
    verify_data(dev, data_offset, data)

    # Cleanup replica2
    cleanup_replica(replica2)

    verify_async(dev, 10, 128, 1)

    common.verify_replica_state(controller, 1, "ERR")

    verify_read(dev, data_offset, data)

    controller.delete(replicas[1])

    # Rebuild replica2
    common.open_replica(replica2)
    cmd.add_replica(common.REPLICA2)

    verify_async(dev, 10, 128, 1)

    common.verify_replica_state(controller, 1, "RW")

    verify_read(dev, data_offset, data)

    # WORKAROUND for unable to remove the parent of volume head
    newsnap = cmd.snapshot_create()

    info = cmd.snapshot_info()
    assert len(info) == 3
    sysnap = info[newsnap]["parent"]
    assert info[sysnap]["parent"] == ""
    assert newsnap in info[sysnap]["children"]
    assert info[sysnap]["usercreated"] is False
    assert info[sysnap]["removed"] is False

    cmd.snapshot_purge()
    info = cmd.snapshot_info()
    assert len(info) == 2
    assert info[newsnap] is not None
    assert info[VOLUME_HEAD] is not None
def test_snapshot_revert_with_backing_file(
        grpc_backing_controller,  # NOQA
        grpc_backing_replica1,  # NOQA
        grpc_backing_replica2):  # NOQA
    address = grpc_backing_controller.address

    dev = get_backing_dev(grpc_backing_replica1, grpc_backing_replica2,
                          grpc_backing_controller)

    offset = 0
    length = 256

    snap0 = cmd.snapshot_create(address)
    before = read_dev(dev, offset, length)
    assert before != ""

    info = cmd.snapshot_info(address)
    assert len(info) == 2
    assert VOLUME_HEAD in info
    assert snap0 in info

    exists = read_from_backing_file(offset, length)
    assert before == exists

    snapshot_revert_test(dev, address, ENGINE_BACKING_NAME)

    snapshot_revert_with_frontend(address, ENGINE_BACKING_NAME, snap0)
    after = read_dev(dev, offset, length)
    assert before == after
Example #4
0
def rm_snaps(snaps, url=cmd.CONTROLLER):
    for s in snaps:
        cmd.snapshot_rm(s, url)
        cmd.snapshot_purge(url)
    snap_info_list = cmd.snapshot_info(url)
    for s in snaps:
        assert s not in snap_info_list
Example #5
0
def rm_snaps(*snaps):
    for s in snaps:
        cmd.snapshot_rm(s)
        cmd.snapshot_purge()
    snap_info_list = cmd.snapshot_info()
    for s in snaps:
        assert s not in snap_info_list
Example #6
0
def rm_snaps(url, snaps):
    for s in snaps:
        cmd.snapshot_rm(url, s)
        cmd.snapshot_purge(url)
        wait_for_purge_completion(url)
    snap_info_list = cmd.snapshot_info(url)
    for s in snaps:
        assert s not in snap_info_list
def test_snapshot_rm_basic(
        grpc_controller,  # NOQA
        grpc_replica1,
        grpc_replica2):  # NOQA
    address = grpc_controller.address

    dev = get_dev(grpc_replica1, grpc_replica2, grpc_controller)

    existings = {}

    snap1 = Snapshot(dev, generate_random_data(existings), address)
    snap2 = Snapshot(dev, generate_random_data(existings), address)
    snap3 = Snapshot(dev, generate_random_data(existings), address)

    info = cmd.snapshot_info(address)
    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(address, snap2.name)
    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    info = cmd.snapshot_info(address)
    assert len(info) == 3
    assert snap1.name in info
    assert snap3.name in info

    snap3.verify_checksum()
    snap2.verify_data()
    snap1.verify_data()

    snapshot_revert_with_frontend(address, ENGINE_NAME, snap1.name)
    snap3.refute_data()
    snap2.refute_data()
    snap1.verify_checksum()
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_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
Example #10
0
def test_snapshot_rm_rolling(dev):  # NOQA
    offset = 0
    length = 128

    snap1_data = common.random_string(length)
    common.verify_data(dev, offset, snap1_data)
    snap1 = cmd.snapshot_create()

    snapList = cmd.snapshot_ls()
    assert snap1 in snapList

    cmd.snapshot_rm(snap1)

    snap2_data = common.random_string(length)
    common.verify_data(dev, offset, snap2_data)
    snap2 = cmd.snapshot_create()

    snapList = cmd.snapshot_ls()
    assert snap1 not in snapList
    assert snap2 in snapList

    # this should trigger real deletion of snap1
    cmd.snapshot_rm(snap2)

    snap3_data = common.random_string(length)
    common.verify_data(dev, offset, snap3_data)
    snap3 = cmd.snapshot_create()

    snap4_data = common.random_string(length)
    common.verify_data(dev, offset, snap4_data)
    snap4 = cmd.snapshot_create()

    snapList = cmd.snapshot_ls()
    assert snap1 not in snapList
    assert snap2 not in snapList
    assert snap3 in snapList
    assert snap4 in snapList

    output = cmd.snapshot_info()
    info = json.loads(output)

    assert info[snap3]["size"] == "4096"
    assert info[snap4]["size"] == "4096"

    # this should trigger real deletion of snap2 and snap3
    cmd.snapshot_rm(snap3)

    readed = read_dev(dev, offset, length)
    assert readed == snap4_data
Example #11
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
def test_snapshot_rm_rolling(dev):  # NOQA
    offset = 0
    length = 128

    snap1_data = common.random_string(length)
    common.verify_data(dev, offset, snap1_data)
    snap1 = cmd.snapshot_create()

    snapList = cmd.snapshot_ls()
    assert snap1 in snapList

    cmd.snapshot_rm(snap1)
    # cannot do anything because it's the parent of volume head
    cmd.snapshot_purge()

    snap2_data = common.random_string(length)
    common.verify_data(dev, offset, snap2_data)
    snap2 = cmd.snapshot_create()

    info = cmd.snapshot_info()
    assert len(info) == 3
    assert snap1 in info
    assert info[snap1]["removed"] is True
    assert snap2 in info
    assert info[snap2]["removed"] is False

    cmd.snapshot_rm(snap2)
    # this should trigger the deletion of snap1
    cmd.snapshot_purge()

    snap3_data = common.random_string(length)
    common.verify_data(dev, offset, snap3_data)
    snap3 = cmd.snapshot_create()

    snap4_data = common.random_string(length)
    common.verify_data(dev, offset, snap4_data)
    snap4 = cmd.snapshot_create()

    snap5_data = common.random_string(length)
    common.verify_data(dev, offset, snap5_data)
    snap5 = cmd.snapshot_create()

    snapList = cmd.snapshot_ls()
    assert snap1 not in snapList
    assert snap2 not in snapList
    assert snap3 in snapList
    assert snap4 in snapList
    assert snap5 in snapList

    info = cmd.snapshot_info()
    assert len(info) == 5
    assert snap1 not in info
    assert snap2 in info
    assert info[snap2]["removed"] is True
    assert snap3 in info
    assert info[snap3]["size"] == "4096"
    assert snap4 in info
    assert info[snap4]["size"] == "4096"
    assert snap5 in info
    assert info[snap5]["size"] == "4096"

    cmd.snapshot_rm(snap3)
    cmd.snapshot_rm(snap4)
    cmd.snapshot_rm(snap5)
    # this should trigger the deletion of snap2 - snap4
    # and snap5 marked as removed
    cmd.snapshot_purge()

    info = cmd.snapshot_info()
    assert len(info) == 2
    assert snap1 not in info
    assert snap2 not in info
    assert snap3 not in info
    assert snap4 not in info
    assert snap5 in info
    assert info[snap5]["removed"] is True
    assert info[snap5]["size"] == "4096"

    readed = read_dev(dev, offset, length)
    assert readed == snap5_data
Example #13
0
def test_ha_single_replica_rebuild(controller, replica1, replica2):  # NOQA
    open_replica(replica1)
    open_replica(replica2)

    replicas = controller.list_replica()
    assert len(replicas) == 0

    v = controller.list_volume()[0]
    v = v.start(replicas=[
        common.REPLICA1,
        common.REPLICA2
    ])
    assert v.replicaCount == 2

    replicas = controller.list_replica()
    assert len(replicas) == 2
    assert replicas[0].mode == "RW"
    assert replicas[1].mode == "RW"

    dev = get_blockdev()

    data = common.random_string(128)
    data_offset = 1024
    verify_data(dev, data_offset, data)

    # Cleanup replica2
    cleanup_replica(replica2)

    verify_async(dev, 10, 128, 1)

    common.verify_replica_state(controller, 1, "ERR")

    verify_read(dev, data_offset, data)

    controller.delete(replicas[1])

    # Rebuild replica2
    common.open_replica(replica2)
    cmd.add_replica(common.REPLICA2)

    verify_async(dev, 10, 128, 1)

    common.verify_replica_state(controller, 1, "RW")

    verify_read(dev, data_offset, data)

    # WORKAROUND for unable to remove the parent of volume head
    newsnap = cmd.snapshot_create()

    info = cmd.snapshot_info()
    assert len(info) == 3
    sysnap = info[newsnap]["parent"]
    assert info[sysnap]["parent"] == ""
    assert newsnap in info[sysnap]["children"]
    assert info[sysnap]["usercreated"] is False
    assert info[sysnap]["removed"] is False

    cmd.snapshot_purge()
    info = cmd.snapshot_info()
    assert len(info) == 2
    assert info[newsnap] is not None
    assert info[VOLUME_HEAD] is not None
Example #14
0
def test_ha_single_replica_rebuild(
        grpc_controller,  # NOQA
        grpc_replica1,
        grpc_replica2):  # NOQA
    address = grpc_controller.address

    open_replica(grpc_replica1)
    open_replica(grpc_replica2)

    replicas = grpc_controller.replica_list()
    assert len(replicas) == 0

    r1_url = grpc_replica1.url
    r2_url = grpc_replica2.url
    v = grpc_controller.volume_start(replicas=[r1_url, r2_url])
    assert v.replicaCount == 2

    replicas = grpc_controller.replica_list()
    assert len(replicas) == 2
    assert replicas[0].mode == "RW"
    assert replicas[1].mode == "RW"

    dev = get_blockdev(VOLUME_NAME)

    data = random_string(128)
    data_offset = 1024
    verify_data(dev, data_offset, data)

    # Cleanup replica2
    cleanup_replica(grpc_replica2)

    verify_async(dev, 10, 128, 1)

    verify_replica_state(grpc_controller, 1, "ERR")

    verify_read(dev, data_offset, data)

    grpc_controller.replica_delete(replicas[1].address)

    # Rebuild replica2
    open_replica(grpc_replica2)
    cmd.add_replica(address, r2_url)

    verify_async(dev, 10, 128, 1)

    verify_replica_state(grpc_controller, 1, "RW")

    verify_read(dev, data_offset, data)

    # WORKAROUND for unable to remove the parent of volume head
    newsnap = cmd.snapshot_create(address)

    info = cmd.snapshot_info(address)
    assert len(info) == 3
    sysnap = info[newsnap]["parent"]
    assert info[sysnap]["parent"] == ""
    assert newsnap in info[sysnap]["children"]
    assert info[sysnap]["usercreated"] is False
    assert info[sysnap]["removed"] is False

    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    info = cmd.snapshot_info(address)
    assert len(info) == 2
    assert info[newsnap] is not None
    assert info[VOLUME_HEAD] is not None
def snapshot_tree_verify_relationship(snap, strict):
    info = cmd.snapshot_info()

    assert snap["0a"] in info
    assert info[snap["0a"]]["children"] == [snap["0b"]]

    assert snap["0b"] in info
    assert info[snap["0b"]]["parent"] == snap["0a"]
    assert len(info[snap["0b"]]["children"]) == 3
    assert snap["0c"] in info[snap["0b"]]["children"]
    assert snap["1a"] in info[snap["0b"]]["children"]
    assert snap["2a"] in info[snap["0b"]]["children"]

    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"] == [snap["1c"]]

    assert snap["1c"] in info
    assert info[snap["1c"]]["parent"] == snap["1b"]
    assert info[snap["1c"]]["children"] == []

    assert snap["2a"] in info
    assert info[snap["2a"]]["parent"] == snap["0b"]
    assert len(info[snap["2a"]]["children"]) == 2
    assert snap["2b"] in info[snap["2a"]]["children"]
    assert snap["3a"] in info[snap["2a"]]["children"]

    assert snap["2b"] in info
    assert info[snap["2b"]]["parent"] == snap["2a"]
    assert info[snap["2b"]]["children"] == [snap["2c"]]

    assert snap["2c"] in info
    assert info[snap["2c"]]["parent"] == snap["2b"]
    assert info[snap["2c"]]["children"] == []

    assert snap["3a"] in info
    assert info[snap["3a"]]["parent"] == snap["2a"]
    assert info[snap["3a"]]["children"] == [snap["3b"]]

    assert snap["3b"] in info
    assert info[snap["3b"]]["parent"] == snap["3a"]
    assert info[snap["3b"]]["children"] == [snap["3c"]]

    assert snap["3c"] in info
    assert info[snap["3c"]]["parent"] == snap["3b"]

    if strict:
        assert len(info) == 13
        assert info[snap["0a"]]["parent"] == ""
        assert info[snap["3c"]]["children"] == [VOLUME_HEAD]
        assert VOLUME_HEAD in info
        assert info[VOLUME_HEAD]["parent"] == snap["3c"]
        assert info[VOLUME_HEAD]["children"] == []

        output = cmd.snapshot_ls()
        assert output == '''ID
{}
{}
{}
{}
{}
{}
'''.format(snap["3c"], snap["3b"], snap["3a"], snap["2a"], snap["0b"],
           snap["0a"])
def test_snapshot_rm_rolling(
        grpc_controller,  # NOQA
        grpc_replica1,
        grpc_replica2):  # NOQA
    address = grpc_controller.address

    dev = get_dev(grpc_replica1, grpc_replica2, grpc_controller)

    existings = {}

    snap1 = Snapshot(dev, generate_random_data(existings), address)

    snapList = cmd.snapshot_ls(address)
    assert snap1.name in snapList

    cmd.snapshot_rm(address, snap1.name)
    # cannot do anything because it's the parent of volume head
    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    snap2 = Snapshot(dev, generate_random_data(existings), address)

    info = cmd.snapshot_info(address)
    assert len(info) == 3
    assert snap1.name in info
    assert snap2.name in info
    assert info[snap1.name]["removed"] is True
    assert info[snap2.name]["removed"] is False

    cmd.snapshot_rm(address, snap2.name)
    # this should trigger the deletion of snap1
    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    snap2.verify_checksum()
    snap1.verify_data()

    snap3 = Snapshot(dev, generate_random_data(existings), address)
    snap4 = Snapshot(dev, generate_random_data(existings), address)
    snap5 = Snapshot(dev, generate_random_data(existings), address)

    snapList = cmd.snapshot_ls(address)
    assert snap1.name not in snapList
    assert snap2.name not in snapList
    assert snap3.name in snapList
    assert snap4.name in snapList
    assert snap5.name in snapList

    info = cmd.snapshot_info(address)
    assert len(info) == 5
    assert snap1.name not in info
    assert snap2.name in info
    assert snap3.name in info
    assert snap4.name in info
    assert snap5.name in info
    assert info[snap2.name]["removed"] is True

    cmd.snapshot_rm(address, snap3.name)
    cmd.snapshot_rm(address, snap4.name)
    cmd.snapshot_rm(address, snap5.name)
    # this should trigger the deletion of snap2 - snap4
    # and snap5 marked as removed
    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    info = cmd.snapshot_info(address)
    assert len(info) == 2
    assert snap1.name not in info
    assert snap2.name not in info
    assert snap3.name not in info
    assert snap4.name not in info
    assert snap5.name in info
    assert info[snap5.name]["removed"] is True

    snap5.verify_checksum()
    snap4.verify_data()
    snap3.verify_data()
    snap2.verify_data()
    snap1.verify_data()
Example #17
0
def snapshot_tree_verify_relationship(snap, strict):
    info = cmd.snapshot_info()

    assert snap["0a"] in info
    assert snap["0b"] in info[snap["0a"]]["children"]

    assert snap["0b"] in info
    assert info[snap["0b"]]["parent"] == snap["0a"]
    assert len(info[snap["0b"]]["children"]) == 3
    assert snap["0c"] in info[snap["0b"]]["children"]
    assert snap["1a"] in info[snap["0b"]]["children"]
    assert snap["2a"] in info[snap["0b"]]["children"]

    assert snap["0c"] in info
    assert info[snap["0c"]]["parent"] == snap["0b"]
    assert not info[snap["0c"]]["children"]

    assert snap["1a"] in info
    assert info[snap["1a"]]["parent"] == snap["0b"]
    assert snap["1b"] in info[snap["1a"]]["children"]

    assert snap["1b"] in info
    assert info[snap["1b"]]["parent"] == snap["1a"]
    assert snap["1c"] in info[snap["1b"]]["children"]

    assert snap["1c"] in info
    assert info[snap["1c"]]["parent"] == snap["1b"]
    assert not info[snap["1c"]]["children"]

    assert snap["2a"] in info
    assert info[snap["2a"]]["parent"] == snap["0b"]
    assert len(info[snap["2a"]]["children"]) == 2
    assert snap["2b"] in info[snap["2a"]]["children"]
    assert snap["3a"] in info[snap["2a"]]["children"]

    assert snap["2b"] in info
    assert info[snap["2b"]]["parent"] == snap["2a"]
    assert snap["2c"] in info[snap["2b"]]["children"]

    assert snap["2c"] in info
    assert info[snap["2c"]]["parent"] == snap["2b"]
    assert not info[snap["2c"]]["children"]

    assert snap["3a"] in info
    assert info[snap["3a"]]["parent"] == snap["2a"]
    assert snap["3b"] in info[snap["3a"]]["children"]

    assert snap["3b"] in info
    assert info[snap["3b"]]["parent"] == snap["3a"]
    assert snap["3c"] in info[snap["3b"]]["children"]

    assert snap["3c"] in info
    assert info[snap["3c"]]["parent"] == snap["3b"]

    if strict:
        assert len(info) == 13
        assert info[snap["0a"]]["parent"] == ""
        assert VOLUME_HEAD in info[snap["3c"]]["children"]
        assert VOLUME_HEAD in info
        assert info[VOLUME_HEAD]["parent"] == snap["3c"]
        assert not info[VOLUME_HEAD]["children"]

        output = cmd.snapshot_ls()
        assert output == '''ID
{}
{}
{}
{}
{}
{}
'''.format(snap["3c"], snap["3b"], snap["3a"],
           snap["2a"], snap["0b"], snap["0a"])
def test_snapshot_tree_basic(
        grpc_controller,  # NOQA
        grpc_replica1,
        grpc_replica2):  # NOQA
    address = grpc_controller.address

    dev = get_dev(grpc_replica1, grpc_replica2, grpc_controller)

    offset = 0
    length = 128

    snap, data = snapshot_tree_build(dev, address, ENGINE_NAME, offset, length)

    snapshot_revert_with_frontend(address, ENGINE_NAME, snap["1b"])
    cmd.snapshot_rm(address, snap["0a"])
    cmd.snapshot_rm(address, snap["0b"])
    cmd.snapshot_rm(address, snap["1c"])
    cmd.snapshot_rm(address, snap["2a"])
    cmd.snapshot_rm(address, snap["2b"])
    cmd.snapshot_rm(address, snap["2c"])
    cmd.snapshot_rm(address, snap["3a"])
    cmd.snapshot_rm(address, snap["3b"])
    cmd.snapshot_rm(address, snap["3c"])
    cmd.snapshot_purge(address)
    wait_for_purge_completion(address)

    # the result should looks like this
    # snap["0b"](r) -> snap["0c"]
    #   \-> snap["1a"] -> snap["1b"] -> head
    info = cmd.snapshot_info(address)
    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 not info[snap["0c"]]["children"]

    assert snap["1a"] in info
    assert info[snap["1a"]]["parent"] == snap["0b"]
    assert snap["1b"] in info[snap["1a"]]["children"]

    assert snap["1b"] in info
    assert info[snap["1b"]]["parent"] == snap["1a"]
    assert VOLUME_HEAD in info[snap["1b"]]["children"]

    assert VOLUME_HEAD in info
    assert info[VOLUME_HEAD]["parent"] == snap["1b"]

    snapshot_tree_verify_node(dev, address, ENGINE_NAME, offset, length, snap,
                              data, "0b")
    snapshot_tree_verify_node(dev, address, ENGINE_NAME, offset, length, snap,
                              data, "0c")
    snapshot_tree_verify_node(dev, address, ENGINE_NAME, offset, length, snap,
                              data, "1a")
    snapshot_tree_verify_node(dev, address, ENGINE_NAME, offset, length, snap,
                              data, "1b")
Example #19
0
def test_snapshot_rm_rolling(dev):  # NOQA
    existings = {}

    snap1 = Snapshot(dev, generate_random_data(existings))

    snapList = cmd.snapshot_ls()
    assert snap1.name in snapList

    cmd.snapshot_rm(snap1.name)
    # cannot do anything because it's the parent of volume head
    cmd.snapshot_purge()

    snap2 = Snapshot(dev, generate_random_data(existings))

    info = cmd.snapshot_info()
    assert len(info) == 3
    assert snap1.name in info
    assert snap2.name in info
    assert info[snap1.name]["removed"] is True
    assert info[snap2.name]["removed"] is False

    cmd.snapshot_rm(snap2.name)
    # this should trigger the deletion of snap1
    cmd.snapshot_purge()

    snap2.verify_checksum()
    snap1.verify_data()

    snap3 = Snapshot(dev, generate_random_data(existings))
    snap4 = Snapshot(dev, generate_random_data(existings))
    snap5 = Snapshot(dev, generate_random_data(existings))

    snapList = cmd.snapshot_ls()
    assert snap1.name not in snapList
    assert snap2.name not in snapList
    assert snap3.name in snapList
    assert snap4.name in snapList
    assert snap5.name in snapList

    info = cmd.snapshot_info()
    assert len(info) == 5
    assert snap1.name not in info
    assert snap2.name in info
    assert snap3.name in info
    assert snap4.name in info
    assert snap5.name in info
    assert info[snap2.name]["removed"] is True

    cmd.snapshot_rm(snap3.name)
    cmd.snapshot_rm(snap4.name)
    cmd.snapshot_rm(snap5.name)
    # this should trigger the deletion of snap2 - snap4
    # and snap5 marked as removed
    cmd.snapshot_purge()

    info = cmd.snapshot_info()
    assert len(info) == 2
    assert snap1.name not in info
    assert snap2.name not in info
    assert snap3.name not in info
    assert snap4.name not in info
    assert snap5.name in info
    assert info[snap5.name]["removed"] is True

    snap5.verify_checksum()
    snap4.verify_data()
    snap3.verify_data()
    snap2.verify_data()
    snap1.verify_data()