// @project The CERN Tape Archive (CTA)
// @brief CTA-EOS gRPC API for CASTOR-EOS migration
// @copyright Copyright 2019 CERN
// @license This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
// NOTE: Compile for Go with:
// protoc ./eos_grpc.proto --go_out=plugins=grpc:.
syntax = "proto3";
package eos.rpc;
option java_multiple_files = true;
option java_package = "io.grpc.eos.rpc";
option java_outer_classname = "EosProto";
option objc_class_prefix = "EOS";
option go_package = "github.com/cern-eos/grpc-proto/protobuf;eos_grpc";
service Eos {
// Replies to a ping
rpc Ping (PingRequest) returns (PingReply) {}
// ---------------------------------------------------------------------
// NAMESPACE
// ---------------------------------------------------------------------
// Replies to MD requests with a stream
rpc MD (MDRequest) returns (stream MDResponse) {}
// Replies to Find requests with a stream
rpc Find (FindRequest) returns (stream MDResponse) {}
// Replies to a NsStat operation
rpc NsStat (NsStatRequest) returns (NsStatResponse) {}
// Replies to an insert
rpc ContainerInsert (ContainerInsertRequest) returns (InsertReply) {}
rpc FileInsert (FileInsertRequest) returns (InsertReply) {}
// Replies to a NsRequest operation
rpc Exec (NSRequest) returns (NSResponse) {}
// ---------------------------------------------------------------------
// OPENSTACK
// ---------------------------------------------------------------------
// Manila Driver
rpc ManilaServerRequest (ManilaRequest) returns (ManilaResponse) {}
}
message PingRequest {
string authkey = 1;
bytes message = 2;
}
message PingReply {
bytes message = 1;
}
// ---------------------------------------------------------------------
// NAMESPACE
// ---------------------------------------------------------------------
message ContainerInsertRequest {
repeated ContainerMdProto container = 1;
string authkey = 2;
bool inherit_md = 3;
}
message FileInsertRequest {
repeated FileMdProto files = 1;
string authkey = 2;
}
message InsertReply {
repeated string message = 1;
repeated uint32 retc = 2;
}
message Time {
uint64 sec = 1;
uint64 n_sec = 2;
}
message Checksum {
bytes value = 1;
string type = 2;
}
message FileMdProto {
uint64 id = 1;
uint64 cont_id = 2;
uint64 uid = 3;
uint64 gid = 4;
uint64 size = 5;
uint32 layout_id = 6;
uint32 flags = 7;
bytes name = 8;
bytes link_name = 9;
Time ctime = 10; // change time
Time mtime = 11; // modification time
Checksum checksum =12;
repeated uint32 locations = 13;
repeated uint32 unlink_locations = 14;
map xattrs = 15;
bytes path = 16;
string etag = 17;
uint64 inode = 18;
}
message ContainerMdProto {
uint64 id = 1;
uint64 parent_id = 2;
uint64 uid = 3;
uint64 gid = 4;
int64 tree_size = 6;
uint32 mode = 5;
uint32 flags = 7;
bytes name = 8;
Time ctime = 9; // change time
Time mtime = 10; // modification time
Time stime = 11; // sync time
map xattrs = 12;
bytes path = 13;
string etag = 14;
uint64 inode = 15;
}
enum TYPE { FILE = 0; CONTAINER = 1; LISTING = 2; STAT = 3;}
enum QUOTATYPE { USER = 0; GROUP = 2; PROJECT = 3;}
enum QUOTAOP { GET = 0; SET = 1; RM = 2; RMNODE = 3;}
enum QUOTAENTRY { NONE = 0; VOLUME = 1; INODE = 2;}
message QuotaProto {
bytes path = 1; // quota node path
string name = 2; // associated name for the given type
QUOTATYPE type = 3; // user,group,project or all quota
uint64 usedbytes = 4; // bytes used physical
uint64 usedlogicalbytes = 5; // bytes used logical
uint64 usedfiles = 6; // number of files used
uint64 maxbytes = 7; // maximum number of bytes (volume quota)
uint64 maxlogicalbytes = 8; // maximum number of logical bytes (logical volume quota)
uint64 maxfiles = 9; // maximum number of files (inode quota)
float percentageusedbytes = 10; // percentage of volume quota used from 0 to 100
float percentageusedfiles = 11; // percentag of inode quota used from 0 to 100
string statusbytes = 12; // status string for volume quota ok,warning,exceeded
string statusfiles = 13; // status string for inode quota ok,warning,exceeded
}
message RoleId {
uint64 uid = 1;
uint64 gid = 2;
string username = 3;
string groupname = 4;
}
message MDId {
bytes path = 1;
fixed64 id = 2;
fixed64 ino = 3;
TYPE type = 4;
}
message Limit {
bool zero = 1;
uint64 min = 2;
uint64 max = 3;
}
message MDSelection {
bool select = 1;
Limit ctime = 2;
Limit mtime = 3;
Limit stime = 4;
Limit size = 5;
Limit treesize = 6;
Limit children = 7;
Limit locations = 8;
Limit unlinked_locations = 9;
uint64 layoutid = 10;
uint64 flags = 11;
bool symlink = 12;
Checksum checksum = 13;
uint32 owner = 14;
uint32 group = 15;
bool owner_root = 16;
bool group_root = 17;
bytes regexp_filename = 18;
bytes regexp_dirname = 19;
map xattr = 20;
}
message MDRequest {
TYPE type = 1;
MDId id = 2;
string authkey = 3;
RoleId role = 4;
MDSelection selection = 5;
}
message MDResponse {
TYPE type = 1;
FileMdProto fmd = 2;
ContainerMdProto cmd = 3;
}
message FindRequest {
TYPE type = 1;
MDId id = 2;
RoleId role = 3;
string authkey = 4;
uint64 maxdepth = 5;
MDSelection selection = 6;
}
message ShareAuth {
string prot = 1;
string name = 2;
string host = 3;
}
message ShareProto {
string permission = 1;
uint64 expires = 2;
string owner = 3;
string group = 4;
uint64 generation = 5;
string path = 6;
bool allowtree = 7;
string vtoken = 8;
repeated ShareAuth origins = 9;
}
message ShareToken {
ShareProto token = 1;
bytes signature = 2;
bytes serialized = 3;
int32 seed = 4;
}
message NSRequest {
message MkdirRequest {
MDId id = 1;
bool recursive = 2;
int64 mode = 3;
}
message RmdirRequest {
MDId id = 1;
}
message TouchRequest {
MDId id = 1;
}
message UnlinkRequest {
MDId id = 1;
bool norecycle = 3;
}
message RmRequest {
MDId id = 1;
bool recursive = 2;
bool norecycle = 3;
}
message RenameRequest {
MDId id = 1;
bytes target = 2;
}
message SymlinkRequest {
MDId id = 1;
bytes target = 2;
}
message VersionRequest {
enum VERSION_CMD {
CREATE= 0;
PURGE = 1;
LIST = 2;
GRAB = 3;
}
MDId id = 1;
VERSION_CMD cmd = 2;
int32 maxversion = 3;
string grabversion = 4;
}
message RecycleRequest {
string key = 1;
enum RECYCLE_CMD {
RESTORE = 0;
PURGE = 1;
LIST = 2;
}
RECYCLE_CMD cmd = 2;
message RestoreFlags {
bool force = 1;
bool mkpath = 2;
bool versions = 3;
}
message PurgeDate {
int32 year = 1;
int32 month = 2;
int32 day = 3;
}
RestoreFlags restoreflag = 3;
PurgeDate purgedate = 4;
}
message SetXAttrRequest {
MDId id = 1;
map xattrs = 2;
bool recursive = 3;
repeated string keystodelete = 4;
bool create = 5;
}
message ChownRequest {
MDId id = 1;
RoleId owner = 2;
}
message ChmodRequest {
MDId id = 1;
int64 mode = 2;
}
message AclRequest {
enum ACL_COMMAND {
NONE = 0;
MODIFY = 1;
LIST = 2;
}
enum ACL_TYPE {
USER_ACL = 0;
SYS_ACL = 1;
}
MDId id = 1;
ACL_COMMAND cmd = 2;
bool recursive = 3;
ACL_TYPE type = 4;
string rule = 5;
uint32 position = 6;
}
message TokenRequest {
ShareToken token = 1;
}
message QuotaRequest {
bytes path = 1;
RoleId id = 2;
QUOTAOP op = 3; // get or set, rm or rmnode
uint64 maxfiles = 4; // maximum number of bytes (volume quota) for setting
uint64 maxbytes = 5; // maximum number of bytes (volume quota) for setting
QUOTAENTRY entry = 6; // select volume or inode entry for deletion
}
message ShareRequest {
message LsShare {
enum OutFormat {
NONE = 0; //
MONITORING = 1; // [-m]
LISTING = 2; // [-l]
JSON = 3; // [grpc]
}
OutFormat outformat = 1; //
string selection = 2; //
}
message OperateShare {
enum Op {
CREATE = 0;
REMOVE = 1;
SHARE = 2;
UNSHARE = 3;
ACCESS = 4;
MODIFY = 5;
}
Op op = 1;
string share = 2;
string acl = 3;
string path = 4;
string user = 5;
string group = 6;
}
oneof subcmd {
LsShare ls = 1;
OperateShare op = 2;
}
}
string authkey = 1;
RoleId role = 2;
// Actual request data object
oneof command {
MkdirRequest mkdir = 21;
RmdirRequest rmdir = 22;
TouchRequest touch = 23;
UnlinkRequest unlink = 24;
RmRequest rm = 25;
RenameRequest rename = 26;
SymlinkRequest symlink = 27;
VersionRequest version = 28;
RecycleRequest recycle = 29;
SetXAttrRequest xattr = 30;
ChownRequest chown = 31;
ChmodRequest chmod = 32;
AclRequest acl = 33;
TokenRequest token = 34;
QuotaRequest quota = 35;
ShareRequest share = 36;
}
}
message NSResponse {
message ErrorResponse {
int64 code = 1;
string msg = 2;
}
message VersionResponse {
message VersionInfo {
MDId id = 1;
Time mtime = 2;
}
int64 code = 1;
string msg = 2;
repeated VersionInfo versions = 3;
}
message RecycleResponse {
int64 code = 1;
string msg = 2;
message RecycleInfo {
enum DELETIONTYPE { FILE = 0; TREE = 1; }
MDId id = 1;
RoleId owner = 2;
Time dtime = 3;
uint64 size = 4;
DELETIONTYPE type = 5;
string key = 6;
}
repeated RecycleInfo recycles = 3;
}
message AclResponse {
int64 code = 1;
string msg = 2;
string rule = 3;
}
message QuotaResponse {
int64 code = 1;
string msg = 2;
repeated QuotaProto quotanode = 3;
}
message ShareInfo {
string name = 1;
string root = 2;
string rule = 3;
uint64 uid = 4;
uint64 nshared = 5;
}
message ShareAccess {
string name = 1;
bool granted = 2;
}
message ShareResponse {
int64 code = 1;
string msg = 2;
repeated ShareInfo shares = 3;
repeated ShareAccess access = 4;
}
ErrorResponse error = 1;
VersionResponse version = 2;
RecycleResponse recycle = 3;
AclResponse acl = 4;
QuotaResponse quota = 5;
ShareResponse share = 6;
}
message NsStatRequest {
string authkey = 1;
}
message NsStatResponse {
int64 code = 1;
string emsg = 2;
string state = 3;
uint64 nfiles = 4;
uint64 ncontainers = 5;
uint64 boot_time = 6;
uint64 current_fid = 7;
uint64 current_cid = 8;
uint64 mem_virtual = 9;
uint64 mem_resident = 10;
uint64 mem_share = 11;
uint64 mem_growth = 12;
uint64 threads = 13;
uint64 fds = 14;
uint64 uptime = 15;
}
// ---------------------------------------------------------------------
// OPENSTACK
// ---------------------------------------------------------------------
enum MANILA_REQUEST_TYPE {
CREATE_SHARE = 0;
DELETE_SHARE = 1;
EXTEND_SHARE = 2;
SHRINK_SHARE = 3;
MANAGE_EXISTING = 4;
UNMANAGE = 5;
GET_CAPACITIES = 6;
/* EXTRA FUNCTIONS NOT IMPLEMENTED */
/*
CREATE_SNAPSHOT = 7;
DELETE_SNAPSHOT = 8;
CREATE_SHARE_FROM_SNAPSHOT = 9;
ENSURE_SHARE = 10;
ALLOW_ACCESS = 11;
DENY_ACCESS = 12;
GET_SHARE_STATS = 13;
DO_SETUP = 14;
SETUP_SERVER = 15;
TEARDOWN_SERVER = 16;
GET_NETWORK_ALLOCATIONS_NUMBER = 17;
VERIFY_SHARE_SERVER_HANDLING = 18;
CREATE_SHARE_GROUP = 19;
DELETE_SHARE_GROUP = 20;
*/
}
message ManilaRequest {
MANILA_REQUEST_TYPE request_type = 1;
string auth_key = 2;
string protocol = 3;
string share_name = 4;
string description = 5;
string share_id = 6;
string share_group_id = 7;
int32 quota = 8;
string creator = 9;
string egroup = 10;
string admin_egroup = 11;
string share_host = 12;
string share_location = 13;
}
message ManilaResponse {
string msg = 1; //for generic messages
int32 code = 2; // < 1 is an error -- > 1 is OK
int64 total_used = 3;
int64 total_capacity = 4;
int64 new_share_quota = 5;
string new_share_path = 6;
}