diff --git a/gonvme.go b/gonvme.go index 70a682f..9fec295 100644 --- a/gonvme.go +++ b/gonvme.go @@ -69,6 +69,9 @@ type NVMEinterface interface { // generic implementations isMock() bool getOptions() map[string]string + + // DeviceRescan rescan the NVMe controller device + DeviceRescan(device string) error } // NVMeType is the base structure for each platform implementation diff --git a/gonvme_mock.go b/gonvme_mock.go index 1f539aa..a9e5cdf 100644 --- a/gonvme_mock.go +++ b/gonvme_mock.go @@ -300,3 +300,15 @@ func (nvme *MockNVMe) NVMeDisconnect(target NVMeTarget) error { func (nvme *MockNVMe) GetSessions() ([]NVMESession, error) { return nvme.getSessions() } + +// DeviceRescan rescan the NVMe device +func (nvme *MockNVMe) DeviceRescan(device string) error { + return nvme.deviceRescan(device) +} + +func (nvme *MockNVMe) deviceRescan(_ string) error { + if GONVMEMock.InduceGetSessionsError { + return errors.New("deviceRescan induced error") + } + return nil +} diff --git a/gonvme_tcp_fc.go b/gonvme_tcp_fc.go index fd5baa8..5c6956b 100644 --- a/gonvme_tcp_fc.go +++ b/gonvme_tcp_fc.go @@ -835,3 +835,14 @@ func isNoObjsExitCode(err error) bool { } return false } + +// DeviceRescan rescan the NVMe controller device +func (nvme *NVMe) DeviceRescan(device string) error { + exe := nvme.buildNVMeCommand([]string{"nvme", "ns-rescan", device}) + cmd := exec.Command(exe[0], exe[1:]...) // #nosec G204 + _, err := cmd.Output() + if err != nil { + return err + } + return nil +} diff --git a/gonvme_test.go b/gonvme_test.go index e002848..a2e4d8e 100644 --- a/gonvme_test.go +++ b/gonvme_test.go @@ -762,3 +762,24 @@ func compareStr(t *testing.T, str1 string, str2 string) { t.Errorf("strings are not equal: %s != %s", str1, str2) } } + +func TestMockDeviceRescan(t *testing.T) { + reset() + + // Create a mock NVMe interface + c := NewMockNVMe(map[string]string{}) + + // Test successful rescan (no induced error) + err := c.DeviceRescan("testDevice") + if err != nil { + t.Errorf("Expected no error, but got: %v", err) + } + + // Induce an error and test failure case + GONVMEMock.InduceGetSessionsError = true + err = c.DeviceRescan("testDevice") + if err == nil { + t.Error("Expected an induced error but got nil") + return + } +}