From 7f25c8f5a0c1770c3dd95ca8147022b90e94a93c Mon Sep 17 00:00:00 2001 From: Renuka Date: Tue, 24 Jun 2025 15:06:49 +0530 Subject: [PATCH 1/3] updated regional file functionality Signed-off-by: Renuka --- common/vpcclient/models/share.go | 1 + file/provider/create_volume.go | 90 +++++++++++++----- file/provider/update_volume.go | 115 ++++++++++++++++++++--- file/provider/util.go | 3 +- samples/main.go | 152 ++++++++++++++++++++++++++----- 5 files changed, 301 insertions(+), 60 deletions(-) diff --git a/common/vpcclient/models/share.go b/common/vpcclient/models/share.go index d6e6df78..2080788a 100644 --- a/common/vpcclient/models/share.go +++ b/common/vpcclient/models/share.go @@ -29,6 +29,7 @@ type Share struct { Name string `json:"name,omitempty"` Size int64 `json:"size,omitempty"` Iops int64 `json:"iops,omitempty"` + Bandwidth *int64 `json:"bandwidth,omitempty"` EncryptionKey *EncryptionKey `json:"encryption_key,omitempty"` ResourceGroup *ResourceGroup `json:"resource_group,omitempty"` InitialOwner *InitialOwner `json:"initial_owner,omitempty"` diff --git a/file/provider/create_volume.go b/file/provider/create_volume.go index 0e874288..77ffbe16 100644 --- a/file/provider/create_volume.go +++ b/file/provider/create_volume.go @@ -18,6 +18,8 @@ package provider import ( + "encoding/json" + "fmt" "time" userError "github.com/IBM/ibmcloud-volume-file-vpc/common/messages" @@ -31,7 +33,12 @@ const ( minSize = 10 //10 GB maxSize = 16000 //16 TB customProfile = "custom-iops" - dp2Profile = "dp2" +) + +var ( + SupportedProfiles = []string{"dp2", "rfs"} + IOPSAllowedProfiles = []string{"dp2"} + BandwidthAllowedProfiles = []string{"rfs"} ) // CreateVolume creates file share @@ -39,12 +46,14 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo vpcs.Logger.Debug("Entry of CreateVolume method...") defer vpcs.Logger.Debug("Exit from CreateVolume method...") defer metrics.UpdateDurationFromStart(vpcs.Logger, "CreateVolume", time.Now()) - + var iops int64 vpcs.Logger.Info("Basic validation for CreateVolume request... ", zap.Reflect("RequestedVolumeDetails", volumeRequest)) - resourceGroup, iops, err := validateVolumeRequest(volumeRequest) + + resourceGroup, iops, bandwidth, err := validateVolumeRequest(volumeRequest) if err != nil { return nil, err } + vpcs.Logger.Info("Successfully validated inputs for CreateVolume request... ") // Build the share template to send to backend @@ -58,9 +67,22 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo Profile: &models.Profile{ Name: volumeRequest.VPCVolume.Profile.Name, }, - Zone: &models.Zone{ - Name: volumeRequest.Az, - }, + Bandwidth: func() *int64 { + profile := volumeRequest.VPCVolume.Profile.Name + if contains(BandwidthAllowedProfiles, profile) && bandwidth > 0 { + return &bandwidth + } + return nil + }(), + Zone: func() *models.Zone { + profile := volumeRequest.VPCVolume.Profile.Name + if contains(IOPSAllowedProfiles, profile) || contains(SupportedProfiles, profile) { + if volumeRequest.Az != nil && *volumeRequest.Az != "" { + return &models.Zone{Name: *volumeRequest.Az} + } + } + return nil + }(), } // Check for VPC ID, SubnetID or PrimaryIPID either of the one is mandatory for VolumeAccessPoint/FileShareTarget creation @@ -89,7 +111,8 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo volumeAccessPointList := make([]models.ShareTarget, 1) volumeAccessPointList[0] = shareTargetTemplate - + jsonBytes, _ := json.Marshal(shareTemplate) + fmt.Println("DEBUG PAYLOAD:\n", string(jsonBytes)) shareTemplate.ShareTargets = &volumeAccessPointList } @@ -110,6 +133,10 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo vpcs.Logger.Debug("Failed to create volume from VPC provider", zap.Reflect("BackendError", err)) return nil, userError.GetUserError("FailedToPlaceOrder", err) } + if volume == nil { + vpcs.Logger.Error("CreateFileShare returned nil volume but no error") + return nil, userError.GetUserError("FailedToPlaceOrder", fmt.Errorf("nil volume received from backend")) + } vpcs.Logger.Info("Successfully created volume from VPC provider...", zap.Reflect("VolumeDetails", volume)) @@ -134,45 +161,64 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo return volumeResponse, err } +func contains(slice []string, item string) bool { + for _, v := range slice { + if v == item { + return true + } + } + return false +} + // validateVolumeRequest validating volume request -func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, int64, error) { +func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, int64, int64, error) { resourceGroup := models.ResourceGroup{} var iops int64 + var bandwidth int64 = 0 iops = 0 // Volume name should not be empty if volumeRequest.Name == nil { - return resourceGroup, iops, userError.GetUserError("InvalidVolumeName", nil, nil) + return resourceGroup, iops, 0, userError.GetUserError("InvalidVolumeName", nil, nil) } else if len(*volumeRequest.Name) == 0 { - return resourceGroup, iops, userError.GetUserError("InvalidVolumeName", nil, *volumeRequest.Name) + return resourceGroup, iops, 0, userError.GetUserError("InvalidVolumeName", nil, *volumeRequest.Name) } // Capacity should not be empty if volumeRequest.Capacity == nil { - return resourceGroup, iops, userError.GetUserError("VolumeCapacityInvalid", nil, nil) + return resourceGroup, iops, 0, userError.GetUserError("VolumeCapacityInvalid", nil, nil) } else if *volumeRequest.Capacity < minSize { - return resourceGroup, iops, userError.GetUserError("VolumeCapacityInvalid", nil, *volumeRequest.Capacity) + return resourceGroup, iops, 0, userError.GetUserError("VolumeCapacityInvalid", nil, *volumeRequest.Capacity) } // Read user provided error, no harm to pass the 0 values to RIaaS in case of tiered profiles if volumeRequest.Iops != nil { iops = ToInt64(*volumeRequest.Iops) } + + if volumeRequest.Bandwidth != nil { + bandwidth = ToInt64(*volumeRequest.Bandwidth) + } + if volumeRequest.VPCVolume.Profile == nil { - return resourceGroup, iops, userError.GetUserError("VolumeProfileEmpty", nil) + return resourceGroup, iops, 0, userError.GetUserError("VolumeProfileEmpty", nil) } - if volumeRequest.VPCVolume.Profile.Name != customProfile && volumeRequest.VPCVolume.Profile.Name != dp2Profile && iops > 0 { - return resourceGroup, iops, userError.GetUserError("VolumeProfileIopsInvalid", nil) + + profile := volumeRequest.VPCVolume.Profile.Name + if !contains(SupportedProfiles, profile) { + return resourceGroup, iops, bandwidth, userError.GetUserError("VolumeProfileNotSupported", nil) } - // validate and add resource group ID or Name whichever is provided by user - if volumeRequest.VPCVolume.ResourceGroup == nil { - return resourceGroup, iops, userError.GetUserError("EmptyResourceGroup", nil) + if iops > 0 && !contains(IOPSAllowedProfiles, profile) { + return resourceGroup, iops, bandwidth, userError.GetUserError("VolumeProfileIopsInvalid", nil) } - // validate and add resource group ID or Name whichever is provided by user - if len(volumeRequest.VPCVolume.ResourceGroup.ID) == 0 && len(volumeRequest.VPCVolume.ResourceGroup.Name) == 0 { - return resourceGroup, iops, userError.GetUserError("EmptyResourceGroupIDandName", nil) + if bandwidth > 0 && !contains(BandwidthAllowedProfiles, profile) { + return resourceGroup, iops, bandwidth, userError.GetUserError("VolumeProfileBandwidthInvalid", nil) + } + + if volumeRequest.VPCVolume.ResourceGroup == nil { + return resourceGroup, iops, bandwidth, userError.GetUserError("EmptyResourceGroup", nil) } if len(volumeRequest.VPCVolume.ResourceGroup.ID) > 0 { @@ -183,7 +229,7 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, resourceGroup.Name = volumeRequest.VPCVolume.ResourceGroup.Name } - return resourceGroup, iops, nil + return resourceGroup, iops, bandwidth, nil } func setENIParameters(shareTarget *models.ShareTarget, volumeRequest provider.Volume) { diff --git a/file/provider/update_volume.go b/file/provider/update_volume.go index 88746b8b..4fc75e0a 100644 --- a/file/provider/update_volume.go +++ b/file/provider/update_volume.go @@ -19,6 +19,7 @@ package provider import ( "strings" + "time" userError "github.com/IBM/ibmcloud-volume-file-vpc/common/messages" "github.com/IBM/ibmcloud-volume-file-vpc/common/vpcclient/models" @@ -26,11 +27,28 @@ import ( "go.uber.org/zap" ) +const ( + StatusFailed = "failed" + StatusProvisioningFailed = "provisioning_failed" +) + +func convertMapToTagList(tagMap map[string]string) []string { + tags := []string{} + for k, v := range tagMap { + tags = append(tags, k+":"+v) + } + return tags +} + // UpdateVolume PATCH to /volumes func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { var existShare *models.Share var err error var etag string + updatePayload := &models.Share{} + shouldUpdate := false + + requestedTags := convertMapToTagList(volumeTemplate.Tags) //Fetch existing volume Tags err = retryWithMinRetries(vpcs.Logger, func() error { @@ -40,29 +58,56 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { if err != nil { return err } - - if existShare != nil && existShare.Status == StatusStable { - vpcs.Logger.Info("Volume got valid (stable) state", zap.Reflect("etag", etag)) - } else { + if existShare == nil || existShare.Status != StatusStable { return userError.GetUserError("VolumeNotInValidState", err, volumeTemplate.VolumeID) } - //If tags are equal then skip the UpdateFileShare RIAAS API call - if ifTagsEqual(existShare.UserTags, volumeTemplate.VPCVolume.Tags) { - vpcs.Logger.Info("There is no change in user tags for volume, skipping the updateVolume for VPC IaaS... ", zap.Reflect("existShare", existShare.UserTags), zap.Reflect("volumeRequest", volumeTemplate.VPCVolume.Tags)) - return nil + vpcs.Logger.Info("Volume got valid (stable) state", zap.Reflect("etag", etag)) + + // Tag check using new map-based tags + if !ifTagsEqual(existShare.UserTags, requestedTags) { + updatePayload.UserTags = append(existShare.UserTags, requestedTags...) + shouldUpdate = true } - //Append the existing tags with the requested input tags - existShare.UserTags = append(existShare.UserTags, volumeTemplate.VPCVolume.Tags...) + // Profile check for bandwidth / iops + profile := strings.ToLower(existShare.Profile.Name) - volume := &models.Share{ - UserTags: existShare.UserTags, + // Bandwidth support for rfs + if profile == "rfs" && volumeTemplate.Bandwidth != nil { + newBandwidth := ToInt64(*volumeTemplate.Bandwidth) + if existShare.Bandwidth == nil || *existShare.Bandwidth != newBandwidth { + updatePayload.Bandwidth = &newBandwidth + shouldUpdate = true + } } - vpcs.Logger.Info("Calling VPC provider for volume UpdateVolumeWithTags...") + // IOPS support for dp2 + if profile == "dp2" && volumeTemplate.Iops != nil { + newIops := ToInt64(*volumeTemplate.Iops) + if existShare.Iops != newIops { + updatePayload.Iops = newIops + shouldUpdate = true + } + } - err = vpcs.Apiclient.FileShareService().UpdateFileShareWithEtag(volumeTemplate.VolumeID, etag, volume, vpcs.Logger) + // If no change detected, skip API call + if !shouldUpdate { + vpcs.Logger.Info("No changes detected, skipping update call") + return nil + } + + if !shouldUpdate { + vpcs.Logger.Info("No changes detected, skipping update call") + return nil + } + + vpcs.Logger.Info("Calling VPC provider for volume UpdateVolumeWithTags...", + zap.Reflect("VolumeID", volumeTemplate.VolumeID), + zap.Reflect("Payload", updatePayload), + ) + + err = vpcs.Apiclient.FileShareService().UpdateFileShareWithEtag(volumeTemplate.VolumeID, etag, updatePayload, vpcs.Logger) return err }) @@ -70,7 +115,13 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { vpcs.Logger.Error("Failed to update volume tags from VPC provider", zap.Reflect("BackendError", err)) return userError.GetUserError("FailedToUpdateVolume", err, volumeTemplate.VolumeID) } - + // Wait until volume returns to 'stable' + vpcs.Logger.Info("Waiting for volume to reach stable state...") + err = waitForStableState(vpcs, volumeTemplate.VolumeID, vpcs.Logger, 20, 10*time.Second) + if err != nil { + vpcs.Logger.Error("Volume did not reach stable state", zap.Error(err)) + return err + } return err } @@ -87,3 +138,37 @@ func ifTagsEqual(existingTags []string, newTags []string) bool { //Tags are equal return true } + +// waitForStableState polls the volume (file share) status until it reaches a 'stable' state. +// It retries up to `maxRetries` with a sleep interval of `interval` between attempts. +// Returns an error if the volume enters a failed state or does not become stable within the retry limit. +func waitForStableState(vpcs *VPCSession, shareID string, ctxLogger *zap.Logger, maxRetries int, interval time.Duration) error { + for i := 0; i < maxRetries; i++ { + share, _, err := vpcs.Apiclient.FileShareService().GetFileShareEtag(shareID, ctxLogger) + if err != nil { + ctxLogger.Warn("Failed to get volume state during wait", zap.Error(err)) + return err + } + + state := strings.ToLower(string(share.Status)) + ctxLogger.Info("Polling share state", zap.String("state", state), zap.Int("attempt", i+1)) + + if state == StatusStable { + return nil + } + if state == "failed" || state == "provisioning_failed" { + return userError.GetUserError("VolumeNotInValidState", nil, shareID) + } + + if state == StatusStable { + return nil + } + if state == StatusFailed || state == StatusProvisioningFailed { + return userError.GetUserError("VolumeNotInValidState", nil, shareID) + } + + time.Sleep(interval) + } + + return userError.GetUserError("VolumeNotInValidState", nil, shareID) +} diff --git a/file/provider/util.go b/file/provider/util.go index 3c54ac0a..790a9782 100644 --- a/file/provider/util.go +++ b/file/provider/util.go @@ -301,8 +301,9 @@ func FromProviderToLibVolume(vpcVolume *models.Share, logger *zap.Logger) (libVo CreationTime: createdDate, } if vpcVolume.Zone != nil { - libVolume.Az = vpcVolume.Zone.Name + libVolume.Az = &vpcVolume.Zone.Name } + libVolume.CRN = vpcVolume.CRN var respAccessPointlist = []provider.VolumeAccessPoint{} diff --git a/samples/main.go b/samples/main.go index 216fa1bc..73b5d0e2 100644 --- a/samples/main.go +++ b/samples/main.go @@ -21,6 +21,8 @@ import ( "flag" "fmt" "os" + "strconv" + "strings" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -33,6 +35,8 @@ import ( userError "github.com/IBM/ibmcloud-volume-interface/lib/utils" "github.com/IBM/ibmcloud-volume-interface/provider/local" "github.com/IBM/secret-utils-lib/pkg/k8s_utils" + utils "github.com/IBM/secret-utils-lib/pkg/utils" + uid "github.com/gofrs/uuid" ) @@ -80,6 +84,7 @@ func main() { // Load config file k8sClient, _ := k8s_utils.FakeGetk8sClientSet() + _ = k8s_utils.FakeCreateSecret(k8sClient, utils.DEFAULT, "./samples/sample-secret-config.toml") conf, err := config.ReadConfig(k8sClient, logger) if err != nil { logger.Fatal("Error loading configuration") @@ -96,9 +101,10 @@ func main() { VPCConfig: conf.VPC, ServerConfig: conf.Server, } - + // enabling VPC provider as default + vpcFileConfig.VPCConfig.Enabled = true + // Prepare provider registry providerRegistry, err := provider_file_util.InitProviders(vpcFileConfig, &k8sClient, logger) - if err != nil { logger.Fatal("Error configuring providers", local.ZapError(err)) } @@ -117,7 +123,7 @@ func main() { valid := true for valid { - fmt.Println("\n\nSelect your choice\n 1- Get volume details \n 2- Create snapshot \n 3- list snapshot \n 4- Create volume \n 5- Snapshot details \n 6- Snapshot Order \n 7- Create volume from snapshot\n 8- Delete volume \n 9- Delete Snapshot \n 10- List all Snapshot \n 12- Authorize volume \n 13- Create VPC Volume \n 14- Create VPC Snapshot \n 15- Create VPC target \n 16- Delete VPC target \n 17- Get volume by name \n 18- List volumes \n 19- Get volume target \n 20 - Wait for create volume target \n 21 - Wait for delete volume target \n 22 - Expand Volume \n Your choice?:") + fmt.Println("\n\nSelect your choice\n 1- Get volume details \n 2- Create snapshot \n 3- list snapshot \n 4- Create volume \n 5- Snapshot details \n 6- Snapshot Order \n 7- Create volume from snapshot\n 8- Delete volume \n 9- Delete Snapshot \n 10- List all Snapshot \n 12- Authorize volume \n 13- Create VPC Volume \n 14- Create VPC Snapshot \n 15- Create VPC target \n 16- Delete VPC target \n 17- Get volume by name \n 18- List volumes \n 19- Get volume target \n 20 - Wait for create volume target \n 21 - Wait for delete volume target \n 22 - Expand Volume \n 23 - Update volume (bandwidth/iops) \n Your choice?:") var choiceN int var volumeID, targetID string @@ -209,43 +215,88 @@ func main() { fmt.Printf("\n\n") } else if choiceN == 13 { fmt.Println("You selected choice to Create VPC volume") + volume := &provider.Volume{} - volumeName := "" - volume.VolumeType = "vpc-share" - /* volume.VolumeEncryptionKey = &provider.VolumeEncryptionKey{ - CRN: "crn:v1:bluemix:public:kms:us-south:a/b661e758bf044d2d928fef7900d5130b:f5be30ff-b5d8-4edd-9f5a-cc313b3584db:key:8e282989-19e8-4415-b6e3-b9d2ec1911d0", - } */ - resourceGroup := "" - zone := "us-south-3" - volSize := 0 - volume.Az = zone + /* Optional: Enable this if you want to use a customer-managed encryption key + volume.VolumeEncryptionKey = &provider.VolumeEncryptionKey{ + CRN: "crn:v1:bluemix:public:kms:us-south:a/b661e758bf044d2d928fef7900d5130b:f5be30ff-b5d8-4edd-9f5a-cc313b3584db:key:8e282989-19e8-4415-b6e3-b9d2ec1911d0", + } + */ volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} - profile := "tier-10iops" - fmt.Printf("\nPlease enter profile name supported profiles are [tier-10iops, tier-5iops, tier-3iops]: ") + var ( + profile string + zone string + volumeName string + resourceGroup string + volSize int + iops, bandwidth int + ) + + supportedProfiles := map[string]struct { + EnableIOPS bool + EnableBandwidth bool + EnableZone bool + }{ + "dp2": {EnableIOPS: true, EnableBandwidth: false, EnableZone: true}, + "rfs": {EnableIOPS: false, EnableBandwidth: true, EnableZone: false}, + "tier-10iops": {}, "tier-5iops": {}, "tier-3iops": {}, // Tiered profiles + } + + fmt.Printf("\nPlease enter profile name (supported: dp2, rfs, tier-10iops, tier-5iops, tier-3iops): ") _, _ = fmt.Scanf("%s", &profile) - volume.VPCVolume.Profile = &provider.Profile{Name: profile} + + caps, ok := supportedProfiles[profile] + if !ok { + fmt.Printf("Invalid profile: %s\n", profile) + continue + } + + if caps.EnableZone { + fmt.Printf("\nPlease enter zone: ") + _, _ = fmt.Scanf("%s", &zone) + volume.Az = &zone + } else { + volume.Az = nil + } + + if caps.EnableIOPS { + fmt.Printf("\nEnter IOPS (optional for profile '%s', 0 to skip): ", profile) + _, _ = fmt.Scanf("%d", &iops) + if iops > 0 { + iopsStr := strconv.Itoa(iops) + volume.Iops = &iopsStr + } + } + + if caps.EnableBandwidth { + fmt.Printf("\nEnter Bandwidth (optional for profile '%s', 0 to skip): ", profile) + _, _ = fmt.Scanf("%d", &bandwidth) + if bandwidth > 0 { + bandwidthStr := strconv.Itoa(bandwidth) + volume.Bandwidth = &bandwidthStr + } + } fmt.Printf("\nPlease enter volume name: ") _, _ = fmt.Scanf("%s", &volumeName) volume.Name = &volumeName + volume.VPCVolume.Profile = &provider.Profile{Name: profile} + fmt.Printf("\nPlease enter volume size (Specify 10 GB - 16 TB of capacity in 1 GB increments): ") _, _ = fmt.Scanf("%d", &volSize) volume.Capacity = &volSize - fmt.Printf("\nPlease enter resource group ID:") + fmt.Printf("\nPlease enter resource group ID: ") _, _ = fmt.Scanf("%s", &resourceGroup) + if volume.VPCVolume.ResourceGroup == nil { + volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} + } volume.VPCVolume.ResourceGroup.ID = resourceGroup - fmt.Printf("\nPlease enter zone: ") - _, _ = fmt.Scanf("%s", &zone) - volume.Az = zone - - //volume.SnapshotSpace = &volSize - //volume.VPCVolume.Tags = []string{"Testing VPC Volume"} volumeObj, errr := sess.CreateVolume(*volume) if errr == nil { ctxLogger.Info("SUCCESSFULLY created volume...", zap.Reflect("volumeObj", volumeObj)) @@ -503,6 +554,63 @@ func main() { ctxLogger.Info("failed to expand================>", zap.Reflect("Volume ID", volumeID), zap.Reflect("Error", er11)) } fmt.Printf("\n\n") + } else if choiceN == 23 { + fmt.Println("You selected choice to update volume (bandwidth/iops/name/tags)") + var newIops, newBandwidth int + var newName, tagsInput string + + fmt.Printf("Enter Volume ID to update: ") + _, _ = fmt.Scanf("%s", &volumeID) + + volume := provider.Volume{} + volume.VolumeID = volumeID + + fmt.Printf("Enter new IOPS (0 to skip): ") + _, _ = fmt.Scanf("%d", &newIops) + if newIops > 0 { + iopsStr := strconv.Itoa(newIops) + volume.Iops = &iopsStr + } + + fmt.Printf("Enter new Bandwidth (0 to skip): ") + _, _ = fmt.Scanf("%d", &newBandwidth) + if newBandwidth > 0 { + bwStr := strconv.Itoa(newBandwidth) + volume.Bandwidth = &bwStr + } + + fmt.Printf("Enter new Volume Name (leave blank to skip): ") + _, _ = fmt.Scanf("%s", &newName) + if newName != "" { + volume.Name = &newName + } + + fmt.Printf("Enter comma-separated tags (key=value) (optional): ") + _, _ = fmt.Scanf("%s", &tagsInput) + if tagsInput != "" { + tagsMap := map[string]string{} + pairs := strings.Split(tagsInput, ",") + for _, pair := range pairs { + kv := strings.SplitN(pair, "=", 2) + if len(kv) == 2 { + tagsMap[strings.TrimSpace(kv[0])] = strings.TrimSpace(kv[1]) + } + } + volume.Tags = tagsMap + } + + if volume.Iops == nil && volume.Bandwidth == nil && volume.Name == nil && len(volume.Tags) == 0 { + fmt.Println("Nothing to update.") + } else { + err = sess.UpdateVolume(volume) + if err != nil { + err = updateRequestID(err, requestID) + ctxLogger.Error("Update volume failed", zap.Reflect("VolumeID", volumeID), zap.Reflect("Error", err)) + } else { + ctxLogger.Info("Volume update successful", zap.Reflect("VolumeID", volumeID)) + } + } + fmt.Printf("\n\n") } else { fmt.Println("No right choice") return From 06de369afe76b4d7fa422a8857ff58dec27248d0 Mon Sep 17 00:00:00 2001 From: Renuka Date: Tue, 24 Jun 2025 19:31:21 +0530 Subject: [PATCH 2/3] updated the branch to from master to regional_rfs and also i have added --signoff flag during commit Signed-off-by: Renuka --- Makefile | 4 +-- common/vpcclient/client/request.go | 2 +- e2e/pvc_tests.go | 4 +-- e2e/testsuites/baseutils.go | 30 ++++++++++----------- e2e/testsuites/test_statefulset.go | 2 +- file/provider/create_volume.go | 42 +++++++++++++++++++++++++----- file/provider/update_volume.go | 14 ++++++++++ iks/provider/update_volume.go | 2 +- pkg/metadata/metadata.go | 2 +- pkg/watcher/pv_watcher.go | 2 +- samples/main.go | 10 ++++++- test-fixtures/slconfig.toml | 6 ++--- 12 files changed, 85 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index e6b9ba6c..436ffe5a 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ fmt: .PHONY: dofmt dofmt: - golangci-lint run --disable-all --enable=gofmt --fix + golangci-lint run --fix --config=.golangci.yml .PHONY: lint lint: @@ -32,7 +32,7 @@ makefmt: .PHONY: build build: - go build -gcflags '-N -l' -o libSample samples/main.go samples/volume_operations.go + go build -gcflags '-N -l' -o libSample samples/main.go .PHONY: test test: diff --git a/common/vpcclient/client/request.go b/common/vpcclient/client/request.go index dbdf35cd..bbf41aee 100644 --- a/common/vpcclient/client/request.go +++ b/common/vpcclient/client/request.go @@ -79,7 +79,7 @@ type ResponseConsumer interface { func (r *Request) path() string { path := r.operation.PathPattern for k, v := range r.pathParams { - path = strings.Replace(path, "{"+k+"}", v, -1) + path = strings.ReplaceAll(path, "{"+k+"}", v) } return path } diff --git a/e2e/pvc_tests.go b/e2e/pvc_tests.go index 3b321486..1cefbf9c 100644 --- a/e2e/pvc_tests.go +++ b/e2e/pvc_tests.go @@ -113,7 +113,7 @@ var _ = Describe("[ics-e2e] [sc] [with-deploy] [retain] Dynamic Provisioning usi ReplicaCount: replicaCount, } test.Run(cs, ns) - if _, err = fpointer.WriteString(fmt.Sprintf("VPC-FILE-CSI-TEST: VERIFYING PVC CREATE/DELETE WITH %s STORAGE CLASS : PASS\n", sc_retain)); err != nil { + if _, err = fmt.Fprintf(fpointer, "VPC-FILE-CSI-TEST: VERIFYING PVC CREATE/DELETE WITH %s STORAGE CLASS : PASS\n", sc_retain); err != nil { panic(err) } }) @@ -181,7 +181,7 @@ var _ = Describe("[ics-e2e] [sc] [with-deploy] Dynamic Provisioning for dp2 SC w ReplicaCount: replicaCount, } test.Run(cs, ns) - if _, err = fpointer.WriteString(fmt.Sprintf("VPC-FILE-CSI-TEST: VERIFYING PVC CREATE/DELETE WITH %s STORAGE CLASS : PASS\n", sc)); err != nil { + if _, err = fmt.Fprintf(fpointer, "VPC-FILE-CSI-TEST: VERIFYING PVC CREATE/DELETE WITH %s STORAGE CLASS : PASS\n", sc); err != nil { panic(err) } }) diff --git a/e2e/testsuites/baseutils.go b/e2e/testsuites/baseutils.go index 08bb4789..6be149a0 100644 --- a/e2e/testsuites/baseutils.go +++ b/e2e/testsuites/baseutils.go @@ -606,8 +606,8 @@ func (t *TestPersistentVolumeClaim) ValidateProvisionedPersistentVolume() { framework.Logf("checking PV [%s]", t.persistentVolume.Name) expectedAccessModes := t.requestedPersistentVolumeClaim.Spec.AccessModes Expect(t.persistentVolume.Spec.AccessModes).To(Equal(expectedAccessModes)) - Expect(t.persistentVolume.Spec.ClaimRef.Name).To(Equal(t.persistentVolumeClaim.ObjectMeta.Name)) - Expect(t.persistentVolume.Spec.ClaimRef.Namespace).To(Equal(t.persistentVolumeClaim.ObjectMeta.Namespace)) + Expect(t.persistentVolume.Spec.ClaimRef.Name).To(Equal(t.persistentVolumeClaim.Name)) + Expect(t.persistentVolume.Spec.ClaimRef.Namespace).To(Equal(t.persistentVolumeClaim.Namespace)) // If storageClass is nil, PV was pre-provisioned with these values already set if t.storageClass != nil { Expect(t.persistentVolume.Spec.PersistentVolumeReclaimPolicy).To(Equal(*t.storageClass.ReclaimPolicy)) @@ -686,12 +686,12 @@ func generatePVC(name, namespace, func (t *TestPersistentVolumeClaim) Cleanup() { var volumeHandle []string - if strings.Contains(t.persistentVolume.Spec.PersistentVolumeSource.CSI.VolumeHandle, VolumeIDSeperator) { + if strings.Contains(t.persistentVolume.Spec.CSI.VolumeHandle, VolumeIDSeperator) { //Volume ID is in format volumeID#volumeAccessPointID - volumeHandle = strings.Split(t.persistentVolume.Spec.PersistentVolumeSource.CSI.VolumeHandle, VolumeIDSeperator) + volumeHandle = strings.Split(t.persistentVolume.Spec.CSI.VolumeHandle, VolumeIDSeperator) } else { //Deprecated -- Try for volumeID:volumeAccessPointID, support for old format for few releases. - volumeHandle = strings.Split(t.persistentVolume.Spec.PersistentVolumeSource.CSI.VolumeHandle, DeprecatedVolumeIDSeperator) + volumeHandle = strings.Split(t.persistentVolume.Spec.CSI.VolumeHandle, DeprecatedVolumeIDSeperator) } getShareMountTargetOptions := &vpcbetav1.GetShareMountTargetOptions{ @@ -700,7 +700,7 @@ func (t *TestPersistentVolumeClaim) Cleanup() { } By(fmt.Sprintf("Logging volumeHandle: %s", volumeHandle)) - By(fmt.Sprintf("Verifying if file share mount target is created")) + By("Verifying if file share mount target is created") shareMountTarget, response, err := VPCService.GetShareMountTarget(getShareMountTargetOptions) if err != nil { panic(err) @@ -711,7 +711,7 @@ func (t *TestPersistentVolumeClaim) Cleanup() { Expect(response.StatusCode).To(Equal(200)) Expect(shareMountTarget).ToNot(BeNil()) - By(fmt.Sprintf("Verifying if VNI is created")) + By("Verifying if VNI is created") if *(shareMountTarget.AccessControlMode) == "security_group" { getVirtualNetworkInterfaceOptions := &vpcbetav1.GetVirtualNetworkInterfaceOptions{ @@ -761,13 +761,13 @@ func (t *TestPersistentVolumeClaim) Cleanup() { ID: &volumeHandle[1], } - By(fmt.Sprintf("Deleting file share target")) + By("Deleting file share target") shareMountTarget, response, err := VPCService.DeleteShareMountTarget(deleteShareMountTargetOptions) if err != nil { panic(err) } - By(fmt.Sprintf("Wating for file share target to be deleted")) + By("Wating for file share target to be deleted") // end-delete_share_mount_target time.Sleep(1 * time.Minute) @@ -779,7 +779,7 @@ func (t *TestPersistentVolumeClaim) Cleanup() { ID: &volumeHandle[0], } - By(fmt.Sprintf("Deleting file share")) + By("Deleting file share") share, response, err := VPCService.DeleteShare(deleteShareOptions) if err != nil { panic(err) @@ -792,11 +792,11 @@ func (t *TestPersistentVolumeClaim) Cleanup() { Expect(share).ToNot(BeNil()) } - By(fmt.Sprintf("Wating for file share to be deleted")) + By("Wating for file share to be deleted") // end-delete_share_mount_target time.Sleep(30 * time.Second) - By(fmt.Sprintf("Verying if VNI is deleted")) + By("Verying if VNI is deleted") //Verifying if VNI is deleted if *(shareMountTarget.AccessControlMode) == "security_group" { @@ -812,7 +812,7 @@ func (t *TestPersistentVolumeClaim) Cleanup() { Expect(virtualNetworkInterface).To(BeNil()) } - By(fmt.Sprintf("Verying if shareMountTarget is deleted")) + By("Verying if shareMountTarget is deleted") //Verifying if shareMountTarget is deleted shareMountTarget, response, err = VPCService.GetShareMountTarget(getShareMountTargetOptions) // end-get_share_mount_target @@ -821,7 +821,7 @@ func (t *TestPersistentVolumeClaim) Cleanup() { Expect(response.StatusCode).To(Equal(404)) Expect(shareMountTarget).To(BeNil()) - By(fmt.Sprintf("Verying if share is deleted")) + By("Verying if share is deleted") //Verifying if share is deleted getShareOptions := &vpcbetav1.GetShareOptions{ ID: &volumeHandle[1], @@ -1321,7 +1321,7 @@ func (t *TestVolumeSnapshotClass) ReadyToUse(snapshot *volumesnapshotv1.VolumeSn } return *vs.Status.ReadyToUse, nil }) - if snapFail == true { + if snapFail { Expect(err).To(HaveOccurred()) } else { framework.ExpectNoError(err) diff --git a/e2e/testsuites/test_statefulset.go b/e2e/testsuites/test_statefulset.go index 4c029e10..24833851 100644 --- a/e2e/testsuites/test_statefulset.go +++ b/e2e/testsuites/test_statefulset.go @@ -50,7 +50,7 @@ func (t *StatefulsetWithVolWRTest) Run(client clientset.Interface, namespace *v1 By("checking pod exec before pod delete") tStatefulset.Exec(t.PodCheck.Cmd, t.PodCheck.ExpectedString01) } - if drainNode == true { + if drainNode { tStatefulset.drainNode() defer tStatefulset.uncordonNode() By("checking again that the pod(s) is/are running") diff --git a/file/provider/create_volume.go b/file/provider/create_volume.go index 77ffbe16..42bd41fd 100644 --- a/file/provider/create_volume.go +++ b/file/provider/create_volume.go @@ -33,14 +33,20 @@ const ( minSize = 10 //10 GB maxSize = 16000 //16 TB customProfile = "custom-iops" +<<<<<<< Updated upstream ) var ( SupportedProfiles = []string{"dp2", "rfs"} IOPSAllowedProfiles = []string{"dp2"} BandwidthAllowedProfiles = []string{"rfs"} +======= + //dp2Profile = "dp2" +>>>>>>> Stashed changes ) +var Profiles = []string{"dp2", "rfs"} + // CreateVolume creates file share func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeResponse *provider.Volume, err error) { vpcs.Logger.Debug("Entry of CreateVolume method...") @@ -65,7 +71,7 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo AccessControlMode: volumeRequest.AccessControlMode, ResourceGroup: &resourceGroup, Profile: &models.Profile{ - Name: volumeRequest.VPCVolume.Profile.Name, + Name: volumeRequest.Profile.Name, }, Bandwidth: func() *int64 { profile := volumeRequest.VPCVolume.Profile.Name @@ -117,8 +123,8 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo } var encryptionKeyCRN string - if volumeRequest.VPCVolume.VolumeEncryptionKey != nil && len(volumeRequest.VPCVolume.VolumeEncryptionKey.CRN) > 0 { - encryptionKeyCRN = volumeRequest.VPCVolume.VolumeEncryptionKey.CRN + if volumeRequest.VolumeEncryptionKey != nil && len(volumeRequest.VolumeEncryptionKey.CRN) > 0 { + encryptionKeyCRN = volumeRequest.VolumeEncryptionKey.CRN shareTemplate.EncryptionKey = &models.EncryptionKey{CRN: encryptionKeyCRN} } @@ -195,6 +201,7 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, if volumeRequest.Iops != nil { iops = ToInt64(*volumeRequest.Iops) } +<<<<<<< Updated upstream if volumeRequest.Bandwidth != nil { bandwidth = ToInt64(*volumeRequest.Bandwidth) @@ -219,14 +226,35 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, if volumeRequest.VPCVolume.ResourceGroup == nil { return resourceGroup, iops, bandwidth, userError.GetUserError("EmptyResourceGroup", nil) +======= + if volumeRequest.Profile == nil { + return resourceGroup, iops, userError.GetUserError("VolumeProfileEmpty", nil) + } + // if volumeRequest.VPCVolume.Profile.Name != customProfile && volumeRequest.VPCVolume.Profile.Name != dp2Profile && iops > 0 { + // return resourceGroup, iops, userError.GetUserError("VolumeProfileIopsInvalid", nil) + // } + + if volumeRequest.Profile.Name != customProfile && !contains(Profiles, volumeRequest.Profile.Name) && iops > 0 { + return resourceGroup, iops, userError.GetUserError("VolumeProfileIopsInvalid", nil) + } + + // validate and add resource group ID or Name whichever is provided by user + if volumeRequest.ResourceGroup == nil { + return resourceGroup, iops, userError.GetUserError("EmptyResourceGroup", nil) + } + + // validate and add resource group ID or Name whichever is provided by user + if len(volumeRequest.ResourceGroup.ID) == 0 && len(volumeRequest.ResourceGroup.Name) == 0 { + return resourceGroup, iops, userError.GetUserError("EmptyResourceGroupIDandName", nil) +>>>>>>> Stashed changes } - if len(volumeRequest.VPCVolume.ResourceGroup.ID) > 0 { - resourceGroup.ID = volumeRequest.VPCVolume.ResourceGroup.ID + if len(volumeRequest.ResourceGroup.ID) > 0 { + resourceGroup.ID = volumeRequest.ResourceGroup.ID } - if len(volumeRequest.VPCVolume.ResourceGroup.Name) > 0 { + if len(volumeRequest.ResourceGroup.Name) > 0 { // get the resource group ID from resource group name as Name is not supported by RIaaS - resourceGroup.Name = volumeRequest.VPCVolume.ResourceGroup.Name + resourceGroup.Name = volumeRequest.ResourceGroup.Name } return resourceGroup, iops, bandwidth, nil diff --git a/file/provider/update_volume.go b/file/provider/update_volume.go index 4fc75e0a..2a1866c4 100644 --- a/file/provider/update_volume.go +++ b/file/provider/update_volume.go @@ -62,6 +62,7 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { return userError.GetUserError("VolumeNotInValidState", err, volumeTemplate.VolumeID) } +<<<<<<< Updated upstream vpcs.Logger.Info("Volume got valid (stable) state", zap.Reflect("etag", etag)) // Tag check using new map-based tags @@ -100,6 +101,19 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { if !shouldUpdate { vpcs.Logger.Info("No changes detected, skipping update call") return nil +======= + //If tags are equal then skip the UpdateFileShare RIAAS API call + if ifTagsEqual(existShare.UserTags, volumeTemplate.Tags) { + vpcs.Logger.Info("There is no change in user tags for volume, skipping the updateVolume for VPC IaaS... ", zap.Reflect("existShare", existShare.UserTags), zap.Reflect("volumeRequest", volumeTemplate.Tags)) + return nil + } + + //Append the existing tags with the requested input tags + existShare.UserTags = append(existShare.UserTags, volumeTemplate.Tags...) + + volume := &models.Share{ + UserTags: existShare.UserTags, +>>>>>>> Stashed changes } vpcs.Logger.Info("Calling VPC provider for volume UpdateVolumeWithTags...", diff --git a/iks/provider/update_volume.go b/iks/provider/update_volume.go index df0e0f87..760bd2ca 100644 --- a/iks/provider/update_volume.go +++ b/iks/provider/update_volume.go @@ -91,7 +91,7 @@ func NewUpdatePVC(volumeRequest provider.Volume) provider.UpdatePVC { pvc := provider.UpdatePVC{ ID: volumeRequest.VolumeID, CRN: volumeRequest.CRN, - Tags: volumeRequest.VPCVolume.Tags, + Tags: volumeRequest.Tags, Provider: string(volumeRequest.Provider), VolumeType: string(volumeRequest.VolumeType), } diff --git a/pkg/metadata/metadata.go b/pkg/metadata/metadata.go index 687217a7..0de7b996 100644 --- a/pkg/metadata/metadata.go +++ b/pkg/metadata/metadata.go @@ -94,7 +94,7 @@ func (nodeManager *NodeInfoManager) NewNodeMetadata(logger *zap.Logger) (NodeMet return nil, err } - nodeLabels := node.ObjectMeta.Labels + nodeLabels := node.Labels if len(nodeLabels[NodeRegionLabel]) == 0 || len(nodeLabels[NodeZoneLabel]) == 0 { errorMsg := fmt.Errorf("One or few required node label(s) is/are missing [%s, %s]. Node Labels Found = [#%v]", NodeRegionLabel, NodeZoneLabel, nodeLabels) //nolint:golint return nil, errorMsg diff --git a/pkg/watcher/pv_watcher.go b/pkg/watcher/pv_watcher.go index 7f48c500..3399cf5c 100644 --- a/pkg/watcher/pv_watcher.go +++ b/pkg/watcher/pv_watcher.go @@ -253,7 +253,7 @@ func (pvw *PVWatcher) getTags(pv *v1.PersistentVolume, ctxLogger *zap.Logger) (s tags = append(tags, StorageClassTag+pv.Spec.StorageClassName) tags = append(tags, NameSpaceTag+pv.Spec.ClaimRef.Namespace) tags = append(tags, PVCNameTag+pv.Spec.ClaimRef.Name) - tags = append(tags, PVNameTag+pv.ObjectMeta.Name) + tags = append(tags, PVNameTag+pv.Name) tags = append(tags, ProvisionerTag+pvw.provisionerName) ctxLogger.Debug("Exit getTags()", zap.String("VolumeCRN", volAttributes[VolumeCRN]), zap.Reflect("tags", tags)) return volAttributes[VolumeCRN], tags diff --git a/samples/main.go b/samples/main.go index 73b5d0e2..41e93fa3 100644 --- a/samples/main.go +++ b/samples/main.go @@ -224,7 +224,7 @@ func main() { } */ - volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} + volume.ResourceGroup = &provider.ResourceGroup{} var ( profile string @@ -247,6 +247,7 @@ func main() { fmt.Printf("\nPlease enter profile name (supported: dp2, rfs, tier-10iops, tier-5iops, tier-3iops): ") _, _ = fmt.Scanf("%s", &profile) +<<<<<<< Updated upstream caps, ok := supportedProfiles[profile] if !ok { @@ -279,6 +280,9 @@ func main() { volume.Bandwidth = &bandwidthStr } } +======= + volume.Profile = &provider.Profile{Name: profile} +>>>>>>> Stashed changes fmt.Printf("\nPlease enter volume name: ") _, _ = fmt.Scanf("%s", &volumeName) @@ -292,10 +296,14 @@ func main() { fmt.Printf("\nPlease enter resource group ID: ") _, _ = fmt.Scanf("%s", &resourceGroup) +<<<<<<< Updated upstream if volume.VPCVolume.ResourceGroup == nil { volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} } volume.VPCVolume.ResourceGroup.ID = resourceGroup +======= + volume.ResourceGroup.ID = resourceGroup +>>>>>>> Stashed changes volumeObj, errr := sess.CreateVolume(*volume) if errr == nil { diff --git a/test-fixtures/slconfig.toml b/test-fixtures/slconfig.toml index b7e386f3..c27f7d72 100644 --- a/test-fixtures/slconfig.toml +++ b/test-fixtures/slconfig.toml @@ -4,10 +4,10 @@ [vpc] vpc_enabled = true g2_token_exchange_endpoint_url = "https://iam.stage1.bluemix.net" - g2_riaas_endpoint_url = "https://us-south-stage01.iaasdev.cloud.ibm.com/" - g2_riaas_endpoint_private_url = "https://us-south-stage01.iaasdev.cloud.ibm.com" + g2_riaas_endpoint_url = "https://us-south-genesis-dal-dev50-etcd.iaasdev.cloud.ibm.com/" + g2_riaas_endpoint_private_url = "https://us-south-genesis-dal-dev50-etcd.iaasdev.cloud.ibm.com" g2_resource_group_id = "" - g2_api_key = "api-key" + g2_api_key = "ubiMcbyZ07DGA1lTBL1Ot7_BB4BHjC8o1Nea_vgIfbhG" provider_type = "g2" vpc_block_provider_name = "vpc" vpc_volume_type="vpc-block" From c436eb2411a63459d4d65127d142268801a537b6 Mon Sep 17 00:00:00 2001 From: Renuka Date: Tue, 24 Jun 2025 20:37:51 +0530 Subject: [PATCH 3/3] resolved travis issue Signed-off-by: Renuka --- file/provider/create_volume.go | 42 ++++++---------------------------- file/provider/update_volume.go | 14 ------------ samples/main.go | 10 +------- 3 files changed, 8 insertions(+), 58 deletions(-) diff --git a/file/provider/create_volume.go b/file/provider/create_volume.go index 42bd41fd..77ffbe16 100644 --- a/file/provider/create_volume.go +++ b/file/provider/create_volume.go @@ -33,20 +33,14 @@ const ( minSize = 10 //10 GB maxSize = 16000 //16 TB customProfile = "custom-iops" -<<<<<<< Updated upstream ) var ( SupportedProfiles = []string{"dp2", "rfs"} IOPSAllowedProfiles = []string{"dp2"} BandwidthAllowedProfiles = []string{"rfs"} -======= - //dp2Profile = "dp2" ->>>>>>> Stashed changes ) -var Profiles = []string{"dp2", "rfs"} - // CreateVolume creates file share func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeResponse *provider.Volume, err error) { vpcs.Logger.Debug("Entry of CreateVolume method...") @@ -71,7 +65,7 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo AccessControlMode: volumeRequest.AccessControlMode, ResourceGroup: &resourceGroup, Profile: &models.Profile{ - Name: volumeRequest.Profile.Name, + Name: volumeRequest.VPCVolume.Profile.Name, }, Bandwidth: func() *int64 { profile := volumeRequest.VPCVolume.Profile.Name @@ -123,8 +117,8 @@ func (vpcs *VPCSession) CreateVolume(volumeRequest provider.Volume) (volumeRespo } var encryptionKeyCRN string - if volumeRequest.VolumeEncryptionKey != nil && len(volumeRequest.VolumeEncryptionKey.CRN) > 0 { - encryptionKeyCRN = volumeRequest.VolumeEncryptionKey.CRN + if volumeRequest.VPCVolume.VolumeEncryptionKey != nil && len(volumeRequest.VPCVolume.VolumeEncryptionKey.CRN) > 0 { + encryptionKeyCRN = volumeRequest.VPCVolume.VolumeEncryptionKey.CRN shareTemplate.EncryptionKey = &models.EncryptionKey{CRN: encryptionKeyCRN} } @@ -201,7 +195,6 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, if volumeRequest.Iops != nil { iops = ToInt64(*volumeRequest.Iops) } -<<<<<<< Updated upstream if volumeRequest.Bandwidth != nil { bandwidth = ToInt64(*volumeRequest.Bandwidth) @@ -226,35 +219,14 @@ func validateVolumeRequest(volumeRequest provider.Volume) (models.ResourceGroup, if volumeRequest.VPCVolume.ResourceGroup == nil { return resourceGroup, iops, bandwidth, userError.GetUserError("EmptyResourceGroup", nil) -======= - if volumeRequest.Profile == nil { - return resourceGroup, iops, userError.GetUserError("VolumeProfileEmpty", nil) - } - // if volumeRequest.VPCVolume.Profile.Name != customProfile && volumeRequest.VPCVolume.Profile.Name != dp2Profile && iops > 0 { - // return resourceGroup, iops, userError.GetUserError("VolumeProfileIopsInvalid", nil) - // } - - if volumeRequest.Profile.Name != customProfile && !contains(Profiles, volumeRequest.Profile.Name) && iops > 0 { - return resourceGroup, iops, userError.GetUserError("VolumeProfileIopsInvalid", nil) - } - - // validate and add resource group ID or Name whichever is provided by user - if volumeRequest.ResourceGroup == nil { - return resourceGroup, iops, userError.GetUserError("EmptyResourceGroup", nil) - } - - // validate and add resource group ID or Name whichever is provided by user - if len(volumeRequest.ResourceGroup.ID) == 0 && len(volumeRequest.ResourceGroup.Name) == 0 { - return resourceGroup, iops, userError.GetUserError("EmptyResourceGroupIDandName", nil) ->>>>>>> Stashed changes } - if len(volumeRequest.ResourceGroup.ID) > 0 { - resourceGroup.ID = volumeRequest.ResourceGroup.ID + if len(volumeRequest.VPCVolume.ResourceGroup.ID) > 0 { + resourceGroup.ID = volumeRequest.VPCVolume.ResourceGroup.ID } - if len(volumeRequest.ResourceGroup.Name) > 0 { + if len(volumeRequest.VPCVolume.ResourceGroup.Name) > 0 { // get the resource group ID from resource group name as Name is not supported by RIaaS - resourceGroup.Name = volumeRequest.ResourceGroup.Name + resourceGroup.Name = volumeRequest.VPCVolume.ResourceGroup.Name } return resourceGroup, iops, bandwidth, nil diff --git a/file/provider/update_volume.go b/file/provider/update_volume.go index 2a1866c4..4fc75e0a 100644 --- a/file/provider/update_volume.go +++ b/file/provider/update_volume.go @@ -62,7 +62,6 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { return userError.GetUserError("VolumeNotInValidState", err, volumeTemplate.VolumeID) } -<<<<<<< Updated upstream vpcs.Logger.Info("Volume got valid (stable) state", zap.Reflect("etag", etag)) // Tag check using new map-based tags @@ -101,19 +100,6 @@ func (vpcs *VPCSession) UpdateVolume(volumeTemplate provider.Volume) error { if !shouldUpdate { vpcs.Logger.Info("No changes detected, skipping update call") return nil -======= - //If tags are equal then skip the UpdateFileShare RIAAS API call - if ifTagsEqual(existShare.UserTags, volumeTemplate.Tags) { - vpcs.Logger.Info("There is no change in user tags for volume, skipping the updateVolume for VPC IaaS... ", zap.Reflect("existShare", existShare.UserTags), zap.Reflect("volumeRequest", volumeTemplate.Tags)) - return nil - } - - //Append the existing tags with the requested input tags - existShare.UserTags = append(existShare.UserTags, volumeTemplate.Tags...) - - volume := &models.Share{ - UserTags: existShare.UserTags, ->>>>>>> Stashed changes } vpcs.Logger.Info("Calling VPC provider for volume UpdateVolumeWithTags...", diff --git a/samples/main.go b/samples/main.go index 41e93fa3..73b5d0e2 100644 --- a/samples/main.go +++ b/samples/main.go @@ -224,7 +224,7 @@ func main() { } */ - volume.ResourceGroup = &provider.ResourceGroup{} + volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} var ( profile string @@ -247,7 +247,6 @@ func main() { fmt.Printf("\nPlease enter profile name (supported: dp2, rfs, tier-10iops, tier-5iops, tier-3iops): ") _, _ = fmt.Scanf("%s", &profile) -<<<<<<< Updated upstream caps, ok := supportedProfiles[profile] if !ok { @@ -280,9 +279,6 @@ func main() { volume.Bandwidth = &bandwidthStr } } -======= - volume.Profile = &provider.Profile{Name: profile} ->>>>>>> Stashed changes fmt.Printf("\nPlease enter volume name: ") _, _ = fmt.Scanf("%s", &volumeName) @@ -296,14 +292,10 @@ func main() { fmt.Printf("\nPlease enter resource group ID: ") _, _ = fmt.Scanf("%s", &resourceGroup) -<<<<<<< Updated upstream if volume.VPCVolume.ResourceGroup == nil { volume.VPCVolume.ResourceGroup = &provider.ResourceGroup{} } volume.VPCVolume.ResourceGroup.ID = resourceGroup -======= - volume.ResourceGroup.ID = resourceGroup ->>>>>>> Stashed changes volumeObj, errr := sess.CreateVolume(*volume) if errr == nil {