@@ -928,6 +928,7 @@ func TestNVMeNamespaceUnmapped(t *testing.T) {
928928 mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
929929 mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
930930 mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
931+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
931932
932933 removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
933934
@@ -999,11 +1000,84 @@ func TestNVMeNamespaceUnmapped(t *testing.T) {
9991000 mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
10001001 mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 },
10011002 nil ).Times (1 )
1003+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
10021004
10031005 removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , nonExistentHostNQN , subsystemUUID , nsUUID )
10041006
10051007 assert .Equal (t , false , removePublishInfo , "nqn is unmapped" )
10061008 assert .NoError (t , err )
1009+
1010+ // case 13: Multiple hosts with error getting namespace count
1011+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1012+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1013+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1014+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1015+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (0 ), errors .New ("Error getting namespace count" )).Times (1 )
1016+
1017+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1018+
1019+ assert .Equal (t , false , removePublishInfo , "subsystem removed" )
1020+ assert .Error (t , err )
1021+
1022+ // case 14: Multiple hosts with namespace count > 1, error removing namespace
1023+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1024+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1025+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1026+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1027+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (2 ), nil ).Times (1 )
1028+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (errors .New ("Error removing namespace" )).Times (1 )
1029+
1030+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1031+
1032+ assert .Equal (t , false , removePublishInfo , "subsystem removed" )
1033+ assert .Error (t , err )
1034+
1035+ // case 15: Multiple hosts with namespace count > 1, success removing namespace
1036+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1037+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1038+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1039+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1040+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (3 ), nil ).Times (1 )
1041+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (nil ).Times (1 )
1042+
1043+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1044+
1045+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed due to multiple namespaces" )
1046+ assert .NoError (t , err )
1047+
1048+ // case 16: Multiple hosts with namespace count = 1 (RWX case), no removal of namespace or subsystem
1049+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1050+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1051+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 , host2 }, nil ).Times (1 )
1052+ mock .EXPECT ().NVMeRemoveHostFromSubsystem (ctx , hostNQN , subsystemUUID ).Return (nil ).Times (1 )
1053+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (1 ), nil ).Times (1 )
1054+
1055+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1056+
1057+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed in RWX case" )
1058+ assert .NoError (t , err )
1059+
1060+ // case 17: Single host but different from requested host (nonExistentHostNQN), subsystem and namespace not removed
1061+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1062+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1063+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 }, nil ).Times (1 )
1064+
1065+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , nonExistentHostNQN , subsystemUUID , nsUUID )
1066+
1067+ assert .Equal (t , false , removePublishInfo , "subsystem is not removed when host doesn't match" )
1068+ assert .NoError (t , err )
1069+
1070+ // case 18: Namespace count > 0 after removal, subsystem not deleted
1071+ mock .EXPECT ().ClientConfig ().Return (clientConfig ).AnyTimes ()
1072+ mock .EXPECT ().NVMeIsNamespaceMapped (ctx , subsystemUUID , nsUUID ).Return (true , nil ).Times (1 )
1073+ mock .EXPECT ().NVMeGetHostsOfSubsystem (ctx , subsystemUUID ).Return ([]* models.NvmeSubsystemHost {host1 }, nil ).Times (1 )
1074+ mock .EXPECT ().NVMeSubsystemRemoveNamespace (ctx , subsystemUUID , nsUUID ).Return (nil ).Times (1 )
1075+ mock .EXPECT ().NVMeNamespaceCount (ctx , subsystemUUID ).Return (int64 (2 ), nil ).Times (1 )
1076+
1077+ removePublishInfo , err = oapi .NVMeEnsureNamespaceUnmapped (ctx , hostNQN , subsystemUUID , nsUUID )
1078+
1079+ assert .Equal (t , true , removePublishInfo , "subsystem has remaining namespaces" )
1080+ assert .NoError (t , err )
10071081}
10081082
10091083func TestNVMeIsNamespaceMapped (t * testing.T ) {
0 commit comments