iSulad/src/services/cri/cni_network_plugin.h
2019-12-25 15:50:34 +08:00

158 lines
6.4 KiB
C++

/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2017-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: tanyifeng
* Create: 2017-11-22
* Description: provide cni network plugin function definition
********************************************************************************/
#ifndef _CRI_CNI_NETWORK_PLUGIN_H_
#define _CRI_CNI_NETWORK_PLUGIN_H_
#include <memory>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <clibcni/api.h>
#include "network_plugin.h"
#include "utils.h"
#include "errors.h"
#include "cri_runtime_service.h"
namespace Network {
#define UNUSED(x) ((void)(x))
static const std::string CNI_PLUGIN_NAME { "cni" };
static const std::string DEFAULT_NET_DIR { "/etc/cni/net.d" };
static const std::string DEFAULT_CNI_DIR { "/opt/cni/bin" };
class CNINetwork {
public:
CNINetwork() = delete;
CNINetwork(const CNINetwork &) = delete;
CNINetwork &operator=(const CNINetwork &) = delete;
CNINetwork(const std::string &name, struct cni_network_list_conf *netList);
~CNINetwork();
const std::string &GetName() const
{
return m_name;
}
void SetName(const std::string &name)
{
m_name = name;
}
void InsertPath(const std::string &path)
{
m_path.push_back(path);
}
std::string GetNetworkConfigJsonStr()
{
return m_networkConfig->bytes ? m_networkConfig->bytes : "";
}
std::string GetNetworkType() const
{
return m_networkConfig->first_plugin_type ? m_networkConfig->first_plugin_type : "";
}
std::string GetNetworkName() const
{
return m_networkConfig->first_plugin_name ? m_networkConfig->first_plugin_name : "";
}
char **GetPaths(Errors &err);
private:
std::string m_name;
std::vector<std::string> m_path;
struct cni_network_list_conf *m_networkConfig {
nullptr
};
};
class CniNetworkPlugin : public NetworkPlugin {
public:
CniNetworkPlugin(const std::string &binDir, const std::string &pluginDir,
const std::string &vendorCNIDirPrefix = "");
virtual ~CniNetworkPlugin();
void Init(CRIRuntimeServiceImpl *criImpl, const std::string &hairpinMode, const std::string &nonMasqueradeCIDR,
int mtu, Errors &error) override;
void Event(const std::string &name, std::map<std::string, std::string> &details) override;
const std::string &Name() const override;
std::map<int, bool> *Capabilities() override;
void SetUpPod(const std::string &ns, const std::string &name, const std::string &networkPlane,
const std::string &interfaceName, const std::string &podSandboxID,
const std::map<std::string, std::string> &annotations, Errors &error) override;
void TearDownPod(const std::string &ns, const std::string &name, const std::string &networkPlane,
const std::string &interfaceName, const std::string &podSandboxID,
const std::map<std::string, std::string> &annotations, Errors &error) override;
void GetPodNetworkStatus(const std::string &ns, const std::string &name, const std::string &interfaceName,
const std::string &podSandboxID, PodNetworkStatus &status, Errors &error) override;
void Status(Errors &error) override;
virtual void SetLoNetwork(std::unique_ptr<CNINetwork> lo);
private:
virtual void PlatformInit(Errors &error);
virtual void SyncNetworkConfig();
virtual void GetCNINetwork(const std::string &pluginDir, const std::string &binDir,
const std::string &vendorCNIDirPrefix, Errors &error);
virtual void CheckInitialized(Errors &error);
virtual void AddToNetwork(CNINetwork *network, const std::string &jsonCheckpoint, const std::string &podName,
const std::string &podNamespace, const std::string &interfaceName,
const std::string &podSandboxID, const std::string &podNetnsPath, struct result **presult,
Errors &error);
virtual void DeleteFromNetwork(CNINetwork *network, const std::string &jsonCheckpoint, const std::string &podName,
const std::string &podNamespace, const std::string &interfaceName,
const std::string &podSandboxID, const std::string &podNetnsPath, Errors &error);
virtual void BuildCNIRuntimeConf(const std::string &podName, const std::string &jsonCheckpoint,
const std::string &podNs, const std::string &interfaceName,
const std::string &podSandboxID, const std::string &podNetnsPath,
struct runtime_conf **cni_rc, Errors &error);
private:
void RLockNetworkMap(Errors &error);
void WLockNetworkMap(Errors &error);
void UnlockNetworkMap(Errors &error);
int GetCNIConfFiles(const std::string &pluginDir, std::vector<std::string> &vect_files, Errors &err);
int LoadCNIConfigFileList(const std::string &elem, struct cni_network_list_conf **n_list);
int InsertConfNameToAllPanes(struct cni_network_list_conf *n_list, std::set<std::string> &allPanes, Errors &err);
int InsertNewNetwork(struct cni_network_list_conf *n_list,
std::map<std::string, std::unique_ptr<CNINetwork>> &newNets, const std::string &binDir,
const std::string &vendorCNIDirPrefix, Errors &err);
void ResetCNINetwork(std::map<std::string, std::unique_ptr<CNINetwork>> &newNets, Errors &err);
NoopNetworkPlugin m_noop;
std::unique_ptr<CNINetwork> m_loNetwork { nullptr };
CRIRuntimeServiceImpl *m_criImpl { nullptr };
std::string m_nsenterPath;
std::string m_pluginDir;
std::string m_vendorCNIDirPrefix;
std::string m_binDir;
pthread_rwlock_t m_netsLock = PTHREAD_RWLOCK_INITIALIZER;
std::map<std::string, std::unique_ptr<CNINetwork>> m_networks;
};
} // namespace Network
#endif