syntax = "proto3";
package node_service;

/* -------------------------------------------------------------------- */
message Error {
  uint32 code = 1;
  string error_info = 2;
}

message PingRequest {
  uint64 version = 1;
  bytes body = 2;
}

message PingResponse {
  uint64 version = 1;
  bytes body = 2;
}

message HealBucketRequest {
  string bucket = 1;
  string options = 2;
}

message HealBucketResponse {
  bool success = 1;
  optional Error error = 2;
}

message ListBucketRequest {
  string options = 1;
}

message ListBucketResponse {
  bool success = 1;
  repeated string bucket_infos = 2;
  optional Error error = 3;
}

message MakeBucketRequest {
  string name = 1;
  string options = 2;
}

message MakeBucketResponse {
  bool success = 1;
  optional Error error = 2;
}

message GetBucketInfoRequest {
  string bucket = 1;
  string options = 2;
}

message GetBucketInfoResponse {
  bool success = 1;
  string bucket_info = 2;
  optional Error error = 3;
}

message DeleteBucketRequest {
  string bucket = 1;
}

message DeleteBucketResponse {
  bool success = 1;
  optional Error error = 2;
}

message ReadAllRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
}

message ReadAllResponse {
  bool success = 1;
  bytes data = 2;
  optional Error error = 3;
}

message WriteAllRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  bytes data = 4;
}

message WriteAllResponse {
  bool success = 1;
  optional Error error = 2;
}

message DeleteRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  string options = 4;
}

message DeleteResponse {
  bool success = 1;
  optional Error error = 2;
}

message VerifyFileRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  string file_info = 4;
}

message VerifyFileResponse {
  bool success = 1;
  string check_parts_resp = 2;
  optional Error error = 3;
}

message CheckPartsRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  string file_info = 4;
}

message CheckPartsResponse {
  bool success = 1;
  string check_parts_resp = 2;
  optional Error error = 3;
}

message RenamePartRequst {
  string disk = 1;
  string src_volume = 2;
  string src_path = 3;
  string dst_volume = 4;
  string dst_path = 5;
  bytes meta = 6;
}

message RenamePartResponse {
  bool success = 1;
  optional Error error = 2;
}

message RenameFileRequst {
  string disk = 1;
  string src_volume = 2;
  string src_path = 3;
  string dst_volume = 4;
  string dst_path = 5;
}

message RenameFileResponse {
  bool success = 1;
  optional Error error = 2;
}

message WriteRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  bool is_append = 4;
  bytes data = 5;
}

message WriteResponse {
  bool success = 1;
  optional Error error = 2;
}

// message AppendRequest {
//   string disk = 1;  // indicate which one in the disks
//   string volume = 2;
//   string path = 3;
//   bytes data = 4;
// }
// 
// message AppendResponse {
//   bool success = 1;
//   optional Error error = 2;
// }

message ReadAtRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  int64 offset = 4;
  int64 length = 5;
}

message ReadAtResponse {
  bool success = 1;
  bytes data = 2;
  int64 read_size = 3;
  optional Error error = 4;
}

message ListDirRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
}

message ListDirResponse {
  bool success = 1;
  repeated string volumes = 2;
  optional Error error = 3;
}

message WalkDirRequest {
  string disk = 1;  // indicate which one in the disks
  bytes walk_dir_options = 2;
}

message WalkDirResponse {
  bool success = 1;
  string meta_cache_entry = 2;
  optional string error_info = 3;
}

message RenameDataRequest {
  string disk = 1;  // indicate which one in the disks
  string src_volume = 2;
  string src_path = 3;
  string file_info = 4;
  string dst_volume = 5;
  string dst_path = 6;
}

message RenameDataResponse {
  bool success = 1;
  string rename_data_resp = 2;
  optional Error error = 3;
}

message MakeVolumesRequest {
  string disk = 1;  // indicate which one in the disks
  repeated string volumes = 2;
}

message MakeVolumesResponse {
  bool success = 1;
  optional Error error = 2;
}

message MakeVolumeRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
}

message MakeVolumeResponse {
  bool success = 1;
  optional Error error = 2;
}

message ListVolumesRequest {
  string disk = 1;  // indicate which one in the disks
}

message ListVolumesResponse {
  bool success = 1;
  repeated string volume_infos = 2;
  optional Error error = 3;
}

message StatVolumeRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
}

message StatVolumeResponse {
  bool success = 1;
  string volume_info = 2;
  optional Error error = 3;
}

message DeletePathsRequest {
  string disk = 1;
  string volume = 2;
  repeated string paths = 3;
}

message DeletePathsResponse {
  bool success = 1;
  optional Error error = 2;
}

message UpdateMetadataRequest {
  string disk = 1;
  string volume = 2;
  string path = 3;
  string file_info = 4;
  string opts = 5;
}

message UpdateMetadataResponse {
  bool success = 1;
  optional Error error = 2;
}

message WriteMetadataRequest {
  string disk = 1;  // indicate which one in the disks
  string volume = 2;
  string path = 3;
  string file_info = 4;
}

message WriteMetadataResponse {
  bool success = 1;
  optional Error error = 2;
}

message ReadVersionRequest {
  string disk = 1;
  string volume = 2;
  string path = 3;
  string version_id = 4;
  string opts = 5;
}

message ReadVersionResponse {
  bool success = 1;
  string file_info = 2;
  optional Error error = 3;
}

message ReadXLRequest {
  string disk = 1;
  string volume = 2;
  string path = 3;
  bool read_data = 4;
}

message ReadXLResponse {
  bool success = 1;
  string raw_file_info = 2;
  optional Error error = 3;
}

message DeleteVersionRequest {
  string disk = 1;
  string volume = 2;
  string path = 3;
  string file_info = 4;
  bool force_del_marker = 5;
  string opts = 6;
}

message DeleteVersionResponse {
  bool success = 1;
  string raw_file_info = 2;
  optional Error error = 3;
}

message DeleteVersionsRequest {
  string disk = 1;
  string volume = 2;
  repeated string versions = 3;
  string opts = 4;
}

message DeleteVersionsResponse {
  bool success = 1;
  repeated string errors = 2;
  optional Error error = 3;
}

message ReadMultipleRequest {
  string disk = 1;
  string read_multiple_req = 2;
}

message ReadMultipleResponse {
  bool success = 1;
  repeated string read_multiple_resps = 2;
  optional Error error = 3;
}

message DeleteVolumeRequest {
  string disk = 1;
  string volume = 2;
}

message DeleteVolumeResponse {
  bool success = 1;
  optional Error error = 2;
}

message DiskInfoRequest {
  string disk = 1;
  string opts = 2;
}

message DiskInfoResponse {
  bool success = 1;
  string disk_info = 2;
  optional Error error = 3;
}

message NsScannerRequest {
  string disk = 1;
  string cache = 2;
  uint64 scan_mode = 3;
}

message NsScannerResponse {
  bool success = 1;
  string update = 2;
  string data_usage_cache = 3;
  optional Error error = 4;
}

// lock api have same argument type
message GenerallyLockRequest {
    string args = 1;
}

message GenerallyLockResponse {
  bool success = 1;
  optional string error_info = 2;
}

message Mss {
  map<string, string> value = 1;
}

message LocalStorageInfoRequest {
  bool metrics = 1;
}

message LocalStorageInfoResponse {
  bool success = 1;
  bytes storage_info = 2;
  optional string error_info = 3;
}

message ServerInfoRequest {
  bool metrics = 1;
}

message ServerInfoResponse {
  bool success = 1;
  bytes server_properties = 2;
  optional string error_info = 3;
}

message GetCpusRequest {}

message GetCpusResponse {
  bool success = 1;
  bytes cpus = 2;
  optional string error_info = 3;
}

message GetNetInfoRequest {}

message GetNetInfoResponse {
  bool success = 1;
  bytes net_info = 2;
  optional string error_info = 3;
}

message GetPartitionsRequest {}

message GetPartitionsResponse {
  bool success = 1;
  bytes partitions = 2;
  optional string error_info = 3;
}

message GetOsInfoRequest {}

message GetOsInfoResponse {
  bool success = 1;
  bytes os_info = 2;
  optional string error_info = 3;
}

message GetSELinuxInfoRequest {}

message GetSELinuxInfoResponse {
  bool success = 1;
  bytes sys_services = 2;
  optional string error_info = 3;
}

message GetSysConfigRequest {}

message GetSysConfigResponse {
  bool success = 1;
  bytes sys_config = 2;
  optional string error_info = 3;
}

message GetSysErrorsRequest {}

message GetSysErrorsResponse {
  bool success = 1;
  bytes sys_errors = 2;
  optional string error_info = 3;
}

message GetMemInfoRequest {}

message GetMemInfoResponse {
  bool success = 1;
  bytes mem_info = 2;
  optional string error_info = 3;
}

message GetMetricsRequest {
  bytes metric_type = 1;
  bytes opts = 2;
}

message GetMetricsResponse {
  bool success = 1;
  bytes realtime_metrics = 2;
  optional string error_info = 3;
}

message GetProcInfoRequest {}

message GetProcInfoResponse {
  bool success = 1;
  bytes proc_info = 2;
  optional string error_info = 3;
}

message StartProfilingRequest {
  string profiler = 1;
}

message StartProfilingResponse {
  bool success = 1;
  optional string error_info = 2;
}

message DownloadProfileDataRequest {}

message DownloadProfileDataResponse {
  bool success = 1;
  map<string, bytes> data = 2;
  optional string error_info = 3;
}

message GetBucketStatsDataRequest {
  string bucket = 1;
}

message GetBucketStatsDataResponse {
  bool success = 1;
  bytes bucket_stats = 2;
  optional string error_info = 3;
}

message GetSRMetricsDataRequest {}

message GetSRMetricsDataResponse {
  bool success = 1;
  bytes sr_metrics_summary = 2;
  optional string error_info = 3;
}

message GetAllBucketStatsRequest {}

message GetAllBucketStatsResponse {
  bool success = 1;
  bytes bucket_stats_map = 2;
  optional string error_info = 3;
}

message LoadBucketMetadataRequest {
  string bucket = 1;
}

message LoadBucketMetadataResponse {
  bool success = 1;
  optional string error_info = 2;
}

message DeleteBucketMetadataRequest {
  string bucket = 1;
}

message DeleteBucketMetadataResponse {
  bool success = 1;
  optional string error_info = 2;
}

message DeletePolicyRequest {
  string policy_name = 1;
}

message DeletePolicyResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadPolicyRequest {
  string policy_name = 1;
}

message LoadPolicyResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadPolicyMappingRequest {
  string user_or_group = 1;
  uint64 user_type = 2;
  bool is_group = 3;
}

message LoadPolicyMappingResponse {
  bool success = 1;
  optional string error_info = 2;
}

message DeleteUserRequest {
  string access_key = 1;
}

message DeleteUserResponse {
  bool success = 1;
  optional string error_info = 2;
}

message DeleteServiceAccountRequest {
  string access_key = 1;
}

message DeleteServiceAccountResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadUserRequest {
  string access_key = 1;
  bool temp = 2;
}

message LoadUserResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadServiceAccountRequest {
  string access_key = 1;
}

message LoadServiceAccountResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadGroupRequest {
  string group = 1;
}

message LoadGroupResponse {
  bool success = 1;
  optional string error_info = 2;
}

message ReloadSiteReplicationConfigRequest {}

message ReloadSiteReplicationConfigResponse {
  bool success = 1;
  optional string error_info = 2;
}

message SignalServiceRequest {
  Mss vars = 1;
}

message SignalServiceResponse {
  bool success = 1;
  optional string error_info = 2;
}

message BackgroundHealStatusRequest {}

message BackgroundHealStatusResponse {
  bool success = 1;
  bytes bg_heal_state = 2;
  optional string error_info = 3;
}

message GetMetacacheListingRequest {
  bytes opts = 1;
}

message GetMetacacheListingResponse {
  bool success = 1;
  bytes metacache = 2;
  optional string error_info = 3;
}

message UpdateMetacacheListingRequest {
  bytes metacache = 1;
}

message UpdateMetacacheListingResponse {
  bool success = 1;
  bytes metacache = 2;
  optional string error_info = 3;
}

message ReloadPoolMetaRequest {}

message ReloadPoolMetaResponse {
  bool success = 1;
  optional string error_info = 2;
}

message StopRebalanceRequest {}

message StopRebalanceResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadRebalanceMetaRequest {
  bool start_rebalance = 1;
}

message LoadRebalanceMetaResponse {
  bool success = 1;
  optional string error_info = 2;
}

message LoadTransitionTierConfigRequest {}

message LoadTransitionTierConfigResponse {
  bool success = 1;
  optional string error_info = 2;
}

/* -------------------------------------------------------------------- */

service NodeService {
/* -------------------------------meta service-------------------------- */
  rpc Ping(PingRequest) returns (PingResponse) {};
  rpc HealBucket(HealBucketRequest) returns (HealBucketResponse) {};
  rpc ListBucket(ListBucketRequest) returns (ListBucketResponse) {};
  rpc MakeBucket(MakeBucketRequest) returns (MakeBucketResponse) {};
  rpc GetBucketInfo(GetBucketInfoRequest) returns (GetBucketInfoResponse) {};
  rpc DeleteBucket(DeleteBucketRequest) returns (DeleteBucketResponse) {};

/* -------------------------------disk service-------------------------- */

  rpc ReadAll(ReadAllRequest) returns (ReadAllResponse) {};
  rpc WriteAll(WriteAllRequest) returns (WriteAllResponse) {};
  rpc Delete(DeleteRequest) returns (DeleteResponse) {};
  rpc VerifyFile(VerifyFileRequest) returns (VerifyFileResponse) {};
  rpc CheckParts(CheckPartsRequest) returns (CheckPartsResponse) {};
  rpc RenamePart(RenamePartRequst) returns (RenamePartResponse) {};
  rpc RenameFile(RenameFileRequst) returns (RenameFileResponse) {};
  rpc Write(WriteRequest) returns (WriteResponse) {};
  rpc WriteStream(stream WriteRequest) returns (stream WriteResponse) {};
//  rpc Append(AppendRequest) returns (AppendResponse) {};
  rpc ReadAt(stream ReadAtRequest) returns (stream ReadAtResponse) {};
  rpc ListDir(ListDirRequest) returns (ListDirResponse) {};
  rpc WalkDir(WalkDirRequest) returns (stream WalkDirResponse) {};
  rpc RenameData(RenameDataRequest) returns (RenameDataResponse) {};
  rpc MakeVolumes(MakeVolumesRequest) returns (MakeVolumesResponse) {};
  rpc MakeVolume(MakeVolumeRequest) returns (MakeVolumeResponse) {};
  rpc ListVolumes(ListVolumesRequest) returns (ListVolumesResponse) {};
  rpc StatVolume(StatVolumeRequest) returns (StatVolumeResponse) {};
  rpc DeletePaths(DeletePathsRequest) returns (DeletePathsResponse) {};
  rpc UpdateMetadata(UpdateMetadataRequest) returns (UpdateMetadataResponse) {};
  rpc WriteMetadata(WriteMetadataRequest) returns (WriteMetadataResponse) {};
  rpc ReadVersion(ReadVersionRequest) returns (ReadVersionResponse) {};
  rpc ReadXL(ReadXLRequest) returns (ReadXLResponse) {};
  rpc DeleteVersion(DeleteVersionRequest) returns (DeleteVersionResponse) {};
  rpc DeleteVersions(DeleteVersionsRequest) returns (DeleteVersionsResponse) {};
  rpc ReadMultiple(ReadMultipleRequest) returns (ReadMultipleResponse) {};
  rpc DeleteVolume(DeleteVolumeRequest) returns (DeleteVolumeResponse) {};
  rpc DiskInfo(DiskInfoRequest) returns (DiskInfoResponse) {};
  rpc NsScanner(stream NsScannerRequest) returns (stream NsScannerResponse) {};

/* -------------------------------lock service-------------------------- */

  rpc Lock(GenerallyLockRequest) returns (GenerallyLockResponse) {};
  rpc UnLock(GenerallyLockRequest) returns (GenerallyLockResponse) {};
  rpc RLock(GenerallyLockRequest) returns (GenerallyLockResponse) {};
  rpc RUnLock(GenerallyLockRequest) returns (GenerallyLockResponse) {};
  rpc ForceUnLock(GenerallyLockRequest) returns (GenerallyLockResponse) {};
  rpc Refresh(GenerallyLockRequest) returns (GenerallyLockResponse) {};

/* -------------------------------peer rest service-------------------------- */

  rpc LocalStorageInfo(LocalStorageInfoRequest) returns (LocalStorageInfoResponse) {};
  rpc ServerInfo(ServerInfoRequest) returns (ServerInfoResponse) {};
  rpc GetCpus(GetCpusRequest) returns (GetCpusResponse) {};
  rpc GetNetInfo(GetNetInfoRequest) returns (GetNetInfoResponse) {};
  rpc GetPartitions(GetPartitionsRequest) returns (GetPartitionsResponse) {};
  rpc GetOsInfo(GetOsInfoRequest) returns (GetOsInfoResponse) {};
  rpc GetSELinuxInfo(GetSELinuxInfoRequest) returns (GetSELinuxInfoResponse) {};
  rpc GetSysConfig(GetSysConfigRequest) returns (GetSysConfigResponse) {};
  rpc GetSysErrors(GetSysErrorsRequest) returns (GetSysErrorsResponse) {};
  rpc GetMemInfo(GetMemInfoRequest) returns (GetMemInfoResponse) {};
  rpc GetMetrics(GetMetricsRequest) returns (GetMetricsResponse) {};
  rpc GetProcInfo(GetProcInfoRequest) returns (GetProcInfoResponse) {};
  rpc StartProfiling(StartProfilingRequest) returns (StartProfilingResponse) {};
  rpc DownloadProfileData(DownloadProfileDataRequest) returns (DownloadProfileDataResponse) {};
  rpc GetBucketStats(GetBucketStatsDataRequest) returns (GetBucketStatsDataResponse) {};
  rpc GetSRMetrics(GetSRMetricsDataRequest) returns (GetSRMetricsDataResponse) {};
  rpc GetAllBucketStats(GetAllBucketStatsRequest) returns (GetAllBucketStatsResponse) {};
  rpc LoadBucketMetadata(LoadBucketMetadataRequest) returns (LoadBucketMetadataResponse) {};
  rpc DeleteBucketMetadata(DeleteBucketMetadataRequest) returns (DeleteBucketMetadataResponse) {};
  rpc DeletePolicy(DeletePolicyRequest) returns (DeletePolicyResponse) {};
  rpc LoadPolicy(LoadPolicyRequest) returns (LoadPolicyResponse) {};
  rpc LoadPolicyMapping(LoadPolicyMappingRequest) returns (LoadPolicyMappingResponse) {};
  rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse) {};
  rpc DeleteServiceAccount(DeleteServiceAccountRequest) returns (DeleteServiceAccountResponse) {};
  rpc LoadUser(LoadUserRequest) returns (LoadUserResponse) {};
  rpc LoadServiceAccount(LoadServiceAccountRequest) returns (LoadServiceAccountResponse) {};
  rpc LoadGroup(LoadGroupRequest) returns (LoadGroupResponse) {};
  rpc ReloadSiteReplicationConfig(ReloadSiteReplicationConfigRequest) returns (ReloadSiteReplicationConfigResponse) {};
  // rpc VerifyBinary() returns () {};
  // rpc CommitBinary() returns () {};
  rpc SignalService(SignalServiceRequest) returns (SignalServiceResponse) {};
  rpc BackgroundHealStatus(BackgroundHealStatusRequest) returns (BackgroundHealStatusResponse) {};
  rpc GetMetacacheListing(GetMetacacheListingRequest) returns (GetMetacacheListingResponse) {};
  rpc UpdateMetacacheListing(UpdateMetacacheListingRequest) returns (UpdateMetacacheListingResponse) {};
  rpc ReloadPoolMeta(ReloadPoolMetaRequest) returns (ReloadPoolMetaResponse) {};
  rpc StopRebalance(StopRebalanceRequest) returns (StopRebalanceResponse) {};
  rpc LoadRebalanceMeta(LoadRebalanceMetaRequest) returns (LoadRebalanceMetaResponse) {};
  rpc LoadTransitionTierConfig(LoadTransitionTierConfigRequest) returns (LoadTransitionTierConfigResponse) {};
}
