iSulad/0045-rollback-setuped-network-if-mult-network-failed.patch

276 lines
12 KiB
Diff
Raw Normal View History

From e5304673ad2069b98256a942d13f959856578383 Mon Sep 17 00:00:00 2001
From: haozi007 <liuhao27@huawei.com>
Date: Tue, 23 Feb 2021 19:42:43 +0800
Subject: [PATCH 45/53] rollback setuped network if mult-network failed
Signed-off-by: haozi007 <liuhao27@huawei.com>
---
src/daemon/entry/cri/cni_network_plugin.cc | 121 ++++++++++-----------
src/daemon/entry/cri/cni_network_plugin.h | 2 +-
2 files changed, 56 insertions(+), 67 deletions(-)
diff --git a/src/daemon/entry/cri/cni_network_plugin.cc b/src/daemon/entry/cri/cni_network_plugin.cc
index b764b2a4..de599361 100644
--- a/src/daemon/entry/cri/cni_network_plugin.cc
+++ b/src/daemon/entry/cri/cni_network_plugin.cc
@@ -382,32 +382,33 @@ void CniNetworkPlugin::Status(Errors &err)
CheckInitialized(err);
}
-
+// return: represent need rollback
bool CniNetworkPlugin::SetupMultNetworks(const std::string &ns, const std::string &defaultInterface,
const std::string &name,
const std::string &netnsPath, const std::string &podSandboxID,
const std::map<std::string, std::string> &annotations,
const std::map<std::string, std::string> &options, Errors &err)
{
- bool ret = false;
int defaultIdx = -1;
size_t len = 0;
+ struct result *preResult = nullptr;
+ CNINetwork *useDefaultNet = nullptr;
+ bool ret = true;
cri_pod_network_element **networks = CRIHelpers::GetNetworkPlaneFromPodAnno(annotations, &len, err);
if (err.NotEmpty()) {
ERROR("Couldn't get network plane from pod annotations: %s", err.GetCMessage());
err.Errorf("Couldn't get network plane from pod annotations: %s", err.GetCMessage());
- goto cleanup;
+ return false;
}
for (size_t i = 0; i < len; i++) {
if (networks[i] == nullptr || networks[i]->name == nullptr || networks[i]->interface == nullptr) {
continue;
}
- struct result *preResult = nullptr;
auto netIter = m_mutlNetworks.find(networks[i]->name);
if (netIter == m_mutlNetworks.end()) {
err.Errorf("Cannot found user defined net: %s", networks[i]->name);
- break;
+ goto cleanup;
}
if (defaultInterface == networks[i]->interface) {
defaultIdx = i;
@@ -416,32 +417,32 @@ bool CniNetworkPlugin::SetupMultNetworks(const std::string &ns, const std::strin
AddToNetwork((netIter->second).get(), name, ns, networks[i]->interface, podSandboxID, netnsPath, annotations, options,
&preResult, err);
free_result(preResult);
+ preResult = nullptr;
if (err.NotEmpty()) {
ERROR("Do setup user defined net: %s, failed: %s", networks[i]->name, err.GetCMessage());
- break;
+ goto cleanup;
}
- INFO("Setup user defained net: %s success", networks[i]->name);
+ INFO("Setup user defined net: %s success", networks[i]->name);
}
+ useDefaultNet = m_defaultNetwork.get();
// mask default network pod, if user defined net use same interface
if (defaultIdx >= 0) {
auto netIter = m_mutlNetworks.find(networks[defaultIdx]->name);
if (netIter == m_mutlNetworks.end()) {
- err.Errorf("Cannot found user defined net: %s", networks[defaultIdx]->name);
+ err.Errorf("Cannot default net: %s", networks[defaultIdx]->name);
goto cleanup;
}
-
- struct result *preResult = nullptr;
- AddToNetwork((netIter->second).get(), name, ns, networks[defaultIdx]->interface, podSandboxID, netnsPath, annotations,
- options, &preResult, err);
- free_result(preResult);
- if (err.NotEmpty()) {
- ERROR("Do setup user defined net: %s, failed: %s", networks[defaultIdx]->name, err.GetCMessage());
- goto cleanup;
- }
- INFO("Setup default net: %s success", networks[defaultIdx]->name);
- ret = true;
+ useDefaultNet = (netIter->second).get();
+ }
+ AddToNetwork(useDefaultNet, name, ns, defaultInterface, podSandboxID, netnsPath, annotations, options, &preResult, err);
+ free_result(preResult);
+ if (err.NotEmpty()) {
+ ERROR("Setup default net failed: %s", err.GetCMessage());
+ goto cleanup;
}
+ INFO("Setup default net: %s success", useDefaultNet->GetName().c_str());
+ ret = false;
cleanup:
free_cri_pod_network(networks, len);
return ret;
@@ -489,8 +490,8 @@ void CniNetworkPlugin::SetUpPod(const std::string &ns, const std::string &name,
return;
}
- struct result *preResult = nullptr;
if (m_loNetwork != nullptr) {
+ struct result *preResult = nullptr;
AddToNetwork(m_loNetwork.get(), name, ns, interfaceName, id, netnsPath, annotations, options, &preResult, err);
free_result(preResult);
preResult = nullptr;
@@ -506,38 +507,32 @@ void CniNetworkPlugin::SetUpPod(const std::string &ns, const std::string &name,
return;
}
- bool setedDefaultNet = SetupMultNetworks(ns, interfaceName, name, netnsPath, id, annotations, options, err);
- if (err.NotEmpty()) {
- goto unlock;
- }
-
- if (setedDefaultNet) {
- goto unlock;
- }
-
- AddToNetwork(m_defaultNetwork.get(), name, ns, interfaceName, id, netnsPath, annotations, options, &preResult, err);
- free_result(preResult);
- if (err.NotEmpty()) {
- ERROR("Error while adding to cni network: %s", err.GetCMessage());
+ bool needRollback = SetupMultNetworks(ns, interfaceName, name, netnsPath, id, annotations, options, err);
+ if (needRollback && err.NotEmpty()) {
+ Errors tmpErr;
+ TearDownMultNetworks(ns, interfaceName, name, netnsPath, id, annotations, tmpErr);
+ if (tmpErr.NotEmpty()) {
+ err.AppendError(tmpErr.GetMessage());
+ }
}
-unlock:
UnlockNetworkMap(err);
}
-bool CniNetworkPlugin::TearDownMultNetworks(const std::string &ns, const std::string &defaultInterface,
+void CniNetworkPlugin::TearDownMultNetworks(const std::string &ns, const std::string &defaultInterface,
const std::string &name,
const std::string &netnsPath, const std::string &podSandboxID, const std::map<std::string, std::string> &annotations,
Errors &err)
{
- bool ret = false;
int defaultIdx = -1;
size_t len = 0;
+ CNINetwork *useDefaultNet = nullptr;
+ Errors tmpErr;
cri_pod_network_element **networks = CRIHelpers::GetNetworkPlaneFromPodAnno(annotations, &len, err);
if (err.NotEmpty()) {
ERROR("Couldn't get network plane from pod annotations: %s", err.GetCMessage());
err.Errorf("Couldn't get network plane from pod annotations: %s", err.GetCMessage());
- goto cleanup;
+ return;
}
for (size_t i = 0; i < len; i++) {
@@ -553,14 +548,18 @@ bool CniNetworkPlugin::TearDownMultNetworks(const std::string &ns, const std::st
defaultIdx = i;
continue;
}
- DeleteFromNetwork((netIter->second).get(), name, ns, networks[i]->interface, podSandboxID, netnsPath, annotations, err);
- if (err.NotEmpty()) {
- ERROR("Do teardown user defined net: %s, failed: %s", networks[i]->name, err.GetCMessage());
- break;
+ DeleteFromNetwork((netIter->second).get(), name, ns, networks[i]->interface, podSandboxID, netnsPath, annotations,
+ tmpErr);
+ if (tmpErr.NotEmpty()) {
+ ERROR("Do teardown user defined net: %s, failed: %s", networks[i]->name, tmpErr.GetCMessage());
+ err.AppendError(tmpErr.GetMessage());
+ tmpErr.Clear();
+ continue;
}
INFO("Teardown user defained net: %s success", networks[i]->name);
}
+ useDefaultNet = m_defaultNetwork.get();
// mask default network pod, if user defined net use same interface
if (defaultIdx >= 0) {
auto netIter = m_mutlNetworks.find(networks[defaultIdx]->name);
@@ -568,19 +567,18 @@ bool CniNetworkPlugin::TearDownMultNetworks(const std::string &ns, const std::st
err.Errorf("Cannot found user defined net: %s", networks[defaultIdx]->name);
goto cleanup;
}
-
- DeleteFromNetwork((netIter->second).get(), name, ns, networks[defaultIdx]->interface, podSandboxID, netnsPath,
- annotations, err);
- if (err.NotEmpty()) {
- ERROR("Do teardown user defined net: %s, failed: %s", networks[defaultIdx]->name, err.GetCMessage());
- goto cleanup;
- }
- INFO("Teardown default net: %s success", networks[defaultIdx]->name);
- ret = true;
+ useDefaultNet = (netIter->second).get();
+ }
+ DeleteFromNetwork(useDefaultNet, name, ns, defaultInterface, podSandboxID, netnsPath, annotations, tmpErr);
+ if (tmpErr.NotEmpty()) {
+ ERROR("Teardown default net: %s, failed: %s", useDefaultNet->GetName().c_str(), tmpErr.GetCMessage());
+ err.AppendError(tmpErr.GetMessage());
+ goto cleanup;
}
+ INFO("Teardown default net: %s success", useDefaultNet->GetName().c_str());
+
cleanup:
free_cri_pod_network(networks, len);
- return ret;
}
void CniNetworkPlugin::TearDownPod(const std::string &ns, const std::string &name, const std::string &interfaceName,
@@ -605,21 +603,11 @@ void CniNetworkPlugin::TearDownPod(const std::string &ns, const std::string &nam
return;
}
- bool defaultNetDone = TearDownMultNetworks(ns, interfaceName, name, netnsPath, id, annotations, err);
- if (defaultNetDone) {
- goto unlock;
- }
+ TearDownMultNetworks(ns, interfaceName, name, netnsPath, id, annotations, err);
if (err.NotEmpty()) {
WARN("Teardown user defined networks failed: %s", err.GetCMessage());
}
- DeleteFromNetwork(m_defaultNetwork.get(), name, ns, interfaceName, id, netnsPath, annotations, tmpErr);
- if (tmpErr.NotEmpty()) {
- WARN("Teardown default network failed: %s", tmpErr.GetCMessage());
- err.AppendError(tmpErr.GetMessage());
- }
-
-unlock:
UnlockNetworkMap(err);
}
@@ -801,7 +789,8 @@ static void GetExtensionCNIArgs(const std::map<std::string, std::string> &annota
// get cni multinetwork extension
auto iter = annotations.find(CRIHelpers::Constants::CNI_MUTL_NET_EXTENSION_KEY);
if (iter != annotations.end()) {
- if (!CheckCNIArgValue(iter->second)) {
+ // args value must do not have ';'
+ if (iter->second.find(';') != std::string::npos) {
WARN("Ignore: invalid multinetwork cni args: %s", iter->second.c_str());
} else {
args[CRIHelpers::Constants::CNI_MUTL_NET_EXTENSION_ARGS_KEY] = iter->second;
@@ -817,9 +806,9 @@ static void GetExtensionCNIArgs(const std::map<std::string, std::string> &annota
continue;
}
auto strs = CXXUtils::Split(work.second, '=');
- iter = annotations.find(work.first);
- if (iter != annotations.end()) {
- WARN("Ignore: Same key cni args: %s", work.first.c_str());
+ iter = args.find(strs[0]);
+ if (iter != args.end()) {
+ WARN("Ignore: Same key cni args: %s", work.second.c_str());
continue;
}
args[strs[0]] = strs[1];
diff --git a/src/daemon/entry/cri/cni_network_plugin.h b/src/daemon/entry/cri/cni_network_plugin.h
index f545930f..8d51a94d 100644
--- a/src/daemon/entry/cri/cni_network_plugin.h
+++ b/src/daemon/entry/cri/cni_network_plugin.h
@@ -167,7 +167,7 @@ private:
const std::string &netnsPath, const std::string &podSandboxID, const std::map<std::string, std::string> &annotations,
const std::map<std::string, std::string> &options, Errors &err);
- bool TearDownMultNetworks(const std::string &ns, const std::string &defaultInterface, const std::string &name,
+ void TearDownMultNetworks(const std::string &ns, const std::string &defaultInterface, const std::string &name,
const std::string &netnsPath, const std::string &podSandboxID, const std::map<std::string, std::string> &annotations,
Errors &err);
--
2.25.1