背景:CNI spec社区规范已升至spec-v1.0.0,由于iSulad的网络模块实现了CNI规范,所以需要从spec-v0.4.0版本适配升级到spec-v1.0.0版本。本文主要描述完成该升级需要做的适配。
在plugins字段中,capabilities的取值范围存在变动,增加了ips、mac、infiniband guid、device id、aliases字段,实际需要增加的是aliases字段,其他字段iSulad已支持。
改动后相关结构体的结果如下:
typedef struct {
...
char **aliases;
size_t aliases_len;
...
}
cni_cached_info;
typedef struct {
...
char **aliases;
size_t aliases_len;
...
}
cni_net_conf_runtime_config;
VERSION操作用于检查插件支持的CNI规范的版本,在spec-v1.0.0中,它增加了输入参数cniVersion。
整体时序:
sequenceDiagram
participant conf_bridge
participant cni_get_plugins_supported_version
participant cni_version_network_list
participant version_network
participant get_version_info
conf_bridge ->> cni_get_plugins_supported_version:post cni_net_conf_list
cni_get_plugins_supported_version ->> cni_version_network_list:post cni_net_conf_list
loop for each plugin
cni_version_network_list ->> version_network:post each cni_net_conf
version_network ->> get_version_info:post each cni_net_conf plugin path e.g.
get_version_info -->> version_network:get version_result
version_network -->> cni_version_network_list:get version_result
end
cni_version_network_list ->> cni_version_network_list:comb cni_version_info_list
cni_version_network_list -->> cni_get_plugins_supported_version:get cni_version_info_list
cni_get_plugins_supported_version ->> cni_get_plugins_supported_version:find the latest CNI version supported by all plugins
cni_get_plugins_supported_version -->> conf_bridge:get version
无变更
无变更
spec-v1.0.0删除了spec v0.4.0中interfaces的version字段,iSulad已支持。
spec-v1.0.0版本的interfaces的示例如下:
"interfaces": [
{
"name": "cni0",
"mac": "00:11:22:33:44:55"
},
{
"name": "veth3243",
"mac": "55:44:33:22:11:11"
},
{
"name": "eth0",
"mac": "99:88:77:66:55:44",
"sandbox": "/var/run/netns/blue"
}
]
spec-v1.0.0相比于spec v0.4.0增加了4,5,6,7的错误码定义,iSulad已支持。
spec-v1.0.0版本的error code的示例如下:
{
"cniVersion": "1.0.0",
"code": 7,
"msg": "Invalid Configuration",
"details": "Network 192.168.0.0/31 too small to allocate from."
}
Support versions数组中需要增加"1.0.0"字符串表示支持了v1.0.0版本。
改动后的相关代码如下:
#define CURR_SUPPORT_VERSION_LEN 5
const char *g_curr_support_versions[CURR_SUPPORT_VERSION_LEN] = { "0.3.0", "0.3.1", "0.4.0", CURRENT_VERSION, NULL };
在指定路径下查找plugin的逻辑中,提前检查plugin,如果有分隔符,比如Linux为"/",就判断plugin非法,达到加速的目的。