コード例 #1
0
def test_descriptor_compute_chunk_size():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, mock.MagicMock())
    assert d._compute_chunk_size() == \
        synccopy._MAX_NONBLOCK_BLOB_CHUNKSIZE_BYTES

    d = synccopy.Descriptor(src_ase, dst_ase, [], opts, mock.MagicMock())
    assert d._compute_chunk_size() == d.src_entity.size

    b = mock.MagicMock()
    b.size = 1
    d = synccopy.Descriptor(src_ase, dst_ase, [b], opts, mock.MagicMock())
    assert d._compute_chunk_size() == 1

    d = synccopy.Descriptor(src_ase, dst_ase, [b, b], opts, mock.MagicMock())
    assert d._compute_chunk_size() == -1
コード例 #2
0
def test_descriptor_complete_offset_upload():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, mock.MagicMock())
    d.complete_offset_upload(0)
    assert d._outstanding_ops == 1

    d.complete_offset_upload(0)
    assert d._outstanding_ops == 0
    assert 0 not in d._replica_counters
コード例 #3
0
def test_descriptor():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, mock.MagicMock())
    assert d._offset == 0
    assert d._chunk_num == 0
    assert not d._finalized
    assert d._src_block_list is None

    assert d.src_entity == src_ase
    assert d.dst_entity == dst_ase
    assert not d.all_operations_completed
    assert d.is_resumable
    assert d.last_block_num == -1
    assert not d.remote_is_file
    assert not d.remote_is_page_blob
    assert not d.remote_is_append_blob
    assert d.is_one_shot_block_blob
    assert not d.requires_put_block_list
コード例 #4
0
def test_descriptor_compute_total_chunks():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, mock.MagicMock())
    assert d._compute_total_chunks(0) == 1
コード例 #5
0
def test_descriptor_next_offsets():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    # test normal
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, None)
    d._resume = mock.MagicMock()
    d._resume.return_value = None

    offsets, rb = d.next_offsets()
    assert rb is None
    assert offsets.chunk_num == 0
    assert offsets.num_bytes == 32
    assert offsets.range_start == 0
    assert offsets.range_end == 31
    assert d._offset == 32
    assert d._chunk_num == 1

    # test nothing left
    offsets, rb = d.next_offsets()
    assert rb is None
    assert offsets is None

    # test neg chunk size with block list
    b = mock.MagicMock()
    b.size = 10
    d = synccopy.Descriptor(src_ase, dst_ase, [b], opts, None)
    d._resume = mock.MagicMock()
    d._resume.return_value = None
    d._chunk_size = -1

    offsets, rb = d.next_offsets()
    assert rb is None
    assert offsets.chunk_num == 0
    assert offsets.num_bytes == 10
    assert offsets.range_start == 0
    assert offsets.range_end == 9
    assert d._offset == 10
    assert d._chunk_num == 1

    # test small chunk size
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, None)
    d._resume = mock.MagicMock()
    d._resume.return_value = None
    d._chunk_size = 32
    offsets, rb = d.next_offsets()
    assert rb is None
    assert offsets.chunk_num == 0
    assert offsets.num_bytes == 32
    assert offsets.range_start == 0
    assert offsets.range_end == 31
    assert d._offset == 32
    assert d._chunk_num == 1
コード例 #6
0
def test_resume():
    opts = mock.MagicMock()
    opts.dest_mode = azmodels.StorageModes.Auto
    opts.mode = azmodels.StorageModes.Auto

    src_ase = azmodels.StorageEntity('cont')
    src_ase._mode = azmodels.StorageModes.Block
    src_ase._name = 'name'
    src_ase._size = 32
    src_ase._encryption = None

    dst_ase = azmodels.StorageEntity('cont2')
    dst_ase._mode = azmodels.StorageModes.Block
    dst_ase._name = 'name'
    dst_ase._size = 32
    dst_ase._encryption = None
    dst_ase.replica_targets = [mock.MagicMock()]

    # test no resume
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, None)
    assert d._resume() is None

    # check if path exists in resume db
    resume = mock.MagicMock()
    resume.get_record.return_value = None
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, resume)
    assert d._resume() is None

    # check same lengths
    bad = mock.MagicMock()
    bad.length = 0
    resume.get_record.return_value = bad
    assert d._resume() is None

    # check completed resume
    comp = mock.MagicMock()
    comp.length = 32
    comp.completed = True
    comp.total_chunks = 1
    comp.chunk_size = 32
    comp.completed_chunks = 1
    resume.get_record.return_value = comp
    dst_ase.replica_targets = None
    d._completed_chunks = mock.MagicMock()
    assert d._resume() == 32

    dst_ase.replica_targets = [dst_ase]
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, resume)
    d._completed_chunks = mock.MagicMock()
    assert d._resume() == 64

    # check resume no md5
    nc = mock.MagicMock()
    nc.offset = 16
    nc.length = 32
    nc.completed = False
    nc.total_chunks = 2
    nc.chunk_size = 16
    cc = bitstring.BitArray(length=nc.total_chunks)
    cc.set(True, 0)
    nc.completed_chunks = cc.int

    resume.get_record.return_value = nc
    dst_ase.replica_targets = None
    d = synccopy.Descriptor(src_ase, dst_ase, None, opts, resume)
    assert d._resume() == 16