diff options
Diffstat (limited to '0150-add-missing-con-linux-info-for-nri-module.patch')
-rw-r--r-- | 0150-add-missing-con-linux-info-for-nri-module.patch | 548 |
1 files changed, 548 insertions, 0 deletions
diff --git a/0150-add-missing-con-linux-info-for-nri-module.patch b/0150-add-missing-con-linux-info-for-nri-module.patch new file mode 100644 index 0000000..7717193 --- /dev/null +++ b/0150-add-missing-con-linux-info-for-nri-module.patch @@ -0,0 +1,548 @@ +From 140166e0f385a2f23502efeeba4113536736c3c8 Mon Sep 17 00:00:00 2001 +From: zhongtao <zhongtao17@huawei.com> +Date: Thu, 14 Nov 2024 16:45:08 +0800 +Subject: [PATCH 150/156] add missing con linux info for nri module + +Signed-off-by: zhongtao <zhongtao17@huawei.com> +--- + src/daemon/common/nri/nri_convert.cc | 482 ++++++++++++++++++++++++++- + 1 file changed, 480 insertions(+), 2 deletions(-) + +diff --git a/src/daemon/common/nri/nri_convert.cc b/src/daemon/common/nri/nri_convert.cc +index 30caf1dd..d862d992 100644 +--- a/src/daemon/common/nri/nri_convert.cc ++++ b/src/daemon/common/nri/nri_convert.cc +@@ -15,12 +15,16 @@ + + #include "nri_convert.h" + ++#include <sys/stat.h> ++#include <sys/sysmacros.h> ++ + #include "container_api.h" + #include "v1_cri_helpers.h" + #include "path.h" + #include "transform.h" + #include "nri_utils.h" + #include "cstruct_wrapper.h" ++#include "specs_api.h" + + static int64_t DefaultOOMScoreAdj = 0; + +@@ -385,6 +389,462 @@ error_out: + return false; + } + ++static int ConvertDevice(const char *host_path, const char *container_path, const char *permissions, ++ nri_linux_device &device, nri_linux_device_cgroup &deviceCgroup) ++{ ++ int ret = 0; ++ struct stat st; ++ const char *dev_type = NULL; ++ unsigned int file_mode = 0; ++ ++ if (host_path == NULL) { ++ return -1; ++ } ++ ++ ret = stat(host_path, &st); ++ if (ret < 0) { ++ ERROR("device %s no exists", host_path); ++ return -1; ++ } ++ ++ file_mode = st.st_mode & 0777; ++ ++ /* check device type first */ ++ if (S_ISBLK(st.st_mode)) { ++ file_mode |= S_IFBLK; ++ dev_type = "b"; ++ } else if (S_ISCHR(st.st_mode)) { ++ file_mode |= S_IFCHR; ++ dev_type = "c"; ++ } else { ++ ERROR("Cannot determine the device number for device %s", host_path); ++ return -1; ++ } ++ ++ /* fill spec dev */ ++ device.major = (int64_t)major(st.st_rdev); ++ device.minor = (int64_t)minor(st.st_rdev); ++ device.uid = (uint32_t *)util_common_calloc_s(sizeof(uint32_t*)); ++ if (device.uid == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ *(device.uid) = st.st_uid; ++ device.gid = (uint32_t *)util_common_calloc_s(sizeof(uint32_t*)); ++ if (device.gid == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ *(device.gid) = st.st_gid; ++ device.file_mode = (uint32_t *)util_common_calloc_s(sizeof(uint32_t)); ++ if (device.file_mode == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ *(device.file_mode) = (int)file_mode; ++ device.type = util_strdup_s(dev_type); ++ device.path = util_strdup_s(container_path); ++ ++ /* fill spec cgroup dev */ ++ deviceCgroup.allow = true; ++ deviceCgroup.access = util_strdup_s(permissions); ++ deviceCgroup.type = util_strdup_s(dev_type); ++ deviceCgroup.major = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (deviceCgroup.major == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ *(deviceCgroup.major) = (int64_t)major(st.st_rdev); ++ deviceCgroup.minor = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (deviceCgroup.minor == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ *(deviceCgroup.minor) = (int64_t)minor(st.st_rdev); ++ ++ return 0; ++} ++ ++static int ConvertHostConfigDevices(const host_config_devices_element *dev_map, nri_linux_device &device, ++ nri_linux_device_cgroup &deviceCgroup) ++{ ++ return ConvertDevice(dev_map->path_on_host, dev_map->path_in_container, ++ dev_map->cgroup_permissions, device, deviceCgroup); ++} ++ ++static int ConLinuxDeviceToNRI(const host_config *config, nri_container &con) ++{ ++ size_t i; ++ ++ if (config->devices_len == 0 && config->nri_devices_len == 0) { ++ return 0; ++ } ++ con.linux->devices = (nri_linux_device **)util_smart_calloc_s(sizeof(nri_linux_device *), ++ config->devices_len + config->nri_devices_len); ++ if (con.linux->devices == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ con.linux->resources->devices = (nri_linux_device_cgroup **)util_smart_calloc_s(sizeof(nri_linux_device_cgroup *), ++ config->devices_len); ++ if (con.linux->resources->devices == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ for (i = 0; i < config->devices_len; i++) { ++ nri_linux_device *device = (nri_linux_device *)util_common_calloc_s(sizeof(nri_linux_device)); ++ if (device == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ nri_linux_device_cgroup *deviceCgroup = (nri_linux_device_cgroup *)util_common_calloc_s(sizeof( ++ nri_linux_device_cgroup)); ++ if (deviceCgroup == nullptr) { ++ ERROR("Out of memory"); ++ free_nri_linux_device(device); ++ return -1; ++ } ++ ++ if (ConvertHostConfigDevices(config->devices[i], *device, *deviceCgroup) != 0) { ++ ERROR("Failed to convert host config devices"); ++ free_nri_linux_device(device); ++ free_nri_linux_device_cgroup(deviceCgroup); ++ return -1; ++ } ++ ++ con.linux->devices[i] = device; ++ con.linux->resources->devices[i] = deviceCgroup; ++ con.linux->devices_len++; ++ con.linux->resources->devices_len++; ++ } ++ ++ for (i = 0; i < config->nri_devices_len; i++) { ++ nri_linux_device *device = (nri_linux_device *)util_common_calloc_s(sizeof(nri_linux_device)); ++ if (device == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ device->file_mode = (uint32_t *)util_common_calloc_s(sizeof(uint32_t)); ++ if (device->file_mode == nullptr) { ++ ERROR("Out of memory"); ++ free_nri_linux_device(device); ++ return -1; ++ } ++ *(device->file_mode) = config->nri_devices[i]->file_mode; ++ ++ device->path = util_strdup_s(config->nri_devices[i]->path); ++ device->type = util_strdup_s(config->nri_devices[i]->type); ++ device->major = config->nri_devices[i]->major; ++ device->minor = config->nri_devices[i]->minor; ++ ++ device->uid = (uint32_t *)util_common_calloc_s(sizeof(uint32_t)); ++ if (device->uid == nullptr) { ++ ERROR("Out of memory"); ++ free_nri_linux_device(device); ++ return -1; ++ } ++ *(device->uid) = config->nri_devices[i]->uid; ++ ++ device->gid = (uint32_t *)util_common_calloc_s(sizeof(uint32_t)); ++ if (device->gid == nullptr) { ++ ERROR("Out of memory"); ++ free_nri_linux_device(device); ++ return -1; ++ } ++ *(device->gid) = config->nri_devices[i]->gid; ++ con.linux->devices[i + config->devices_len] = device; ++ con.linux->devices_len++; ++ } ++ ++ return 0; ++} ++ ++static int ConvertCRIV1Devices(const ::runtime::v1::Device &dev_map, nri_linux_device &device, ++ nri_linux_device_cgroup &deviceCgroup) ++{ ++ return ConvertDevice(dev_map.host_path().c_str(), dev_map.container_path().c_str(), ++ dev_map.permissions().c_str(), device, deviceCgroup); ++} ++ ++static bool ConLinuxResourcesCpuToNRI(const host_config *config, nri_linux_cpu &cpu) ++{ ++ cpu.shares = (uint64_t *)util_common_calloc_s(sizeof(uint64_t)); ++ if (cpu.shares == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(cpu.shares) = config->cpu_shares; ++ ++ cpu.quota = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (cpu.quota == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(cpu.quota) = config->cpu_quota; ++ ++ cpu.period = (uint64_t *)util_common_calloc_s(sizeof(uint64_t)); ++ if (cpu.period == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(cpu.period) = config->cpu_period; ++ ++ cpu.cpus = util_strdup_s(config->cpuset_cpus); ++ cpu.mems = util_strdup_s(config->cpuset_mems); ++ ++ return true; ++} ++ ++static bool ConLinuxResourcesMemoryToNRI(const host_config *config, nri_linux_memory &memory) ++{ ++ memory.limit = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (memory.limit == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.limit) = config->memory; ++ ++ memory.reservation = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (memory.reservation == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ ++ *(memory.reservation) = config->memory_reservation; ++ ++ memory.swap = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (memory.swap == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.swap) = config->memory_swap; ++ ++ memory.kernel = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (memory.kernel == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.kernel) = config->kernel_memory; ++ ++ // isulad has not set kernel_tcp ++ memory.kernel_tcp = nullptr; ++ ++ if (config->memory_swappiness != nullptr) { ++ memory.swappiness = (uint64_t *)util_common_calloc_s(sizeof(uint64_t)); ++ if (memory.swappiness == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.swappiness) = *(config->memory_swappiness); ++ } ++ ++ memory.disable_oom_killer = (uint8_t *)util_common_calloc_s(sizeof(uint8_t)); ++ if (memory.disable_oom_killer == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.disable_oom_killer) = config->oom_kill_disable; ++ ++ // isulad has not set use_hierarchy ++ memory.use_hierarchy = (uint8_t *)util_common_calloc_s(sizeof(uint8_t)); ++ if (memory.use_hierarchy == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(memory.use_hierarchy) = false; ++ return true; ++} ++ ++auto ConLinuxResourcesToNRI(const host_config *config) -> nri_linux_resources * ++{ ++ nri_linux_resources *resources = nullptr; ++ size_t i; ++ ++ resources = init_nri_linux_resources(); ++ if (resources == nullptr) { ++ ERROR("Failed to init nri linux resources"); ++ return nullptr; ++ } ++ ++ if (!ConLinuxResourcesCpuToNRI(config, *resources->cpu)) { ++ ERROR("Failed to transform cpu to nri"); ++ goto error_out; ++ } ++ ++ if (!ConLinuxResourcesMemoryToNRI(config, *resources->memory)) { ++ ERROR("Failed to transform memory to nri"); ++ goto error_out; ++ } ++ ++ resources->hugepage_limits = (nri_hugepage_limit **)util_smart_calloc_s(sizeof(nri_hugepage_limit *), ++ config->hugetlbs_len); ++ if (resources->hugepage_limits == nullptr) { ++ ERROR("Out of memory"); ++ goto error_out; ++ } ++ ++ for (i = 0; i < config->hugetlbs_len; i++) { ++ resources->hugepage_limits[i] = (nri_hugepage_limit *)util_common_calloc_s(sizeof(nri_hugepage_limit)); ++ if (resources->hugepage_limits[i] == nullptr) { ++ ERROR("Out of memory"); ++ goto error_out; ++ } ++ resources->hugepage_limits[i]->page_size = util_strdup_s(config->hugetlbs[i]->page_size); ++ resources->hugepage_limits[i]->limit = config->hugetlbs[i]->limit; ++ resources->hugepage_limits_len++; ++ } ++ ++ // resources.blockio_class is not support ++ // resources.rdt_class is not support ++ // They are not standard fields in oci spec ++ ++ if (dup_json_map_string_string(config->unified, resources->unified) != 0) { ++ ERROR("Failed to copy unified map"); ++ goto error_out; ++ } ++ ++ // resources.devices is set in ConLinuxDeviceToNRI ++ ++ return resources; ++ ++error_out: ++ free_nri_linux_resources(resources); ++ resources = nullptr; ++ return resources; ++} ++ ++static bool ConLinuxToNRI(const char *id, const host_config *config, nri_container &con) ++{ ++ con.linux = (nri_linux_container *)util_common_calloc_s(sizeof(nri_linux_container)); ++ if (con.linux == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ ++ con.linux->resources = ConLinuxResourcesToNRI(config); ++ if (con.linux->resources == nullptr) { ++ ERROR("Failed to transform resources to nri for con : %s", id); ++ return false; ++ } ++ ++ if (ConLinuxDeviceToNRI(config, con) != 0) { ++ ERROR("Failed to transform devices to nri for con : %s", id); ++ return false; ++ } ++ ++ con.linux->oom_score_adj = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (con.linux->oom_score_adj == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ ++ *(con.linux->oom_score_adj) = config->oom_score_adj; ++ ++ con.linux->cgroups_path = merge_container_cgroups_path(id, config); ++ if (con.linux->cgroups_path == NULL) { ++ WARN("nri container cgroups path is NULL"); ++ } ++ return true; ++} ++ ++static int ConConfigLinuxDeviceToNRI(const runtime::v1::ContainerConfig &containerConfig, nri_container &con) ++{ ++ int i; ++ int conConfigDevicesSize = containerConfig.devices_size(); ++ ++ if (conConfigDevicesSize == 0) { ++ return 0; ++ } ++ con.linux->devices = (nri_linux_device **)util_smart_calloc_s(sizeof(nri_linux_device *), conConfigDevicesSize); ++ if (con.linux->devices == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ if (con.linux->resources == nullptr) { ++ con.linux->resources = init_nri_linux_resources(); ++ if (con.linux->resources == nullptr) { ++ ERROR("Failed to init nri linux resources"); ++ return -1; ++ } ++ } ++ ++ con.linux->resources->devices = (nri_linux_device_cgroup **)util_smart_calloc_s(sizeof(nri_linux_device_cgroup *), ++ conConfigDevicesSize); ++ if (con.linux->resources->devices == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ for (i = 0; i < conConfigDevicesSize; i++) { ++ nri_linux_device *device = (nri_linux_device *)util_common_calloc_s(sizeof(nri_linux_device)); ++ if (device == nullptr) { ++ ERROR("Out of memory"); ++ return -1; ++ } ++ ++ nri_linux_device_cgroup *deviceCgroup = (nri_linux_device_cgroup *)util_common_calloc_s(sizeof( ++ nri_linux_device_cgroup)); ++ if (deviceCgroup == nullptr) { ++ ERROR("Out of memory"); ++ free_nri_linux_device(device); ++ return -1; ++ } ++ ++ if (ConvertCRIV1Devices(containerConfig.devices(i), *device, *deviceCgroup) != 0) { ++ ERROR("Failed to convert CRI v1 devices"); ++ free_nri_linux_device(device); ++ free_nri_linux_device_cgroup(deviceCgroup); ++ return -1; ++ } ++ ++ con.linux->devices[i] = device; ++ con.linux->resources->devices[i] = deviceCgroup; ++ con.linux->devices_len++; ++ con.linux->resources->devices_len++; ++ } ++ ++ return 0; ++} ++ ++static bool ConConfigLinuxToNRI(const runtime::v1::ContainerConfig &containerConfig, nri_container &con) ++{ ++ const char *name = containerConfig.metadata().name().c_str(); ++ con.linux = (nri_linux_container *)util_common_calloc_s(sizeof(nri_linux_container)); ++ if (con.linux == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ ++ if (containerConfig.has_linux() && containerConfig.linux().has_resources()) { ++ con.linux->resources = LinuxResourcesToNRI(containerConfig.linux().resources()); ++ if (con.linux->resources == nullptr) { ++ ERROR("Failed to transform resources to nri for con : %s", name); ++ return false; ++ } ++ ++ con.linux->oom_score_adj = (int64_t *)util_common_calloc_s(sizeof(int64_t)); ++ if (con.linux->oom_score_adj == nullptr) { ++ ERROR("Out of memory"); ++ return false; ++ } ++ *(con.linux->oom_score_adj) = containerConfig.linux().resources().oom_score_adj(); ++ } ++ ++ if (ConConfigLinuxDeviceToNRI(containerConfig, con) != 0) { ++ ERROR("Failed to convert devices to nri for con : %s", name); ++ return false; ++ } ++ ++ // ContainerToNRIByConfig is called when CreateContainer, and cannot get pid at this time ++ con.linux->cgroups_path = NULL; ++ return true; ++} ++ + // container info is incomplete because container in excution is not created + auto ContainerToNRIByConConfig(const runtime::v1::ContainerConfig &containerConfig, nri_container &con) -> bool + { +@@ -395,6 +855,9 @@ auto ContainerToNRIByConConfig(const runtime::v1::ContainerConfig &containerConf + + Errors tmpError; + ++ // ContainerToNRIByConfig is called when CreateConatiner, and the status is 0(CONTAINER_UNKNOWN) at this time ++ con.state = 0; ++ + con.labels = Transform::ProtobufMapToJsonMapForString(containerConfig.labels(), tmpError); + if (con.labels == nullptr) { + ERROR("Failed to transform labels to nri for con : %s, : %s", con.name, tmpError.GetMessage().c_str()); +@@ -426,9 +889,18 @@ auto ContainerToNRIByConConfig(const runtime::v1::ContainerConfig &containerConf + ERROR("Failed to transform mounts to nri for con : %s", con.name); + return false; + } +- return true; + +- // todo: can not get container hooks and pid from containerConfig ++ if (!ConConfigLinuxToNRI(containerConfig, con)) { ++ ERROR("Failed to convert conatiner linux info to nri for con : %s", con.name); ++ return false; ++ } ++ ++ // todo: CRI module can not get container hooks from containerConfig ++ // ContainerToNRIByConfig is called when CreateConatiner, and cannot get pid at this time ++ ++ // rlimit not support in containerd ++ ++ return true; + } + + // container info is incomplete because container in excution is not created +@@ -486,6 +958,11 @@ auto ContainerToNRIByID(const std::string &id, nri_container &con) -> bool + goto out; + } + ++ if (!ConLinuxToNRI(cont->common_config->id, cont->hostconfig, con)) { ++ ERROR("Failed to transform conatiner linux info to nri for con : %s", con.name); ++ goto out; ++ } ++ + // todo: can convert hostconfig's hook_spec to nri spec + + con.pid = container_state_get_pid(cont->state); +@@ -644,6 +1121,7 @@ auto ContainersToNRI(std::vector<std::unique_ptr<runtime::v1::Container>> &conta + } + if (!ContainerToNRIByID(containers[i].get()->id(), *con)) { + ERROR("Failed to transform container to nri for container : %s", containers[i]->metadata().name().c_str()); ++ free_nri_container(con); + return false; + } + cons.push_back(con); +-- +2.34.1 + |