OperationChain startOperationChain(int blobSize, Container container, int chainId, Queue<OperationType> operations) {
    byte[] userMetadata = new byte[1000];
    byte[] data = new byte[blobSize];
    TestUtils.RANDOM.nextBytes(userMetadata);
    TestUtils.RANDOM.nextBytes(data);
    short accountId = container == null ? Utils.getRandomShort(TestUtils.RANDOM) : container.getParentAccountId();
    short containerId = container == null ? Utils.getRandomShort(TestUtils.RANDOM) : container.getId();
    BlobProperties properties =
        new BlobProperties(blobSize, "serviceid1", null, null, false, TestUtils.TTL_SECS, accountId, containerId,
            testEncryption, null, null, null);
    OperationChain opChain = new OperationChain(chainId, properties, userMetadata, data, operations);
    continueChain(opChain);
    return opChain;
  }
Create an {@link OperationChain} from a queue of {@link OperationType}s.  Start the operation chain asynchronously.
@param blobSize the size of the blob generated for put operations.
@param container the {@link Container} to put the blob into (can be {@code null}}
@param chainId a numeric identifying the operation chain.
@param operations the queue of operations to perform in the chain
@return an {@link OperationChain} object describing the started chain.
ambry-server/src/integration-test/java/com/github/ambry/server/RouterServerTestFramework.java