@@ -964,6 +964,7 @@ func TestNVMeNamespaceUnmapped(t *testing.T) {
964964 mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
965965 mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
966966 mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
967+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
967968
968969 removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
969970
@@ -1035,11 +1036,84 @@ func TestNVMeNamespaceUnmapped(t *testing.T) {
10351036 mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
10361037 mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 },
10371038 nil ).Times (1 )
1039+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
10381040
10391041 removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , nonExistentHostNQN , subsystemUUID , nsUUID )
10401042
10411043 assert .Equal (t , false , removePublishInfo , "nqn is unmapped" )
10421044 assert .NoError (t , err )
1045+
1046+ // case 13: Multiple hosts with error getting namespace count
1047+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1048+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1049+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1050+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1051+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (0 ), errors .New ("Error getting namespace count" )).Times (1 )
1052+
1053+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1054+
1055+ assert .Equal (t , false , removePublishInfo , "subsystem removed" )
1056+ assert .Error (t , err )
1057+
1058+ // case 14: Multiple hosts with namespace count > 1, error removing namespace
1059+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1060+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1061+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1062+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1063+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (2 ), nil ).Times (1 )
1064+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (errors .New ("Error removing namespace" )).Times (1 )
1065+
1066+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1067+
1068+ assert .Equal (t , false , removePublishInfo , "subsystem removed" )
1069+ assert .Error (t , err )
1070+
1071+ // case 15: Multiple hosts with namespace count > 1, success removing namespace
1072+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1073+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1074+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1075+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1076+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (3 ), nil ).Times (1 )
1077+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (nil ).Times (1 )
1078+
1079+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1080+
1081+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed due to multiple namespaces" )
1082+ assert .NoError (t , err )
1083+
1084+ // case 16: Multiple hosts with namespace count = 1 (RWX case), no removal of namespace or subsystem
1085+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1086+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1087+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1088+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1089+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
1090+
1091+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1092+
1093+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed in RWX case" )
1094+ assert .NoError (t , err )
1095+
1096+ // case 17: Single host but different from requested host (nonExistentHostNQN), subsystem and namespace not removed
1097+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1098+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1099+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 }, nil ).Times (1 )
1100+
1101+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , nonExistentHostNQN , subsystemUUID , nsUUID )
1102+
1103+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed when host doesn't match" )
1104+ assert .NoError (t , err )
1105+
1106+ // case 18: Namespace count > 0 after removal, subsystem not deleted
1107+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1108+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1109+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 }, nil ).Times (1 )
1110+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (nil ).Times (1 )
1111+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (2 ), nil ).Times (1 )
1112+
1113+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1114+
1115+ assert .Equal (t , true , removePublishInfo , "subsystem has remaining namespaces" )
1116+ assert .NoError (t , err )
10431117}
10441118
10451119func TestNVMeIsNamespaceMapped (t * testing.T ) {
0 commit comments