/**
 * 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.
 */

/**
 * These .proto interfaces are private and unstable.
 * Please see http://wiki.apache.org/hadoop/Compatibility
 * for what changes are allowed for a *unstable* .proto interface.
 */

option java_package = "org.apache.hadoop.hdds.protocol.proto";

option java_outer_classname = "SCMSecurityProtocolProtos";

option java_generic_services = true;

option java_generate_equals_and_hash = true;

package hadoop.hdds.security;

import "hdds.proto";

/**
All commands is send as request and all response come back via
Response class. If adding new functions please follow this protocol, since
our tracing and visibility tools depend on this pattern.
*/
message SCMSecurityRequest {
    required Type cmdType = 1; // Type of the command

    optional string traceID = 2;

    optional SCMGetDataNodeCertRequestProto getDataNodeCertRequest = 3;
    optional SCMGetOMCertRequestProto getOMCertRequest = 4;
    optional SCMGetCertificateRequestProto getCertificateRequest = 5;
    optional SCMGetCACertificateRequestProto getCACertificateRequest = 6;
    optional SCMListCertificateRequestProto listCertificateRequest = 7;
    optional SCMGetSCMCertRequestProto getSCMCertificateRequest = 8;

}

message SCMSecurityResponse {
    required Type cmdType = 1; // Type of the command

    // A string that identifies this command, we generate  Trace ID in Ozone
    // frontend and this allows us to trace that command all over ozone.
    optional string traceID = 2;

    optional bool success = 3 [default = true];

    optional string message = 4;

    required Status status = 5;

    optional SCMGetCertResponseProto getCertResponseProto = 6;

    optional SCMListCertificateResponseProto listCertificateResponseProto = 7;

}

enum Type {
    GetDataNodeCertificate = 1;
    GetOMCertificate = 2;
    GetCertificate = 3;
    GetCACertificate = 4;
    ListCertificate = 5;
    GetSCMCertificate = 6;
}

enum Status {
    OK = 1;
    INVALID_CSR = 2;
    UNABLE_TO_ISSUE_CERTIFICATE = 3;
    GET_DN_CERTIFICATE_FAILED = 4;
    GET_OM_CERTIFICATE_FAILED = 5;
    GET_SCM_CERTIFICATE_FAILED = 6;
    GET_CERTIFICATE_FAILED = 7;
    GET_CA_CERT_FAILED = 8;
    CERTIFICATE_NOT_FOUND = 9;
    PEM_ENCODE_FAILED = 10;
    INTERNAL_ERROR = 11;
    DEFAULT = 12;
    MISSING_BLOCK_TOKEN = 13;
    BLOCK_TOKEN_VERIFICATION_FAILED = 14;
}
/**
* This message is send by data node to prove its identity and get an SCM
* signed certificate.
*/
message SCMGetDataNodeCertRequestProto {
    required DatanodeDetailsProto datanodeDetails = 1;
    required string CSR = 2;
}

/**
* This message is send by OzoneManager to prove its identity and get an SCM
* signed certificate.
*/
message SCMGetOMCertRequestProto {
    required OzoneManagerDetailsProto omDetails = 1;
    required string CSR = 2;
}

message SCMGetSCMCertRequestProto {
    required ScmNodeDetailsProto scmDetails = 1;
    required string CSR = 2;
}

/**
* Proto request to get a certificate with given serial id.
*/
message SCMGetCertificateRequestProto {
    required string certSerialId = 1;
}

/**
* Proto request to get CA certificate.
*/
message SCMGetCACertificateRequestProto {
}

/**
* Proto request to list certificates by node type or all.
*/
message SCMListCertificateRequestProto {
    optional NodeType role = 1;
    optional int64 startCertId = 2;
    required uint32 count = 3; // Max
    optional bool isRevoked = 4; // list revoked certs
}

/**
 * Returns a certificate signed by SCM.
 */
message SCMGetCertResponseProto {
    enum ResponseCode {
        success = 1;
        authenticationFailed = 2;
        invalidCSR = 3;
    }
    required ResponseCode responseCode = 1;
    required string x509Certificate = 2; // Base64 encoded X509 certificate.
    optional string x509CACertificate = 3; // Base64 encoded CA X509 certificate.
}

/**
* Return a list of PEM encoded certificates.
*/
message SCMListCertificateResponseProto {
    enum ResponseCode {
        success = 1;
        authenticationFailed = 2;
    }
    required ResponseCode responseCode = 1;
    repeated string certificates = 2;
}


service SCMSecurityProtocolService {
    rpc submitRequest (SCMSecurityRequest) returns (SCMSecurityResponse);
}
