From be4e41db050c6d59e9fb5abf47e647f5bbdc24b2 Mon Sep 17 00:00:00 2001 From: Noor Date: Mon, 17 Mar 2025 20:33:01 +0530 Subject: [PATCH] Migrated SNP proto file and its From impls into its snp module and updated build configuration for snp proto --- build.rs | 24 +++- proto/snp/vm.proto | 271 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/snp/mod.rs | 32 ++++++ 4 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 proto/snp/vm.proto create mode 100644 src/snp/mod.rs diff --git a/build.rs b/build.rs index a97a026..1b7070d 100644 --- a/build.rs +++ b/build.rs @@ -2,9 +2,29 @@ fn main() -> Result<(), Box> { tonic_build::configure() .build_server(true) .protoc_arg("--experimental_allow_proto3_optional") + .type_attribute( + ".vm_proto.VmContract", + "#[derive(serde::Serialize, serde::Deserialize)]", + ) + .type_attribute( + ".vm_proto.InspectOperatorResp", + "#[derive(serde::Serialize, serde::Deserialize)]", + ) + .type_attribute( + ".vm_proto.ListOperatorsResp", + "#[derive(serde::Serialize, serde::Deserialize)]", + ) + .type_attribute( + ".vm_proto.VmNodeListResp", + "#[derive(serde::Serialize, serde::Deserialize)]", + ) .compile_protos( - &["proto/sgx/brain.proto", "proto/sgx/dtpm.proto"], - &["proto"], + &[ + "proto/sgx/brain.proto", + "proto/sgx/dtpm.proto", + "proto/snp/vm.proto", + ], + &["proto/sgx", "proto/snp"], )?; Ok(()) diff --git a/proto/snp/vm.proto b/proto/snp/vm.proto new file mode 100644 index 0000000..f0f4d2e --- /dev/null +++ b/proto/snp/vm.proto @@ -0,0 +1,271 @@ +syntax = "proto3"; +package vm_proto; + +message Empty { +} + +message Pubkey { + string pubkey = 1; +} + +message AccountBalance { + uint64 balance = 1; + uint64 tmp_locked = 2; +} + +message VmContract { + string uuid = 1; + string hostname = 2; + string admin_pubkey = 3; + string node_pubkey = 4; + repeated uint32 exposed_ports = 5; + string public_ipv4 = 6; + string public_ipv6 = 7; + uint32 disk_size_gb = 8; + uint32 vcpus = 9; + uint32 memory_mb = 10; + string kernel_sha = 11; + string dtrfs_sha = 12; + string created_at = 13; + string updated_at = 14; + // total nanoLP cost per minute (for all units) + uint64 nano_per_minute = 15; + uint64 locked_nano = 16; + string collected_at = 17; +} + +message MeasurementArgs { + // this will be IP:Port of the dtrfs API + // actually not a measurement arg, but needed for the injector + string dtrfs_api_endpoint = 1; + repeated uint32 exposed_ports = 2; + string ovmf_hash = 5; + // This is needed to allow the CLI to build the kernel params from known data. + // The CLI will use the kernel params to get the measurement. + repeated MeasurementIP ips = 6; +} + +message MeasurementIP { + uint32 nic_index = 1; + string address = 2; + string mask = 3; + string gateway = 4; +} + +// This should also include a block hash or similar, for auth +message RegisterVmNodeReq { + string node_pubkey = 1; + string operator_wallet = 2; + string main_ip = 3; + string country = 4; + string region = 5; + string city = 6; + // nanoLP per unit per minute + uint64 price = 7; +} + +message VmNodeResources { + string node_pubkey = 1; + uint32 avail_ports = 2; + uint32 avail_ipv4 = 3; + uint32 avail_ipv6 = 4; + uint32 avail_vcpus = 5; + uint32 avail_memory_mb = 6; + uint32 avail_storage_gb = 7; + uint32 max_ports_per_vm = 8; +} + +message NewVmReq { + string uuid = 1; + string hostname = 2; + string admin_pubkey = 3; + string node_pubkey = 4; + repeated uint32 extra_ports = 5; + bool public_ipv4 = 6; + bool public_ipv6 = 7; + uint32 disk_size_gb = 8; + uint32 vcpus = 9; + uint32 memory_mb = 10; + string kernel_url = 11; + string kernel_sha = 12; + string dtrfs_url = 13; + string dtrfs_sha = 14; + uint64 price_per_unit = 15; + uint64 locked_nano = 16; +} + +message NewVmResp { + string uuid = 1; + string error = 2; + MeasurementArgs args = 3; +} + +message UpdateVmReq { + string uuid = 1; + string admin_pubkey = 2; + uint32 disk_size_gb = 3; + uint32 vcpus = 4; + uint32 memory_mb = 5; + string kernel_url = 6; + string kernel_sha = 7; + string dtrfs_url = 8; + string dtrfs_sha = 9; +} + +message UpdateVmResp { + string uuid = 1; + string error = 2; + MeasurementArgs args = 3; +} + +message DeleteVmReq { + string uuid = 1; + string admin_pubkey = 2; +} + +message BrainVmMessage { + oneof Msg { + NewVmReq new_vm_req = 1; + UpdateVmReq update_vm_req = 2; + DeleteVmReq delete_vm = 3; + } +} + +message DaemonStreamAuth { + string timestamp = 1; + string pubkey = 2; + repeated string contracts = 3; + string signature = 4; +} + +message VmDaemonMessage { + oneof Msg { + DaemonStreamAuth auth = 1; + NewVmResp new_vm_resp = 2; + UpdateVmResp update_vm_resp = 3; + VmNodeResources vm_node_resources = 4; + } +} + +service BrainVmDaemon { + rpc RegisterVmNode (RegisterVmNodeReq) returns (stream VmContract); + rpc BrainMessages (DaemonStreamAuth) returns (stream BrainVmMessage); + rpc DaemonMessages (stream VmDaemonMessage) returns (Empty); +} + +message ListVmContractsReq { + string wallet = 1; + bool as_operator = 2; + string uuid = 3; +} + +message VmNodeFilters { + uint32 free_ports = 1; + bool offers_ipv4 = 2; + bool offers_ipv6 = 3; + uint32 vcpus = 4; + uint32 memory_mb = 5; + uint32 storage_gb = 6; + string country = 7; + string region = 8; + string city = 9; + string ip = 10; + string node_pubkey = 11; +} + +message VmNodeListResp { + string operator = 1; + string node_pubkey = 2; + string country = 3; + string region = 4; + string city = 5; + string ip = 6; // required for latency test + repeated string reports = 7; // TODO: this will become an enum + uint64 price = 8; // nanoLP per unit per minute +} + +message ExtendVmReq { + string uuid = 1; + string admin_pubkey = 2; + uint64 locked_nano = 3; +} + +message AirdropReq { + string pubkey = 1; + uint64 tokens = 2; +} + +message SlashReq { + string pubkey = 1; + uint64 tokens = 2; +} + +message Account { + string pubkey = 1; + uint64 balance = 2; + uint64 tmp_locked = 3; +} + +message RegOperatorReq { + string pubkey = 1; + uint64 escrow = 2; + string email = 3; +} + +message ListOperatorsResp { + string pubkey = 1; + uint64 escrow = 2; + string email = 3; + uint64 app_nodes = 4; + uint64 vm_nodes = 5; + uint64 reports = 6; +} + +message InspectOperatorResp { + ListOperatorsResp operator = 1; + repeated VmNodeListResp nodes = 2; +} + +message ReportNodeReq { + string admin_pubkey = 1; + string node_pubkey = 2; + string contract = 3; + string reason = 4; +} + +message KickReq { + string operator_wallet = 1; + string contract_uuid = 2; + string reason = 3; +} + +message BanUserReq { + string operator_wallet = 1; + string user_wallet = 2; +} + +message KickResp { + uint64 nano_lp = 1; +} + +service BrainCli { + rpc GetBalance (Pubkey) returns (AccountBalance); + rpc NewVm (NewVmReq) returns (NewVmResp); + rpc ListVmContracts (ListVmContractsReq) returns (stream VmContract); + rpc ListVmNodes (VmNodeFilters) returns (stream VmNodeListResp); + rpc GetOneVmNode (VmNodeFilters) returns (VmNodeListResp); + rpc DeleteVm (DeleteVmReq) returns (Empty); + rpc UpdateVm (UpdateVmReq) returns (UpdateVmResp); + rpc ExtendVm (ExtendVmReq) returns (Empty); + rpc ReportNode (ReportNodeReq) returns (Empty); + rpc ListOperators (Empty) returns (stream ListOperatorsResp); + rpc InspectOperator (Pubkey) returns (InspectOperatorResp); + rpc RegisterOperator (RegOperatorReq) returns (Empty); + rpc KickContract (KickReq) returns (KickResp); + rpc BanUser (BanUserReq) returns (Empty); + // admin commands + rpc Airdrop (AirdropReq) returns (Empty); + rpc Slash (SlashReq) returns (Empty); + rpc ListAllVmContracts (Empty) returns (stream VmContract); + rpc ListAccounts (Empty) returns (stream Account); +} diff --git a/src/lib.rs b/src/lib.rs index f2e5e64..b19cb29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ pub mod sgx; +pub mod snp; diff --git a/src/snp/mod.rs b/src/snp/mod.rs new file mode 100644 index 0000000..d03398b --- /dev/null +++ b/src/snp/mod.rs @@ -0,0 +1,32 @@ +pub mod pb { + + pub mod vm { + tonic::include_proto!("vm_proto"); + } +} + +use pb::vm as snp_proto; + +impl From for snp_proto::VmDaemonMessage { + fn from(value: snp_proto::NewVmResp) -> Self { + snp_proto::VmDaemonMessage { + msg: Some(snp_proto::vm_daemon_message::Msg::NewVmResp(value)), + } + } +} + +impl From for snp_proto::VmDaemonMessage { + fn from(value: snp_proto::UpdateVmResp) -> Self { + snp_proto::VmDaemonMessage { + msg: Some(snp_proto::vm_daemon_message::Msg::UpdateVmResp(value)), + } + } +} + +impl From for snp_proto::VmDaemonMessage { + fn from(value: snp_proto::VmNodeResources) -> Self { + snp_proto::VmDaemonMessage { + msg: Some(snp_proto::vm_daemon_message::Msg::VmNodeResources(value)), + } + } +}