Skip to content

Commit b8e8bae

Browse files
committed
fix(networking): cleanup service/endpoint if needed
We meet a corner case that the service/endpoint would not be cleanup. That will cause the service keep the ClusterIP `None`. With this config, the endpoint of sharemanager would not correct. So the CSI driver cannot perform the mountpoint well. We would like to have a checking mechanism to know if the service/ endpoint did not cleanup. Then we will cleanup the service/endpoint to ensure the correct endpoint. Remove the cleanup function in the setting controller, we could do the cleanup on the sm controller Signed-off-by: Vicente Cheng <[email protected]>
1 parent 19ba220 commit b8e8bae

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

controller/setting_controller.go

-8
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,6 @@ func (sc *SettingController) syncDangerZoneSettingsForManagedComponents(settingN
359359
return &types.ErrorInvalidState{Reason: fmt.Sprintf("failed to apply %v setting to Longhorn components when there are attached volumes. It will be eventually applied", types.SettingNameStorageNetworkForRWXVolumeEnabled)}
360360
}
361361

362-
// Perform cleanup of the share manager Service
363-
// This is to allow the creation of the correct Service
364-
// and Endpoint when switching between cluster network
365-
// and storage network.
366-
if err := sc.cleanupShareManagerServiceAndEndpoints(); err != nil {
367-
return err
368-
}
369-
370362
return nil
371363
}
372364

controller/share_manager_controller.go

+64
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,65 @@ func (c *ShareManagerController) getShareManagerTolerationsFromStorageClass(sc *
10501050
return tolerations
10511051
}
10521052

1053+
func (c *ShareManagerController) cleanupServiceAndEndpoint(shareManager *longhorn.ShareManager) error {
1054+
service, err := c.ds.GetService(c.namespace, shareManager.Name)
1055+
if err != nil {
1056+
// if NotFound, means the service/endpoint is already cleaned up
1057+
if apierrors.IsNotFound(err) {
1058+
return nil
1059+
}
1060+
return errors.Wrapf(err, "failed to get service for share manager %v", shareManager.Name)
1061+
}
1062+
1063+
settingStorageNetwork, err := c.ds.GetSetting(types.SettingNameStorageNetwork)
1064+
if err != nil {
1065+
return errors.Wrapf(err, "failed to get setting %v", types.SettingNameStorageNetwork)
1066+
}
1067+
settingStorageNetworkForRWXVolumeEnabled, err := c.ds.GetSetting(types.SettingNameStorageNetworkForRWXVolumeEnabled)
1068+
if err != nil {
1069+
return errors.Wrapf(err, "failed to get setting %v", types.SettingNameStorageNetworkForRWXVolumeEnabled)
1070+
}
1071+
1072+
// make sure the whole storage network setting is applied
1073+
if !settingStorageNetworkForRWXVolumeEnabled.Status.Applied || !settingStorageNetwork.Status.Applied {
1074+
c.logger.Warnf("Setting `StorageNetwork` status: %v or `StorageNetworkForRWXVol` status: %v is not applied, do nothing.", settingStorageNetwork.Status.Applied, settingStorageNetworkForRWXVolumeEnabled.Status.Applied)
1075+
return nil
1076+
}
1077+
1078+
storageNetwork, err := c.ds.GetSettingWithAutoFillingRO(types.SettingNameStorageNetwork)
1079+
if err != nil {
1080+
return errors.Wrapf(err, "failed to get setting value %v", types.SettingNameStorageNetwork)
1081+
}
1082+
1083+
storageNetworkForRWXVolumeEnabled, err := c.ds.GetSettingAsBool(types.SettingNameStorageNetworkForRWXVolumeEnabled)
1084+
if err != nil {
1085+
return errors.Wrapf(err, "failed to get setting value %v", types.SettingNameStorageNetworkForRWXVolumeEnabled)
1086+
}
1087+
1088+
// no need to cleanup because looks the service file is correct
1089+
if types.IsStorageNetworkForRWXVolume(storageNetwork, storageNetworkForRWXVolumeEnabled) && service.Spec.ClusterIP == core.ClusterIPNone {
1090+
return nil
1091+
}
1092+
if !types.IsStorageNetworkForRWXVolume(storageNetwork, storageNetworkForRWXVolumeEnabled) && service.Spec.ClusterIP != core.ClusterIPNone {
1093+
return nil
1094+
}
1095+
1096+
// let's cleanup
1097+
c.logger.Infof("Deleting Service for sharemanager %v", shareManager.Name)
1098+
err = c.ds.DeleteService(c.namespace, shareManager.Name)
1099+
if err != nil && !apierrors.IsNotFound(err) {
1100+
return errors.Wrapf(err, "failed to delete service for share manager %v", shareManager.Name)
1101+
}
1102+
1103+
c.logger.Infof("Deleting Endpoint for sharemanager %v", shareManager.Name)
1104+
err = c.ds.DeleteKubernetesEndpoint(c.namespace, shareManager.Name)
1105+
if err != nil && !apierrors.IsNotFound(err) {
1106+
return errors.Wrapf(err, "failed to delete Endpoint for share manager %v", shareManager.Name)
1107+
}
1108+
1109+
return nil
1110+
}
1111+
10531112
func (c *ShareManagerController) createServiceAndEndpoint(shareManager *longhorn.ShareManager) error {
10541113
// check if we need to create the service
10551114
_, err := c.ds.GetService(c.namespace, shareManager.Name)
@@ -1122,6 +1181,11 @@ func (c *ShareManagerController) createShareManagerPod(sm *longhorn.ShareManager
11221181
}
11231182
priorityClass := setting.Value
11241183

1184+
err = c.cleanupServiceAndEndpoint(sm)
1185+
if err != nil {
1186+
return nil, errors.Wrapf(err, "failed to cleanup service and endpoint for share manager %v", sm.Name)
1187+
}
1188+
11251189
err = c.createServiceAndEndpoint(sm)
11261190
if err != nil {
11271191
return nil, errors.Wrapf(err, "failed to create service and endpoint for share manager %v", sm.Name)

0 commit comments

Comments
 (0)