api/pkg/apis/scheduler/v1/scheduler.proto

397 lines
13 KiB
Protocol Buffer

/*
* Copyright 2022 The Dragonfly Authors
*
* Licensed 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 = "proto3";
package scheduler;
import "pkg/apis/common/v1/common.proto";
import "pkg/apis/errordetails/v1/errordetails.proto";
import "validate/validate.proto";
import "google/protobuf/empty.proto";
option go_package = "d7y.io/api/v2/pkg/apis/scheduler/v1;scheduler";
// PeerTaskRequest represents request of RegisterPeerTask.
message PeerTaskRequest{
// Download url.
string url = 1 [(validate.rules).string.uri = true];
// URL meta info.
common.UrlMeta url_meta = 2 [(validate.rules).message.required = true];
// Peer id and it must be global uniqueness.
string peer_id = 3 [(validate.rules).string.min_len = 1];
// Peer host info.
PeerHost peer_host = 4;
// When requesting for range, it will trigger seed peer to download entire task.
bool prefetch = 5;
// Whether this request is caused by migration.
bool is_migrating = 6;
// Task id.
string task_id = 8;
}
// RegisterResult represents response of RegisterPeerTask.
message RegisterResult{
// Task type.
common.TaskType task_type = 1;
// Task id
string task_id = 2 [(validate.rules).string.min_len = 1];
// File size scope.
common.SizeScope size_scope = 3;
// Download the only piece directly for small or tiny file.
oneof direct_piece{
// Return single piece info when size scope is small.
SinglePiece single_piece = 4;
// Return task content when size scope is tiny.
bytes piece_content = 5;
}
// Task extend attribute,
// only direct_piece will carry extend attribute.
common.ExtendAttribute extend_attribute = 6;
}
// SinglePiece represents information of single piece.
message SinglePiece{
// Destination peer id.
string dst_pid = 1 [(validate.rules).string.min_len = 1];
// Destination download address.
string dst_addr = 2 [(validate.rules).string.min_len = 1];
// Piece info.
common.PieceInfo piece_info = 3;
}
// PeerHost represents information of peer host.
message PeerHost{
// Peer host id.
string id = 1 [(validate.rules).string.min_len = 1];
// peer host ip
string ip = 2 [(validate.rules).string.ip = true];
// Port of grpc service.
int32 rpc_port = 3 [(validate.rules).int32 = {gte: 1024, lt: 65535}];
// Port of download server.
int32 down_port = 4 [(validate.rules).int32 = {gte: 1024, lt: 65535}];
// Peer hostname.
string hostname = 5 [(validate.rules).string.hostname = true];
// Location path(area|country|province|city|...).
string location = 7;
// IDC where the peer host is located
string idc = 8;
}
// PieceResult represents request of ReportPieceResult.
message PieceResult{
// Task id.
string task_id = 1 [(validate.rules).string.min_len = 1];
// Source peer id.
string src_pid = 2 [(validate.rules).string.min_len = 1];
// Destination peer id.
string dst_pid = 3;
// Piece info.
common.PieceInfo piece_info = 4;
// Begin time of the piece downloading.
uint64 begin_time = 5;
// End time of the piece downloading.
uint64 end_time = 6;
// Whether the piece downloading is successfully.
bool success = 7;
// Result code.
common.Code code = 8;
// Finished count.
int32 finished_count = 10;
// Task extend attribute,
// only first success back source piece will carry extend attribute.
common.ExtendAttribute extend_attribute = 11;
}
// PeerPacket represents response of ReportPieceResult.
message PeerPacket{
message DestPeer{
// Destination ip.
string ip = 1 [(validate.rules).string.ip = true];
// Port of grpc service.
int32 rpc_port = 2 [(validate.rules).int32 = {gte: 1024, lt: 65535}];
// Destination peer id.
string peer_id = 3 [(validate.rules).string.min_len = 1];
}
// Task id.
string task_id = 2 [(validate.rules).string.min_len = 1];
// Source peer id.
string src_pid = 3 [(validate.rules).string.min_len = 1];
// Main peer.
DestPeer main_peer = 5;
// Candidate peers.
repeated DestPeer candidate_peers = 6;
// Result code.
common.Code code = 7;
// Error detail.
oneof errordetails{
// Source error.
errordetails.SourceError source_error = 8;
}
}
// PeerResult represents response of ReportPeerResult.
message PeerResult{
// Task id.
string task_id = 1 [(validate.rules).string.min_len = 1];
// Peer id.
string peer_id = 2 [(validate.rules).string.min_len = 1];
// Source host ip.
string src_ip = 3 [(validate.rules).string.ip = true];
// IDC where the peer host is located
string idc = 5;
// Download url.
string url = 6 [(validate.rules).string.uri = true];
// Total content length.
int64 content_length = 7 [(validate.rules).int64.gte = -1];
// Total network traffic.
uint64 traffic = 8;
// Total cost time.
uint32 cost = 9;
// Whether peer downloading file is successfully.
bool success = 10;
// Result code.
common.Code code = 11;
// Task total piece count.
int32 total_piece_count = 12 [(validate.rules).int32.gte = -1];
// Error detail.
oneof errordetails{
// Source error.
errordetails.SourceError source_error = 13;
}
}
// AnnounceTaskRequest represents request of AnnounceTask.
message AnnounceTaskRequest{
// Task id.
string task_id = 1 [(validate.rules).string.min_len = 1];
// Download url.
string url = 2 [(validate.rules).string = {uri: true, ignore_empty: true}];
// URL meta info.
common.UrlMeta url_meta = 3 [(validate.rules).message.required = true];
// Peer host info.
PeerHost peer_host = 4;
// Task piece info.
common.PiecePacket piece_packet = 5 [(validate.rules).message.required = true];
// Task type.
common.TaskType task_type = 6;
}
// StatTaskRequest represents request of StatTask.
message StatTaskRequest{
// Task id.
string task_id = 1 [(validate.rules).string.min_len = 1];
}
// Task represents download task.
message Task{
// Task id.
string id = 1 [(validate.rules).string.min_len = 1];
// Task type.
common.TaskType type = 2;
// Task content length.
int64 content_length = 3 [(validate.rules).int64.gte = 1];
// Task total piece count.
int32 total_piece_count = 4 [(validate.rules).int32.gte = 1];
// Task state.
string state = 5 [(validate.rules).string.min_len = 1];
// Task peer count.
int32 peer_count = 6 [(validate.rules).int32.gte = 0];
// Task contains available peer.
bool hasAvailablePeer = 7;
}
// PeerTarget represents request of LeaveTask.
message PeerTarget{
// Task id.
string task_id = 1 [(validate.rules).string.min_len = 1];
// Peer id.
string peer_id = 2 [(validate.rules).string.min_len = 1];
}
// LeaveHostRequest represents request of LeaveHost.
message LeaveHostRequest{
// Host id.
string id = 1 [(validate.rules).string.min_len = 1];
}
// AnnounceHostRequest represents request of AnnounceHost.
message AnnounceHostRequest{
// Host id.
string id = 1 [(validate.rules).string.min_len = 1];
// Host type.
string type = 2 [(validate.rules).string = {in: ["normal", "super", "strong", "weak"]}];
// Hostname.
string hostname = 3 [(validate.rules).string.min_len = 1];
// Host ip.
string ip = 4 [(validate.rules).string.ip = true];
// Port of grpc service.
int32 port = 5 [(validate.rules).int32 = {gte: 1024, lt: 65535}];
// Port of download server.
int32 download_port = 6 [(validate.rules).int32 = {gte: 1024, lt: 65535}];
// Host OS.
string os = 7;
// Host platform.
string platform = 8;
// Host platform family.
string platform_family = 9;
// Host platform version.
string platform_version = 10;
// Host kernel version.
string kernel_version = 11;
// CPU Stat.
CPU cpu = 12 [(validate.rules).message.required = true];
// Memory Stat.
Memory memory = 13 [(validate.rules).message.required = true];
// Network Stat.
Network network = 14 [(validate.rules).message.required = true];
// Disk Stat.
Disk disk = 15 [(validate.rules).message.required = true];
// Build information.
Build build = 16 [(validate.rules).message.required = true];
// ID of the cluster to which the host belongs.
uint64 scheduler_cluster_id = 17;
// Port of object storage server.
int32 object_storage_port = 18 [(validate.rules).int32 = {gte: 1024, lt: 65535, ignore_empty: true}];
}
// CPU Stat.
message CPU {
// Number of logical cores in the system.
uint32 logical_count = 1;
// Number of physical cores in the system
uint32 physical_count = 2;
// Percent calculates the percentage of cpu used.
double percent = 3 [(validate.rules).double.gte = 0];
// Calculates the percentage of cpu used by process.
double process_percent = 4 [(validate.rules).double.gte = 0];
// CPUTimes contains the amounts of time the CPU has spent performing different kinds of work.
CPUTimes times = 5 [(validate.rules).message.required = true];
}
// CPUTimes contains the amounts of time the CPU has spent performing different
// kinds of work. Time units are in seconds.
message CPUTimes {
// CPU time of user.
double user = 1 [(validate.rules).double.gte = 0];
// CPU time of system.
double system = 2 [(validate.rules).double.gte = 0];
// CPU time of idle.
double idle = 3 [(validate.rules).double.gte = 0];
// CPU time of nice.
double nice = 4 [(validate.rules).double.gte = 0];
// CPU time of iowait.
double iowait = 5 [(validate.rules).double.gte = 0];
// CPU time of irq.
double irq = 6 [(validate.rules).double.gte = 0];
// CPU time of softirq.
double softirq = 7 [(validate.rules).double.gte = 0];
// CPU time of steal.
double steal = 8 [(validate.rules).double.gte = 0];
// CPU time of guest.
double guest = 9 [(validate.rules).double.gte = 0];
// CPU time of guest nice.
double guest_nice = 10 [(validate.rules).double.gte = 0];
}
// Memory Stat.
message Memory {
// Total amount of RAM on this system.
uint64 total = 1;
// RAM available for programs to allocate.
uint64 available = 2;
// RAM used by programs.
uint64 used = 3;
// Percentage of RAM used by programs.
double used_percent = 4;
// Calculates the percentage of memory used by process.
double process_used_percent = 5;
// This is the kernel's notion of free memory.
uint64 free = 6;
}
// Network Stat.
message Network {
// Return count of tcp connections opened and status is ESTABLISHED.
uint32 tcp_connection_count = 1;
// Return count of upload tcp connections opened and status is ESTABLISHED.
uint32 upload_tcp_connection_count = 2;
// Location path(area|country|province|city|...).
string location = 4;
// IDC where the peer host is located
string idc = 5;
}
// Disk Stat.
message Disk {
// Total amount of disk on the data path of dragonfly.
uint64 total = 1;
// Free amount of disk on the data path of dragonfly.
uint64 free = 2;
// Used amount of disk on the data path of dragonfly.
uint64 used = 3;
// Used percent of disk on the data path of dragonfly directory.
double used_percent = 4 [(validate.rules).double = {gte: 0, lte: 100}];
// Total amount of indoes on the data path of dragonfly directory.
uint64 inodes_total = 5;
// Used amount of indoes on the data path of dragonfly directory.
uint64 inodes_used = 6;
// Free amount of indoes on the data path of dragonfly directory.
uint64 inodes_free = 7;
// Used percent of indoes on the data path of dragonfly directory.
double inodes_used_percent = 8 [(validate.rules).double = {gte: 0, lte: 100}];
}
// Build information.
message Build {
// Git version.
string git_version = 1;
// Git commit.
string git_commit = 2;
// Golang version.
string go_version = 3;
// Build platform.
string platform = 4;
}
// Scheduler RPC Service.
service Scheduler{
// RegisterPeerTask registers a peer into task.
rpc RegisterPeerTask(PeerTaskRequest)returns(RegisterResult);
// ReportPieceResult reports piece results and receives peer packets.
rpc ReportPieceResult(stream PieceResult)returns(stream PeerPacket);
// ReportPeerResult reports downloading result for the peer.
rpc ReportPeerResult(PeerResult)returns(google.protobuf.Empty);
// A peer announces that it has the announced task to other peers.
rpc AnnounceTask(AnnounceTaskRequest) returns(google.protobuf.Empty);
// Checks if any peer has the given task.
rpc StatTask(StatTaskRequest)returns(Task);
// LeaveTask makes the peer leaving from task.
rpc LeaveTask(PeerTarget)returns(google.protobuf.Empty);
// AnnounceHost announces host to scheduler.
rpc AnnounceHost(AnnounceHostRequest)returns(google.protobuf.Empty);
// LeaveHost makes the peers leaving from host.
rpc LeaveHost(LeaveHostRequest)returns(google.protobuf.Empty);
}