diff --git a/include/aos/common/config.hpp b/include/aos/common/config.hpp index ff5adcea5..ce950b7c9 100644 --- a/include/aos/common/config.hpp +++ b/include/aos/common/config.hpp @@ -222,7 +222,7 @@ * Host device name len. */ #ifndef AOS_CONFIG_TYPES_DEVICE_NAME_LEN -#define AOS_CONFIG_TYPES_DEVICE_NAME_LEN 16 +#define AOS_CONFIG_TYPES_DEVICE_NAME_LEN 64 #endif /** @@ -236,7 +236,7 @@ * Resource name len. */ #ifndef AOS_CONFIG_TYPES_RESOURCE_NAME_LEN -#define AOS_CONFIG_TYPES_RESOURCE_NAME_LEN 16 +#define AOS_CONFIG_TYPES_RESOURCE_NAME_LEN 64 #endif /** diff --git a/include/aos/common/tools/string.hpp b/include/aos/common/tools/string.hpp index 27ae58fb9..d546cf43c 100644 --- a/include/aos/common/tools/string.hpp +++ b/include/aos/common/tools/string.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "aos/common/tools/array.hpp" @@ -24,6 +25,11 @@ namespace aos { */ class String : public Array { public: + enum class CaseSensitivity { + CaseInsensitive, + CaseSensitive, + }; + /** * Creates string. */ @@ -730,11 +736,11 @@ class String : public Array { */ RetWithError FindSubstr(size_t startPos, const String& substr) const { - if (substr.Size() > Size()) { + if (substr.Size() == 0 || substr.Size() > Size()) { return {Size(), ErrorEnum::eNotFound}; } - for (size_t i = startPos; i < Size() - substr.Size(); i++) { + for (size_t i = startPos; i <= Size() - substr.Size(); i++) { const auto chunk = Array(CStr() + i, substr.Size()); if (chunk == substr) { @@ -765,6 +771,23 @@ class String : public Array { return {Size(), ErrorEnum::eNotFound}; } + + /** + * Compares string with another string. + * + * @param str string to compare with. + * @param caseSensitivity comparation case sensitivity. + * @return int: 0 - if strings are equal, <0 - if current string is less than str, + * >0 - if current string is greater than str. + */ + int Compare(const String& str, CaseSensitivity caseSensitivity = CaseSensitivity::CaseSensitive) const + { + if (caseSensitivity == CaseSensitivity::CaseSensitive) { + return strcmp(CStr(), str.CStr()); + } + + return strcasecmp(CStr(), str.CStr()); + } }; /** diff --git a/include/aos/sm/networkmanager.hpp b/include/aos/sm/networkmanager.hpp index 060220e44..3dc7b0a78 100644 --- a/include/aos/sm/networkmanager.hpp +++ b/include/aos/sm/networkmanager.hpp @@ -758,6 +758,7 @@ class NetworkManager : public NetworkManagerItf { Error CreateNetwork(const NetworkInfo& network); Error GenerateVlanIfName(String& vlanIfName); Error DeleteInstanceNetworkConfig(const String& instanceID, const String& networkID); + Error CleanupInstanceNetworkResources(const String& instanceID, const String& networkID); StorageItf* mStorage {}; cni::CNIItf* mCNI {}; diff --git a/src/iam/nodeinfoprovider/nodeinfoprovider.cpp b/src/iam/nodeinfoprovider/nodeinfoprovider.cpp index 2745d04f3..3b268879b 100644 --- a/src/iam/nodeinfoprovider/nodeinfoprovider.cpp +++ b/src/iam/nodeinfoprovider/nodeinfoprovider.cpp @@ -7,27 +7,13 @@ #include "aos/iam/nodeinfoprovider.hpp" -static bool CaseInsensitiveEqual(const aos::String& lhs, const aos::String& rhs) -{ - if (lhs.Size() != rhs.Size()) { - return false; - } - - for (size_t i = 0; i < lhs.Size(); ++i) { - if (tolower(lhs[i]) != tolower(rhs[i])) { - return false; - } - } - - return true; -} - namespace aos::iam::nodeinfoprovider { bool IsMainNode(const NodeInfo& nodeInfo) { - return nodeInfo.mAttrs.FindIf([](const auto& attr) { return CaseInsensitiveEqual(attr.mName, cAttrMainNode); }) - != nodeInfo.mAttrs.end(); + return nodeInfo.mAttrs.FindIf([](const auto& attr) { + return !attr.mName.Compare(cAttrMainNode, String::CaseSensitivity::CaseInsensitive); + }) != nodeInfo.mAttrs.end(); } } // namespace aos::iam::nodeinfoprovider diff --git a/src/sm/launcher/instance.cpp b/src/sm/launcher/instance.cpp index 6e441e125..f9fc194d7 100644 --- a/src/sm/launcher/instance.cpp +++ b/src/sm/launcher/instance.cpp @@ -254,9 +254,7 @@ Error Instance::CreateAosEnvVars(oci::RuntimeSpec& runtimeSpec) Error Instance::ApplyImageConfig(const oci::ImageSpec& imageSpec, oci::RuntimeSpec& runtimeSpec) { - StaticString os = imageSpec.mOS; - - if (os.ToLower() != cLinuxOS) { + if (imageSpec.mOS.Compare(cLinuxOS, String::CaseSensitivity::CaseInsensitive) != 0) { return AOS_ERROR_WRAP(Error(ErrorEnum::eNotSupported, "unsupported OS in image config")); } diff --git a/src/sm/networkmanager/networkmanager.cpp b/src/sm/networkmanager/networkmanager.cpp index 1a4627238..5dc8c39fc 100644 --- a/src/sm/networkmanager/networkmanager.cpp +++ b/src/sm/networkmanager/networkmanager.cpp @@ -261,6 +261,32 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const Error err; + if (auto errCleanupResources = CleanupInstanceNetworkResources(instanceID, networkID); + !errCleanupResources.IsNone()) { + if (err.IsNone()) { + err = errCleanupResources; + } + } + + if (auto errRemoveFromCache = RemoveInstanceFromCache(instanceID, networkID); + !errRemoveFromCache.IsNone() && err.IsNone()) { + err = errRemoveFromCache; + } + + if (!err.IsNone()) { + return err; + } + + LOG_DBG() << "Instance removed from network" << Log::Field("instanceID", instanceID) + << Log::Field("networkID", networkID); + + return ErrorEnum::eNone; +} + +Error NetworkManager::CleanupInstanceNetworkResources(const String& instanceID, const String& networkID) +{ + Error err; + if (auto errStopInstanceMonitoring = mNetMonitor->StopInstanceMonitoring(instanceID); !errStopInstanceMonitoring.IsNone()) { if (err.IsNone()) { @@ -275,13 +301,6 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const } } - if (auto errRemoveInstanceFromCache = RemoveInstanceFromCache(instanceID, networkID); - !errRemoveInstanceFromCache.IsNone()) { - if (err.IsNone()) { - err = errRemoveInstanceFromCache; - } - } - if (auto errRemoveInstanceFromStorage = mStorage->RemoveInstanceNetworkInfo(instanceID); !errRemoveInstanceFromStorage.IsNone()) { if (err.IsNone()) { @@ -289,14 +308,7 @@ Error NetworkManager::RemoveInstanceFromNetwork(const String& instanceID, const } } - if (!err.IsNone()) { - return err; - } - - LOG_DBG() << "Instance removed from network" << Log::Field("instanceID", instanceID) - << Log::Field("networkID", networkID); - - return ErrorEnum::eNone; + return err; } Error NetworkManager::DeleteInstanceNetworkConfig(const String& instanceID, const String& networkID) @@ -1005,10 +1017,15 @@ Error NetworkManager::RemoveNetwork(const String& networkID) Error err; for (const auto& instance : provider->mSecond) { - if (auto errRemoveInstance = RemoveInstanceFromNetwork(instance.mFirst, networkID); + if (auto errRemoveInstance = CleanupInstanceNetworkResources(instance.mFirst, networkID); !errRemoveInstance.IsNone() && err.IsNone()) { err = errRemoveInstance; } + + if (auto errRemoveFromCache = RemoveInstanceFromCache(instance.mFirst, networkID); + !errRemoveFromCache.IsNone() && err.IsNone()) { + err = errRemoveFromCache; + } } return err; diff --git a/tests/common/src/tools/string_test.cpp b/tests/common/src/tools/string_test.cpp index 52e4c3053..dd2e8f920 100644 --- a/tests/common/src/tools/string_test.cpp +++ b/tests/common/src/tools/string_test.cpp @@ -411,4 +411,26 @@ TEST(StringTest, Replace) err = str.Replace("Universe", "Aos", 1); EXPECT_TRUE(err.IsNone()); EXPECT_EQ(str, "Hi Aos! Goodbye Universe!"); + + str = "Replace the whole string"; + + err = str.Replace(str, "replaced", 1); + EXPECT_TRUE(err.IsNone()); + EXPECT_EQ(str, "replaced"); +} + +TEST(StringTest, Compare) +{ + const auto cLhsStr = String("Test string"); + + EXPECT_EQ(cLhsStr.Compare("Test string"), 0); + EXPECT_LT(cLhsStr.Compare("Test string1"), 0); + EXPECT_LT(cLhsStr.Compare("Test strinh"), 0); + EXPECT_GT(cLhsStr.Compare("Test strina"), 0); + EXPECT_GT(cLhsStr.Compare("Test"), 0); + + EXPECT_EQ(cLhsStr.Compare("Test string", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_EQ(cLhsStr.Compare("test string", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_EQ(cLhsStr.Compare("TEST STRING", String::CaseSensitivity::CaseInsensitive), 0); + EXPECT_LT(cLhsStr.Compare("TEST STRING1", String::CaseSensitivity::CaseInsensitive), 0); }