Skip to content

Commit 3146083

Browse files
authored
Fix NVMe namespace size lookup via full GET
Route NVMeNamespaceGetSize through NVMeNamespaceGetByName instead of a REST query with fields=space.size only, which ONTAP can answer with num_records=0 on the exact namespace path. Remove dead RestClient.NVMeNamespaceSize and update unit tests/mocks.
1 parent eec02a6 commit 3146083

7 files changed

Lines changed: 92 additions & 76 deletions

File tree

mocks/mock_storage_drivers/mock_ontap/mock_api.go

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mocks/mock_storage_drivers/mock_ontap/mock_ontap_rest_interface.go

Lines changed: 8 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

storage_drivers/ontap/api/abstraction_rest.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3897,7 +3897,18 @@ func (d OntapAPIREST) NVMeGetNamespaceUUIDsForSubsystem(ctx context.Context, sub
38973897
}
38983898

38993899
func (d OntapAPIREST) NVMeNamespaceGetSize(ctx context.Context, namespacePath string) (int, error) {
3900-
return d.api.NVMeNamespaceSize(ctx, namespacePath)
3900+
ns, err := d.NVMeNamespaceGetByName(ctx, namespacePath)
3901+
if err != nil {
3902+
return 0, err
3903+
}
3904+
if ns.Size == "" {
3905+
return 0, errors.NotFoundError("namespace %s size not yet available", namespacePath)
3906+
}
3907+
size, err := strconv.Atoi(ns.Size)
3908+
if err != nil {
3909+
return 0, fmt.Errorf("namespace %s: invalid size %q: %w", namespacePath, ns.Size, err)
3910+
}
3911+
return size, nil
39013912
}
39023913

39033914
func (d OntapAPIREST) StorageUnitExists(ctx context.Context, suName string) (bool, error) {

storage_drivers/ontap/api/abstraction_rest_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,70 @@ func TestNVMeNamespaceGetByName(t *testing.T) {
384384
assert.Error(t, err)
385385
}
386386

387+
func TestNVMeNamespaceGetSize(t *testing.T) {
388+
clientConfig := api.ClientConfig{
389+
DebugTraceFlags: map[string]bool{"method": true},
390+
}
391+
392+
ctrl := gomock.NewController(t)
393+
defer ctrl.Finish()
394+
mock := mockapi.NewMockRestClientInterface(ctrl)
395+
oapi, err := api.NewOntapAPIRESTFromRestClientInterface(mock)
396+
assert.NoError(t, err)
397+
398+
name := "fakeNS"
399+
uuid := "fakeUUID"
400+
location := &models.NvmeNamespaceInlineLocation{
401+
Volume: &models.NvmeNamespaceInlineLocationInlineVolume{
402+
Name: &name,
403+
},
404+
}
405+
spaceWithSize := &models.NvmeNamespaceInlineSpace{
406+
BlockSize: new(int64(4096)),
407+
Size: new(int64(99999)),
408+
}
409+
spaceWithoutSize := &models.NvmeNamespaceInlineSpace{
410+
BlockSize: new(int64(4096)),
411+
}
412+
status := &models.NvmeNamespaceInlineStatus{
413+
State: new("fakeState"),
414+
}
415+
nsWithSize := &models.NvmeNamespace{
416+
Name: &name,
417+
UUID: &uuid,
418+
OsType: new("fakeOS"),
419+
Location: location,
420+
Space: spaceWithSize,
421+
Status: status,
422+
}
423+
nsWithoutSize := &models.NvmeNamespace{
424+
Name: &name,
425+
UUID: &uuid,
426+
OsType: new("fakeOS"),
427+
Location: location,
428+
Space: spaceWithoutSize,
429+
Status: status,
430+
}
431+
432+
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
433+
434+
mock.EXPECT().NVMeNamespaceGetByName(ctx, name, gomock.Any()).Return(nsWithSize, nil)
435+
size, err := oapi.NVMeNamespaceGetSize(ctx, name)
436+
assert.NoError(t, err)
437+
assert.Equal(t, 99999, size)
438+
439+
mock.EXPECT().NVMeNamespaceGetByName(ctx, name, gomock.Any()).Return(nil, errors.New("error while getting namespace"))
440+
size, err = oapi.NVMeNamespaceGetSize(ctx, name)
441+
assert.Error(t, err)
442+
assert.Zero(t, size)
443+
444+
mock.EXPECT().NVMeNamespaceGetByName(ctx, name, gomock.Any()).Return(nsWithoutSize, nil)
445+
size, err = oapi.NVMeNamespaceGetSize(ctx, name)
446+
assert.Error(t, err)
447+
assert.True(t, errors.IsNotFoundError(err))
448+
assert.Zero(t, size)
449+
}
450+
387451
func TestNVMeNamespaceList(t *testing.T) {
388452
clientConfig := api.ClientConfig{
389453
DebugTraceFlags: map[string]bool{"method": true},

storage_drivers/ontap/api/ontap_rest.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7817,20 +7817,6 @@ func (c *RestClient) NVMeGetHostsOfSubsystem(ctx context.Context, subsUUID strin
78177817
return nil, fmt.Errorf("get hosts of a subsystem call failed")
78187818
}
78197819

7820-
// NVMeNamespaceSize returns the size of the namespace
7821-
func (c *RestClient) NVMeNamespaceSize(ctx context.Context, namespacePath string) (int, error) {
7822-
fields := []string{"space.size"}
7823-
namespace, err := c.NVMeNamespaceGetByName(ctx, namespacePath, fields)
7824-
if err != nil {
7825-
return 0, err
7826-
}
7827-
if namespace == nil {
7828-
return 0, errors.NotFoundError("could not find namespace with name %v", namespace)
7829-
}
7830-
size := namespace.Space.Size
7831-
return int(*size), nil
7832-
}
7833-
78347820
// ///////////////////////////////////////////////////////////////////////////
78357821

78367822
// ////////////////////////////////////////////////////////////////////////////

storage_drivers/ontap/api/ontap_rest_interface.go

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

storage_drivers/ontap/api/ontap_rest_test.go

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4104,34 +4104,6 @@ func TestOntapRestNVMeGetHostsOfSubsystem(t *testing.T) {
41044104
}
41054105
}
41064106

4107-
func TestOntapRestNVMeNamespaceSize(t *testing.T) {
4108-
tests := []struct {
4109-
name string
4110-
mockFunction func(w http.ResponseWriter, r *http.Request)
4111-
isErrorExpected bool
4112-
}{
4113-
{"PositiveTest", mockNvmeNamespaceResponse, false},
4114-
{"BackendReturnError", mockNvmeResourceNotFound, true},
4115-
{"BackendReturnNilResponse", mockNvmeNamespaceResponseNil, true},
4116-
}
4117-
for _, test := range tests {
4118-
t.Run(test.name, func(t *testing.T) {
4119-
server := httptest.NewServer(http.HandlerFunc(test.mockFunction))
4120-
rs := newRestClient(server.Listener.Addr().String(), server.Client())
4121-
assert.NotNil(t, rs)
4122-
4123-
size, err := rs.NVMeNamespaceSize(ctx, "namespace1")
4124-
if !test.isErrorExpected {
4125-
assert.NoError(t, err, "failed to get NVMe namespace size")
4126-
assert.Equal(t, 1073741824, size)
4127-
} else {
4128-
assert.Error(t, err, "get the NVMe namespace size")
4129-
}
4130-
server.Close()
4131-
})
4132-
}
4133-
}
4134-
41354107
func mockSVM(w http.ResponseWriter, r *http.Request) {
41364108
mocksvm := models.Svm{
41374109
UUID: new("1234"),

0 commit comments

Comments
 (0)