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 f2abc8a [frontend] Foward requests to managemet service (#227)
f2abc8a is described below
commit f2abc8a439b67f893fa886e09f76c46b4120cf42
Author: TX <[email protected]>
AuthorDate: Tue Feb 18 17:42:17 2020 -0800
[frontend] Foward requests to managemet service (#227)
---
services/frontend/enclave/src/service.rs | 120 ++++--
services/management/enclave/src/service.rs | 27 ++
.../src/proto/teaclave_frontend_service.proto | 10 +
services/proto/src/teaclave_frontend_service.rs | 9 +
.../enclave/src/teaclave_frontend_service.rs | 444 ++++++++++++++++++++-
5 files changed, 573 insertions(+), 37 deletions(-)
diff --git a/services/frontend/enclave/src/service.rs
b/services/frontend/enclave/src/service.rs
index 3909f69..8b32b65 100644
--- a/services/frontend/enclave/src/service.rs
+++ b/services/frontend/enclave/src/service.rs
@@ -6,8 +6,13 @@ use teaclave_proto::teaclave_authentication_service::{
};
use teaclave_proto::teaclave_common::UserCredential;
use teaclave_proto::teaclave_frontend_service::{
- RegisterInputFileRequest, RegisterInputFileResponse,
RegisterOutputFileRequest,
- RegisterOutputFileResponse, TeaclaveFrontend,
+ ApproveTaskRequest, ApproveTaskResponse, AssignDataRequest,
AssignDataResponse,
+ CreateTaskRequest, CreateTaskResponse, GetFunctionRequest,
GetFunctionResponse,
+ GetFusionDataRequest, GetFusionDataResponse, GetOutputFileRequest,
GetOutputFileResponse,
+ GetTaskRequest, GetTaskResponse, InvokeTaskRequest, InvokeTaskResponse,
+ RegisterFunctionRequest, RegisterFunctionResponse,
RegisterInputFileRequest,
+ RegisterInputFileResponse, RegisterOutputFileRequest,
RegisterOutputFileResponse,
+ TeaclaveFrontend,
};
use teaclave_proto::teaclave_management_service::TeaclaveManagementClient;
use teaclave_rpc::endpoint::Endpoint;
@@ -20,6 +25,8 @@ use thiserror::Error;
enum TeaclaveFrontendError {
#[error("authentication error")]
AuthenticationError,
+ #[error("lock error")]
+ LockError,
}
impl From<TeaclaveFrontendError> for TeaclaveServiceResponseError {
@@ -35,6 +42,28 @@ pub(crate) struct TeaclaveFrontendService {
management_client: Arc<Mutex<TeaclaveManagementClient>>,
}
+macro_rules! forward_to_management {
+ ($service: ident, $request: ident, $func: ident) => {{
+ match $service.authenticate(&$request) {
+ Ok(true) => (),
+ _ => return Err(TeaclaveFrontendError::AuthenticationError.into()),
+ }
+
+ let client = $service.management_client.clone();
+ let mut client = client
+ .lock()
+ .map_err(|_| TeaclaveFrontendError::LockError)?;
+ client.metadata_mut().clear();
+ client.metadata_mut().extend($request.metadata);
+
+ let response = client.$func($request.message);
+
+ client.metadata_mut().clear();
+ let response = response?;
+ Ok(response)
+ }};
+}
+
impl TeaclaveFrontendService {
pub(crate) fn new(
authentication_service_endpoint: Endpoint,
@@ -62,34 +91,77 @@ impl TeaclaveFrontend for TeaclaveFrontendService {
&self,
request: Request<RegisterInputFileRequest>,
) -> TeaclaveServiceResponseResult<RegisterInputFileResponse> {
- match self.authenticate(&request) {
- Ok(true) => (),
- _ => return Err(TeaclaveFrontendError::AuthenticationError.into()),
- }
- let response = self
- .management_client
- .clone()
- .lock()
- .unwrap()
- .register_input_file(request.message)?;
- Ok(response)
+ forward_to_management!(self, request, register_input_file)
}
fn register_output_file(
&self,
request: Request<RegisterOutputFileRequest>,
) -> TeaclaveServiceResponseResult<RegisterOutputFileResponse> {
- match self.authenticate(&request) {
- Ok(true) => (),
- _ => return Err(TeaclaveFrontendError::AuthenticationError.into()),
- }
- let response = self
- .management_client
- .clone()
- .lock()
- .unwrap()
- .register_output_file(request.message)?;
- Ok(response)
+ forward_to_management!(self, request, register_output_file)
+ }
+
+ fn get_output_file(
+ &self,
+ request: Request<GetOutputFileRequest>,
+ ) -> TeaclaveServiceResponseResult<GetOutputFileResponse> {
+ forward_to_management!(self, request, get_output_file)
+ }
+
+ fn get_fusion_data(
+ &self,
+ request: Request<GetFusionDataRequest>,
+ ) -> TeaclaveServiceResponseResult<GetFusionDataResponse> {
+ forward_to_management!(self, request, get_fusion_data)
+ }
+
+ fn register_function(
+ &self,
+ request: Request<RegisterFunctionRequest>,
+ ) -> TeaclaveServiceResponseResult<RegisterFunctionResponse> {
+ forward_to_management!(self, request, register_function)
+ }
+
+ fn get_function(
+ &self,
+ request: Request<GetFunctionRequest>,
+ ) -> TeaclaveServiceResponseResult<GetFunctionResponse> {
+ forward_to_management!(self, request, get_function)
+ }
+
+ fn create_task(
+ &self,
+ request: Request<CreateTaskRequest>,
+ ) -> TeaclaveServiceResponseResult<CreateTaskResponse> {
+ forward_to_management!(self, request, create_task)
+ }
+
+ fn get_task(
+ &self,
+ request: Request<GetTaskRequest>,
+ ) -> TeaclaveServiceResponseResult<GetTaskResponse> {
+ forward_to_management!(self, request, get_task)
+ }
+
+ fn assign_data(
+ &self,
+ request: Request<AssignDataRequest>,
+ ) -> TeaclaveServiceResponseResult<AssignDataResponse> {
+ forward_to_management!(self, request, assign_data)
+ }
+
+ fn approve_task(
+ &self,
+ request: Request<ApproveTaskRequest>,
+ ) -> TeaclaveServiceResponseResult<ApproveTaskResponse> {
+ forward_to_management!(self, request, approve_task)
+ }
+
+ fn invoke_task(
+ &self,
+ request: Request<InvokeTaskRequest>,
+ ) -> TeaclaveServiceResponseResult<InvokeTaskResponse> {
+ forward_to_management!(self, request, invoke_task)
}
}
diff --git a/services/management/enclave/src/service.rs
b/services/management/enclave/src/service.rs
index 920923a..8debe7e 100644
--- a/services/management/enclave/src/service.rs
+++ b/services/management/enclave/src/service.rs
@@ -440,6 +440,13 @@ impl TeaclaveManagementService {
let value = fusion_data.to_vec()?;
self.write_to_storage(&key, &value)?;
+ let mut fusion_data =
+ FusionData::new(vec!["frontend_user".to_string(),
"mock_user".to_string()])?;
+ fusion_data.data_id = "fusion-data-mock-frontend-data".to_string();
+ let key = fusion_data.get_key_vec();
+ let value = fusion_data.to_vec()?;
+ self.write_to_storage(&key, &value)?;
+
let function_input = FunctionInput {
name: "input".to_string(),
description: "input_desc".to_string(),
@@ -473,6 +480,26 @@ impl TeaclaveManagementService {
let value = native_function.to_vec()?;
self.write_to_storage(&key, &value)?;
+ let function_output = FunctionOutput {
+ name: "output".to_string(),
+ description: "output_desc".to_string(),
+ };
+ let native_function = Function {
+ function_id: "native-mock-simple-func".to_string(),
+ name: "mock-native-func".to_string(),
+ description: "mock-desc".to_string(),
+ payload: b"mock-payload".to_vec(),
+ is_public: true,
+ arg_list: vec!["arg1".to_string()],
+ input_list: vec![],
+ output_list: vec![function_output],
+ owner: "teaclave".to_string(),
+ is_native: true,
+ };
+ let key = native_function.get_key_vec();
+ let value = native_function.to_vec()?;
+ self.write_to_storage(&key, &value)?;
+
let url = Url::parse("s3://bucket_id/path?token=mock_token").unwrap();
let user_id = "mock_user1".to_string();
let crypto_info = TeaclaveFileCryptoInfo::default();
diff --git a/services/proto/src/proto/teaclave_frontend_service.proto
b/services/proto/src/proto/teaclave_frontend_service.proto
index c07bf7e..c24eba2 100644
--- a/services/proto/src/proto/teaclave_frontend_service.proto
+++ b/services/proto/src/proto/teaclave_frontend_service.proto
@@ -156,4 +156,14 @@ message InvokeTaskResponse { }
service TeaclaveFrontend {
rpc RegisterInputFile (RegisterInputFileRequest) returns
(RegisterInputFileResponse);
rpc RegisterOutputFile (RegisterOutputFileRequest) returns
(RegisterOutputFileResponse);
+ rpc GetOutputFile (GetOutputFileRequest) returns (GetOutputFileResponse);
+ rpc GetFusionData (GetFusionDataRequest) returns (GetFusionDataResponse);
+ rpc RegisterFunction (RegisterFunctionRequest) returns
(RegisterFunctionResponse);
+ rpc GetFunction (GetFunctionRequest) returns (GetFunctionResponse);
+ rpc CreateTask (CreateTaskRequest) returns (CreateTaskResponse);
+ rpc GetTask (GetTaskRequest) returns (GetTaskResponse);
+ rpc AssignData (AssignDataRequest) returns (AssignDataResponse);
+ rpc ApproveTask (ApproveTaskRequest) returns (ApproveTaskResponse);
+ rpc InvokeTask (InvokeTaskRequest) returns (InvokeTaskResponse);
+
}
diff --git a/services/proto/src/teaclave_frontend_service.rs
b/services/proto/src/teaclave_frontend_service.rs
index 76e35cd..de28fd4 100644
--- a/services/proto/src/teaclave_frontend_service.rs
+++ b/services/proto/src/teaclave_frontend_service.rs
@@ -49,6 +49,7 @@ pub struct RegisterOutputFileResponse {
}
#[into_request(TeaclaveManagementRequest::GetOutputFile)]
+#[into_request(TeaclaveFrontendRequest::GetOutputFile)]
#[derive(Debug)]
pub struct GetOutputFileRequest {
pub data_id: String,
@@ -61,6 +62,7 @@ pub struct GetOutputFileResponse {
}
#[into_request(TeaclaveManagementRequest::GetFusionData)]
+#[into_request(TeaclaveFrontendRequest::GetFusionData)]
#[derive(Debug)]
pub struct GetFusionDataRequest {
pub data_id: String,
@@ -86,6 +88,7 @@ pub struct FunctionOutput {
}
#[into_request(TeaclaveManagementRequest::RegisterFunction)]
+#[into_request(TeaclaveFrontendRequest::RegisterFunction)]
#[derive(Debug)]
pub struct RegisterFunctionRequest {
pub name: String,
@@ -104,6 +107,7 @@ pub struct RegisterFunctionResponse {
}
#[into_request(TeaclaveManagementRequest::GetFunction)]
+#[into_request(TeaclaveFrontendRequest::GetFunction)]
#[derive(Debug)]
pub struct GetFunctionRequest {
pub function_id: String,
@@ -128,6 +132,7 @@ pub struct DataOwnerList {
}
#[into_request(TeaclaveManagementRequest::CreateTask)]
+#[into_request(TeaclaveFrontendRequest::CreateTask)]
#[derive(Debug)]
pub struct CreateTaskRequest {
pub function_id: String,
@@ -159,6 +164,7 @@ pub enum TaskStatus {
}
#[into_request(TeaclaveManagementRequest::GetTask)]
+#[into_request(TeaclaveFrontendRequest::GetTask)]
#[derive(Debug)]
pub struct GetTaskRequest {
pub task_id: String,
@@ -182,6 +188,7 @@ pub struct GetTaskResponse {
}
#[into_request(TeaclaveManagementRequest::AssignData)]
+#[into_request(TeaclaveFrontendRequest::AssignData)]
#[derive(Debug)]
pub struct AssignDataRequest {
pub task_id: String,
@@ -193,6 +200,7 @@ pub struct AssignDataRequest {
pub struct AssignDataResponse;
#[into_request(TeaclaveManagementRequest::ApproveTask)]
+#[into_request(TeaclaveFrontendRequest::ApproveTask)]
#[derive(Debug)]
pub struct ApproveTaskRequest {
pub task_id: String,
@@ -202,6 +210,7 @@ pub struct ApproveTaskRequest {
pub struct ApproveTaskResponse;
#[into_request(TeaclaveManagementRequest::InvokeTask)]
+#[into_request(TeaclaveFrontendRequest::InvokeTask)]
#[derive(Debug)]
pub struct InvokeTaskRequest {
pub task_id: String,
diff --git a/tests/functional/enclave/src/teaclave_frontend_service.rs
b/tests/functional/enclave/src/teaclave_frontend_service.rs
index a77e2cb..ca2e2a3 100644
--- a/tests/functional/enclave/src/teaclave_frontend_service.rs
+++ b/tests/functional/enclave/src/teaclave_frontend_service.rs
@@ -1,7 +1,12 @@
use std::collections::HashMap;
use std::prelude::v1::*;
+use teaclave_attestation::verifier;
use teaclave_config::RuntimeConfig;
+use teaclave_config::BUILD_CONFIG;
+use teaclave_proto::teaclave_authentication_service::*;
+use teaclave_proto::teaclave_common::*;
use teaclave_proto::teaclave_frontend_service::*;
+use teaclave_rpc::config::SgxTrustedTlsClientConfig;
use teaclave_rpc::endpoint::Endpoint;
use teaclave_types::*;
use url::Url;
@@ -9,35 +14,85 @@ use url::Url;
pub fn run_tests() -> bool {
use teaclave_test_utils::*;
- run_tests!(test_register_input_file_authentication_error)
+ run_tests!(
+ test_register_input_file,
+ test_register_output_file,
+ test_get_output_file,
+ test_get_fusion_data,
+ test_register_function,
+ test_get_function,
+ test_create_task,
+ test_get_task,
+ test_assign_data,
+ test_approve_task,
+ test_invoke_task,
+ )
+}
+
+fn get_credential() -> UserCredential {
+ // register user and login
+ let runtime_config =
RuntimeConfig::from_toml("runtime.config.toml").expect("runtime");
+ let enclave_info =
+
EnclaveInfo::from_bytes(&runtime_config.audit.enclave_info_bytes.as_ref().unwrap());
+ let enclave_attr = enclave_info
+ .get_enclave_attr("teaclave_authentication_service")
+ .expect("authentication");
+ let config = SgxTrustedTlsClientConfig::new().attestation_report_verifier(
+ vec![enclave_attr],
+ BUILD_CONFIG.as_root_ca_cert,
+ verifier::universal_quote_verifier,
+ );
+ let channel = Endpoint::new("localhost:7776")
+ .config(config)
+ .connect()
+ .unwrap();
+ let mut api_client =
TeaclaveAuthenticationApiClient::new(channel).unwrap();
+
+ let request = UserRegisterRequest::new("frontend_user", "test_password");
+ let _response_result = api_client.user_register(request);
+
+ let request = UserLoginRequest::new("frontend_user", "test_password");
+ let response_result = api_client.user_login(request);
+ assert!(response_result.is_ok());
+ UserCredential::new("frontend_user", response_result.unwrap().token)
}
fn get_client() -> TeaclaveFrontendClient {
+ let user_credential = get_credential();
let runtime_config =
RuntimeConfig::from_toml("runtime.config.toml").expect("runtime");
let port = &runtime_config.api_endpoints.frontend.listen_address.port();
let channel = Endpoint::new(&format!("localhost:{}", port))
.connect()
.unwrap();
- TeaclaveFrontendClient::new(channel).unwrap()
+
+ let mut metadata = HashMap::new();
+ metadata.insert("id".to_string(), user_credential.id);
+ metadata.insert("token".to_string(), user_credential.token);
+
+ TeaclaveFrontendClient::new_with_metadata(channel, metadata).unwrap()
}
-fn test_register_input_file_authentication_error() {
+fn test_register_input_file() {
+ let mut client = get_client();
+
let request = RegisterInputFileRequest {
url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
hash: "deadbeefdeadbeef".to_string(),
- crypto_info: TeaclaveFileCryptoInfo::AesGcm128(AesGcm128CryptoInfo {
- key: [0x90u8; 16],
- iv: [0x89u8; 12],
- }),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
};
-
- let mut metadata = HashMap::new();
- metadata.insert("id".to_string(), "".to_string());
- metadata.insert("token".to_string(), "".to_string());
-
- let mut client = get_client();
let response = client.register_input_file(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().data_id.is_empty());
+ let request = RegisterInputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ hash: "deadbeefdeadbeef".to_string(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.register_input_file(request);
assert_eq!(
response,
Err(TeaclaveServiceResponseError::RequestError(
@@ -45,3 +100,366 @@ fn test_register_input_file_authentication_error() {
))
);
}
+
+fn test_register_output_file() {
+ let mut client = get_client();
+
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ let response = client.register_output_file(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().data_id.is_empty());
+
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.register_output_file(request);
+ assert!(response.is_err());
+}
+
+fn test_get_output_file() {
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+
+ let mut client = get_client();
+ let response = client.register_output_file(request);
+ let data_id = response.unwrap().data_id;
+
+ let request = GetOutputFileRequest {
+ data_id: data_id.clone(),
+ };
+ let response = client.get_output_file(request);
+ assert!(response.is_ok());
+ assert!(response.unwrap().hash.is_empty());
+
+ let request = GetOutputFileRequest { data_id };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.get_output_file(request);
+ assert!(response.is_err());
+}
+
+fn test_get_fusion_data() {
+ let mut client = get_client();
+
+ let request = GetFusionDataRequest {
+ data_id: "fusion-data-mock-frontend-data".to_string(),
+ };
+ let response = client.get_fusion_data(request);
+ assert!(response.is_ok());
+ assert!(response.unwrap().hash.is_empty());
+
+ let request = GetFusionDataRequest {
+ data_id: "fusion-data-mock-frontend-data".to_string(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.get_fusion_data(request);
+ assert!(response.is_err());
+}
+
+fn test_register_function() {
+ let mut client = get_client();
+
+ let request = RegisterFunctionRequest {
+ name: "mock_function".to_string(),
+ description: "mock function".to_string(),
+ payload: b"python script".to_vec(),
+ is_public: true,
+ arg_list: vec!["arg".to_string()],
+ input_list: vec![],
+ output_list: vec![],
+ };
+ let response = client.register_function(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().function_id.is_empty());
+
+ let request = RegisterFunctionRequest {
+ name: "mock_function".to_string(),
+ description: "mock function".to_string(),
+ payload: b"python script".to_vec(),
+ is_public: true,
+ arg_list: vec!["arg".to_string()],
+ input_list: vec![],
+ output_list: vec![],
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.register_function(request);
+ assert!(response.is_err());
+}
+
+fn test_get_function() {
+ let mut client = get_client();
+
+ let request = GetFunctionRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ };
+ let response = client.get_function(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().name.is_empty());
+
+ let request = GetFunctionRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.get_function(request);
+ assert!(response.is_err());
+}
+
+fn test_create_task() {
+ let mut client = get_client();
+
+ let data_owner_id_list = DataOwnerList {
+ user_id_list: vec!["frontend_user".to_string(),
"mock_user".to_string()]
+ .into_iter()
+ .collect(),
+ };
+ let mut output_data_owner_list = HashMap::new();
+ output_data_owner_list.insert("output".to_string(), data_owner_id_list);
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list: output_data_owner_list.clone(),
+ };
+ let response = client.create_task(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().task_id.is_empty());
+
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list,
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.create_task(request);
+ assert!(response.is_err());
+}
+
+fn test_get_task() {
+ let mut client = get_client();
+
+ let data_owner_id_list = DataOwnerList {
+ user_id_list: vec!["frontend_user".to_string(),
"mock_user".to_string()]
+ .into_iter()
+ .collect(),
+ };
+ let mut output_data_owner_list = HashMap::new();
+ output_data_owner_list.insert("output".to_string(), data_owner_id_list);
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list,
+ };
+ let response = client.create_task(request);
+ let task_id = response.unwrap().task_id;
+
+ let request = GetTaskRequest {
+ task_id: task_id.clone(),
+ };
+ let response = client.get_task(request);
+ assert!(response.is_ok());
+ assert!(!response.unwrap().function_id.is_empty());
+
+ let request = GetTaskRequest { task_id };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.get_task(request);
+ assert!(response.is_err());
+}
+
+fn test_assign_data() {
+ let mut client = get_client();
+
+ let data_owner_id_list = DataOwnerList {
+ user_id_list: vec!["frontend_user".to_string()].into_iter().collect(),
+ };
+ let mut output_data_owner_list = HashMap::new();
+ output_data_owner_list.insert("output".to_string(), data_owner_id_list);
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list,
+ };
+ let response = client.create_task(request);
+ let task_id = response.unwrap().task_id;
+
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ let response = client.register_output_file(request);
+ let output_id = response.unwrap().data_id;
+
+ let request = AssignDataRequest {
+ task_id: task_id.clone(),
+ input_map: HashMap::new(),
+ output_map: vec![("output".to_string(), output_id.clone())]
+ .into_iter()
+ .collect(),
+ };
+ let correct_token = client.metadata().get("token").unwrap().to_string();
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.assign_data(request);
+ assert!(response.is_err());
+
+ let request = AssignDataRequest {
+ task_id,
+ input_map: HashMap::new(),
+ output_map: vec![("output".to_string(), output_id)]
+ .into_iter()
+ .collect(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), correct_token);
+ let response = client.assign_data(request);
+ assert!(response.is_ok());
+}
+
+fn test_approve_task() {
+ let mut client = get_client();
+
+ let data_owner_id_list = DataOwnerList {
+ user_id_list: vec!["frontend_user".to_string()].into_iter().collect(),
+ };
+ let mut output_data_owner_list = HashMap::new();
+ output_data_owner_list.insert("output".to_string(), data_owner_id_list);
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list,
+ };
+ let response = client.create_task(request);
+ let task_id = response.unwrap().task_id;
+
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ let response = client.register_output_file(request);
+ let output_id = response.unwrap().data_id;
+
+ let request = AssignDataRequest {
+ task_id: task_id.clone(),
+ input_map: HashMap::new(),
+ output_map: vec![("output".to_string(), output_id)]
+ .into_iter()
+ .collect(),
+ };
+ let _response = client.assign_data(request);
+
+ let request = ApproveTaskRequest {
+ task_id: task_id.clone(),
+ };
+ let correct_token = client.metadata().get("token").unwrap().to_string();
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.approve_task(request);
+ assert!(response.is_err());
+
+ let request = ApproveTaskRequest { task_id };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), correct_token);
+ let response = client.approve_task(request);
+ assert!(response.is_ok());
+}
+
+fn test_invoke_task() {
+ let mut client = get_client();
+
+ let data_owner_id_list = DataOwnerList {
+ user_id_list: vec!["frontend_user".to_string()].into_iter().collect(),
+ };
+ let mut output_data_owner_list = HashMap::new();
+ output_data_owner_list.insert("output".to_string(), data_owner_id_list);
+ let request = CreateTaskRequest {
+ function_id: "native-mock-simple-func".to_string(),
+ arg_list: vec![("arg1".to_string(), "data1".to_string())]
+ .into_iter()
+ .collect(),
+ input_data_owner_list: HashMap::new(),
+ output_data_owner_list,
+ };
+ let response = client.create_task(request);
+ let task_id = response.unwrap().task_id;
+
+ let request = RegisterOutputFileRequest {
+ url:
Url::parse("s3://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg.enc?key-id=deadbeefdeadbeef&key=deadbeefdeadbeef").unwrap(),
+ crypto_info: TeaclaveFileCryptoInfo::default(),
+ };
+ let response = client.register_output_file(request);
+ let output_id = response.unwrap().data_id;
+
+ let request = AssignDataRequest {
+ task_id: task_id.clone(),
+ input_map: HashMap::new(),
+ output_map: vec![("output".to_string(), output_id)]
+ .into_iter()
+ .collect(),
+ };
+ let _response = client.assign_data(request);
+
+ let request = ApproveTaskRequest {
+ task_id: task_id.clone(),
+ };
+ let _response = client.approve_task(request);
+
+ let request = InvokeTaskRequest {
+ task_id: task_id.clone(),
+ };
+ let correct_token = client.metadata().get("token").unwrap().to_string();
+ client
+ .metadata_mut()
+ .insert("token".to_string(), "wrong token".to_string());
+ let response = client.invoke_task(request);
+ assert!(response.is_err());
+
+ let request = InvokeTaskRequest {
+ task_id: task_id.clone(),
+ };
+ client
+ .metadata_mut()
+ .insert("token".to_string(), correct_token);
+ let response = client.invoke_task(request);
+ assert!(response.is_ok());
+
+ let request = GetTaskRequest { task_id };
+ let response = client.get_task(request);
+ assert_eq!(response.unwrap().status, TaskStatus::Running);
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]