From 2f11d1b59dcc470031ededc9173c2546495e695a Mon Sep 17 00:00:00 2001 From: Derek Su Date: Sun, 17 Dec 2023 06:56:56 +0000 Subject: [PATCH] datastore: introduce IsBackendStoreDriverV1 and IsBackendStoreDriverV2 Longhorn 7357 Signed-off-by: Derek Su --- controller/engine_controller.go | 12 +++---- controller/engine_image_controller.go | 2 +- controller/instance_handler.go | 10 +++--- controller/instance_manager_controller.go | 4 +-- controller/monitor/disk_monitor.go | 2 +- controller/replica_controller.go | 10 +++--- controller/setting_controller.go | 2 +- controller/volume_controller.go | 42 ++++++++--------------- datastore/longhorn.go | 14 ++++++-- engineapi/engine_binary.go | 2 +- engineapi/instance_manager.go | 5 +-- engineapi/types.go | 3 +- scheduler/replica_scheduler.go | 6 ++-- webhook/resources/engine/validator.go | 2 +- webhook/resources/replica/validator.go | 2 +- webhook/resources/snapshot/validator.go | 2 +- webhook/resources/volume/mutator.go | 7 ++-- webhook/resources/volume/validator.go | 6 ++-- 18 files changed, 65 insertions(+), 68 deletions(-) diff --git a/controller/engine_controller.go b/controller/engine_controller.go index fa517ad8f7..c0fc400e54 100644 --- a/controller/engine_controller.go +++ b/controller/engine_controller.go @@ -311,7 +311,7 @@ func (ec *EngineController) syncEngine(key string) (err error) { }() isCLIAPIVersionOne := false - if engine.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(engine.Spec.BackendStoreDriver) { if engine.Status.CurrentImage != "" { isCLIAPIVersionOne, err = ec.ds.IsEngineImageCLIAPIVersionOne(engine.Status.CurrentImage) if err != nil { @@ -488,7 +488,7 @@ func (ec *EngineController) DeleteInstance(obj interface{}) (err error) { } log := getLoggerForEngine(ec.logger, e) - if e.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(e.Spec.BackendStoreDriver) { err = ec.deleteInstanceWithCLIAPIVersionOne(e) if err != nil { return err @@ -924,8 +924,8 @@ func (m *EngineMonitor) refresh(engine *longhorn.Engine) error { return err } - if (engine.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 && cliAPIVersion >= engineapi.MinCLIVersion) || - (engine.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2) { + if (datastore.IsBackendStoreDriverV1(engine.Spec.BackendStoreDriver) && cliAPIVersion >= engineapi.MinCLIVersion) || + datastore.IsBackendStoreDriverV2(engine.Spec.BackendStoreDriver) { volumeInfo, err := engineClientProxy.VolumeGet(engine) if err != nil { return err @@ -1614,7 +1614,7 @@ func GetBinaryClientForEngine(e *longhorn.Engine, engines engineapi.EngineClient err = errors.Wrapf(err, "cannot get client for engine %v", e.Name) }() - if e.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(e.Spec.BackendStoreDriver) { return nil, nil } @@ -2074,7 +2074,7 @@ func (ec *EngineController) isResponsibleFor(e *longhorn.Engine, defaultEngineIm return isResponsible, nil } - if e.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(e.Spec.BackendStoreDriver) { readyNodesWithEI, err := ec.ds.ListReadyNodesContainingEngineImageRO(e.Status.CurrentImage) if err != nil { return false, errors.Wrapf(err, "failed to list ready nodes containing engine image %v", e.Status.CurrentImage) diff --git a/controller/engine_image_controller.go b/controller/engine_image_controller.go index 62dd020312..45f7d2b638 100644 --- a/controller/engine_image_controller.go +++ b/controller/engine_image_controller.go @@ -436,7 +436,7 @@ func (ic *EngineImageController) handleAutoUpgradeEngineImageToDefaultEngineImag for _, v := range vs { ic.logger.WithFields(logrus.Fields{"volume": v.Name, "image": v.Spec.Image}).Infof("Upgrading volume engine image to the default engine image %v automatically", defaultEngineImage) - if v.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(v.Spec.BackendStoreDriver) { ic.logger.WithFields(logrus.Fields{"volume": v.Name, "image": v.Spec.Image}).Infof("Skip upgrading volume engine image to the default engine image %v automatically since it is using v2 backend store", defaultEngineImage) continue } diff --git a/controller/instance_handler.go b/controller/instance_handler.go index e5fa4ce24c..19ac43c1ad 100644 --- a/controller/instance_handler.go +++ b/controller/instance_handler.go @@ -224,7 +224,7 @@ func (h *InstanceHandler) ReconcileInstanceState(obj interface{}, spec *longhorn } isCLIAPIVersionOne := false - if spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(spec.BackendStoreDriver) { if status.CurrentImage != "" { isCLIAPIVersionOne, err = h.ds.IsEngineImageCLIAPIVersionOne(status.CurrentImage) if err != nil { @@ -262,7 +262,7 @@ func (h *InstanceHandler) ReconcileInstanceState(obj interface{}, spec *longhorn if spec.LogRequested { if !status.LogFetched { // No need to get the log for instance manager if the backend store driver is not "longhorn" - if spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(spec.BackendStoreDriver) { logrus.Warnf("Getting requested log for %v in instance manager %v", instanceName, status.InstanceManagerName) if im == nil { logrus.Warnf("Failed to get the log for %v due to Instance Manager is already gone", status.InstanceManagerName) @@ -381,7 +381,7 @@ func (h *InstanceHandler) ReconcileInstanceState(obj interface{}, spec *longhorn longhorn.InstanceConditionReasonInstanceCreationFailure, instance.Status.ErrorMsg) } - if instance.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(instance.Spec.BackendStoreDriver) { logrus.Warnf("Instance %v crashed on Instance Manager %v at %v, getting log", instanceName, im.Name, im.Spec.NodeID) if err := h.printInstanceLogs(instanceName, runtimeObj); err != nil { @@ -397,7 +397,7 @@ func (h *InstanceHandler) ReconcileInstanceState(obj interface{}, spec *longhorn func shouldDeleteInstance(instance *longhorn.InstanceProcess) bool { // For a replica of a SPDK volume, a stopped replica means the lvol is not exposed, // but the lvol is still there. We don't need to delete it. - if instance.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(instance.Spec.BackendStoreDriver) { if instance.Status.State == longhorn.InstanceStateStopped { return false } @@ -441,7 +441,7 @@ func (h *InstanceHandler) createInstance(instanceName string, backendStoreDriver if err == nil { return nil } - if !types.ErrorIsNotFound(err) && !(backendStoreDriver == longhorn.BackendStoreDriverTypeV2 && types.ErrorIsStopped(err)) { + if !types.ErrorIsNotFound(err) && !(datastore.IsBackendStoreDriverV2(backendStoreDriver) && types.ErrorIsStopped(err)) { return errors.Wrapf(err, "Failed to get instance process %v", instanceName) } diff --git a/controller/instance_manager_controller.go b/controller/instance_manager_controller.go index b7b2e7ae4b..245a5a4b9c 100644 --- a/controller/instance_manager_controller.go +++ b/controller/instance_manager_controller.go @@ -1081,7 +1081,7 @@ func (imc *InstanceManagerController) createInstanceManagerPodSpec(im *longhorn. podSpec.ObjectMeta.Labels = types.GetInstanceManagerLabels(imc.controllerID, im.Spec.Image, longhorn.InstanceManagerTypeAllInOne, backendStoreDriver) podSpec.Spec.Containers[0].Name = "instance-manager" - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(backendStoreDriver) { podSpec.Spec.Containers[0].Args = []string{ "instance-manager", "--enable-spdk", "--debug", "daemon", "--spdk-enabled", "--listen", fmt.Sprintf("0.0.0.0:%d", engineapi.InstanceManagerProcessManagerServiceDefaultPort), } @@ -1176,7 +1176,7 @@ func (imc *InstanceManagerController) createInstanceManagerPodSpec(im *longhorn. }, } - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(backendStoreDriver) { podSpec.Spec.Containers[0].VolumeMounts = append(podSpec.Spec.Containers[0].VolumeMounts, corev1.VolumeMount{ MountPath: "/hugepages", Name: "hugepage", diff --git a/controller/monitor/disk_monitor.go b/controller/monitor/disk_monitor.go index 9e6f712f69..67e7e0fb4c 100644 --- a/controller/monitor/disk_monitor.go +++ b/controller/monitor/disk_monitor.go @@ -227,7 +227,7 @@ func (m *NodeMonitor) collectDiskData(node *longhorn.Node) map[string]*Collected if diskServiceClient == nil { // TODO: disk service is not used by filesystem-type disk, so we can skip it for now. - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(backendStoreDriver) { diskInfoMap[diskName] = NewDiskInfo(disk.Path, "", nodeOrDiskEvicted, nil, orphanedReplicaInstanceNames, string(longhorn.DiskConditionReasonDiskServiceUnreachable), fmt.Sprintf("Disk %v(%v) on node %v is not ready: disk service is unreachable", diff --git a/controller/replica_controller.go b/controller/replica_controller.go index b4507649a9..5a9dd3d48c 100644 --- a/controller/replica_controller.go +++ b/controller/replica_controller.go @@ -249,7 +249,7 @@ func (rc *ReplicaController) syncReplica(key string) (err error) { if replica.Spec.NodeID != "" && replica.Spec.NodeID != rc.controllerID { log.Warn("Failed to cleanup replica's data because the replica's data is not on this node") } else if replica.Spec.NodeID != "" { - if replica.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(replica.Spec.BackendStoreDriver) { // Clean up the data directory if this is the active replica or if this inactive replica is the only one // using it. if (replica.Spec.Active || !hasMatchingReplica(replica, rs)) && dataPath != "" { @@ -503,7 +503,7 @@ func (rc *ReplicaController) DeleteInstance(obj interface{}) error { } log := getLoggerForReplica(rc.logger, r) - if r.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(r.Spec.BackendStoreDriver) { if err := rc.deleteInstanceWithCLIAPIVersionOne(r); err != nil { return err } @@ -572,8 +572,8 @@ func (rc *ReplicaController) DeleteInstance(obj interface{}) error { } func canDeleteInstance(r *longhorn.Replica) bool { - return r.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 || - (r.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 && r.DeletionTimestamp != nil) + return datastore.IsBackendStoreDriverV1(r.Spec.BackendStoreDriver) || + (datastore.IsBackendStoreDriverV2(r.Spec.BackendStoreDriver) && r.DeletionTimestamp != nil) } func deleteUnixSocketFile(volumeName string) error { @@ -669,7 +669,7 @@ func (rc *ReplicaController) GetInstance(obj interface{}) (*longhorn.InstancePro return nil, err } - if instance.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(instance.Spec.BackendStoreDriver) { if instance.Status.State == longhorn.InstanceStateStopped { return nil, fmt.Errorf("instance %v is stopped", instance.Spec.Name) } diff --git a/controller/setting_controller.go b/controller/setting_controller.go index b6d1834939..aab46a23d3 100644 --- a/controller/setting_controller.go +++ b/controller/setting_controller.go @@ -1582,7 +1582,7 @@ func (info *ClusterInfo) collectVolumesInfo() error { // TODO: Remove this condition when v2 volume actual size is implemented. // https://github.com/longhorn/longhorn/issues/5947 - isVolumeUsingV2DataEngine := volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 + isVolumeUsingV2DataEngine := datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) if !isVolumeUsingV2DataEngine { totalVolumeSize += int(volume.Spec.Size) totalVolumeActualSize += int(volume.Status.ActualSize) diff --git a/controller/volume_controller.go b/controller/volume_controller.go index 360ab24cec..c280a9f5e6 100644 --- a/controller/volume_controller.go +++ b/controller/volume_controller.go @@ -776,7 +776,7 @@ func (c *VolumeController) ReconcileEngineReplicaState(v *longhorn.Volume, es ma // 2. the volume is old restore/DR volumes. // 3. the volume is expanding size. isOldRestoreVolume := (v.Status.IsStandby || v.Status.RestoreRequired) && - (e.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 && cliAPIVersion < engineapi.CLIVersionFour) + (datastore.IsBackendStoreDriverV1(e.Spec.BackendStoreDriver) && cliAPIVersion < engineapi.CLIVersionFour) isInExpansion := v.Spec.Size != e.Status.CurrentSize if isMigratingDone && !isOldRestoreVolume && !isInExpansion { if err := c.replenishReplicas(v, e, rs, ""); err != nil { @@ -824,7 +824,7 @@ func areAllReplicasFailed(rs map[string]*longhorn.Replica) bool { } func (c *VolumeController) shouldStopOfflineReplicaRebuilding(v *longhorn.Volume, healthyCount int) (bool, error) { - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { return true, nil } @@ -944,7 +944,7 @@ func (c *VolumeController) cleanupCorruptedOrStaleReplicas(v *longhorn.Volume, r continue } - if v.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { staled := false if v.Spec.StaleReplicaTimeout > 0 && util.TimestampAfterTimeout(r.Spec.FailedAt, time.Duration(int64(v.Spec.StaleReplicaTimeout*60))*time.Second) { @@ -1156,20 +1156,6 @@ func (c *VolumeController) getAutoBalancedReplicasSetting(v *longhorn.Volume) (l return setting, errors.Wrapf(err, "replica auto-balance is disabled") } -func (c *VolumeController) updateReplicaLogRequested(e *longhorn.Engine, rs map[string]*longhorn.Replica) { - needReplicaLogs := false - for _, r := range rs { - if r.Spec.LogRequested && r.Status.LogFetched { - r.Spec.LogRequested = false - } - needReplicaLogs = needReplicaLogs || r.Spec.LogRequested - rs[r.Name] = r - } - if e.Spec.LogRequested && e.Status.LogFetched && !needReplicaLogs { - e.Spec.LogRequested = false - } -} - func (c *VolumeController) isUnmapMarkSnapChainRemovedEnabled(v *longhorn.Volume) (bool, error) { if v.Spec.UnmapMarkSnapChainRemoved != longhorn.UnmapMarkSnapChainRemovedIgnored { return v.Spec.UnmapMarkSnapChainRemoved == longhorn.UnmapMarkSnapChainRemovedEnabled, nil @@ -2083,7 +2069,7 @@ func (c *VolumeController) replenishReplicas(v *longhorn.Volume, e *longhorn.Eng for i := 0; i < replenishCount; i++ { var reusableFailedReplica *longhorn.Replica // TODO: reuse failed replica for replica rebuilding of SPDK volumes - if v.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { reusableFailedReplica, err = c.scheduler.CheckAndReuseFailedReplica(rs, v, hardNodeAffinity) if err != nil { return errors.Wrapf(err, "failed to reuse a failed replica during replica replenishment") @@ -2296,7 +2282,7 @@ func (c *VolumeController) getReplicaCountForAutoBalanceZone(v *longhorn.Volume, } ei := &longhorn.EngineImage{} - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { ei, err = c.getEngineImageRO(v.Status.CurrentImage) if err != nil { return 0, nil, err @@ -2320,7 +2306,7 @@ func (c *VolumeController) getReplicaCountForAutoBalanceZone(v *longhorn.Volume, continue } - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { if isReady, _ := c.ds.CheckEngineImageReadiness(ei.Spec.Image, nodeName); !isReady { log.Warnf("Failed to use node %v, engine image is not ready", nodeName) continue @@ -2445,7 +2431,7 @@ func (c *VolumeController) getReplicaCountForAutoBalanceNode(v *longhorn.Volume, } ei := &longhorn.EngineImage{} - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { ei, err = c.getEngineImageRO(v.Status.CurrentImage) if err != nil { return 0, nodeExtraRs, err @@ -2463,7 +2449,7 @@ func (c *VolumeController) getReplicaCountForAutoBalanceNode(v *longhorn.Volume, continue } - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { if isReady, _ := c.ds.CheckEngineImageReadiness(ei.Spec.Image, node.Name); !isReady { log.Warnf("Failed to use node %v, engine image is not ready", nodeName) delete(readyNodes, nodeName) @@ -2574,7 +2560,7 @@ func (c *VolumeController) getNodeCandidatesForAutoBalanceZone(v *longhorn.Volum } ei := &longhorn.EngineImage{} - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { ei, err = c.getEngineImageRO(v.Status.CurrentImage) if err != nil { return candidateNames @@ -2594,7 +2580,7 @@ func (c *VolumeController) getNodeCandidatesForAutoBalanceZone(v *longhorn.Volum continue } - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { if isReady, _ := c.ds.CheckEngineImageReadiness(ei.Spec.Image, nName); !isReady { // cannot use node, engine image is not ready delete(readyNodes, nName) @@ -2752,7 +2738,7 @@ func (c *VolumeController) upgradeEngineForVolume(v *longhorn.Volume, es map[str volumeAndReplicaNodes = append(volumeAndReplicaNodes, r.Spec.NodeID) } - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { oldImage, err := c.getEngineImageRO(v.Status.CurrentImage) if err != nil { log.WithError(err).Warnf("Failed to get engine image %v for live upgrade", v.Status.CurrentImage) @@ -2904,7 +2890,7 @@ func (c *VolumeController) updateRequestedBackupForVolumeRestore(v *longhorn.Vol func (c *VolumeController) checkAndInitVolumeOfflineReplicaRebuilding(v *longhorn.Volume, rs map[string]*longhorn.Replica) error { log := getLoggerForVolume(c.logger, v) - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { return nil } @@ -3238,7 +3224,7 @@ func (c *VolumeController) createReplica(v *longhorn.Volume, e *longhorn.Engine, } if isRebuildingReplica { // TODO: reuse failed replica for replica rebuilding of SPDK volumes - if v.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(v.Spec.BackendStoreDriver) { if !v.Spec.DisableFrontend || !v.Status.OfflineReplicaRebuildingRequired { log.Tracef("Online replica rebuilding for replica %v is not supported for SPDK volumes", replica.Name) return nil @@ -3953,7 +3939,7 @@ func (c *VolumeController) isResponsibleFor(v *longhorn.Volume, defaultEngineIma isResponsible := isControllerResponsibleFor(c.controllerID, c.ds, v.Name, v.Spec.NodeID, v.Status.OwnerID) - if v.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV1(v.Spec.BackendStoreDriver) { readyNodesWithDefaultEI, err := c.ds.ListReadyNodesContainingEngineImageRO(defaultEngineImage) if err != nil { return false, err diff --git a/datastore/longhorn.go b/datastore/longhorn.go index 68dab59bfa..95da23908d 100644 --- a/datastore/longhorn.go +++ b/datastore/longhorn.go @@ -1766,7 +1766,7 @@ func (s *DataStore) CheckEngineImageReadiness(image string, nodes ...string) (is } func (s *DataStore) CheckImageReadiness(image string, backendStoreDriver longhorn.BackendStoreDriverType, nodes ...string) (isReady bool, err error) { - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if IsBackendStoreDriverV2(backendStoreDriver) { return true, nil } return s.CheckEngineImageReadiness(image, nodes...) @@ -3433,7 +3433,7 @@ func (s *DataStore) GetDataEngineImageCLIAPIVersion(imageName string, backendSto return -1, fmt.Errorf("cannot check the CLI API Version based on empty image name") } - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if IsBackendStoreDriverV2(backendStoreDriver) { return 0, nil } @@ -4851,3 +4851,13 @@ func (s *DataStore) RemoveFinalizerForLHVolumeAttachment(va *longhorn.VolumeAtta func (s *DataStore) DeleteLHVolumeAttachment(vaName string) error { return s.lhClient.LonghornV1beta2().VolumeAttachments(s.namespace).Delete(context.TODO(), vaName, metav1.DeleteOptions{}) } + +// IsBackendStoreDriverV1 returns true if the given backendstoreDriver is v1 +func IsBackendStoreDriverV1(backendstoreDriver longhorn.BackendStoreDriverType) bool { + return backendstoreDriver != longhorn.BackendStoreDriverTypeV2 +} + +// IsBackendStoreDriverV2 returns true if the given backendstoreDriver is v2 +func IsBackendStoreDriverV2(backendstoreDriver longhorn.BackendStoreDriverType) bool { + return backendstoreDriver == longhorn.BackendStoreDriverTypeV2 +} diff --git a/engineapi/engine_binary.go b/engineapi/engine_binary.go index 8075905e32..201b823981 100644 --- a/engineapi/engine_binary.go +++ b/engineapi/engine_binary.go @@ -29,7 +29,7 @@ func GetEngineBinaryClient(ds *datastore.DataStore, volumeName, nodeID string) ( for _, e = range es { break } - if e.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(e.Spec.BackendStoreDriver) { return nil, nil } if e.Status.CurrentState != longhorn.InstanceStateRunning { diff --git a/engineapi/instance_manager.go b/engineapi/instance_manager.go index d7f434683d..0fe36e87ce 100644 --- a/engineapi/instance_manager.go +++ b/engineapi/instance_manager.go @@ -15,6 +15,7 @@ import ( immeta "github.com/longhorn/longhorn-instance-manager/pkg/meta" imutil "github.com/longhorn/longhorn-instance-manager/pkg/util" + "github.com/longhorn/longhorn-manager/datastore" longhorn "github.com/longhorn/longhorn-manager/k8s/pkg/apis/longhorn/v1beta2" "github.com/longhorn/longhorn-manager/types" ) @@ -479,7 +480,7 @@ func (c *InstanceManagerClient) ReplicaInstanceCreate(req *ReplicaInstanceCreate binary := "" args := []string{} - if req.Replica.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 { + if datastore.IsBackendStoreDriverV1(req.Replica.Spec.BackendStoreDriver) { binary, args = getBinaryAndArgsForReplicaProcessCreation(req.Replica, req.DataPath, req.BackingImagePath, req.DataLocality, DefaultReplicaPortCountV1, req.EngineCLIAPIVersion) } @@ -493,7 +494,7 @@ func (c *InstanceManagerClient) ReplicaInstanceCreate(req *ReplicaInstanceCreate } portCount := DefaultReplicaPortCountV1 - if req.Replica.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(req.Replica.Spec.BackendStoreDriver) { portCount = DefaultReplicaPortCountV2 } diff --git a/engineapi/types.go b/engineapi/types.go index 0f30ea3265..6f9bda589f 100644 --- a/engineapi/types.go +++ b/engineapi/types.go @@ -8,6 +8,7 @@ import ( iscsidevtypes "github.com/longhorn/go-iscsi-helper/types" spdkdevtypes "github.com/longhorn/go-spdk-helper/pkg/types" + "github.com/longhorn/longhorn-manager/datastore" longhorn "github.com/longhorn/longhorn-manager/k8s/pkg/apis/longhorn/v1beta2" ) @@ -249,7 +250,7 @@ func GetEngineInstanceFrontend(backendStoreDriver longhorn.BackendStoreDriverTyp switch volumeFrontend { case longhorn.VolumeFrontendBlockDev: frontend = string(iscsidevtypes.FrontendTGTBlockDev) - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(backendStoreDriver) { frontend = string(spdkdevtypes.FrontendSPDKTCPBlockdev) } case longhorn.VolumeFrontendISCSI: diff --git a/scheduler/replica_scheduler.go b/scheduler/replica_scheduler.go index da2827560d..5d26d027d3 100644 --- a/scheduler/replica_scheduler.go +++ b/scheduler/replica_scheduler.go @@ -314,8 +314,8 @@ func (rcs *ReplicaScheduler) filterNodeDisksForReplica(node *longhorn.Node, disk continue } - if !(volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV1 && diskSpec.Type == longhorn.DiskTypeFilesystem) && - !(volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 && diskSpec.Type == longhorn.DiskTypeBlock) { + if !(datastore.IsBackendStoreDriverV1(volume.Spec.BackendStoreDriver) && diskSpec.Type == longhorn.DiskTypeFilesystem) && + !(datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) && diskSpec.Type == longhorn.DiskTypeBlock) { logrus.Debugf("Volume %v is not compatible with disk %v", volume.Name, diskName) continue } @@ -683,7 +683,7 @@ func IsPotentiallyReusableReplica(r *longhorn.Replica, hardNodeAffinity string) return false } // TODO: Reuse failed replicas for a SPDK volume - if r.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(r.Spec.BackendStoreDriver) { return false } return true diff --git a/webhook/resources/engine/validator.go b/webhook/resources/engine/validator.go index 4a81cbf34f..7ac77ea84d 100644 --- a/webhook/resources/engine/validator.go +++ b/webhook/resources/engine/validator.go @@ -52,7 +52,7 @@ func (e *engineValidator) Create(request *admission.Request, newObj runtime.Obje return werror.NewInternalError(err.Error()) } - if engine.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(engine.Spec.BackendStoreDriver) { v2DataEngineEnabled, err := e.ds.GetSettingAsBool(types.SettingNameV2DataEngine) if err != nil { err = errors.Wrapf(err, "failed to get spdk setting") diff --git a/webhook/resources/replica/validator.go b/webhook/resources/replica/validator.go index 519bfe7bf5..44982a7ee5 100644 --- a/webhook/resources/replica/validator.go +++ b/webhook/resources/replica/validator.go @@ -44,7 +44,7 @@ func (r *replicaValidator) Resource() admission.Resource { func (r *replicaValidator) Create(request *admission.Request, newObj runtime.Object) error { replica := newObj.(*longhorn.Replica) - if replica.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(replica.Spec.BackendStoreDriver) { v2DataEngineEnabled, err := r.ds.GetSettingAsBool(types.SettingNameV2DataEngine) if err != nil { err = errors.Wrapf(err, "failed to get spdk setting") diff --git a/webhook/resources/snapshot/validator.go b/webhook/resources/snapshot/validator.go index 394c438d49..a3f1d4a414 100644 --- a/webhook/resources/snapshot/validator.go +++ b/webhook/resources/snapshot/validator.go @@ -57,7 +57,7 @@ func (o *snapshotValidator) Create(request *admission.Request, newObj runtime.Ob err := errors.Wrapf(err, "failed to get volume %v", snapshot.Spec.Volume) return werror.NewInvalidError(err.Error(), "") } - if volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) { err := errors.Errorf("creating snapshot for volume %v with backend store driver %v is not supported", volume.Name, volume.Spec.BackendStoreDriver) return werror.NewInvalidError(err.Error(), "") } diff --git a/webhook/resources/volume/mutator.go b/webhook/resources/volume/mutator.go index 94e45cc170..528f2a4799 100644 --- a/webhook/resources/volume/mutator.go +++ b/webhook/resources/volume/mutator.go @@ -159,7 +159,7 @@ func (v *volumeMutator) Create(request *admission.Request, newObj runtime.Object // Mutate the image to the default one defaultImageSetting := types.SettingNameDefaultEngineImage - if volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) { defaultImageSetting = types.SettingNameDefaultInstanceManagerImage } defaultImage, _ := v.ds.GetSettingValueExisted(defaultImageSetting) @@ -178,7 +178,7 @@ func (v *volumeMutator) Create(request *admission.Request, newObj runtime.Object } // TODO: Remove the mutations below after they are implemented for SPDK volumes - if volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) { if volume.Spec.Encrypted { patchOps = append(patchOps, `{"op": "replace", "path": "/spec/encrypted", "value": false}`) } @@ -295,8 +295,7 @@ func mutate(newObj runtime.Object, moreLabels map[string]string) (admission.Patc if string(volume.Spec.BackendStoreDriver) == "" { patchOps = append(patchOps, fmt.Sprintf(`{"op": "replace", "path": "/spec/backendStoreDriver", "value": "%s"}`, longhorn.BackendStoreDriverTypeV1)) } - if string(volume.Spec.OfflineReplicaRebuilding) == "" && - volume.Spec.BackendStoreDriver != longhorn.BackendStoreDriverTypeV2 { + if string(volume.Spec.OfflineReplicaRebuilding) == "" && datastore.IsBackendStoreDriverV1(volume.Spec.BackendStoreDriver) { // Always mutate the offlineReplicaRebuilding to disabled for non-SPDK volumes patchOps = append(patchOps, fmt.Sprintf(`{"op": "replace", "path": "/spec/offlineReplicaRebuilding", "value": "%s"}`, longhorn.OfflineReplicaRebuildingDisabled)) } diff --git a/webhook/resources/volume/validator.go b/webhook/resources/volume/validator.go index e925b7f469..24faf6a2b9 100644 --- a/webhook/resources/volume/validator.go +++ b/webhook/resources/volume/validator.go @@ -123,7 +123,7 @@ func (v *volumeValidator) Create(request *admission.Request, newObj runtime.Obje return werror.NewInvalidError(err.Error(), "") } - if volume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(volume.Spec.BackendStoreDriver) { v2DataEngineEnabled, err := v.ds.GetSettingAsBool(types.SettingNameV2DataEngine) if err != nil { err = errors.Wrapf(err, "failed to get spdk setting") @@ -217,7 +217,7 @@ func (v *volumeValidator) Update(request *admission.Request, oldObj runtime.Obje } } - if newVolume.Spec.BackendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(newVolume.Spec.BackendStoreDriver) { // TODO: remove this check when we support the following features for SPDK volumes if oldVolume.Spec.Size != newVolume.Spec.Size { err := fmt.Errorf("changing volume size for volume %v is not supported for backend store driver %v", @@ -406,7 +406,7 @@ func validateReplicaCount(dataLocality longhorn.DataLocality, replicaCount int) } func (v *volumeValidator) canDisableRevisionCounter(image string, backendStoreDriver longhorn.BackendStoreDriverType) (bool, error) { - if backendStoreDriver == longhorn.BackendStoreDriverTypeV2 { + if datastore.IsBackendStoreDriverV2(backendStoreDriver) { // v2 volume does not have revision counter return true, nil }