/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
syntax = "proto2";

option java_package = "org.apache.bookkeeper.proto";
option optimize_for = SPEED;

/**
 * Protocol Versions.
 */
enum ProtocolVersion {
    VERSION_ONE = 1;
    VERSION_TWO = 2;
    VERSION_THREE = 3;
}

/**
 * Status codes.
 */
enum StatusCode {
    EOK = 0;

    // Server side Errors 4xx
    ENOLEDGER = 402;
    ENOENTRY = 403;
    EBADREQ = 404;

    // IO/access errors 5xx
    EIO = 501;
    EUA = 502;
    EBADVERSION = 503;
    EFENCED = 504;
    EREADONLY = 505;
    ETOOMANYREQUESTS = 506;
}

/**
 * Supported operations by this protocol.
 */
enum OperationType {
    READ_ENTRY = 1;
    ADD_ENTRY = 2;
    // Not supported yet.
    RANGE_READ_ENTRY = 3;
    RANGE_ADD_ENTRY = 4;

    AUTH = 5;
    WRITE_LAC = 6;
    READ_LAC = 7;
    GET_BOOKIE_INFO = 8;
    START_TLS = 9;
    FORCE_LEDGER = 10;
    GET_LIST_OF_ENTRIES_OF_LEDGER = 11;
}

/**
 * Packet header for all requests.
 */
message BKPacketHeader {
    required ProtocolVersion version = 1;
    required OperationType operation = 2;
    required uint64 txnId = 3;
    optional uint32 priority = 4 [default = 0];
}

message ContextPair {
    required string key = 1;
    required string value = 2;
}

message Request {
    required BKPacketHeader header = 1;
    // Requests
    optional ReadRequest readRequest = 100;
    optional AddRequest addRequest = 101;
    optional AuthMessage authRequest = 102;
    optional WriteLacRequest writeLacRequest = 103;
    optional ReadLacRequest readLacRequest = 104;
    optional GetBookieInfoRequest getBookieInfoRequest = 105;
    optional StartTLSRequest startTLSRequest = 106;
    optional ForceLedgerRequest forceLedgerRequest = 107;
    optional GetListOfEntriesOfLedgerRequest getListOfEntriesOfLedgerRequest = 108;
    // to pass MDC context
    repeated ContextPair requestContext = 200;
}

message ReadRequest {
    enum Flag {
        FENCE_LEDGER = 1;
        ENTRY_PIGGYBACK = 2;
    }
    optional Flag flag = 100;
    required int64 ledgerId = 1;
    // entryId will be -1 for reading the LAST_ADD_CONFIRMED entry.
    required int64 entryId = 2;
    // Used while fencing a ledger.
    optional bytes masterKey = 3;
    // Used for waiting on last add confirmed update
    optional int64 previousLAC = 4;
    // Used as a timeout (in milliseconds) for the long polling request
    optional int64 timeOut = 5;
}

message AddRequest {
    enum Flag {
        RECOVERY_ADD = 1;
    }
    optional Flag flag = 100;
    required int64 ledgerId = 1;
    required int64 entryId = 2;
    required bytes masterKey = 3;
    required bytes body = 4;
    optional int32 writeFlags = 5;
}

message StartTLSRequest {
}

message WriteLacRequest {
    required int64 ledgerId = 1;
    required int64 lac = 2;
    required bytes masterKey = 3;
    required bytes body = 4;
}

message ForceLedgerRequest {
    required int64 ledgerId = 1;
}

message ReadLacRequest {
    required int64 ledgerId = 1;
}

message GetBookieInfoRequest {
    enum Flags {
        TOTAL_DISK_CAPACITY = 0x01;
        FREE_DISK_SPACE = 0x02;
    }
    // bitwise OR of Flags
    optional int64 requested = 1;
}

message GetListOfEntriesOfLedgerRequest {
	required int64 ledgerId = 1;
}

message Response {

    required BKPacketHeader header = 1;
    // EOK if the underlying request succeeded. Each individual response
    // has a more meaningful status. EBADREQ if we have an unsupported request.
    required StatusCode status = 2;
    // Response
    optional ReadResponse readResponse = 100;
    optional AddResponse addResponse = 101;
    optional AuthMessage authResponse = 102;
    optional WriteLacResponse writeLacResponse = 103;
    optional ReadLacResponse readLacResponse = 104;
    optional GetBookieInfoResponse getBookieInfoResponse = 105;
    optional StartTLSResponse startTLSResponse = 106;
    optional ForceLedgerResponse forceLedgerResponse = 107;
    optional GetListOfEntriesOfLedgerResponse getListOfEntriesOfLedgerResponse = 108;
}

message ReadResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
    required int64 entryId = 3;
    optional bytes body = 4;
    // Piggyback LAC
    optional int64 maxLAC = 5;
    optional int64 lacUpdateTimestamp = 6;
}

message AddResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
    required int64 entryId = 3;
}

message AuthMessage {
    required string authPluginName = 1;
    required bytes payload = 2;
}

message WriteLacResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
}

message ForceLedgerResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
}

message ReadLacResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
    optional bytes lacBody = 3; // lac sent by PutLacRequest
    optional bytes lastEntryBody = 4; // Actual last entry on the disk
}

message GetBookieInfoResponse {
    required StatusCode status = 1;
    optional int64 totalDiskCapacity = 2;
    optional int64 freeDiskSpace = 3;
}

message GetListOfEntriesOfLedgerResponse {
    required StatusCode status = 1;
    required int64 ledgerId = 2;
    optional bytes availabilityOfEntriesOfLedger = 3; // condensed encoded format representing availability of entries of ledger
}

message StartTLSResponse {
}
