@@ -451,17 +451,12 @@ func (c *ShareManagerController) syncShareManagerEndpoint(sm *longhorn.ShareMana
451
451
return nil
452
452
}
453
453
454
- storageNetwork , err := c .ds . GetSettingWithAutoFillingRO ( types . SettingNameStorageNetwork )
454
+ storageNetworkForRWXVolume , err := c .isStorageNetworkForRWXVolume ( )
455
455
if err != nil {
456
456
return err
457
457
}
458
458
459
- storageNetworkForRWXVolumeEnabled , err := c .ds .GetSettingAsBool (types .SettingNameStorageNetworkForRWXVolumeEnabled )
460
- if err != nil {
461
- return err
462
- }
463
-
464
- if types .IsStorageNetworkForRWXVolume (storageNetwork , storageNetworkForRWXVolumeEnabled ) {
459
+ if storageNetworkForRWXVolume {
465
460
serviceFqdn := fmt .Sprintf ("%v.%v.svc.cluster.local" , sm .Name , sm .Namespace )
466
461
sm .Status .Endpoint = fmt .Sprintf ("nfs://%v/%v" , serviceFqdn , sm .Name )
467
462
} else {
@@ -1050,6 +1045,97 @@ func (c *ShareManagerController) getShareManagerTolerationsFromStorageClass(sc *
1050
1045
return tolerations
1051
1046
}
1052
1047
1048
+ func (c * ShareManagerController ) isStorageNetworkForRWXVolume () (bool , error ) {
1049
+ storageNetwork , err := c .ds .GetSettingWithAutoFillingRO (types .SettingNameStorageNetwork )
1050
+ if err != nil {
1051
+ return false , errors .Wrapf (err , "failed to get setting value %v" , types .SettingNameStorageNetwork )
1052
+ }
1053
+
1054
+ storageNetworkForRWXVolumeEnabled , err := c .ds .GetSettingAsBool (types .SettingNameStorageNetworkForRWXVolumeEnabled )
1055
+ if err != nil {
1056
+ return false , errors .Wrapf (err , "failed to get setting value %v" , types .SettingNameStorageNetworkForRWXVolumeEnabled )
1057
+ }
1058
+
1059
+ return types .IsStorageNetworkForRWXVolume (storageNetwork , storageNetworkForRWXVolumeEnabled ), nil
1060
+ }
1061
+
1062
+ func (c * ShareManagerController ) checkStorageNetworkApplied () (bool , error ) {
1063
+ targetSettings := []types.SettingName {types .SettingNameStorageNetwork , types .SettingNameStorageNetworkForRWXVolumeEnabled }
1064
+ for _ , item := range targetSettings {
1065
+ if applied , err := c .ds .GetSettingApplied (item ); err != nil || ! applied {
1066
+ return applied , err
1067
+ }
1068
+ }
1069
+ return true , nil
1070
+ }
1071
+
1072
+ func (c * ShareManagerController ) canCleanupServiceAndEndpoint (ns , shareManagerName string ) (bool , error ) {
1073
+ service , err := c .ds .GetService (c .namespace , shareManagerName )
1074
+ if err != nil {
1075
+ // if NotFound, means the service/endpoint is already cleaned up
1076
+ // The service and endpoint are related with the kubernetes endpoint controller.
1077
+ // It means once the service is deleted, the corresponding endpoint will be deleted automatically.
1078
+ if apierrors .IsNotFound (err ) {
1079
+ return false , nil
1080
+ }
1081
+ return false , errors .Wrap (err , "failed to get service" )
1082
+ }
1083
+
1084
+ // check the settings status of storage network and storage network for RWX volume
1085
+ settingsApplied , err := c .checkStorageNetworkApplied ()
1086
+ if err != nil {
1087
+ return false , errors .Wrap (err , "failed to check if the storage network settings are applied" )
1088
+ }
1089
+ if ! settingsApplied {
1090
+ c .logger .Warn ("Storage network settings are not applied, do nothing" )
1091
+ return false , nil
1092
+ }
1093
+
1094
+ storageNetworkForRWXVolume , err := c .isStorageNetworkForRWXVolume ()
1095
+ if err != nil {
1096
+ return false , err
1097
+ }
1098
+
1099
+ // no need to cleanup because looks the service file is correct
1100
+ if storageNetworkForRWXVolume {
1101
+ if service .Spec .ClusterIP == core .ClusterIPNone {
1102
+ return false , nil
1103
+ }
1104
+ } else {
1105
+ if service .Spec .ClusterIP != core .ClusterIPNone {
1106
+ return false , nil
1107
+ }
1108
+ }
1109
+ return true , nil
1110
+ }
1111
+
1112
+ func (c * ShareManagerController ) cleanupServiceAndEndpoint (shareManager * longhorn.ShareManager ) error {
1113
+ if ok , err := c .canCleanupServiceAndEndpoint (c .namespace , shareManager .Name ); ! ok || err != nil {
1114
+ if err != nil {
1115
+ return errors .Wrapf (err , "failed to check if we can cleanup service and endpoint for share manager %v" , shareManager .Name )
1116
+ }
1117
+ return nil
1118
+ }
1119
+
1120
+ // let's cleanup
1121
+ c .logger .Infof ("Deleting Service for share manager %v" , shareManager .Name )
1122
+ err := c .ds .DeleteService (c .namespace , shareManager .Name )
1123
+ if err != nil && ! apierrors .IsNotFound (err ) {
1124
+ return errors .Wrapf (err , "failed to delete service for share manager %v" , shareManager .Name )
1125
+ }
1126
+
1127
+ c .logger .Infof ("Deleting Endpoint for share manager %v" , shareManager .Name )
1128
+ err = c .ds .DeleteKubernetesEndpoint (c .namespace , shareManager .Name )
1129
+ if err != nil && ! apierrors .IsNotFound (err ) {
1130
+ // we don't return error with the endpoint deletion because the kubernetes
1131
+ // endpoints_controller will sync the service to clean up the corresponding endpoint
1132
+ // https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/endpoint/endpoints_controller.go#L374-L392
1133
+ c .logger .Warnf ("Failed to delete endpoint for share manager %v" , shareManager .Name )
1134
+ }
1135
+
1136
+ return nil
1137
+ }
1138
+
1053
1139
func (c * ShareManagerController ) createServiceAndEndpoint (shareManager * longhorn.ShareManager ) error {
1054
1140
// check if we need to create the service
1055
1141
_ , err := c .ds .GetService (c .namespace , shareManager .Name )
@@ -1122,6 +1208,11 @@ func (c *ShareManagerController) createShareManagerPod(sm *longhorn.ShareManager
1122
1208
}
1123
1209
priorityClass := setting .Value
1124
1210
1211
+ err = c .cleanupServiceAndEndpoint (sm )
1212
+ if err != nil {
1213
+ return nil , errors .Wrapf (err , "failed to cleanup service and endpoint for share manager %v" , sm .Name )
1214
+ }
1215
+
1125
1216
err = c .createServiceAndEndpoint (sm )
1126
1217
if err != nil {
1127
1218
return nil , errors .Wrapf (err , "failed to create service and endpoint for share manager %v" , sm .Name )
@@ -1276,17 +1367,12 @@ func (c *ShareManagerController) createServiceManifest(sm *longhorn.ShareManager
1276
1367
1277
1368
log := getLoggerForShareManager (c .logger , sm )
1278
1369
1279
- storageNetwork , err := c .ds .GetSettingWithAutoFillingRO (types .SettingNameStorageNetwork )
1280
- if err != nil {
1281
- log .WithError (err ).Warnf ("Failed to get %v setting, fallback to cluster IP" , types .SettingNameStorageNetwork )
1282
- }
1283
-
1284
- storageNetworkForRWXVolumeEnabled , err := c .ds .GetSettingAsBool (types .SettingNameStorageNetworkForRWXVolumeEnabled )
1370
+ storageNetworkForRWXVolume , err := c .isStorageNetworkForRWXVolume ()
1285
1371
if err != nil {
1286
- log .WithError (err ).Warnf ("Failed to get %v setting, fallback to cluster IP" , types . SettingNameStorageNetworkForRWXVolumeEnabled )
1372
+ log .WithError (err ).Warnf ("Failed to check storage network for RWX volume" )
1287
1373
}
1288
1374
1289
- if types . IsStorageNetworkForRWXVolume ( storageNetwork , storageNetworkForRWXVolumeEnabled ) {
1375
+ if storageNetworkForRWXVolume {
1290
1376
// Create a headless service do it doesn't use a cluster IP. This allows
1291
1377
// directly reaching the share manager pods using their individual
1292
1378
// IP address.
0 commit comments