This is an automated email from the ASF dual-hosted git repository.
mssun pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git
The following commit(s) were added to refs/heads/develop by this push:
new ac50c6d [rpc] Introduce IntoRequest trait to ease the request handling
ac50c6d is described below
commit ac50c6db301bc7ec66e6dd6585b301c8f4f7cd4b
Author: Mingshen Sun <[email protected]>
AuthorDate: Thu Feb 13 20:59:54 2020 -0800
[rpc] Introduce IntoRequest trait to ease the request handling
---
rpc/Cargo.toml | 1 +
rpc/proc_macro/Cargo.toml | 14 +++++++++++
rpc/proc_macro/src/lib.rs | 29 ++++++++++++++++++++++
rpc/src/lib.rs | 3 ++-
rpc/src/request.rs | 4 +++
services/proto/proto_gen/templates/proto.j2 | 9 +++----
.../proto/src/teaclave_access_control_service.rs | 9 +++++++
.../proto/src/teaclave_authentication_service.rs | 7 ++++++
services/proto/src/teaclave_execution_service.rs | 3 +++
services/proto/src/teaclave_frontend_service.rs | 23 +++++++++++++++++
services/proto/src/teaclave_storage_service.rs | 11 ++++++++
11 files changed, 106 insertions(+), 7 deletions(-)
diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml
index 49800fd..537d58e 100644
--- a/rpc/Cargo.toml
+++ b/rpc/Cargo.toml
@@ -27,6 +27,7 @@ webpki = { version = "0.21.0" }
teaclave_types = { path = "../types" }
teaclave_attestation = { path = "../attestation" }
+teaclave_rpc_proc_macro = { path = "./proc_macro" }
sgx_trts = { version = "1.1.0" }
sgx_tstd = { version = "1.1.0", features = ["net", "backtrace"], optional =
true }
diff --git a/rpc/proc_macro/Cargo.toml b/rpc/proc_macro/Cargo.toml
new file mode 100644
index 0000000..9078ec7
--- /dev/null
+++ b/rpc/proc_macro/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "teaclave_rpc_proc_macro"
+version = "0.1.0"
+authors = ["Teaclave Contributors <[email protected]>"]
+license = "Apache-2.0"
+edition = "2018"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+proc-macro2 = "1.0"
+quote = "1.0"
+syn = { version = "1.0", features = ["full"] }
diff --git a/rpc/proc_macro/src/lib.rs b/rpc/proc_macro/src/lib.rs
new file mode 100644
index 0000000..5afd210
--- /dev/null
+++ b/rpc/proc_macro/src/lib.rs
@@ -0,0 +1,29 @@
+extern crate proc_macro;
+use proc_macro2::{Ident, Span};
+use quote::quote;
+use syn::parse_macro_input;
+use syn::ItemStruct;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_attribute]
+pub fn into_request(attr: TokenStream, input: TokenStream) -> TokenStream {
+ let attr_str = attr.to_string();
+ let splits: Vec<&str> = attr_str.split("::").map(|s| s.trim()).collect();
+ let name = Ident::new(splits[0], Span::call_site());
+ let item = Ident::new(splits[1], Span::call_site());
+ let f = parse_macro_input!(input as ItemStruct);
+ let struct_ident = &f.ident;
+ let q = quote!(
+ #f
+
+
+ impl teaclave_rpc::IntoRequest<#name> for #struct_ident {
+ fn into_request(self) -> teaclave_rpc::Request<#name> {
+ teaclave_rpc::Request::new(#name::#item(self.into()))
+ }
+ }
+ );
+
+ q.into()
+}
diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs
index 69ef2b2..7a403c5 100644
--- a/rpc/src/lib.rs
+++ b/rpc/src/lib.rs
@@ -22,7 +22,8 @@ pub mod config;
pub mod endpoint;
mod protocol;
mod request;
-pub use request::Request;
+pub use request::{IntoRequest, Request};
+pub use teaclave_rpc_proc_macro::into_request;
pub mod server;
mod transport;
mod utils;
diff --git a/rpc/src/request.rs b/rpc/src/request.rs
index b3b8f48..47d1976 100644
--- a/rpc/src/request.rs
+++ b/rpc/src/request.rs
@@ -39,3 +39,7 @@ impl<T> Request<T> {
&mut self.metadata
}
}
+
+pub trait IntoRequest<T> {
+ fn into_request(self) -> Request<T>;
+}
diff --git a/services/proto/proto_gen/templates/proto.j2
b/services/proto/proto_gen/templates/proto.j2
index 9bf279e..d4b9383 100644
--- a/services/proto/proto_gen/templates/proto.j2
+++ b/services/proto/proto_gen/templates/proto.j2
@@ -74,18 +74,15 @@ impl {{ service.proto_name }}Client {
}
{%- for m in service.methods %}
- pub fn {{ m.name }}<T: Into<{{ m.input_type }}>>(
+ pub fn {{ m.name }}<T: teaclave_rpc::IntoRequest<{{ service.proto_name
}}Request>>(
&mut self,
request: T
) -> teaclave_types::TeaclaveServiceResponseResult<{{ m.output_type }}> {
{%- if service.methods.len() > 1 %}
use std::string::ToString;
{%- endif %}
- let request = {{ service.proto_name }}Request::{{ m.proto_name
}}(request.into());
- let request = teaclave_rpc::Request {
- metadata: self.metadata.clone(),
- message: request,
- };
+ let mut request = request.into_request();
+ request.metadata = self.metadata.clone();
match self.channel.invoke(request) {
Ok({{ service.proto_name }}Response::{{ m.proto_name }}(response))
=> Ok(response),
diff --git a/services/proto/src/teaclave_access_control_service.rs
b/services/proto/src/teaclave_access_control_service.rs
index 4b71116..95b9b1e 100644
--- a/services/proto/src/teaclave_access_control_service.rs
+++ b/services/proto/src/teaclave_access_control_service.rs
@@ -1,12 +1,14 @@
use crate::teaclave_access_control_service_proto as proto;
use anyhow::{Error, Result};
use std::prelude::v1::*;
+use teaclave_rpc::into_request;
pub use proto::TeaclaveAccessControl;
pub use proto::TeaclaveAccessControlClient;
pub use proto::TeaclaveAccessControlRequest;
pub use proto::TeaclaveAccessControlResponse;
+#[into_request(TeaclaveAccessControlRequest::AuthorizeData)]
#[derive(Debug)]
pub struct AuthorizeDataRequest {
pub subject_user_id: String,
@@ -22,6 +24,7 @@ impl AuthorizeDataRequest {
}
}
+#[into_request(TeaclaveAccessControlResponse::AuthorizeData)]
#[derive(Debug)]
pub struct AuthorizeDataResponse {
pub accept: bool,
@@ -33,6 +36,7 @@ impl AuthorizeDataResponse {
}
}
+#[into_request(TeaclaveAccessControlRequest::AuthorizeFunction)]
#[derive(Debug)]
pub struct AuthorizeFunctionRequest {
pub subject_user_id: String,
@@ -48,6 +52,7 @@ impl AuthorizeFunctionRequest {
}
}
+#[into_request(TeaclaveAccessControlResponse::AuthorizeFunction)]
#[derive(Debug)]
pub struct AuthorizeFunctionResponse {
pub accept: bool,
@@ -59,6 +64,7 @@ impl AuthorizeFunctionResponse {
}
}
+#[into_request(TeaclaveAccessControlRequest::AuthorizeTask)]
#[derive(Debug)]
pub struct AuthorizeTaskRequest {
pub subject_user_id: String,
@@ -74,6 +80,7 @@ impl AuthorizeTaskRequest {
}
}
+#[into_request(TeaclaveAccessControlResponse::AuthorizeTask)]
#[derive(Debug)]
pub struct AuthorizeTaskResponse {
pub accept: bool,
@@ -85,6 +92,7 @@ impl AuthorizeTaskResponse {
}
}
+#[into_request(TeaclaveAccessControlRequest::AuthorizeStagedTask)]
#[derive(Debug)]
pub struct AuthorizeStagedTaskRequest {
pub subject_task_id: String,
@@ -93,6 +101,7 @@ pub struct AuthorizeStagedTaskRequest {
pub object_output_data_id_list: Vec<String>,
}
+#[into_request(TeaclaveAccessControlResponse::AuthorizeStagedTask)]
#[derive(Debug)]
pub struct AuthorizeStagedTaskResponse {
pub accept: bool,
diff --git a/services/proto/src/teaclave_authentication_service.rs
b/services/proto/src/teaclave_authentication_service.rs
index 2099aa9..2c453b9 100644
--- a/services/proto/src/teaclave_authentication_service.rs
+++ b/services/proto/src/teaclave_authentication_service.rs
@@ -2,6 +2,7 @@ use anyhow::anyhow;
use anyhow::{Error, Result};
use core::convert::TryInto;
use std::prelude::v1::*;
+use teaclave_rpc::into_request;
use crate::teaclave_authentication_service_proto as proto;
use crate::teaclave_common;
@@ -14,6 +15,7 @@ pub use proto::TeaclaveAuthenticationInternalClient;
pub use proto::TeaclaveAuthenticationInternalRequest;
pub use proto::TeaclaveAuthenticationInternalResponse;
+#[into_request(TeaclaveAuthenticationApiRequest::UserRegister)]
#[derive(Debug)]
pub struct UserRegisterRequest {
pub id: std::string::String,
@@ -29,9 +31,11 @@ impl UserRegisterRequest {
}
}
+#[into_request(TeaclaveAuthenticationApiResponse::UserRegister)]
#[derive(Debug, Default)]
pub struct UserRegisterResponse;
+#[into_request(TeaclaveAuthenticationApiRequest::UserLogin)]
#[derive(Debug)]
pub struct UserLoginRequest {
pub id: std::string::String,
@@ -47,6 +51,7 @@ impl UserLoginRequest {
}
}
+#[into_request(TeaclaveAuthenticationApiResponse::UserLogin)]
#[derive(Debug)]
pub struct UserLoginResponse {
pub token: std::string::String,
@@ -60,6 +65,7 @@ impl UserLoginResponse {
}
}
+#[into_request(TeaclaveAuthenticationInternalRequest::UserAuthenticate)]
#[derive(Debug)]
pub struct UserAuthenticateRequest {
pub credential: teaclave_common::UserCredential,
@@ -71,6 +77,7 @@ impl UserAuthenticateRequest {
}
}
+#[into_request(TeaclaveAuthenticationInternalResponse::UserAuthenticate)]
#[derive(Debug)]
pub struct UserAuthenticateResponse {
pub accept: bool,
diff --git a/services/proto/src/teaclave_execution_service.rs
b/services/proto/src/teaclave_execution_service.rs
index 7d1b3f2..ced78cc 100644
--- a/services/proto/src/teaclave_execution_service.rs
+++ b/services/proto/src/teaclave_execution_service.rs
@@ -2,6 +2,7 @@ use std::prelude::v1::*;
use anyhow::{anyhow, Error, Result};
use core::convert::TryInto;
+use teaclave_rpc::into_request;
use teaclave_types::{TeaclaveFunctionArguments, TeaclaveWorkerFileInfo,
WorkerInvocation};
use crate::teaclave_execution_service_proto as proto;
@@ -10,11 +11,13 @@ pub use proto::TeaclaveExecutionClient;
pub use proto::TeaclaveExecutionRequest;
pub use proto::TeaclaveExecutionResponse;
+#[into_request(TeaclaveExecutionRequest::InvokeFunction)]
#[derive(Debug)]
pub struct StagedFunctionExecuteRequest {
pub invocation: WorkerInvocation,
}
+#[into_request(TeaclaveExecutionResponse::InvokeFunction)]
#[derive(Debug)]
pub struct StagedFunctionExecuteResponse {
pub summary: std::string::String,
diff --git a/services/proto/src/teaclave_frontend_service.rs
b/services/proto/src/teaclave_frontend_service.rs
index 762f24f..b0f1468 100644
--- a/services/proto/src/teaclave_frontend_service.rs
+++ b/services/proto/src/teaclave_frontend_service.rs
@@ -1,4 +1,6 @@
use crate::teaclave_frontend_service_proto as proto;
+use crate::teaclave_management_service::TeaclaveManagementRequest;
+use crate::teaclave_management_service::TeaclaveManagementResponse;
use anyhow::anyhow;
use anyhow::{Error, Result};
use core::convert::TryInto;
@@ -6,6 +8,7 @@ use core::iter::FromIterator;
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
use std::prelude::v1::*;
+use teaclave_rpc::into_request;
use teaclave_types::TeaclaveFileCryptoInfo;
use url::Url;
@@ -14,6 +17,8 @@ pub use proto::TeaclaveFrontendClient;
pub use proto::TeaclaveFrontendRequest;
pub use proto::TeaclaveFrontendResponse;
+#[into_request(TeaclaveFrontendRequest::RegisterInputFile)]
+#[into_request(TeaclaveManagementRequest::RegisterInputFile)]
#[derive(Debug)]
pub struct RegisterInputFileRequest {
pub url: Url,
@@ -21,37 +26,47 @@ pub struct RegisterInputFileRequest {
pub crypto_info: TeaclaveFileCryptoInfo,
}
+#[into_request(TeaclaveFrontendResponse::RegisterInputFile)]
+#[into_request(TeaclaveManagementResponse::RegisterInputFile)]
#[derive(Debug)]
pub struct RegisterInputFileResponse {
pub data_id: String,
}
+#[into_request(TeaclaveFrontendRequest::RegisterOutputFile)]
+#[into_request(TeaclaveManagementRequest::RegisterOutputFile)]
#[derive(Debug)]
pub struct RegisterOutputFileRequest {
pub url: Url,
pub crypto_info: TeaclaveFileCryptoInfo,
}
+#[into_request(TeaclaveFrontendResponse::RegisterOutputFile)]
+#[into_request(TeaclaveManagementResponse::RegisterOutputFile)]
#[derive(Debug)]
pub struct RegisterOutputFileResponse {
pub data_id: String,
}
+#[into_request(TeaclaveManagementRequest::GetOutputFile)]
#[derive(Debug)]
pub struct GetOutputFileRequest {
pub data_id: String,
}
+#[into_request(TeaclaveManagementResponse::GetOutputFile)]
#[derive(Debug)]
pub struct GetOutputFileResponse {
pub hash: String,
}
+#[into_request(TeaclaveManagementRequest::GetFusionData)]
#[derive(Debug)]
pub struct GetFusionDataRequest {
pub data_id: String,
}
+#[into_request(TeaclaveManagementResponse::GetFusionData)]
#[derive(Debug)]
pub struct GetFusionDataResponse {
pub hash: String,
@@ -70,6 +85,7 @@ pub struct FunctionOutput {
pub description: String,
}
+#[into_request(TeaclaveManagementRequest::RegisterFunction)]
#[derive(Debug)]
pub struct RegisterFunctionRequest {
pub name: String,
@@ -81,16 +97,19 @@ pub struct RegisterFunctionRequest {
pub output_list: Vec<FunctionOutput>,
}
+#[into_request(TeaclaveManagementResponse::RegisterFunction)]
#[derive(Debug)]
pub struct RegisterFunctionResponse {
pub function_id: String,
}
+#[into_request(TeaclaveManagementRequest::GetFunction)]
#[derive(Debug)]
pub struct GetFunctionRequest {
pub function_id: String,
}
+#[into_request(TeaclaveManagementResponse::GetFunction)]
#[derive(Debug)]
pub struct GetFunctionResponse {
pub name: String,
@@ -108,6 +127,7 @@ pub struct DataOwnerList {
pub user_id_list: HashSet<String>,
}
+#[into_request(TeaclaveManagementRequest::CreateTask)]
#[derive(Debug)]
pub struct CreateTaskRequest {
pub function_id: String,
@@ -116,6 +136,7 @@ pub struct CreateTaskRequest {
pub output_data_owner_list: HashMap<String, DataOwnerList>,
}
+#[into_request(TeaclaveManagementResponse::CreateTask)]
#[derive(Debug)]
pub struct CreateTaskResponse {
pub task_id: String,
@@ -137,11 +158,13 @@ pub enum TaskStatus {
Finished,
}
+#[into_request(TeaclaveManagementRequest::GetTask)]
#[derive(Debug)]
pub struct GetTaskRequest {
pub task_id: String,
}
+#[into_request(TeaclaveManagementResponse::GetTask)]
#[derive(Debug)]
pub struct GetTaskResponse {
pub task_id: String,
diff --git a/services/proto/src/teaclave_storage_service.rs
b/services/proto/src/teaclave_storage_service.rs
index 6e1b200..ebcbb72 100644
--- a/services/proto/src/teaclave_storage_service.rs
+++ b/services/proto/src/teaclave_storage_service.rs
@@ -6,7 +6,9 @@ pub use proto::TeaclaveStorage;
pub use proto::TeaclaveStorageClient;
pub use proto::TeaclaveStorageRequest;
pub use proto::TeaclaveStorageResponse;
+use teaclave_rpc::into_request;
+#[into_request(TeaclaveStorageRequest::Get)]
#[derive(Debug)]
pub struct GetRequest {
pub key: Vec<u8>,
@@ -18,6 +20,7 @@ impl GetRequest {
}
}
+#[into_request(TeaclaveStorageResponse::Get)]
#[derive(Debug)]
pub struct GetResponse {
pub value: Vec<u8>,
@@ -31,6 +34,7 @@ impl GetResponse {
}
}
+#[into_request(TeaclaveStorageRequest::Put)]
#[derive(Debug)]
pub struct PutRequest {
pub key: Vec<u8>,
@@ -46,9 +50,11 @@ impl PutRequest {
}
}
+#[into_request(TeaclaveStorageResponse::Put)]
#[derive(Debug, Default)]
pub struct PutResponse;
+#[into_request(TeaclaveStorageRequest::Delete)]
#[derive(Debug)]
pub struct DeleteRequest {
pub key: Vec<u8>,
@@ -60,9 +66,11 @@ impl DeleteRequest {
}
}
+#[into_request(TeaclaveStorageResponse::Delete)]
#[derive(Debug, Default)]
pub struct DeleteResponse;
+#[into_request(TeaclaveStorageRequest::Enqueue)]
#[derive(Debug)]
pub struct EnqueueRequest {
pub key: Vec<u8>,
@@ -78,9 +86,11 @@ impl EnqueueRequest {
}
}
+#[into_request(TeaclaveStorageResponse::Enqueue)]
#[derive(Debug, Default)]
pub struct EnqueueResponse;
+#[into_request(TeaclaveStorageRequest::Dequeue)]
#[derive(Debug)]
pub struct DequeueRequest {
pub key: Vec<u8>,
@@ -92,6 +102,7 @@ impl DequeueRequest {
}
}
+#[into_request(TeaclaveStorageResponse::Dequeue)]
#[derive(Debug)]
pub struct DequeueResponse {
pub value: Vec<u8>,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]