in pkg/common/utils/k8s/client.go [45:70]
func ApplyService(ctx context.Context, k8sclient client.Client, svc *corev1.Service, equal ServiceEqual) error {
// As stated in the RetryOnConflict's documentation, the returned error shouldn't be wrapped.
var esvc corev1.Service
//avoid clusterIps Invalid value failed.
svc.Spec.ClusterIPs = nil
err := k8sclient.Get(ctx, types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace}, &esvc)
if err != nil && apierrors.IsNotFound(err) {
//avoid client version not match k8s version will result resourceVersion is not "" and response "resourceVersion should not set" failed.
svc.ResourceVersion = ""
if err = CreateClientObject(ctx, k8sclient, svc); err == nil || apierrors.IsAlreadyExists(err) {
return nil
}
return err
} else if err != nil && apierrors.IsNotFound(err) {
return err
}
if equal(svc, &esvc) {
klog.Info("CreateOrUpdateService service Name, Ports, Selector, ServiceType, Labels have not change ", "namespace ", svc.Namespace, " name ", svc.Name)
return nil
}
//resolve the bug: metadata.resourceversion invalid value '' must be specified for an update
svc.ResourceVersion = esvc.ResourceVersion
return PatchClientObject(ctx, k8sclient, svc)
}