This is an automated email from the ASF dual-hosted git repository.
mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git
The following commit(s) were added to refs/heads/master by this push:
new 81d801d Polish service errors (#628)
81d801d is described below
commit 81d801df17353af1b91120d5ca05b4663a98b518
Author: Mingshen Sun <[email protected]>
AuthorDate: Fri Feb 18 09:49:28 2022 -0800
Polish service errors (#628)
---
services/management/enclave/src/error.rs | 33 ++-
services/management/enclave/src/service.rs | 326 ++++++++++++++---------------
services/scheduler/enclave/src/error.rs | 19 +-
services/scheduler/enclave/src/service.rs | 50 ++---
services/storage/enclave/src/error.rs | 17 +-
services/storage/enclave/src/proxy.rs | 7 +-
services/storage/enclave/src/service.rs | 58 ++---
7 files changed, 256 insertions(+), 254 deletions(-)
diff --git a/services/management/enclave/src/error.rs
b/services/management/enclave/src/error.rs
index 917b897..0b77153 100644
--- a/services/management/enclave/src/error.rs
+++ b/services/management/enclave/src/error.rs
@@ -20,21 +20,32 @@ use teaclave_types::TeaclaveServiceResponseError;
use thiserror::Error;
#[derive(Error, Debug)]
-pub(crate) enum TeaclaveManagementServiceError {
- #[error("invalid request")]
- InvalidRequest,
- #[error("data error")]
- DataError,
- #[error("storage error")]
- StorageError,
+pub(crate) enum ManagementServiceError {
+ #[error("service internal error")]
+ Service(#[from] anyhow::Error),
#[error("permission denied")]
PermissionDenied,
- #[error("bad task")]
- BadTask,
+ #[error("missing user id")]
+ MissingUserId,
+ #[error("missing user role")]
+ MissingUserRole,
+ #[error("invalid data id")]
+ InvalidDataId,
+ #[error("invalid output file")]
+ InvalidOutputFile,
+ #[error("invalid function id")]
+ InvalidFunctionId,
+ #[error("invalid task id")]
+ InvalidTaskId,
+ #[error("invalid task")]
+ InvalidTask,
+ #[error("failed to change task state")]
+ TaskStateError,
}
-impl From<TeaclaveManagementServiceError> for TeaclaveServiceResponseError {
- fn from(error: TeaclaveManagementServiceError) -> Self {
+impl From<ManagementServiceError> for TeaclaveServiceResponseError {
+ fn from(error: ManagementServiceError) -> Self {
+ log::debug!("ManagementServiceError: {:?}", error);
TeaclaveServiceResponseError::RequestError(error.to_string())
}
}
diff --git a/services/management/enclave/src/service.rs
b/services/management/enclave/src/service.rs
index fd7adbf..1a640e9 100644
--- a/services/management/enclave/src/service.rs
+++ b/services/management/enclave/src/service.rs
@@ -15,9 +15,8 @@
// specific language governing permissions and limitations
// under the License.
-use crate::error::TeaclaveManagementServiceError;
-use anyhow::{anyhow, Result};
-use std::collections::HashMap;
+use crate::error::ManagementServiceError;
+use anyhow::anyhow;
use std::convert::TryInto;
use std::prelude::v1::*;
use std::sync::{Arc, SgxMutex as Mutex};
@@ -49,7 +48,7 @@ use uuid::Uuid;
#[teaclave_service(
teaclave_management_service,
TeaclaveManagement,
- TeaclaveManagementServiceError
+ ManagementServiceError
)]
#[derive(Clone)]
pub(crate) struct TeaclaveManagementService {
@@ -62,7 +61,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<RegisterInputFileRequest>,
) -> TeaclaveServiceResponseResult<RegisterInputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let input_file = TeaclaveInputFile::new(
request.url,
@@ -71,8 +70,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
vec![user_id],
);
- self.write_to_db(&input_file)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&input_file)?;
let response =
RegisterInputFileResponse::new(input_file.external_id());
Ok(response)
@@ -85,16 +83,16 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<UpdateInputFileRequest>,
) -> TeaclaveServiceResponseResult<UpdateInputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let old_input_file: TeaclaveInputFile = self
.read_from_db(&request.data_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
ensure!(
old_input_file.owner == OwnerList::from(vec![user_id]),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let input_file = TeaclaveInputFile::new(
@@ -104,8 +102,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
old_input_file.owner,
);
- self.write_to_db(&input_file)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&input_file)?;
let response = UpdateInputFileResponse::new(input_file.external_id());
Ok(response)
@@ -116,12 +113,11 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<RegisterOutputFileRequest>,
) -> TeaclaveServiceResponseResult<RegisterOutputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let output_file = TeaclaveOutputFile::new(request.url,
request.crypto_info, vec![user_id]);
- self.write_to_db(&output_file)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&output_file)?;
let response =
RegisterOutputFileResponse::new(output_file.external_id());
Ok(response)
@@ -134,16 +130,16 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<UpdateOutputFileRequest>,
) -> TeaclaveServiceResponseResult<UpdateOutputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let old_output_file: TeaclaveOutputFile = self
.read_from_db(&request.data_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
ensure!(
old_output_file.owner == OwnerList::from(vec![user_id]),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let output_file = TeaclaveOutputFile::new(
@@ -152,8 +148,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
old_output_file.owner,
);
- self.write_to_db(&output_file)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&output_file)?;
let response =
UpdateOutputFileResponse::new(output_file.external_id());
Ok(response)
@@ -164,20 +159,17 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<RegisterFusionOutputRequest>,
) -> TeaclaveServiceResponseResult<RegisterFusionOutputResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let owner_list = request.message.owner_list;
ensure!(
owner_list.len() > 1 && owner_list.contains(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
- let output_file = self
- .create_fusion_data(owner_list)
- .map_err(|_| TeaclaveManagementServiceError::DataError)?;
+ let output_file = create_fusion_data(owner_list)?;
- self.write_to_db(&output_file)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&output_file)?;
let response =
RegisterFusionOutputResponse::new(output_file.external_id());
Ok(response)
@@ -190,22 +182,21 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<RegisterInputFromOutputRequest>,
) -> TeaclaveServiceResponseResult<RegisterInputFromOutputResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let output: TeaclaveOutputFile = self
.read_from_db(&request.message.data_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
ensure!(
output.owner.contains(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let input = TeaclaveInputFile::from_output(output)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidOutputFile)?;
- self.write_to_db(&input)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&input)?;
let response =
RegisterInputFromOutputResponse::new(input.external_id());
Ok(response)
@@ -216,15 +207,15 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<GetOutputFileRequest>,
) -> TeaclaveServiceResponseResult<GetOutputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let output_file: TeaclaveOutputFile = self
.read_from_db(&request.message.data_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
ensure!(
output_file.owner.contains(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let response = GetOutputFileResponse::new(output_file.owner,
output_file.cmac);
@@ -236,15 +227,15 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<GetInputFileRequest>,
) -> TeaclaveServiceResponseResult<GetInputFileResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let input_file: TeaclaveInputFile = self
.read_from_db(&request.message.data_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
ensure!(
input_file.owner.contains(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let response = GetInputFileResponse::new(input_file.owner,
input_file.cmac);
@@ -256,33 +247,30 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<RegisterFunctionRequest>,
) -> TeaclaveServiceResponseResult<RegisterFunctionResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let function = FunctionBuilder::from(request.message)
.id(Uuid::new_v4())
.owner(user_id.clone())
.build();
- self.write_to_db(&function)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&function)?;
let mut u = User::default();
u.id = user_id;
let external_id = u.external_id();
- let user: Result<User> = self.read_from_db(&external_id);
+ let user = self.read_from_db::<User>(&external_id);
match user {
Ok(mut us) => {
us.registered_functions
.push(function.external_id().to_string());
- self.write_to_db(&us)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&us)?;
}
Err(_) => {
u.registered_functions
.push(function.external_id().to_string());
- self.write_to_db(&u)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&u)?;
}
}
@@ -291,18 +279,16 @@ impl TeaclaveManagement for TeaclaveManagementService {
let mut u = User::default();
u.id = user_id.into();
let external_id = u.external_id();
- let user: Result<User> = self.read_from_db(&external_id);
+ let user = self.read_from_db::<User>(&external_id);
match user {
Ok(mut us) => {
us.allowed_functions
.push(function.external_id().to_string());
- self.write_to_db(&us)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&us)?;
}
Err(_) => {
u.allowed_functions.push(function.external_id().to_string());
- self.write_to_db(&u)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&u)?;
}
}
}
@@ -315,14 +301,13 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<UpdateFunctionRequest>,
) -> TeaclaveServiceResponseResult<UpdateFunctionResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let function = FunctionBuilder::from(request.message)
.owner(user_id)
.build();
- self.write_to_db(&function)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&function)?;
let response = UpdateFunctionResponse::new(function.external_id());
Ok(response)
@@ -333,11 +318,11 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<GetFunctionRequest>,
) -> TeaclaveServiceResponseResult<GetFunctionResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let function: Function = self
.read_from_db(&request.message.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
if function.public || function.owner == user_id {
let response = GetFunctionResponse {
@@ -370,7 +355,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
Ok(response)
} else {
- Err(TeaclaveManagementServiceError::PermissionDenied.into())
+ Err(ManagementServiceError::PermissionDenied.into())
}
}
@@ -379,18 +364,18 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<DeleteFunctionRequest>,
) -> TeaclaveServiceResponseResult<DeleteFunctionResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let function: Function = self
.read_from_db(&request.message.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
ensure!(
function.owner == user_id,
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
self.delete_from_db(&request.message.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
let response = DeleteFunctionResponse {};
Ok(response)
}
@@ -403,17 +388,17 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<DisableFunctionRequest>,
) -> TeaclaveServiceResponseResult<DisableFunctionResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
- let role = self.get_request_role(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
+ let role = get_request_role(&request)?;
let mut function: Function = self
.read_from_db(&request.message.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
if role != UserRole::PlatformAdmin {
ensure!(
function.owner == user_id,
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
}
let func_id = function.external_id().to_string();
@@ -422,12 +407,11 @@ impl TeaclaveManagement for TeaclaveManagementService {
let mut u = User::default();
u.id = function.owner.clone();
let external_id = u.external_id();
- let user: Result<User> = self.read_from_db(&external_id);
+ let user = self.read_from_db::<User>(&external_id);
if let Ok(mut us) = user {
us.allowed_functions.retain(|f| !f.eq(&func_id));
us.registered_functions.retain(|f| !f.eq(&func_id));
- self.write_to_db(&us)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&us)?;
} else {
log::warn!("Invalid user id from functions");
}
@@ -437,20 +421,18 @@ impl TeaclaveManagement for TeaclaveManagementService {
let mut u = User::default();
u.id = user_id.into();
let external_id = u.external_id();
- let user: Result<User> = self.read_from_db(&external_id);
+ let user = self.read_from_db::<User>(&external_id);
if let Ok(mut us) = user {
us.allowed_functions.retain(|f| !f.eq(&func_id));
us.registered_functions.retain(|f| !f.eq(&func_id));
- self.write_to_db(&us)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&us)?;
} else {
log::warn!("Invalid user id from functions");
}
}
function.user_allowlist.clear();
- self.write_to_db(&function)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&function)?;
let response = DisableFunctionResponse {};
Ok(response)
}
@@ -462,13 +444,13 @@ impl TeaclaveManagement for TeaclaveManagementService {
) -> TeaclaveServiceResponseResult<ListFunctionsResponse> {
let mut request_user_id = request.message.user_id.clone();
- let current_user_id = self.get_request_user_id(request.metadata())?;
- let role = self.get_request_role(request.metadata())?;
+ let current_user_id = get_request_user_id(&request)?;
+ let role = get_request_role(&request)?;
if role != UserRole::PlatformAdmin {
ensure!(
request_user_id == current_user_id,
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
}
@@ -480,7 +462,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
u.id = request_user_id;
let external_id = u.external_id();
- let user: Result<User> = self.read_from_db(&external_id);
+ let user = self.read_from_db::<User>(&external_id);
match user {
Ok(us) => {
let response = ListFunctionsResponse {
@@ -506,25 +488,25 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<CreateTaskRequest>,
) -> TeaclaveServiceResponseResult<CreateTaskResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
- let role = self.get_request_role(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
+ let role = get_request_role(&request)?;
let request = request.message;
let function: Function = self
.read_from_db(&request.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
match role {
UserRole::DataOwner(a) | UserRole::DataOwnerManager(a) => {
ensure!(
(function.public || function.user_allowlist.contains(&a)),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
}
UserRole::PlatformAdmin => (),
_ => {
- return
Err(TeaclaveManagementServiceError::PermissionDenied.into());
+ return Err(ManagementServiceError::PermissionDenied.into());
}
}
let task = Task::<Create>::new(
@@ -535,12 +517,11 @@ impl TeaclaveManagement for TeaclaveManagementService {
request.outputs_ownership,
function,
)
- .map_err(|_| TeaclaveManagementServiceError::BadTask)?;
+ .map_err(|_| ManagementServiceError::InvalidTask)?;
log::debug!("CreateTask: {:?}", task);
let ts: TaskState = task.into();
- self.write_to_db(&ts)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&ts)?;
let response = CreateTaskResponse::new(ts.external_id());
Ok(response)
@@ -551,15 +532,15 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<GetTaskRequest>,
) -> TeaclaveServiceResponseResult<GetTaskResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let ts: TaskState = self
.read_from_db(&request.message.task_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidTaskId)?;
ensure!(
ts.has_participant(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
log::debug!("GetTask: {:?}", ts);
@@ -596,45 +577,44 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<AssignDataRequest>,
) -> TeaclaveServiceResponseResult<AssignDataResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let ts: TaskState = self
.read_from_db(&request.task_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidTaskId)?;
ensure!(
ts.has_participant(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let mut task: Task<Assign> = ts.try_into().map_err(|e| {
log::warn!("Assign state error: {:?}", e);
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::TaskStateError
})?;
for (data_name, data_id) in request.inputs.iter() {
let file: TeaclaveInputFile = self
.read_from_db(&data_id)
- .map_err(|_|
TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
task.assign_input(&user_id, data_name, file)
- .map_err(|_|
TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::PermissionDenied)?;
}
for (data_name, data_id) in request.outputs.iter() {
let file: TeaclaveOutputFile = self
.read_from_db(&data_id)
- .map_err(|_|
TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidDataId)?;
task.assign_output(&user_id, data_name, file)
- .map_err(|_|
TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::PermissionDenied)?;
}
log::debug!("AssignData: {:?}", task);
let ts: TaskState = task.into();
- self.write_to_db(&ts)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&ts)?;
Ok(AssignDataResponse)
}
@@ -646,26 +626,25 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<ApproveTaskRequest>,
) -> TeaclaveServiceResponseResult<ApproveTaskResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let ts: TaskState = self
.read_from_db(&request.task_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidTaskId)?;
let mut task: Task<Approve> = ts.try_into().map_err(|e| {
log::warn!("Approve state error: {:?}", e);
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::TaskStateError
})?;
task.approve(&user_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::PermissionDenied)?;
log::debug!("ApproveTask: approve:{:?}", task);
let ts: TaskState = task.into();
- self.write_to_db(&ts)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&ts)?;
Ok(ApproveTaskResponse)
}
@@ -677,38 +656,39 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<InvokeTaskRequest>,
) -> TeaclaveServiceResponseResult<InvokeTaskResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
let request = request.message;
let ts: TaskState = self
.read_from_db(&request.task_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidTaskId)?;
// Early validation
ensure!(
ts.has_creator(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
let function: Function = self
.read_from_db(&ts.function_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidFunctionId)?;
log::debug!("InvokeTask: get function: {:?}", function);
let mut task: Task<Stage> = ts.try_into().map_err(|e| {
log::warn!("Stage state error: {:?}", e);
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::TaskStateError
})?;
log::debug!("InvokeTask: get task: {:?}", task);
- let staged_task = task.stage_for_running(&user_id, function)?;
+ let staged_task = task
+ .stage_for_running(&user_id, function)
+ .map_err(|_| ManagementServiceError::PermissionDenied)?;
log::debug!("InvokeTask: staged task: {:?}", staged_task);
self.enqueue_to_db(StagedTask::get_queue_key().as_bytes(),
&staged_task)?;
let ts: TaskState = task.into();
- self.write_to_db(&ts)
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&ts)?;
Ok(InvokeTaskResponse)
}
@@ -720,20 +700,20 @@ impl TeaclaveManagement for TeaclaveManagementService {
&self,
request: Request<CancelTaskRequest>,
) -> TeaclaveServiceResponseResult<CancelTaskResponse> {
- let user_id = self.get_request_user_id(request.metadata())?;
- let role = self.get_request_role(request.metadata())?;
+ let user_id = get_request_user_id(&request)?;
+ let role = get_request_role(&request)?;
let request = request.message;
let ts: TaskState = self
.read_from_db(&request.task_id)
- .map_err(|_| TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::InvalidTaskId)?;
match role {
UserRole::PlatformAdmin => {}
_ => {
ensure!(
ts.has_creator(&user_id),
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::PermissionDenied
);
}
}
@@ -748,7 +728,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
// race will not affect correctness/privacy
let mut task: Task<Cancel> = ts.try_into().map_err(|e| {
log::warn!("Cancel state error: {:?}", e);
- TeaclaveManagementServiceError::PermissionDenied
+ ManagementServiceError::TaskStateError
})?;
log::debug!("Canceled Task: {:?}", task);
@@ -756,10 +736,9 @@ impl TeaclaveManagement for TeaclaveManagementService {
task.update_result(TaskResult::Err(TaskFailure {
reason: "Task canceled".to_string(),
}))
- .map_err(|_|
TeaclaveManagementServiceError::PermissionDenied)?;
+ .map_err(|_| ManagementServiceError::TaskStateError)?;
let ts: TaskState = task.into();
- self.write_to_db(&ts)
- .map_err(|_|
TeaclaveManagementServiceError::StorageError)?;
+ self.write_to_db(&ts)?;
log::warn!("Canceled Task: writtenback");
}
@@ -770,7 +749,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
}
impl TeaclaveManagementService {
- pub(crate) fn new(storage_service_endpoint: Endpoint) -> Result<Self> {
+ pub(crate) fn new(storage_service_endpoint: Endpoint) ->
anyhow::Result<Self> {
let mut i = 0;
let channel = loop {
match storage_service_endpoint.connect() {
@@ -792,36 +771,7 @@ impl TeaclaveManagementService {
Ok(service)
}
- pub fn create_fusion_data(&self, owners: impl Into<OwnerList>) ->
Result<TeaclaveOutputFile> {
- let uuid = Uuid::new_v4();
- let url = format!("fusion:///TEACLAVE_FUSION_BASE/{}.fusion",
uuid.to_string());
- let url = Url::parse(&url).map_err(|_| anyhow!("invalid url"))?;
- let crypto_info = FileCrypto::default();
-
- Ok(TeaclaveOutputFile::new(url, crypto_info, owners))
- }
-
- fn get_request_user_id(
- &self,
- meta: &HashMap<String, String>,
- ) -> TeaclaveServiceResponseResult<UserID> {
- let user_id = meta
- .get("id")
- .ok_or(TeaclaveManagementServiceError::InvalidRequest)?;
- Ok(user_id.to_string().into())
- }
-
- fn get_request_role(
- &self,
- meta: &HashMap<String, String>,
- ) -> TeaclaveServiceResponseResult<UserRole> {
- let role = meta
- .get("role")
- .ok_or(TeaclaveManagementServiceError::InvalidRequest)?;
- Ok(UserRole::from_str(role))
- }
-
- fn write_to_db(&self, item: &impl Storable) -> Result<()> {
+ fn write_to_db(&self, item: &impl Storable) -> Result<(),
ManagementServiceError> {
let k = item.key();
let v = item.to_vec()?;
let put_request = PutRequest::new(k.as_slice(), v.as_slice());
@@ -829,56 +779,65 @@ impl TeaclaveManagementService {
.storage_client
.clone()
.lock()
- .map_err(|_| anyhow!("Cannot lock storage client"))?
- .put(put_request)?;
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .put(put_request)
+ .map_err(|e| ManagementServiceError::Service(e.into()))?;
Ok(())
}
- fn read_from_db<T: Storable>(&self, key: &ExternalID) -> Result<T> {
- anyhow::ensure!(T::match_prefix(&key.prefix), "Key prefix doesn't
match.");
+ fn read_from_db<T: Storable>(&self, key: &ExternalID) -> Result<T,
ManagementServiceError> {
+ ensure!(
+ T::match_prefix(&key.prefix),
+ anyhow!("key prefix doesn't match")
+ );
let request = GetRequest::new(key.to_bytes());
let response = self
.storage_client
.clone()
.lock()
- .map_err(|_| anyhow!("Cannot lock storage client"))?
- .get(request)?;
- T::from_slice(response.value.as_slice())
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .get(request)
+ .map_err(|e| ManagementServiceError::Service(e.into()))?;
+
T::from_slice(response.value.as_slice()).map_err(ManagementServiceError::Service)
}
- fn delete_from_db(&self, key: &ExternalID) -> Result<()> {
+ fn delete_from_db(&self, key: &ExternalID) -> Result<(),
ManagementServiceError> {
let request = DeleteRequest::new(key.to_bytes());
self.storage_client
.clone()
.lock()
- .map_err(|_| anyhow!("Cannot lock storage client"))?
- .delete(request)?;
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .delete(request)
+ .map_err(|e| ManagementServiceError::Service(e.into()))?;
Ok(())
}
- fn enqueue_to_db(&self, key: &[u8], item: &impl Storable) ->
TeaclaveServiceResponseResult<()> {
- let value = item
- .to_vec()
- .map_err(|_| TeaclaveManagementServiceError::DataError)?;
+ fn enqueue_to_db(
+ &self,
+ key: &[u8],
+ item: &impl Storable,
+ ) -> Result<(), ManagementServiceError> {
+ let value = item.to_vec()?;
let enqueue_request = EnqueueRequest::new(key, value);
let _enqueue_response = self
.storage_client
.clone()
.lock()
- .map_err(|_| TeaclaveManagementServiceError::StorageError)?
- .enqueue(enqueue_request)?;
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .enqueue(enqueue_request)
+ .map_err(|e| ManagementServiceError::Service(e.into()))?;
Ok(())
}
#[cfg(test_mode)]
- fn add_mock_data(&self) -> Result<()> {
- let mut output_file = self.create_fusion_data(vec!["mock_user1",
"frontend_user"])?;
+ fn add_mock_data(&self) -> anyhow::Result<()> {
+ let mut output_file = create_fusion_data(vec!["mock_user1",
"frontend_user"])?;
output_file.uuid =
Uuid::parse_str("00000000-0000-0000-0000-000000000001")?;
output_file.cmac = Some(FileAuthTag::mock());
self.write_to_db(&output_file)?;
- let mut output_file = self.create_fusion_data(vec!["mock_user2",
"mock_user3"])?;
+ let mut output_file = create_fusion_data(vec!["mock_user2",
"mock_user3"])?;
output_file.uuid =
Uuid::parse_str("00000000-0000-0000-0000-000000000002")?;
output_file.cmac = Some(FileAuthTag::mock());
self.write_to_db(&output_file)?;
@@ -936,6 +895,31 @@ impl TeaclaveManagementService {
}
}
+fn get_request_user_id<T>(request: &Request<T>) -> Result<UserID,
ManagementServiceError> {
+ let user_id = request
+ .metadata()
+ .get("id")
+ .ok_or(ManagementServiceError::MissingUserId)?;
+ Ok(user_id.to_string().into())
+}
+
+fn get_request_role<T>(request: &Request<T>) -> Result<UserRole,
ManagementServiceError> {
+ let role = request
+ .metadata()
+ .get("role")
+ .ok_or(ManagementServiceError::MissingUserRole)?;
+ Ok(UserRole::from_str(role))
+}
+
+fn create_fusion_data(owners: impl Into<OwnerList>) ->
anyhow::Result<TeaclaveOutputFile> {
+ let uuid = Uuid::new_v4();
+ let url = format!("fusion:///TEACLAVE_FUSION_BASE/{}.fusion",
uuid.to_string());
+ let url = Url::parse(&url).map_err(|_| anyhow!("invalid url"))?;
+ let crypto_info = FileCrypto::default();
+
+ Ok(TeaclaveOutputFile::new(url, crypto_info, owners))
+}
+
#[cfg(feature = "enclave_unit_test")]
pub mod tests {
use super::*;
diff --git a/services/scheduler/enclave/src/error.rs
b/services/scheduler/enclave/src/error.rs
index 48a0ab2..9641262 100644
--- a/services/scheduler/enclave/src/error.rs
+++ b/services/scheduler/enclave/src/error.rs
@@ -21,17 +21,20 @@ use teaclave_types::TeaclaveServiceResponseError;
use thiserror::Error;
#[derive(Error, Debug)]
-pub enum TeaclaveSchedulerError {
- #[error("scheduler service error")]
- SchedulerServiceErr,
- #[error("data error")]
- DataError,
- #[error("storage error")]
+pub enum SchedulerServiceError {
+ #[error("service internal error")]
+ Service(#[from] anyhow::Error),
+ #[error("task to pull has been canceled")]
+ TaskCanceled,
+ #[error("task queue is empty")]
+ TaskQueueEmpty,
+ #[error("storage service error")]
StorageError,
}
-impl From<TeaclaveSchedulerError> for TeaclaveServiceResponseError {
- fn from(error: TeaclaveSchedulerError) -> Self {
+impl From<SchedulerServiceError> for TeaclaveServiceResponseError {
+ fn from(error: SchedulerServiceError) -> Self {
+ log::debug!("SchedulerServiceError: {:?}", error);
TeaclaveServiceResponseError::RequestError(error.to_string())
}
}
diff --git a/services/scheduler/enclave/src/service.rs
b/services/scheduler/enclave/src/service.rs
index dfd6cde..2a739ac 100644
--- a/services/scheduler/enclave/src/service.rs
+++ b/services/scheduler/enclave/src/service.rs
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-use crate::error::TeaclaveSchedulerError;
+use crate::error::SchedulerServiceError;
use std::collections::{HashMap, HashSet, VecDeque};
use std::convert::TryInto;
@@ -66,7 +66,7 @@ impl TeaclaveSchedulerDeamon {
let mut resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
let key = StagedTask::get_queue_key().as_bytes();
@@ -173,31 +173,35 @@ impl TeaclaveSchedulerResources {
Ok(resources)
}
- fn pull_staged_task<T: Storable>(&self, key: &[u8]) ->
TeaclaveServiceResponseResult<T> {
+ fn pull_staged_task<T: Storable>(
+ &self,
+ key: &[u8],
+ ) -> std::result::Result<T, SchedulerServiceError> {
let dequeue_request = DequeueRequest::new(key);
let dequeue_response = self
.storage_client
.clone()
.lock()
- .map_err(|_| TeaclaveSchedulerError::StorageError)?
- .dequeue(dequeue_request)?;
- T::from_slice(dequeue_response.value.as_slice())
- .map_err(|_| TeaclaveSchedulerError::DataError.into())
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .dequeue(dequeue_request)
+ .map_err(|_| SchedulerServiceError::StorageError)?;
+
T::from_slice(dequeue_response.value.as_slice()).map_err(SchedulerServiceError::Service)
}
- fn pull_cancel_queue(&self) -> Result<TaskState> {
+ fn pull_cancel_queue(&self) -> std::result::Result<TaskState,
SchedulerServiceError> {
let dequeue_request = DequeueRequest::new(CANCEL_QUEUE_KEY.as_bytes());
let dequeue_response = self
.storage_client
.clone()
.lock()
- .map_err(|_| TeaclaveSchedulerError::StorageError)?
- .dequeue(dequeue_request)?;
+ .map_err(|_| anyhow!("cannot lock storage client"))?
+ .dequeue(dequeue_request)
+ .map_err(|_| SchedulerServiceError::StorageError)?;
TaskState::from_slice(dequeue_response.value.as_slice())
- .map_err(|_| TeaclaveSchedulerError::DataError.into())
+ .map_err(SchedulerServiceError::Service)
}
- fn cancel_task(&self, task_id: Uuid) -> Result<()> {
+ fn cancel_task(&self, task_id: Uuid) -> std::result::Result<(),
SchedulerServiceError> {
let ts = self.get_task_state(&task_id)?;
let mut task: Task<Cancel> = ts.try_into()?;
@@ -224,7 +228,7 @@ impl TeaclaveSchedulerResources {
.storage_client
.clone()
.lock()
- .map_err(|_| anyhow!("Cannot lock storage client"))?
+ .map_err(|_| anyhow!("cannot lock storage client"))?
.get(get_request)?;
T::from_slice(response.value.as_slice())
}
@@ -237,7 +241,7 @@ impl TeaclaveSchedulerResources {
.storage_client
.clone()
.lock()
- .map_err(|_| anyhow!("Cannot lock storage client"))?
+ .map_err(|_| anyhow!("cannot lock storage client"))?
.put(put_request)?;
Ok(())
}
@@ -254,7 +258,7 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
let mut resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
let staged_task = request.message.staged_task;
resources.task_queue.push_back(staged_task);
@@ -277,7 +281,7 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
let mut resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
let mut command = ExecutorCommand::NoAction;
@@ -329,15 +333,13 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
let mut resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
match resources.task_queue.pop_front() {
Some(task) => match resources.tasks_to_cancel.take(&task.task_id) {
Some(task_id) => {
resources.cancel_task(task_id)?;
- Err(TeaclaveServiceResponseError::InternalError(
- "Task to pull has been canceled".into(),
- ))
+ Err(SchedulerServiceError::TaskCanceled.into())
}
None => {
resources
@@ -346,9 +348,7 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
Ok(PullTaskResponse::new(task))
}
},
- None => Err(TeaclaveServiceResponseError::InternalError(
- "No staged task in task_queue".into(),
- )),
+ None => Err(SchedulerServiceError::TaskQueueEmpty.into()),
}
}
@@ -359,7 +359,7 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
let resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
let request = request.message;
let ts = resources.get_task_state(&request.task_id)?;
@@ -380,7 +380,7 @@ impl TeaclaveScheduler for TeaclaveSchedulerService {
let resources = self
.resources
.lock()
- .map_err(|_| anyhow!("Cannot lock scheduler resources"))?;
+ .map_err(|_| anyhow!("cannot lock scheduler resources"))?;
let request = request.message;
let ts = resources.get_task_state(&request.task_id)?;
diff --git a/services/storage/enclave/src/error.rs
b/services/storage/enclave/src/error.rs
index 617c53a..ad4bbae 100644
--- a/services/storage/enclave/src/error.rs
+++ b/services/storage/enclave/src/error.rs
@@ -21,17 +21,18 @@ use teaclave_types::TeaclaveServiceResponseError;
use thiserror::Error;
#[derive(Error, Debug)]
-pub(crate) enum TeaclaveStorageError {
- #[error("connection error")]
- Connection,
- #[error("leveldb error")]
- LevelDb(#[from] rusty_leveldb::Status),
- #[error("none error")]
+pub(crate) enum StorageServiceError {
+ #[error("none")]
None,
+ #[error("leveldb error")]
+ Database(#[from] rusty_leveldb::Status),
+ #[error("service internal error")]
+ Service(#[from] anyhow::Error),
}
-impl From<TeaclaveStorageError> for TeaclaveServiceResponseError {
- fn from(error: TeaclaveStorageError) -> Self {
+impl From<StorageServiceError> for TeaclaveServiceResponseError {
+ fn from(error: StorageServiceError) -> Self {
+ log::debug!("StorageServiceError: {:?}", error);
TeaclaveServiceResponseError::RequestError(error.to_string())
}
}
diff --git a/services/storage/enclave/src/proxy.rs
b/services/storage/enclave/src/proxy.rs
index 62e73e0..10b50db 100644
--- a/services/storage/enclave/src/proxy.rs
+++ b/services/storage/enclave/src/proxy.rs
@@ -15,7 +15,8 @@
// specific language governing permissions and limitations
// under the License.
-use crate::error::TeaclaveStorageError;
+use crate::error::StorageServiceError;
+use anyhow::anyhow;
use std::prelude::v1::*;
use std::sync::mpsc::{channel, Sender};
use teaclave_proto::teaclave_storage_service::{TeaclaveStorageRequest,
TeaclaveStorageResponse};
@@ -43,10 +44,10 @@ impl teaclave_rpc::TeaclaveService<TeaclaveStorageRequest,
TeaclaveStorageRespon
let (sender, receiver) = channel();
self.sender
.send(ProxyRequest { sender, request })
- .map_err(|_| TeaclaveStorageError::Connection)?;
+ .map_err(|_| StorageServiceError::Service(anyhow!("send
ProxyRequest error")))?;
receiver
.recv()
- .map_err(|_| TeaclaveStorageError::Connection)?
+ .map_err(|_| StorageServiceError::Service(anyhow!("recv
ProxyRequest error")))?
}
}
diff --git a/services/storage/enclave/src/service.rs
b/services/storage/enclave/src/service.rs
index 6651ada..e729ba3 100644
--- a/services/storage/enclave/src/service.rs
+++ b/services/storage/enclave/src/service.rs
@@ -15,8 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-use crate::error::TeaclaveStorageError;
+use crate::error::StorageServiceError;
use crate::proxy::ProxyRequest;
+use anyhow::anyhow;
use rusty_leveldb::DB;
use std::cell::RefCell;
use std::prelude::v1::*;
@@ -29,7 +30,7 @@ use teaclave_rpc::Request;
use teaclave_service_enclave_utils::{bail, teaclave_service};
use teaclave_types::TeaclaveServiceResponseResult;
-#[teaclave_service(teaclave_storage_service, TeaclaveStorage,
TeaclaveStorageError)]
+#[teaclave_service(teaclave_storage_service, TeaclaveStorage,
StorageServiceError)]
pub(crate) struct TeaclaveStorageService {
// Current LevelDB implementation is not concurrent, so we need to wrap the
// DB with RefCell. This service is running in a single thread, it's safe
to
@@ -101,49 +102,44 @@ impl<'a> DBQueue<'a> {
DBQueue { database, key }
}
- pub fn enqueue(&mut self, value: &[u8]) ->
TeaclaveServiceResponseResult<()> {
+ pub fn enqueue(&mut self, value: &[u8]) -> Result<(), StorageServiceError>
{
let tail_index = self.get_tail();
// put element
self.database
- .put(&self.get_element_key(tail_index), value)
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .put(&self.get_element_key(tail_index), value)?;
// update tail
let tail_index = tail_index.wrapping_add(1);
self.database
- .put(&self.get_tail_key(), &tail_index.to_le_bytes())
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .put(&self.get_tail_key(), &tail_index.to_le_bytes())?;
- self.database
- .flush()
- .map_err(TeaclaveStorageError::LevelDb)?;
+ self.database.flush()?;
Ok(())
}
- pub fn dequeue(&mut self) -> TeaclaveServiceResponseResult<Vec<u8>> {
+ pub fn dequeue(&mut self) -> Result<Vec<u8>, StorageServiceError> {
let head_index = self.get_head();
let tail_index = self.get_tail();
// check whether the queue is empty
if head_index == tail_index {
- Err(TeaclaveStorageError::None.into())
+ bail!(StorageServiceError::Service(anyhow!(
+ "head_index == tail_index"
+ )))
} else {
let element_key = self.get_element_key(head_index);
let result = match self.database.get(&element_key) {
Some(value) => value,
- None => bail!(TeaclaveStorageError::None),
+ None => bail!(StorageServiceError::Service(anyhow!(
+ "cannot get element_key"
+ ))),
};
// update head
let head_index = head_index.wrapping_add(1);
self.database
- .put(&self.get_head_key(), &head_index.to_le_bytes())
- .map_err(TeaclaveStorageError::LevelDb)?;
- self.database
- .delete(&element_key)
- .map_err(TeaclaveStorageError::LevelDb)?;
- self.database
- .compact_range(b"queue", b"queuf")
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .put(&self.get_head_key(), &head_index.to_le_bytes())?;
+ self.database.delete(&element_key)?;
+ self.database.compact_range(b"queue", b"queuf")?;
Ok(result)
}
}
@@ -187,7 +183,7 @@ impl TeaclaveStorage for TeaclaveStorageService {
let request = request.message;
match self.database.borrow_mut().get(&request.key) {
Some(value) => Ok(GetResponse { value }),
- None => Err(TeaclaveStorageError::None.into()),
+ None => bail!(StorageServiceError::None),
}
}
@@ -196,12 +192,12 @@ impl TeaclaveStorage for TeaclaveStorageService {
self.database
.borrow_mut()
.put(&request.key, &request.value)
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .map_err(StorageServiceError::Database)?;
self.database
.borrow_mut()
.flush()
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .map_err(StorageServiceError::Database)?;
Ok(PutResponse)
}
@@ -213,12 +209,12 @@ impl TeaclaveStorage for TeaclaveStorageService {
self.database
.borrow_mut()
.delete(&request.key)
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .map_err(StorageServiceError::Database)?;
self.database
.borrow_mut()
.flush()
- .map_err(TeaclaveStorageError::LevelDb)?;
+ .map_err(StorageServiceError::Database)?;
Ok(DeleteResponse)
}
@@ -229,7 +225,10 @@ impl TeaclaveStorage for TeaclaveStorageService {
let request = request.message;
let mut db = self.database.borrow_mut();
let mut queue = DBQueue::open(&mut db, &request.key);
- queue.enqueue(&request.value).map(|_| EnqueueResponse)
+ match queue.enqueue(&request.value) {
+ Ok(_) => Ok(EnqueueResponse {}),
+ Err(e) => bail!(e),
+ }
}
fn dequeue(
@@ -239,7 +238,10 @@ impl TeaclaveStorage for TeaclaveStorageService {
let request = request.message;
let mut db = self.database.borrow_mut();
let mut queue = DBQueue::open(&mut db, &request.key);
- queue.dequeue().map(|value| DequeueResponse { value })
+ match queue.dequeue() {
+ Ok(value) => Ok(DequeueResponse { value }),
+ Err(e) => bail!(e),
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]