2019-12-25 15:50:34 +08:00
|
|
|
/******************************************************************************
|
|
|
|
|
* Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
|
|
|
|
|
* iSulad licensed under the Mulan PSL v1.
|
|
|
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v1.
|
|
|
|
|
* You may obtain a copy of Mulan PSL v1 at:
|
|
|
|
|
* http://license.coscl.org.cn/MulanPSL
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
|
|
|
|
* PURPOSE.
|
|
|
|
|
* See the Mulan PSL v1 for more details.
|
|
|
|
|
* Author: lifeng
|
|
|
|
|
* Create: 2019-11-14
|
|
|
|
|
* Description: provide runtime functions
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
#include <sys/utsname.h>
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
|
|
#include "runtime.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "utils.h"
|
|
|
|
|
#include "lcr_rt_ops.h"
|
|
|
|
|
|
|
|
|
|
static const struct rt_ops g_lcr_rt_ops = {
|
|
|
|
|
.detect = rt_lcr_detect,
|
|
|
|
|
.rt_create = rt_lcr_create,
|
|
|
|
|
.rt_start = rt_lcr_start,
|
|
|
|
|
.rt_restart = rt_lcr_restart,
|
|
|
|
|
.rt_clean_resource = rt_lcr_clean_resource,
|
|
|
|
|
.rt_rm = rt_lcr_rm,
|
|
|
|
|
.rt_status = rt_lcr_status,
|
|
|
|
|
.rt_exec = rt_lcr_exec,
|
|
|
|
|
.rt_pause = rt_lcr_pause,
|
|
|
|
|
.rt_resume = rt_lcr_resume,
|
2020-01-06 05:11:01 -05:00
|
|
|
.rt_attach = rt_lcr_attach,
|
|
|
|
|
.rt_update = rt_lcr_update,
|
|
|
|
|
.rt_listpids = rt_lcr_listpids,
|
|
|
|
|
.rt_resources_stats = rt_lcr_resources_stats,
|
|
|
|
|
.rt_resize = rt_lcr_resize,
|
|
|
|
|
.rt_exec_resize = rt_lcr_exec_resize,
|
2019-12-25 15:50:34 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct rt_ops *g_rt_ops[] = {
|
|
|
|
|
&g_lcr_rt_ops
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const size_t g_rt_nums = sizeof(g_rt_ops) / sizeof(struct rt_ops *);
|
|
|
|
|
|
|
|
|
|
static const struct rt_ops *rt_ops_query(const char *runtime)
|
|
|
|
|
{
|
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < g_rt_nums; i++) {
|
|
|
|
|
bool r = g_rt_ops[i]->detect(runtime);
|
|
|
|
|
if (r) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i == g_rt_nums) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
return g_rt_ops[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_create(const char *name, const char *runtime, const rt_create_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime create");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops for %s", runtime);
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_create(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_start(const char *name, const char *runtime, const rt_start_params_t *params, container_pid_t *pid_info)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || pid_info == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime start");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_start(name, runtime, params, pid_info);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_restart(const char *name, const char *runtime, const rt_restart_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime restart");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_restart(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int runtime_clean_resource(const char *name, const char *runtime, const rt_clean_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime clean");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_clean_resource(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_rm(const char *name, const char *runtime, const rt_rm_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime rm");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_rm(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
int runtime_status(const char *name, const char *runtime, const rt_status_params_t *params,
|
|
|
|
|
struct engine_container_status_info *status)
|
2019-12-25 15:50:34 +08:00
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
if (name == NULL || runtime == NULL || status == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime status");
|
2019-12-25 15:50:34 +08:00
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
ret = ops->rt_status(name, runtime, params, status);
|
2019-12-25 15:50:34 +08:00
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
int runtime_resources_stats(const char *name, const char *runtime, const rt_stats_params_t *params,
|
|
|
|
|
struct engine_container_resources_stats_info *rs_stats)
|
2019-12-25 15:50:34 +08:00
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
if (name == NULL || runtime == NULL || rs_stats == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime stats");
|
2019-12-25 15:50:34 +08:00
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-06 05:11:01 -05:00
|
|
|
ret = ops->rt_resources_stats(name, runtime, params, rs_stats);
|
2019-12-25 15:50:34 +08:00
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_exec(const char *name, const char *runtime, const rt_exec_params_t *params,
|
|
|
|
|
int *exit_code)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || exit_code == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime exec");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_exec(name, runtime, params, exit_code);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_pause(const char *name, const char *runtime, const rt_pause_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime pause");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_pause(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_resume(const char *name, const char *runtime, const rt_resume_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime resume");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_resume(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
2020-01-06 05:11:01 -05:00
|
|
|
|
|
|
|
|
int runtime_attach(const char *name, const char *runtime, const rt_attach_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime attach");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_attach(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_update(const char *name, const char *runtime, const rt_update_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime update");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_update(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void free_rt_listpids_out_t(rt_listpids_out_t *out)
|
|
|
|
|
{
|
|
|
|
|
if (out == NULL) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(out->pids);
|
|
|
|
|
out->pids = NULL;
|
|
|
|
|
free(out);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_listpids(const char *name, const char *runtime, const rt_listpids_params_t *params, rt_listpids_out_t *out)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL || out == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime listpids");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_listpids(name, runtime, params, out);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_resize(const char *name, const char *runtime, const rt_resize_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime resize");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_resize(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int runtime_exec_resize(const char *name, const char *runtime, const rt_exec_resize_params_t *params)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
const struct rt_ops *ops = NULL;
|
|
|
|
|
|
|
|
|
|
if (name == NULL || runtime == NULL || params == NULL) {
|
|
|
|
|
ERROR("Invalide arguments for runtime exec resize");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ops = rt_ops_query(runtime);
|
|
|
|
|
if (ops == NULL) {
|
|
|
|
|
ERROR("Failed to get runtime ops");
|
|
|
|
|
ret = -1;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = ops->rt_exec_resize(name, runtime, params);
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|