blob: 0fed25941afd9fb2fd9bd4eb64b54a7da45622ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "teaclave_client_sdk.h"
#include <stdio.h>
#include <string.h>
#include "utils.h"
#define BUFFER_SIZE 4086
#define QUOTE(x...) #x
const char *register_function_request_serialized = QUOTE({
"request" : "register_function",
"name" : "builtin-echo",
"description" : "Native Echo Function",
"executor_type" : "builtin",
"public" : true,
"payload" : [],
"arguments" : [{"key": "message", "default_value": "", "allow_overwrite": true}],
"inputs" : [],
"outputs" : [],
"user_allowlist": [],
"usage_quota": -1
});
const char *create_task_request_serialized = QUOTE({
"request" : "create_task",
"function_id" : "%s",
"function_arguments" : "{\"message\": \"Hello, Teaclave!\"}",
"executor" : "builtin",
"inputs_ownership" : [],
"outputs_ownership" : []
});
int main() {
int ret = 0;
char token[BUFFER_SIZE] = {0};
size_t token_len = BUFFER_SIZE;
char serialized_response[BUFFER_SIZE] = {0};
char function_id[BUFFER_SIZE] = {0};
char serialized_request[BUFFER_SIZE] = {0};
char task_result[BUFFER_SIZE] = {0};
char task_id[BUFFER_SIZE] = {0};
const char *user_id = "test_id";
const char *user_password = "test_password";
const char *admin_user_id = "admin";
const char *admin_user_password = "teaclave";
/* Register */
printf("[+] Registering\n");
ret = login(admin_user_id, admin_user_password, token, &token_len);
if (ret != 0) {
fprintf(stderr, "[-] Failed to login.\n");
goto bail;
}
ret = user_register(admin_user_id, token, user_id, user_password);
if (ret != 0) {
fprintf(stderr, "[-] Failed to register. Ignore.\n");
}
/* Login. */
printf("[+] Login\n");
token_len = BUFFER_SIZE;
ret = login(user_id, user_password, token, &token_len);
if (ret != 0) {
fprintf(stderr, "[-] Failed to login.\n");
goto bail;
}
/* Connect to the frontend serivice. */
printf("connect frontend service\n");
FrontendClient *frontend_client = teaclave_connect_frontend_service(
frontend_service_address, enclave_info_path, as_root_ca_cert_path);
if (frontend_client == NULL) {
fprintf(stderr, "[-] Failed to connect to the frontend service.\n");
ret = 1;
goto bail;
}
printf("set crendential\n");
/* Set user id and token. */
ret = teaclave_frontend_set_credential(frontend_client, user_id, token);
if (ret != 0) {
fprintf(stderr, "[-] Failed to set credential.\n");
goto bail;
}
/* Register function. */
size_t serialized_response_len = BUFFER_SIZE;
ret = teaclave_register_function_serialized(
frontend_client, register_function_request_serialized,
serialized_response, &serialized_response_len);
if (ret != 0) {
fprintf(stderr, "[-] Failed to register the function.\n");
goto bail;
}
sscanf(serialized_response, "{\"function_id\":\"%45s", function_id);
printf("[+] function_id: %s\n", function_id);
/* Create task. */
snprintf(serialized_request, BUFFER_SIZE, create_task_request_serialized,
function_id);
memset(serialized_response, 0, BUFFER_SIZE);
ret = teaclave_create_task_serialized(frontend_client, serialized_request,
serialized_response,
&serialized_response_len);
if (ret != 0) {
fprintf(stderr, "[-] Failed to create a task.\n");
goto bail;
}
sscanf(serialized_response, "{\"task_id\":\"%41s", task_id);
printf("[+] task_id: %s\n", task_id);
/* Invoke task. */
ret = teaclave_invoke_task(frontend_client, task_id);
if (ret != 0) {
fprintf(stderr, "[-] Failed to invoke the task.\n");
goto bail;
}
/* Get task result. */
size_t task_result_len = BUFFER_SIZE;
ret = teaclave_get_task_result(frontend_client, task_id, task_result,
&task_result_len);
if (ret != 0) {
fprintf(stderr, "[-] Failed to get the task result.\n");
goto bail;
}
printf("[+] Task result in string: %s\n", task_result);
ret = teaclave_close_frontend_service(frontend_client);
if (ret != 0) {
fprintf(stderr, "[-] Failed to close the frontend service client.\n");
}
return ret;
bail:
ret = teaclave_close_frontend_service(frontend_client);
if (ret != 0) {
fprintf(stderr, "[-] Failed to close the frontend service client.\n");
}
exit(-1);
}