Skip to content

Commit 3417825

Browse files
authored
Generating unique subsystem name in case of RWO volumes in ASAr2 NVMe
1 parent a964ffd commit 3417825

15 files changed

+1607
-1442
lines changed

mocks/mock_storage_drivers/mock_ontap/mock_api.go

Lines changed: 656 additions & 659 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: 752 additions & 753 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

storage_drivers/ontap/api/abstraction.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ type OntapAPI interface {
245245
NVMeNamespaceList(ctx context.Context, pattern string) (NVMeNamespaces, error)
246246
NVMeNamespaceGetSize(ctx context.Context, namespacePath string) (int, error)
247247
NVMeNamespaceDelete(ctx context.Context, namespacePath string) error
248-
NVMeSubsystemCreate(ctx context.Context, subsystemName string) (*NVMeSubsystem, error)
248+
NVMeSubsystemCreate(ctx context.Context, subsystemName, comment string) (*NVMeSubsystem, error)
249249
NVMeSubsystemDelete(ctx context.Context, subsysUUID string) error
250250
NVMeSubsystemAddNamespace(ctx context.Context, subsystemUUID, nsUUID string) error
251251
NVMeSubsystemRemoveNamespace(ctx context.Context, subsysUUID, nsUUID string) error

storage_drivers/ontap/api/abstraction_rest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3365,7 +3365,7 @@ func (d OntapAPIREST) NVMeRemoveHostFromSubsystem(ctx context.Context, hostNQN,
33653365
}
33663366

33673367
// NVMeSubsystemCreate Checks if the subsystem is already there or not. If not, creates a new one.
3368-
func (d OntapAPIREST) NVMeSubsystemCreate(ctx context.Context, subsystemName string) (*NVMeSubsystem, error) {
3368+
func (d OntapAPIREST) NVMeSubsystemCreate(ctx context.Context, subsystemName, comment string) (*NVMeSubsystem, error) {
33693369
logFields := LogFields{
33703370
"Method": "SubsystemCreate",
33713371
"Type": "OntapAPIREST",
@@ -3382,7 +3382,7 @@ func (d OntapAPIREST) NVMeSubsystemCreate(ctx context.Context, subsystemName str
33823382
}
33833383
if subsystem == nil {
33843384
Logc(ctx).Infof("Subsystem doesn't exist, creating new subsystem %v now.", subsystemName)
3385-
subsystem, err = d.api.NVMeSubsystemCreate(ctx, subsystemName)
3385+
subsystem, err = d.api.NVMeSubsystemCreate(ctx, subsystemName, comment)
33863386
if err != nil {
33873387
return nil, err
33883388
}

storage_drivers/ontap/api/abstraction_rest_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ func TestNVMeSubsystemCreate(t *testing.T) {
748748

749749
// case 1: No error while adding host to subsystem
750750
subsystemName := "fakeSubsystem"
751+
subsystemComment := "fakeSubsystemComment"
751752
subsysUUID := "fakeUUID"
752753
targetNQN := "fakeTargetNQN"
753754
subsys := &models.NvmeSubsystem{
@@ -758,7 +759,7 @@ func TestNVMeSubsystemCreate(t *testing.T) {
758759

759760
mock.EXPECT().NVMeSubsystemGetByName(ctx, subsystemName, gomock.Any()).Return(subsys, nil)
760761
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
761-
subsystem, err := oapi.NVMeSubsystemCreate(ctx, subsystemName)
762+
subsystem, err := oapi.NVMeSubsystemCreate(ctx, subsystemName, subsystemComment)
762763
assert.NoError(t, err)
763764
assert.Equal(t, subsystem.UUID, subsysUUID, "subsystem UUID does not match")
764765
assert.Equal(t, subsystem.Name, subsystemName, "subsystem name does not match")
@@ -767,31 +768,31 @@ func TestNVMeSubsystemCreate(t *testing.T) {
767768
// case 2: Error getting susbsystem info from backend
768769
mock.EXPECT().NVMeSubsystemGetByName(ctx, subsystemName, gomock.Any()).Return(nil, fmt.Errorf("Error getting susbsystem info"))
769770
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
770-
_, err = oapi.NVMeSubsystemCreate(ctx, subsystemName)
771+
_, err = oapi.NVMeSubsystemCreate(ctx, subsystemName, subsystemComment)
771772
assert.Error(t, err)
772773

773774
// case 3: Subsystem not present, create a new one successfully
774775
mock.EXPECT().NVMeSubsystemGetByName(ctx, subsystemName, gomock.Any()).Return(nil, nil)
775-
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName).Return(subsys, nil)
776+
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName, subsystemComment).Return(subsys, nil)
776777
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
777-
newsubsys, err := oapi.NVMeSubsystemCreate(ctx, subsystemName)
778+
newsubsys, err := oapi.NVMeSubsystemCreate(ctx, subsystemName, subsystemComment)
778779
assert.NoError(t, err)
779780
assert.Equal(t, newsubsys.UUID, subsysUUID, "subsystem UUID does not match")
780781
assert.Equal(t, newsubsys.Name, subsystemName, "subsystem name does not match")
781782
assert.Equal(t, newsubsys.NQN, targetNQN, "host does not match")
782783

783784
// case 4: Subsystem not present, create a new one with failure
784785
mock.EXPECT().NVMeSubsystemGetByName(ctx, subsystemName, gomock.Any()).Return(nil, nil)
785-
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName).Return(nil, fmt.Errorf("Error creating susbsystem"))
786+
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName, subsystemComment).Return(nil, fmt.Errorf("Error creating susbsystem"))
786787
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
787-
newsubsys, err = oapi.NVMeSubsystemCreate(ctx, subsystemName)
788+
newsubsys, err = oapi.NVMeSubsystemCreate(ctx, subsystemName, subsystemComment)
788789
assert.Error(t, err)
789790

790791
// case 5: Subsystem not present, create a new one but returned nil
791792
mock.EXPECT().NVMeSubsystemGetByName(ctx, subsystemName, gomock.Any()).Return(nil, nil)
792-
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName).Return(nil, nil)
793+
mock.EXPECT().NVMeSubsystemCreate(ctx, subsystemName, subsystemComment).Return(nil, nil)
793794
mock.EXPECT().ClientConfig().Return(clientConfig).AnyTimes()
794-
newsubsys, err = oapi.NVMeSubsystemCreate(ctx, subsystemName)
795+
newsubsys, err = oapi.NVMeSubsystemCreate(ctx, subsystemName, subsystemComment)
795796
assert.Error(t, err)
796797
}
797798

storage_drivers/ontap/api/abstraction_zapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2726,7 +2726,7 @@ func (d OntapAPIZAPI) NVMeNamespaceDelete(ctx context.Context, name string) erro
27262726
return errors.UnsupportedError("ZAPI call is not supported yet")
27272727
}
27282728

2729-
func (d OntapAPIZAPI) NVMeSubsystemCreate(ctx context.Context, subsystemName string) (*NVMeSubsystem, error) {
2729+
func (d OntapAPIZAPI) NVMeSubsystemCreate(ctx context.Context, subsystemName, comment string) (*NVMeSubsystem, error) {
27302730
return nil, errors.UnsupportedError("ZAPI call is not supported yet")
27312731
}
27322732

storage_drivers/ontap/api/ontap_rest.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6966,7 +6966,7 @@ func (c *RestClient) NVMeSubsystemGetByName(
69666966
}
69676967

69686968
// NVMeSubsystemCreate creates a new subsystem
6969-
func (c *RestClient) NVMeSubsystemCreate(ctx context.Context, subsystemName string) (*models.NvmeSubsystem, error) {
6969+
func (c *RestClient) NVMeSubsystemCreate(ctx context.Context, subsystemName, comment string) (*models.NvmeSubsystem, error) {
69706970
params := nvme.NewNvmeSubsystemCreateParamsWithTimeout(c.httpClient.Timeout)
69716971
osType := "linux"
69726972
params.Context = ctx
@@ -6978,6 +6978,11 @@ func (c *RestClient) NVMeSubsystemCreate(ctx context.Context, subsystemName stri
69786978
Svm: &models.NvmeSubsystemInlineSvm{UUID: convert.ToPtr(c.svmUUID)},
69796979
}
69806980

6981+
// If comment is provided, set the comment
6982+
if len(comment) > 0 {
6983+
params.Info.Comment = convert.ToPtr(comment)
6984+
}
6985+
69816986
subsysCreated, err := c.api.NvMe.NvmeSubsystemCreate(params, c.authInfo)
69826987
if err != nil {
69836988
return nil, err

storage_drivers/ontap/api/ontap_rest_interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ type RestClientInterface interface {
404404
// NVMeSubsystemGetByName gets the subsystem with the specified name
405405
NVMeSubsystemGetByName(ctx context.Context, subsystemName string, fields []string) (*models.NvmeSubsystem, error)
406406
// NVMeSubsystemCreate creates a new subsystem
407-
NVMeSubsystemCreate(ctx context.Context, subsystemName string) (*models.NvmeSubsystem, error)
407+
NVMeSubsystemCreate(ctx context.Context, subsystemName, comment string) (*models.NvmeSubsystem, error)
408408
// NVMeSubsystemDelete deletes a given subsystem
409409
NVMeSubsystemDelete(ctx context.Context, subsysUUID string) error
410410
// NVMeAddHostNqnToSubsystem adds the NQN of the host to the subsystem

storage_drivers/ontap/api/ontap_rest_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4075,7 +4075,7 @@ func TestOntapRest_NVMeSubsystemCreate(t *testing.T) {
40754075
rs := newRestClient(server.Listener.Addr().String(), server.Client())
40764076
assert.NotNil(t, rs)
40774077

4078-
nvmeSubsystem, err := rs.NVMeSubsystemCreate(ctx, "subsystemName")
4078+
nvmeSubsystem, err := rs.NVMeSubsystemCreate(ctx, "subsystemName", "comment to be set on subsystem")
40794079
if !test.isErrorExpected {
40804080
assert.NoError(t, err, "issue while creating subsystem")
40814081
assert.Equal(t, "subsystemName", *nvmeSubsystem.Name)

storage_drivers/ontap/ontap_asa_nvme.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ type ASANVMeStorageDriver struct {
4444
cloneSplitTimers *sync.Map
4545
}
4646

47+
const (
48+
asaNVMeSubsystemPrefix = "an"
49+
)
50+
4751
func (d *ASANVMeStorageDriver) GetConfig() drivers.DriverConfig {
4852
return &d.Config
4953
}
@@ -859,21 +863,37 @@ func (d *ASANVMeStorageDriver) Publish(
859863
// When FS type is RAW, we create a new subsystem per namespace,
860864
// else we use the subsystem created for that particular node
861865
var ssName string
866+
var completeSSName string
867+
862868
if volConfig.FileSystem == filesystem.Raw {
863869
ssName = getNamespaceSpecificSubsystemName(name, pvName)
870+
completeSSName = ssName
864871
} else {
865-
ssName = getNodeSpecificSubsystemName(publishInfo.HostName, publishInfo.TridentUUID)
872+
// Create a unique node specific subsystem name. Use prefix to indicate ASA r2 NVMe.
873+
completeSSName, ssName, err = getUniqueNodeSpecificSubsystemName(
874+
publishInfo.HostName, publishInfo.TridentUUID, asaNVMeSubsystemPrefix, maximumSubsystemNameLength)
875+
if err != nil {
876+
return fmt.Errorf("failed to create node specific subsystem name: %w", err)
877+
}
878+
}
879+
880+
logFields := LogFields{
881+
"filesystemType": volConfig.FileSystem,
882+
"hostName": publishInfo.HostName,
883+
"subsystemName": ssName,
884+
"completeSubsystemName": completeSSName,
866885
}
886+
Logc(ctx).WithFields(logFields).Debug("Successfully generated subsystem name for publish.")
867887

868888
// Checks if subsystem exists and creates a new one if not
869-
subsystem, err := d.API.NVMeSubsystemCreate(ctx, ssName)
889+
subsystem, err := d.API.NVMeSubsystemCreate(ctx, ssName, completeSSName)
870890
if err != nil {
871891
Logc(ctx).Errorf("subsystem create failed, %w", err)
872892
return err
873893
}
874894

875895
if subsystem == nil {
876-
return fmt.Errorf("No subsystem returned after subsystem create")
896+
return fmt.Errorf("no subsystem returned after subsystem create")
877897
}
878898

879899
// Fill important info in publishInfo

0 commit comments

Comments
 (0)