Skip to content

Commit 7c66692

Browse files
author
Peng Zhou
committed
MLE-21691: fix bug for service not updated when added new port
1 parent 9dcf315 commit 7c66692

File tree

1 file changed

+44
-51
lines changed

1 file changed

+44
-51
lines changed

pkg/k8sutil/service.go

Lines changed: 44 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package k8sutil
33
import (
44
"strings"
55

6+
"github.com/cisco-open/k8s-objectmatcher/patch"
67
corev1 "k8s.io/api/core/v1"
78
"k8s.io/apimachinery/pkg/api/errors"
89
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -14,13 +15,15 @@ import (
1415
)
1516

1617
type serviceParameters struct {
18+
StsName string
1719
Ports []corev1.ServicePort
1820
Type corev1.ServiceType
1921
Annotations map[string]string
2022
}
2123

2224
func generateServiceParams(cr *marklogicv1.MarklogicGroup) serviceParameters {
2325
return serviceParameters{
26+
StsName: cr.Spec.Name,
2427
Type: cr.Spec.Service.Type,
2528
Ports: cr.Spec.Service.AdditionalPorts,
2629
Annotations: cr.Spec.Service.Annotations,
@@ -71,7 +74,7 @@ func generateServicePorts() []corev1.ServicePort {
7174
func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerReference, params serviceParameters) *corev1.Service {
7275
var svcSpec corev1.ServiceSpec
7376
svcSpec = corev1.ServiceSpec{
74-
Selector: serviceMeta.GetLabels(),
77+
Selector: getSelectorLabels(params.StsName),
7578
Ports: append(params.Ports, generateServicePorts()...),
7679
}
7780
if strings.HasSuffix(serviceMeta.Name, "-cluster") {
@@ -92,44 +95,17 @@ func generateServiceDef(serviceMeta metav1.ObjectMeta, ownerRef metav1.OwnerRefe
9295
return service
9396
}
9497

95-
func (oc *OperatorContext) getService(namespace string, serviceName string) (*corev1.Service, error) {
96-
logger := oc.ReqLogger
97-
98-
var serviceInfo *corev1.Service
99-
err := oc.Client.Get(oc.Ctx, types.NamespacedName{Name: serviceName, Namespace: namespace}, serviceInfo)
100-
if err != nil {
101-
logger.Info("MarkLogic service get action is failed")
102-
return nil, err
103-
}
104-
logger.Info("MarkLogic service get action is successful")
105-
return serviceInfo, nil
106-
}
107-
108-
func (oc *OperatorContext) CreateOrUpdateService(namespace string, serviceMeta metav1.ObjectMeta, ownerDef metav1.OwnerReference) error {
109-
logger := oc.ReqLogger
110-
serviceDef := generateServiceDef(serviceMeta, ownerDef, serviceParameters{})
111-
_, err := oc.getService(namespace, serviceMeta.Name)
112-
if err != nil {
113-
if errors.IsNotFound(err) {
114-
logger.Info("MarkLogic service is not found, creating a new one")
115-
err = oc.createService(namespace, serviceDef)
116-
if err != nil {
117-
logger.Info("MarkLogic service creation is failed")
118-
return err
119-
}
120-
logger.Info("MarkLogic service creation is successful")
121-
return nil
122-
}
123-
return err
124-
}
125-
return nil
126-
}
127-
12898
func generateService(svcName string, cr *marklogicv1.MarklogicGroup) *corev1.Service {
12999
labels := getCommonLabels(cr.Spec.Name)
100+
groupLabels := cr.Spec.Labels
101+
if groupLabels != nil {
102+
for key, value := range groupLabels {
103+
labels[key] = value
104+
}
105+
}
130106
var svcParams serviceParameters = serviceParameters{}
131-
svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations)
132107
svcParams = generateServiceParams(cr)
108+
svcObjectMeta := generateObjectMeta(svcName, cr.Namespace, labels, svcParams.Annotations)
133109
service := generateServiceDef(svcObjectMeta, marklogicServerAsOwner(cr), svcParams)
134110
return service
135111
}
@@ -139,18 +115,21 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
139115
logger.Info("service::Reconciling MarkLogic Service")
140116
client := oc.Client
141117
cr := oc.MarklogicGroup
142-
svc := &corev1.Service{}
118+
currentSvc := &corev1.Service{}
143119
headlessSvcName := cr.Spec.Name
144120
svcName := cr.Spec.Name + "-cluster"
145121
services := []string{headlessSvcName, svcName}
146122
for _, service := range services {
147123
svcNsName := types.NamespacedName{Name: service, Namespace: cr.Namespace}
148-
err := client.Get(oc.Ctx, svcNsName, svc)
124+
err := client.Get(oc.Ctx, svcNsName, currentSvc)
125+
svcDef := generateService(service, cr)
149126
if err != nil {
150127
if errors.IsNotFound(err) {
151128
logger.Info("MarkLogic service not found, creating a new one")
152-
svc = generateService(service, cr)
153-
err = client.Create(oc.Ctx, svc)
129+
if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(svcDef); err != nil {
130+
logger.Error(err, "Failed to set last applied annotation for MarkLogic service")
131+
}
132+
err = client.Create(oc.Ctx, svcDef)
154133
if err != nil {
155134
logger.Info("MarkLogic service creation has failed")
156135
return result.Error(err)
@@ -160,19 +139,33 @@ func (oc *OperatorContext) ReconcileServices() result.ReconcileResult {
160139
logger.Error(err, "MarkLogic service creation has failed")
161140
return result.Error(err)
162141
}
142+
} else {
143+
patchDiff, err := patch.DefaultPatchMaker.Calculate(currentSvc, svcDef,
144+
patch.IgnoreStatusFields(),
145+
patch.IgnoreVolumeClaimTemplateTypeMetaAndStatus(),
146+
patch.IgnoreField("kind"))
147+
148+
if err != nil {
149+
logger.Error(err, "Error calculating patch")
150+
return result.Error(err)
151+
}
152+
if !patchDiff.IsEmpty() {
153+
logger.Info("MarkLogic service spec is different from the MarkLogicGroup spec, updating the service")
154+
currentSvc.Spec = svcDef.Spec
155+
currentSvc.ObjectMeta.Annotations = svcDef.ObjectMeta.Annotations
156+
currentSvc.ObjectMeta.Labels = svcDef.ObjectMeta.Labels
157+
if err := patch.DefaultAnnotator.SetLastAppliedAnnotation(currentSvc); err != nil {
158+
logger.Error(err, "Failed to set last applied annotation for MarkLogic service")
159+
}
160+
err := oc.Client.Update(oc.Ctx, currentSvc)
161+
if err != nil {
162+
logger.Error(err, "Error updating MarkLogic service")
163+
return result.Error(err)
164+
}
165+
} else {
166+
logger.Info("MarkLogic service spec is the same")
167+
}
163168
}
164169
}
165170
return result.Continue()
166171
}
167-
168-
func (oc *OperatorContext) createService(namespace string, service *corev1.Service) error {
169-
logger := oc.ReqLogger
170-
client := oc.Client
171-
err := client.Create(oc.Ctx, service)
172-
if err != nil {
173-
logger.Error(err, "MarkLogic service creation has failed")
174-
return err
175-
}
176-
logger.Info("MarkLogic service creation is successful")
177-
return nil
178-
}

0 commit comments

Comments
 (0)