Skip to content

Commit 4fe022a

Browse files
committed
Modify pulp resources reconciliation logic
closes: #1041
1 parent 4915d57 commit 4fe022a

File tree

13 files changed

+293
-148
lines changed

13 files changed

+293
-148
lines changed

CHANGES/1041.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Modified the way to check if a Pulp resource has changed.

controllers/deployment.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"context"
2021
"os"
2122
"reflect"
2223
"strconv"
@@ -112,6 +113,7 @@ func (d CommonDeployment) Deploy(resources any, pulpcoreType string) client.Obje
112113
},
113114
}
114115

116+
AddHashLabel(resources.(FunctionResources), dep)
115117
// Set Pulp instance as the owner and controller
116118
ctrl.SetControllerReference(pulp, dep, resources.(FunctionResources).Scheme)
117119
return dep
@@ -1019,6 +1021,17 @@ func (d *CommonDeployment) setTelemetryConfig(resources any, pulpcoreType string
10191021
d.containers, d.volumes = telemetryConfig(resources, d.envVars, d.containers, d.volumes, pulpcoreType)
10201022
}
10211023

1024+
// AddHashLabel creates a label with the calculated hash from the mutated deployment
1025+
func AddHashLabel(r FunctionResources, deployment *appsv1.Deployment) {
1026+
// if the object does not exist yet we need to mutate the object to get the
1027+
// default values (I think they are added by the admission controller)
1028+
if err := r.Create(context.TODO(), deployment, client.DryRunAll); err != nil {
1029+
SetHashLabel(HashFromMutated(deployment, r), deployment)
1030+
} else {
1031+
SetHashLabel(CalculateHash(deployment.Spec), deployment)
1032+
}
1033+
}
1034+
10221035
// build constructs the fields used in the deployment specification
10231036
func (d *CommonDeployment) build(resources any, pulpcoreType string) {
10241037
pulp := resources.(FunctionResources).Pulp

controllers/ocp/deployment.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ func (d DeploymentAPIOCP) Deploy(resources controllers.FunctionResources) client
5050
// get the current pulpcore-api common deployment definition
5151
deployment := d.DeploymentAPICommon.Deploy(resources).(*appsv1.Deployment)
5252
defaultsForOCPDeployment(deployment, resources.Pulp)
53+
54+
// update the hash label
55+
controllers.AddHashLabel(resources, deployment)
56+
5357
return deployment
5458
}
5559

@@ -64,6 +68,10 @@ func (d DeploymentContentOCP) Deploy(resources controllers.FunctionResources) cl
6468
// get the current pulpcore-content common deployment definition
6569
deployment := d.DeploymentContentCommon.Deploy(resources).(*appsv1.Deployment)
6670
defaultsForOCPDeployment(deployment, resources.Pulp)
71+
72+
// update the hash label
73+
controllers.AddHashLabel(resources, deployment)
74+
6775
return deployment
6876
}
6977

@@ -78,5 +86,9 @@ func (d DeploymentWorkerOCP) Deploy(resources controllers.FunctionResources) cli
7886
// get the current pulpcore-worker common deployment definition
7987
deployment := d.DeploymentWorkerCommon.Deploy(resources).(*appsv1.Deployment)
8088
defaultsForOCPDeployment(deployment, resources.Pulp)
89+
90+
// update the hash label
91+
controllers.AddHashLabel(resources, deployment)
92+
8193
return deployment
8294
}

controllers/ocp/ingress.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func deployOCPIngressRedirect(resources controllers.FunctionResources, plugins [
121121
}
122122

123123
// Ensure ingress specs are as expected
124-
if _, err := controllers.ReconcileObject(controllers.FunctionResources{Context: resources.Context, Client: resources.Client, Pulp: pulp, Scheme: resources.Scheme, Logger: log}, expectedIngress, currentIngress, conditionType); err != nil {
124+
if _, err := controllers.ReconcileObject(controllers.FunctionResources{Context: resources.Context, Client: resources.Client, Pulp: pulp, Scheme: resources.Scheme, Logger: log}, expectedIngress, currentIngress, conditionType, controllers.PulpIngress{}); err != nil {
125125
return err
126126
}
127127

controllers/ocp/route.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func PulpRouteController(resources controllers.FunctionResources, restClient res
177177
}
178178

179179
// Ensure route specs are as expected
180-
if requeue, err := controllers.ReconcileObject(resources, expectedRoute, currentRoute, conditionType); err != nil || requeue {
180+
if requeue, err := controllers.ReconcileObject(resources, expectedRoute, currentRoute, conditionType, controllers.PulpRoute{}); err != nil || requeue {
181181
c <- statusReturn{ctrl.Result{Requeue: requeue}, err}
182182
return
183183
}

controllers/repo_manager/api.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (r *RepoManagerReconciler) pulpApiController(ctx context.Context, pulp *rep
141141
apiDeployment := &appsv1.Deployment{}
142142
r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-api", Namespace: pulp.Namespace}, apiDeployment)
143143
expected := deploymentForPulpApi(funcResources)
144-
if requeue, err := controllers.ReconcileObject(funcResources, expected, apiDeployment, conditionType); err != nil || requeue {
144+
if requeue, err := controllers.ReconcileObject(funcResources, expected, apiDeployment, conditionType, controllers.PulpDeployment{}); err != nil || requeue {
145145
return ctrl.Result{Requeue: requeue}, err
146146
}
147147

@@ -156,15 +156,15 @@ func (r *RepoManagerReconciler) pulpApiController(ctx context.Context, pulp *rep
156156
apiSvc := &corev1.Service{}
157157
r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-api-svc", Namespace: pulp.Namespace}, apiSvc)
158158
expectedSvc := serviceForAPI(funcResources)
159-
if requeue, err := controllers.ReconcileObject(funcResources, expectedSvc, apiSvc, conditionType); err != nil || requeue {
159+
if requeue, err := controllers.ReconcileObject(funcResources, expectedSvc, apiSvc, conditionType, controllers.PulpService{}); err != nil || requeue {
160160
return ctrl.Result{Requeue: requeue}, err
161161
}
162162

163163
// Ensure the secret data is as expected
164164
serverSecret := &corev1.Secret{}
165165
r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-server", Namespace: pulp.Namespace}, serverSecret)
166166
expectedServerSecret := pulpServerSecret(funcResources)
167-
if requeue, err := controllers.ReconcileObject(funcResources, expectedServerSecret, serverSecret, conditionType); err != nil || requeue {
167+
if requeue, err := controllers.ReconcileObject(funcResources, expectedServerSecret, serverSecret, conditionType, controllers.PulpSecret{}); err != nil || requeue {
168168
log.Info("Reprovisioning pulpcore-api pods to get the new settings ...")
169169
// when requeue==true it means the secret changed so we need to redeploy api and content pods to get the new settings.py
170170
r.restartPods(pulp, apiDeployment)
@@ -182,15 +182,15 @@ func (r *RepoManagerReconciler) pulpApiController(ctx context.Context, pulp *rep
182182
telemetryConfigMap := &corev1.ConfigMap{}
183183
r.Get(ctx, types.NamespacedName{Name: controllers.OtelConfigName, Namespace: pulp.Namespace}, telemetryConfigMap)
184184
expectedTelemetryConfigMap := controllers.OtelConfigMap(funcResources)
185-
if requeue, err := controllers.ReconcileObject(funcResources, expectedTelemetryConfigMap, telemetryConfigMap, conditionType); err != nil || requeue {
185+
if requeue, err := controllers.ReconcileObject(funcResources, expectedTelemetryConfigMap, telemetryConfigMap, conditionType, controllers.PulpConfigMap{}); err != nil || requeue {
186186
return ctrl.Result{Requeue: requeue}, err
187187
}
188188

189189
// Ensure otelService is as expected
190190
telemetryService := &corev1.Service{}
191191
r.Get(ctx, types.NamespacedName{Name: controllers.OtelServiceName, Namespace: pulp.Namespace}, telemetryService)
192192
expectedTelemetryService := controllers.ServiceOtel(funcResources)
193-
if requeue, err := controllers.ReconcileObject(funcResources, expectedTelemetryService, telemetryService, conditionType); err != nil || requeue {
193+
if requeue, err := controllers.ReconcileObject(funcResources, expectedTelemetryService, telemetryService, conditionType, controllers.PulpService{}); err != nil || requeue {
194194
return ctrl.Result{Requeue: requeue}, err
195195
}
196196
}

controllers/repo_manager/content.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ func (r *RepoManagerReconciler) pulpContentController(ctx context.Context, pulp
7070
deployment := &appsv1.Deployment{}
7171
r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-content", Namespace: pulp.Namespace}, deployment)
7272
expected := deploymentForPulpContent(funcResources)
73-
if requeue, err := controllers.ReconcileObject(funcResources, expected, deployment, conditionType); err != nil || requeue {
73+
if requeue, err := controllers.ReconcileObject(funcResources, expected, deployment, conditionType, controllers.PulpDeployment{}); err != nil || requeue {
7474
return ctrl.Result{Requeue: requeue}, err
7575
}
7676

7777
// Reconcile Service
7878
cntSvc := &corev1.Service{}
7979
r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-content-svc", Namespace: pulp.Namespace}, cntSvc)
8080
newCntSvc := serviceForContent(funcResources)
81-
if requeue, err := controllers.ReconcileObject(funcResources, newCntSvc, cntSvc, conditionType); err != nil || requeue {
81+
if requeue, err := controllers.ReconcileObject(funcResources, newCntSvc, cntSvc, conditionType, controllers.PulpService{}); err != nil || requeue {
8282
return ctrl.Result{Requeue: requeue}, err
8383
}
8484

controllers/repo_manager/ingress.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func (r *RepoManagerReconciler) pulpIngressController(ctx context.Context, pulp
146146
}
147147

148148
// Ensure ingress specs are as expected
149-
if requeue, err := controllers.ReconcileObject(controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}, expectedIngress, currentIngress, conditionType); err != nil || requeue {
149+
if requeue, err := controllers.ReconcileObject(controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}, expectedIngress, currentIngress, conditionType, controllers.PulpIngress{}); err != nil || requeue {
150150
return ctrl.Result{Requeue: requeue}, err
151151
}
152152

controllers/repo_manager/redis.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"github.com/go-logr/logr"
99
repomanagerpulpprojectorgv1beta2 "github.com/pulp/pulp-operator/apis/repo-manager.pulpproject.org/v1beta2"
1010
"github.com/pulp/pulp-operator/controllers"
11+
"golang.org/x/text/cases"
12+
"golang.org/x/text/language"
1113
appsv1 "k8s.io/api/apps/v1"
1214
corev1 "k8s.io/api/core/v1"
1315
"k8s.io/apimachinery/pkg/api/equality"
@@ -21,6 +23,10 @@ import (
2123

2224
func (r *RepoManagerReconciler) pulpCacheController(ctx context.Context, pulp *repomanagerpulpprojectorgv1beta2.Pulp, log logr.Logger) (ctrl.Result, error) {
2325

26+
// conditionType is used to update .status.conditions with the current resource state
27+
conditionType := cases.Title(language.English, cases.Compact).String(pulp.Spec.DeploymentType) + "-API-Ready"
28+
funcResources := controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}
29+
2430
// pulp-redis-data PVC
2531
// the PVC will be created only if a StorageClassName is provided
2632
if _, storageType := controllers.MultiStorageConfigured(pulp, "Cache"); storageType[0] == controllers.SCNameType {
@@ -99,9 +105,8 @@ func (r *RepoManagerReconciler) pulpCacheController(ctx context.Context, pulp *r
99105
// redis Deployment
100106
deploymentFound := &appsv1.Deployment{}
101107
err = r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-redis", Namespace: pulp.Namespace}, deploymentFound)
102-
dep := redisDeployment(pulp)
108+
dep := redisDeployment(pulp, funcResources)
103109
if err != nil && errors.IsNotFound(err) {
104-
ctrl.SetControllerReference(pulp, dep, r.Scheme)
105110
log.Info("Creating a new Pulp Redis Deployment", "Deployment.Namespace", dep.Namespace, "Deployment.Name", dep.Name)
106111
err = r.Create(ctx, dep)
107112
if err != nil {
@@ -117,19 +122,9 @@ func (r *RepoManagerReconciler) pulpCacheController(ctx context.Context, pulp *r
117122
return ctrl.Result{}, err
118123
}
119124

120-
// Reconcile Deployment
121-
if controllers.CheckDeploymentSpec(dep.Spec, deploymentFound.Spec) {
122-
log.Info("The Redis Deployment has been modified! Reconciling ...")
123-
ctrl.SetControllerReference(pulp, dep, r.Scheme)
124-
r.recorder.Event(pulp, corev1.EventTypeNormal, "Updating", "Reconciling Redis Deployment")
125-
err = r.Update(ctx, dep)
126-
if err != nil {
127-
log.Error(err, "Error trying to update the Redis Deployment object ... ")
128-
r.recorder.Event(pulp, corev1.EventTypeWarning, "Failed", "Failed to reconcile Redis Deployment")
129-
return ctrl.Result{}, err
130-
}
131-
r.recorder.Event(pulp, corev1.EventTypeNormal, "Updated", "Redis Deployment reconciled")
132-
return ctrl.Result{Requeue: true, RequeueAfter: time.Second}, nil
125+
// Ensure the deployment spec is as expected
126+
if requeue, err := controllers.ReconcileObject(funcResources, dep, deploymentFound, conditionType, controllers.PulpDeployment{}); err != nil || requeue {
127+
return ctrl.Result{Requeue: requeue}, err
133128
}
134129

135130
r.recorder.Event(pulp, corev1.EventTypeNormal, "RedisReady", "All Redis tasks ran successfully")
@@ -220,7 +215,7 @@ func redisSvc(m *repomanagerpulpprojectorgv1beta2.Pulp) *corev1.Service {
220215
}
221216

222217
// redisDeployment returns a Redis Deployment object
223-
func redisDeployment(m *repomanagerpulpprojectorgv1beta2.Pulp) *appsv1.Deployment {
218+
func redisDeployment(m *repomanagerpulpprojectorgv1beta2.Pulp, funcResources controllers.FunctionResources) *appsv1.Deployment {
224219

225220
replicas := int32(1)
226221

@@ -359,7 +354,7 @@ func redisDeployment(m *repomanagerpulpprojectorgv1beta2.Pulp) *appsv1.Deploymen
359354
removeStorageDefinition(&resources)
360355

361356
// deployment definition
362-
return &appsv1.Deployment{
357+
dep := &appsv1.Deployment{
363358
ObjectMeta: metav1.ObjectMeta{
364359
Name: m.Name + "-redis",
365360
Namespace: m.Namespace,
@@ -422,6 +417,10 @@ func redisDeployment(m *repomanagerpulpprojectorgv1beta2.Pulp) *appsv1.Deploymen
422417
},
423418
},
424419
}
420+
421+
controllers.AddHashLabel(funcResources, dep)
422+
ctrl.SetControllerReference(m, dep, funcResources.Scheme)
423+
return dep
425424
}
426425

427426
// removeStorageDefinition ensures that no storage definition is present in resourceRequirements

controllers/repo_manager/web.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
)
3838

3939
func (r *RepoManagerReconciler) pulpWebController(ctx context.Context, pulp *repomanagerpulpprojectorgv1beta2.Pulp, log logr.Logger) (ctrl.Result, error) {
40+
funcResources := controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}
4041

4142
// conditionType is used to update .status.conditions with the current resource state
4243
conditionType := cases.Title(language.English, cases.Compact).String(pulp.Spec.DeploymentType) + "-Web-Ready"
@@ -66,7 +67,7 @@ func (r *RepoManagerReconciler) pulpWebController(ctx context.Context, pulp *rep
6667
// pulp-web Deployment
6768
webDeployment := &appsv1.Deployment{}
6869
err = r.Get(ctx, types.NamespacedName{Name: pulp.Name + "-web", Namespace: pulp.Namespace}, webDeployment)
69-
newWebDeployment := r.deploymentForPulpWeb(pulp)
70+
newWebDeployment := r.deploymentForPulpWeb(pulp, funcResources)
7071
if err != nil && errors.IsNotFound(err) {
7172
log.Info("Creating a new Pulp Web Deployment", "Deployment.Namespace", newWebDeployment.Namespace, "Deployment.Name", newWebDeployment.Name)
7273
controllers.UpdateStatus(ctx, r.Client, pulp, metav1.ConditionFalse, conditionType, "CreatingWebDeployment", "Creating "+pulp.Name+"-web deployment resource")
@@ -86,7 +87,7 @@ func (r *RepoManagerReconciler) pulpWebController(ctx context.Context, pulp *rep
8687
}
8788

8889
// Reconcile Deployment
89-
if controllers.CheckDeploymentSpec(newWebDeployment.Spec, webDeployment.Spec) {
90+
if controllers.CheckDeploymentSpec(*newWebDeployment, *webDeployment, funcResources) {
9091
log.Info("The Web Deployment has been modified! Reconciling ...")
9192
controllers.UpdateStatus(ctx, r.Client, pulp, metav1.ConditionFalse, conditionType, "UpdatingWebDeployment", "Reconciling "+pulp.Name+"-web deployment resource")
9293
r.recorder.Event(pulp, corev1.EventTypeNormal, "Updating", "Reconciling Web Deployment")
@@ -125,15 +126,15 @@ func (r *RepoManagerReconciler) pulpWebController(ctx context.Context, pulp *rep
125126
}
126127

127128
// Reconcile Service
128-
if requeue, err := controllers.ReconcileObject(controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}, newWebSvc, webSvc, conditionType); err != nil || requeue {
129+
if requeue, err := controllers.ReconcileObject(controllers.FunctionResources{Context: ctx, Client: r.Client, Pulp: pulp, Scheme: r.Scheme, Logger: log}, newWebSvc, webSvc, conditionType, controllers.PulpService{}); err != nil || requeue {
129130
return ctrl.Result{Requeue: requeue}, err
130131
}
131132

132133
return ctrl.Result{}, nil
133134
}
134135

135136
// deploymentForPulpWeb returns a pulp-web Deployment object
136-
func (r *RepoManagerReconciler) deploymentForPulpWeb(m *repomanagerpulpprojectorgv1beta2.Pulp) *appsv1.Deployment {
137+
func (r *RepoManagerReconciler) deploymentForPulpWeb(m *repomanagerpulpprojectorgv1beta2.Pulp, funcResources controllers.FunctionResources) *appsv1.Deployment {
137138

138139
ls := labelsForPulpWeb(m)
139140
replicas := m.Spec.Web.Replicas
@@ -257,6 +258,8 @@ func (r *RepoManagerReconciler) deploymentForPulpWeb(m *repomanagerpulpprojector
257258
},
258259
},
259260
}
261+
262+
controllers.AddHashLabel(funcResources, dep)
260263
// Set Pulp instance as the owner and controller
261264
ctrl.SetControllerReference(m, dep, r.Scheme)
262265
return dep

0 commit comments

Comments
 (0)