Beispiel #1
0
def test_replica_add_after_rebuild_failed(
        bin,
        grpc_controller_client,  # NOQA
        grpc_replica_client,  # NOQA
        grpc_replica_client2):  # NOQA
    open_replica(grpc_replica_client)
    open_replica(grpc_replica_client2)

    grpc_replica_client.replica_open()
    grpc_replica_client.replica_snapshot(
        name='000', created=datetime.datetime.utcnow().isoformat())
    grpc_replica_client.replica_close()

    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'add-replica',
        grpc_replica_client.url
    ]
    subprocess.check_call(cmd)

    volume = grpc_controller_client.volume_get()
    assert volume.replicaCount == 1

    grpc_replica_client2.replica_open()
    grpc_replica_client2.rebuilding_set(rebuilding=True)
    grpc_replica_client2.replica_close()

    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'add-replica',
        grpc_replica_client2.url
    ]
    subprocess.check_call(cmd)

    volume = grpc_controller_client.volume_get()
    assert volume.replicaCount == 2

    replicas = grpc_controller_client.replica_list()
    assert len(replicas) == 2

    for r in replicas:
        assert r.mode == 'RW'
Beispiel #2
0
def test_replica_add_start(
        bin,
        grpc_controller_client,  # NOQA
        grpc_replica_client):  # NOQA
    open_replica(grpc_replica_client)

    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'add-replica',
        grpc_replica_client.url
    ]
    subprocess.check_call(cmd)

    volume = grpc_controller_client.volume_get()
    assert volume.replicaCount == 1
Beispiel #3
0
def test_shutdown(grpc_client):  # NOQA
    v = grpc_client.volume_get()
    assert v.replicaCount == 0

    f1 = create_backend_file()
    f2 = create_backend_file()
    addresses = ['file://' + f1, 'file://' + f2]
    v = grpc_client.volume_start(replicas=addresses)
    assert v.replicaCount == 2

    v = grpc_client.volume_shutdown()
    assert v.replicaCount == 0

    rs = grpc_client.replica_list()
    assert len(rs) == 0

    cleanup_backend_file([f1, f2])
Beispiel #4
0
def test_start(grpc_client):  # NOQA
    v = grpc_client.volume_get()
    assert v.replicaCount == 0

    f1 = create_backend_file()
    f2 = create_backend_file()
    addresses = ['file://' + f1, 'file://' + f2]
    v = grpc_client.volume_start(replicas=addresses)

    rs = grpc_client.replica_list()
    assert len(rs) == 2
    assert v.replicaCount == 2

    found_addresses = [r.address for r in rs]
    assert set(found_addresses) == set(addresses)

    cleanup_backend_file([f1, f2])
Beispiel #5
0
def backup_core(
        bin,
        engine_manager_client,  # NOQA
        grpc_controller_client,  # NOQA
        grpc_replica_client,  # NOQA
        grpc_replica_client2,  # NOQA
        backup_target):
    open_replica(grpc_replica_client)
    open_replica(grpc_replica_client2)

    r1_url = grpc_replica_client.url
    r2_url = grpc_replica_client2.url
    v = grpc_controller_client.volume_start(replicas=[
        r1_url,
        r2_url,
    ])
    assert v.replicaCount == 2

    env = dict(os.environ)
    backup_type = urlparse(backup_target).scheme
    cmd = [bin, '--url', grpc_controller_client.address, 'snapshot', 'create']
    snapshot1 = subprocess.check_output(cmd).strip()
    output = grpc_replica_client.replica_get().chain[1]

    assert output == 'volume-snap-{}.img'.format(snapshot1)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'create',
        snapshot1, '--dest', backup_target, '--label', 'name=backup1',
        '--label', 'type=' + backup_type
    ]
    backup = json.loads(subprocess.check_output(cmd, env=env).strip())
    assert "backupID" in backup.keys()
    assert "isIncremental" in backup.keys()
    assert backup["isIncremental"] is False
    backup1 = get_backup_url(bin, grpc_controller_client.address,
                             backup["backupID"])

    cmd = [bin, '--url', grpc_controller_client.address, 'snapshot', 'create']
    snapshot2 = subprocess.check_output(cmd).strip()
    output = grpc_replica_client.replica_get().chain[1]

    assert output == 'volume-snap-{}.img'.format(snapshot2)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'create',
        snapshot2, '--dest', backup_target
    ]
    backup = json.loads(subprocess.check_output(cmd, env=env).strip())
    assert "backupID" in backup.keys()
    assert "isIncremental" in backup.keys()
    assert backup["isIncremental"] is True
    backup2 = get_backup_url(bin, grpc_controller_client.address,
                             backup["backupID"])

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'inspect',
        backup1
    ]
    data = subprocess.check_output(cmd, env=env)
    backup1_info = json.loads(data)
    assert backup1_info["URL"] == backup1
    assert backup1_info["VolumeName"] == VOLUME_NAME
    assert backup1_info["VolumeSize"] == SIZE_STR
    assert backup1_info["SnapshotName"] == snapshot1
    assert len(backup1_info["Labels"]) == 2
    assert backup1_info["Labels"]["name"] == "backup1"
    assert backup1_info["Labels"]["type"] == backup_type

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'inspect',
        backup2
    ]
    data = subprocess.check_output(cmd, env=env)
    backup2_info = json.loads(data)
    assert backup2_info["URL"] == backup2
    assert backup2_info["VolumeName"] == VOLUME_NAME
    assert backup2_info["VolumeSize"] == SIZE_STR
    assert backup2_info["SnapshotName"] == snapshot2
    if backup2_info["Labels"] is not None:
        assert len(backup2_info["Labels"]) == 0

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'ls',
        backup_target
    ]
    data = subprocess.check_output(cmd, env=env).strip()
    volume_info = json.loads(data)[VOLUME_NAME]
    assert volume_info["Name"] == VOLUME_NAME
    assert volume_info["Size"] == SIZE_STR
    backup_list = volume_info["Backups"]
    assert backup_list[backup1]["URL"] == backup1_info["URL"]
    assert backup_list[backup1]["SnapshotName"] == backup1_info["SnapshotName"]
    assert backup_list[backup1]["Size"] == backup1_info["Size"]
    assert backup_list[backup1]["Created"] == backup1_info["Created"]
    assert backup_list[backup2]["URL"] == backup2_info["URL"]
    assert backup_list[backup2]["SnapshotName"] == backup2_info["SnapshotName"]
    assert backup_list[backup2]["Size"] == backup2_info["Size"]
    assert backup_list[backup2]["Created"] == backup2_info["Created"]

    # test backup volume list
    # https://github.com/rancher/longhorn/issues/399
    volume_dir = finddir(BACKUP_DEST, VOLUME_NAME)
    assert volume_dir
    assert path.exists(volume_dir)
    volume_cfg_path = findfile(volume_dir, VOLUME_CONFIG_FILE)
    assert path.exists(volume_cfg_path)
    volume_tmp_cfg_path = volume_cfg_path.replace(VOLUME_CONFIG_FILE,
                                                  VOLUME_TMP_CONFIG_FILE)
    os.rename(volume_cfg_path, volume_tmp_cfg_path)
    assert path.exists(volume_tmp_cfg_path)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'ls',
        '--volume-only', backup_target
    ]
    data = subprocess.check_output(cmd, env=env)
    volume_info = json.loads(data)

    assert volume_info
    assert volume_info[VOLUME_NAME] is not None
    assert volume_info[VOLUME_NAME]["Messages"] is not None
    assert MESSAGE_TYPE_ERROR in volume_info[VOLUME_NAME]["Messages"]

    os.rename(volume_tmp_cfg_path, volume_cfg_path)
    assert path.exists(volume_cfg_path)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'ls',
        '--volume-only', backup_target
    ]
    data = subprocess.check_output(cmd, env=env)
    volume_info = json.loads(data)

    assert volume_info
    assert volume_info[VOLUME_NAME] is not None
    assert volume_info[VOLUME_NAME]["Messages"] is not None
    assert MESSAGE_TYPE_ERROR not in volume_info[VOLUME_NAME]["Messages"]

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'inspect',
        backup_target + "?backup=backup-1234" + "&volume=" + VOLUME_NAME
    ]
    # cannot find the backup
    with pytest.raises(subprocess.CalledProcessError):
        subprocess.check_call(cmd, env=env)

    restore_backup(engine_manager_client, bin, grpc_controller_client.address,
                   backup1, env, grpc_controller_client)
    restore_backup(engine_manager_client, bin, grpc_controller_client.address,
                   backup2, env, grpc_controller_client)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'rm', backup1
    ]
    subprocess.check_call(cmd, env=env)
    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'rm', backup2
    ]
    subprocess.check_call(cmd, env=env)

    assert os.path.exists(BACKUP_DEST)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'inspect',
        backup_target + "?backup=backup-1234" + "&volume=" + VOLUME_NAME
    ]
    # cannot find the backup
    with pytest.raises(subprocess.CalledProcessError):
        subprocess.check_call(cmd, env=env)

    cmd = [
        bin, '--url', grpc_controller_client.address, 'backup', 'inspect',
        "xxx"
    ]
    # cannot find the backup
    with pytest.raises(subprocess.CalledProcessError):
        subprocess.check_call(cmd, env=env)
    engine_manager_client.frontend_start(ENGINE_NAME, FRONTEND_TGT_BLOCKDEV)
    v = grpc_controller_client.volume_get()
    assert v.frontendState == "up"
Beispiel #6
0
def test_replica_add_rebuild(
        bin,
        grpc_controller_client,  # NOQA
        grpc_replica_client,  # NOQA
        grpc_replica_client2):  # NOQA
    open_replica(grpc_replica_client)
    open_replica(grpc_replica_client2)

    snap0 = "000"
    snap1 = "001"
    grpc_replica_client.replica_open()
    createtime0 = getNow()
    grpc_replica_client.replica_snapshot(name=snap0,
                                         created=createtime0,
                                         labels={
                                             "name": "snap0",
                                             "key": "value"
                                         })
    createtime1 = getNow()
    r = grpc_replica_client.replica_snapshot(name=snap1,
                                             user_created=True,
                                             created=createtime1)

    r2 = grpc_replica_client2.replica_get()

    assert r.chain == [
        'volume-head-002.img', 'volume-snap-001.img', 'volume-snap-000.img'
    ]

    assert r2.chain != [
        'volume-head-002.img', 'volume-snap-001.img', 'volume-snap-000.img'
    ]

    grpc_replica_client.replica_close()
    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'add-replica',
        grpc_replica_client.url
    ]
    subprocess.check_call(cmd)

    volume = grpc_controller_client.volume_get()
    assert volume.replicaCount == 1

    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'add-replica',
        grpc_replica_client2.url
    ]
    subprocess.check_call(cmd)

    volume = grpc_controller_client.volume_get()
    assert volume.replicaCount == 2

    replicas = grpc_controller_client.replica_list()
    assert len(replicas) == 2

    for r in replicas:
        assert r.mode == 'RW'

    cmd = [
        bin, '--debug', '--url', grpc_controller_client.address, 'snapshot',
        'info'
    ]
    output = subprocess.check_output(cmd)
    info = json.loads(output)

    # two existing snapshots and one system snapshot due to rebuild
    # and volume-head
    volumehead = "volume-head"
    assert len(info) == 4
    for name in info:
        if name != snap0 and name != snap1 and name != volumehead:
            snapreb = name
            break

    head_info = info[volumehead]
    assert head_info["name"] == volumehead
    assert head_info["parent"] == snapreb
    assert not head_info["children"]
    assert head_info["removed"] is False
    assert head_info["usercreated"] is False
    assert head_info["size"] == "0"

    snapreb_info = info[snapreb]
    assert snapreb_info["name"] == snapreb
    assert snapreb_info["parent"] == snap1
    assert volumehead in snapreb_info["children"]
    assert snapreb_info["removed"] is False
    assert snapreb_info["usercreated"] is False
    assert snapreb_info["size"] == "0"

    snap1_info = info[snap1]
    assert snap1_info["name"] == snap1
    assert snap1_info["parent"] == snap0
    assert snapreb in snap1_info["children"]
    assert snap1_info["removed"] is False
    assert snap1_info["usercreated"] is True
    assert snap1_info["created"] == createtime1
    assert snap1_info["size"] == "0"

    snap0_info = info[snap0]
    assert snap0_info["name"] == snap0
    assert snap0_info["parent"] == ""
    assert snap1 in snap0_info["children"]
    assert snap0_info["removed"] is False
    assert snap0_info["usercreated"] is False
    assert snap0_info["created"] == createtime0
    assert snap0_info["size"] == "0"
    assert snap0_info["labels"]["name"] == "snap0"
    assert snap0_info["labels"]["key"] == "value"