Skip to content

Commit c6f6426

Browse files
committed
update the volumereplication condition
this commit updates the volumereplication conditions to include descriptive message for every operations Signed-off-by: yati1998 <[email protected]>
1 parent 54944f9 commit c6f6426

File tree

3 files changed

+67
-22
lines changed

3 files changed

+67
-22
lines changed

api/replication.storage/v1alpha1/volumereplication_types.go

+19
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,25 @@ const (
3636
ConditionValidated = "Validated"
3737
)
3838

39+
// These are valid messages for various
40+
// conditions and states of Volume
41+
// replication.
42+
const (
43+
MessagePromoted = "Volume is promoted"
44+
MessageHealthy = "Volume is healthy"
45+
MessageNotResyncing = "Volume is not resyncing"
46+
MessagePromotionErrorDetected = "error detected while promotion"
47+
MessageDemotionErrorDetected = "error detected while demotion"
48+
MessageResyncErrorDetected = "error detected while resyncing"
49+
MessageValidated = "Volume is validated"
50+
MessageFailedPromoted = "failed to promote volume"
51+
MessageFailedPreCondition = "failed to meet prerequisite"
52+
MessageDemoted = "Volume is demoted"
53+
MessageDegraded = "Volume is degraded"
54+
MessageResyncTriggered = "resync is triggered"
55+
MessageResyncFailed = "failed to resync"
56+
)
57+
3958
// These are valid conditions.
4059

4160
const (

internal/controller/replication.storage/status.go

+32-6
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,21 @@ import (
2626
// sets conditions when volume was promoted successfully.
2727
func setPromotedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
2828
setStatusCondition(conditions, &metav1.Condition{
29+
Message: v1alpha1.MessagePromoted,
2930
Type: v1alpha1.ConditionCompleted,
3031
Reason: v1alpha1.Promoted,
3132
ObservedGeneration: observedGeneration,
3233
Status: metav1.ConditionTrue,
3334
})
3435
setStatusCondition(conditions, &metav1.Condition{
36+
Message: v1alpha1.MessageHealthy,
3537
Type: v1alpha1.ConditionDegraded,
3638
Reason: v1alpha1.Healthy,
3739
ObservedGeneration: observedGeneration,
3840
Status: metav1.ConditionFalse,
3941
})
4042
setStatusCondition(conditions, &metav1.Condition{
43+
Message: v1alpha1.MessageNotResyncing,
4144
Type: v1alpha1.ConditionResyncing,
4245
Reason: v1alpha1.NotResyncing,
4346
ObservedGeneration: observedGeneration,
@@ -46,26 +49,30 @@ func setPromotedCondition(conditions *[]metav1.Condition, observedGeneration int
4649
}
4750

4851
// sets conditions when volume promotion was failed.
49-
func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGeneration int64) {
52+
func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGeneration int64, errMessage string, errFromCephCSI string) {
5053
setStatusCondition(conditions, &metav1.Condition{
54+
Message: errMessage,
5155
Type: v1alpha1.ConditionCompleted,
5256
Reason: v1alpha1.FailedToPromote,
5357
ObservedGeneration: observedGeneration,
5458
Status: metav1.ConditionFalse,
5559
})
5660
setStatusCondition(conditions, &metav1.Condition{
61+
Message: v1alpha1.MessagePromotionErrorDetected,
5762
Type: v1alpha1.ConditionDegraded,
58-
Reason: v1alpha1.Error,
63+
Reason: errFromCephCSI,
5964
ObservedGeneration: observedGeneration,
6065
Status: metav1.ConditionTrue,
6166
})
6267
setStatusCondition(conditions, &metav1.Condition{
68+
Message: v1alpha1.MessageNotResyncing,
6369
Type: v1alpha1.ConditionResyncing,
6470
Reason: v1alpha1.NotResyncing,
6571
ObservedGeneration: observedGeneration,
6672
Status: metav1.ConditionFalse,
6773
})
6874
setStatusCondition(conditions, &metav1.Condition{
75+
Message: v1alpha1.MessageValidated,
6976
Type: v1alpha1.ConditionValidated,
7077
Reason: v1alpha1.PrerequisiteMet,
7178
ObservedGeneration: observedGeneration,
@@ -76,24 +83,28 @@ func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGenerat
7683
// sets conditions when volume promotion was failed due to failed validation.
7784
func setFailedValidationCondition(conditions *[]metav1.Condition, observedGeneration int64) {
7885
setStatusCondition(conditions, &metav1.Condition{
86+
Message: v1alpha1.MessageFailedPromoted,
7987
Type: v1alpha1.ConditionCompleted,
8088
Reason: v1alpha1.FailedToPromote,
8189
ObservedGeneration: observedGeneration,
8290
Status: metav1.ConditionFalse,
8391
})
8492
setStatusCondition(conditions, &metav1.Condition{
93+
Message: v1alpha1.MessagePromotionErrorDetected,
8594
Type: v1alpha1.ConditionDegraded,
8695
Reason: v1alpha1.Error,
8796
ObservedGeneration: observedGeneration,
8897
Status: metav1.ConditionTrue,
8998
})
9099
setStatusCondition(conditions, &metav1.Condition{
100+
Message: v1alpha1.MessageNotResyncing,
91101
Type: v1alpha1.ConditionResyncing,
92102
Reason: v1alpha1.NotResyncing,
93103
ObservedGeneration: observedGeneration,
94104
Status: metav1.ConditionFalse,
95105
})
96106
setStatusCondition(conditions, &metav1.Condition{
107+
Message: v1alpha1.MessageFailedPreCondition,
97108
Type: v1alpha1.ConditionValidated,
98109
Reason: v1alpha1.PrerequisiteNotMet,
99110
ObservedGeneration: observedGeneration,
@@ -104,12 +115,14 @@ func setFailedValidationCondition(conditions *[]metav1.Condition, observedGenera
104115
// sets conditions when volume is demoted and ready to use (resync completed).
105116
func setNotDegradedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
106117
setStatusCondition(conditions, &metav1.Condition{
118+
Message: v1alpha1.MessageDemoted,
107119
Type: v1alpha1.ConditionDegraded,
108120
Reason: v1alpha1.Healthy,
109121
ObservedGeneration: observedGeneration,
110122
Status: metav1.ConditionFalse,
111123
})
112124
setStatusCondition(conditions, &metav1.Condition{
125+
Message: v1alpha1.MessageNotResyncing,
113126
Type: v1alpha1.ConditionResyncing,
114127
Reason: v1alpha1.NotResyncing,
115128
ObservedGeneration: observedGeneration,
@@ -120,18 +133,21 @@ func setNotDegradedCondition(conditions *[]metav1.Condition, observedGeneration
120133
// sets conditions when volume was demoted successfully.
121134
func setDemotedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
122135
setStatusCondition(conditions, &metav1.Condition{
136+
Message: v1alpha1.MessageDemoted,
123137
Type: v1alpha1.ConditionCompleted,
124138
Reason: v1alpha1.Demoted,
125139
ObservedGeneration: observedGeneration,
126140
Status: metav1.ConditionTrue,
127141
})
128142
setStatusCondition(conditions, &metav1.Condition{
143+
Message: v1alpha1.MessageDegraded,
129144
Type: v1alpha1.ConditionDegraded,
130145
Reason: v1alpha1.VolumeDegraded,
131146
ObservedGeneration: observedGeneration,
132147
Status: metav1.ConditionTrue,
133148
})
134149
setStatusCondition(conditions, &metav1.Condition{
150+
Message: v1alpha1.MessageNotResyncing,
135151
Type: v1alpha1.ConditionResyncing,
136152
Reason: v1alpha1.NotResyncing,
137153
ObservedGeneration: observedGeneration,
@@ -140,20 +156,23 @@ func setDemotedCondition(conditions *[]metav1.Condition, observedGeneration int6
140156
}
141157

142158
// sets conditions when volume demotion was failed.
143-
func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGeneration int64) {
159+
func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGeneration int64, errMessage string, errFromCephCSI string) {
144160
setStatusCondition(conditions, &metav1.Condition{
161+
Message: errMessage,
145162
Type: v1alpha1.ConditionCompleted,
146163
Reason: v1alpha1.FailedToDemote,
147164
ObservedGeneration: observedGeneration,
148165
Status: metav1.ConditionFalse,
149166
})
150167
setStatusCondition(conditions, &metav1.Condition{
168+
Message: v1alpha1.MessageDemotionErrorDetected,
151169
Type: v1alpha1.ConditionDegraded,
152-
Reason: v1alpha1.Error,
170+
Reason: errFromCephCSI,
153171
ObservedGeneration: observedGeneration,
154172
Status: metav1.ConditionTrue,
155173
})
156174
setStatusCondition(conditions, &metav1.Condition{
175+
Message: v1alpha1.MessageNotResyncing,
157176
Type: v1alpha1.ConditionResyncing,
158177
Reason: v1alpha1.NotResyncing,
159178
ObservedGeneration: observedGeneration,
@@ -164,18 +183,21 @@ func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGenerati
164183
// sets conditions when volume resync was triggered successfully.
165184
func setResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) {
166185
setStatusCondition(conditions, &metav1.Condition{
186+
Message: v1alpha1.MessageDemoted,
167187
Type: v1alpha1.ConditionCompleted,
168188
Reason: v1alpha1.Demoted,
169189
ObservedGeneration: observedGeneration,
170190
Status: metav1.ConditionTrue,
171191
})
172192
setStatusCondition(conditions, &metav1.Condition{
193+
Message: v1alpha1.MessageDegraded,
173194
Type: v1alpha1.ConditionDegraded,
174195
Reason: v1alpha1.VolumeDegraded,
175196
ObservedGeneration: observedGeneration,
176197
Status: metav1.ConditionTrue,
177198
})
178199
setStatusCondition(conditions, &metav1.Condition{
200+
Message: v1alpha1.MessageResyncTriggered,
179201
Type: v1alpha1.ConditionResyncing,
180202
Reason: v1alpha1.ResyncTriggered,
181203
ObservedGeneration: observedGeneration,
@@ -184,20 +206,23 @@ func setResyncCondition(conditions *[]metav1.Condition, observedGeneration int64
184206
}
185207

186208
// sets conditions when volume resync failed.
187-
func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) {
209+
func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration int64, errMessage string, errFromCephCSI string) {
188210
setStatusCondition(conditions, &metav1.Condition{
211+
Message: errMessage,
189212
Type: v1alpha1.ConditionCompleted,
190213
Reason: v1alpha1.FailedToResync,
191214
ObservedGeneration: observedGeneration,
192215
Status: metav1.ConditionFalse,
193216
})
194217
setStatusCondition(conditions, &metav1.Condition{
218+
Message: v1alpha1.MessageResyncErrorDetected,
195219
Type: v1alpha1.ConditionDegraded,
196-
Reason: v1alpha1.Error,
220+
Reason: errFromCephCSI,
197221
ObservedGeneration: observedGeneration,
198222
Status: metav1.ConditionTrue,
199223
})
200224
setStatusCondition(conditions, &metav1.Condition{
225+
Message: v1alpha1.MessageResyncFailed,
201226
Type: v1alpha1.ConditionResyncing,
202227
Reason: v1alpha1.FailedToResync,
203228
ObservedGeneration: observedGeneration,
@@ -223,6 +248,7 @@ func setStatusCondition(existingConditions *[]metav1.Condition, newCondition *me
223248
existingCondition.LastTransitionTime = metav1.NewTime(time.Now())
224249
}
225250

251+
existingCondition.Message = newCondition.Message
226252
existingCondition.Reason = newCondition.Reason
227253
existingCondition.ObservedGeneration = newCondition.ObservedGeneration
228254
}

internal/controller/replication.storage/volumereplication_controller.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
112112
// Get VolumeReplicationClass
113113
vrcObj, err := r.getVolumeReplicationClass(logger, instance.Spec.VolumeReplicationClass)
114114
if err != nil {
115-
setFailureCondition(instance)
115+
setFailureCondition(instance, "failed to get volumeReplication class", err.Error())
116116
uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error())
117117
if uErr != nil {
118118
logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -124,7 +124,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
124124
err = validatePrefixedParameters(vrcObj.Spec.Parameters)
125125
if err != nil {
126126
logger.Error(err, "failed to validate parameters of volumeReplicationClass", "VRCName", instance.Spec.VolumeReplicationClass)
127-
setFailureCondition(instance)
127+
setFailureCondition(instance, "failed to validate parameters of volumeReplicationClass", err.Error())
128128
uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error())
129129
if uErr != nil {
130130
logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -160,7 +160,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
160160
pvc, pv, pvErr = r.getPVCDataSource(logger, nameSpacedName)
161161
if pvErr != nil {
162162
logger.Error(pvErr, "failed to get PVC", "PVCName", instance.Spec.DataSource.Name)
163-
setFailureCondition(instance)
163+
setFailureCondition(instance, "failed to get PVC", pvErr.Error())
164164
uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), pvErr.Error())
165165
if uErr != nil {
166166
logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -175,7 +175,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
175175
vgr, vgrc, vgrErr = r.getVolumeGroupReplicationDataSource(logger, nameSpacedName)
176176
if vgrErr != nil {
177177
logger.Error(vgrErr, "failed to get VolumeGroupReplication", "VGRName", instance.Spec.DataSource.Name)
178-
setFailureCondition(instance)
178+
setFailureCondition(instance, "failed to get VolumeGroupReplication", vgrErr.Error())
179179
uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), vgrErr.Error())
180180
if uErr != nil {
181181
logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -187,7 +187,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
187187
default:
188188
err = fmt.Errorf("unsupported datasource kind")
189189
logger.Error(err, "given kind not supported", "Kind", instance.Spec.DataSource.Kind)
190-
setFailureCondition(instance)
190+
setFailureCondition(instance, "unsupported datasource", err.Error())
191191
uErr := r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), err.Error())
192192
if uErr != nil {
193193
logger.Error(uErr, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -371,7 +371,7 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
371371
default:
372372
replicationErr = fmt.Errorf("unsupported volume state")
373373
logger.Error(replicationErr, "given volume state is not supported", "ReplicationState", instance.Spec.ReplicationState)
374-
setFailureCondition(instance)
374+
setFailureCondition(instance, "unsupported volume state", replicationErr.Error())
375375
err = r.updateReplicationStatus(instance, logger, getCurrentReplicationState(instance), replicationErr.Error())
376376
if err != nil {
377377
logger.Error(err, "failed to update volumeReplication status", "VRName", instance.Name)
@@ -632,7 +632,7 @@ func (r *VolumeReplicationReconciler) markVolumeAsPrimary(vr *volumeReplicationI
632632
if !isKnownError {
633633
if resp.Error != nil {
634634
vr.logger.Error(resp.Error, "failed to promote volume")
635-
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
635+
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to promote volume", resp.Error.Error())
636636

637637
return resp.Error
638638
}
@@ -643,7 +643,7 @@ func (r *VolumeReplicationReconciler) markVolumeAsPrimary(vr *volumeReplicationI
643643
resp := volumeReplication.Promote()
644644
if resp.Error != nil {
645645
vr.logger.Error(resp.Error, "failed to force promote volume")
646-
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
646+
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to force promote volume", resp.Error.Error())
647647

648648
return resp.Error
649649
}
@@ -665,7 +665,7 @@ func (r *VolumeReplicationReconciler) markVolumeAsSecondary(vr *volumeReplicatio
665665

666666
if resp.Error != nil {
667667
vr.logger.Error(resp.Error, "failed to demote volume")
668-
setFailedDemotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
668+
setFailedDemotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to demote volume", resp.Error.Error())
669669

670670
return resp.Error
671671
}
@@ -686,15 +686,15 @@ func (r *VolumeReplicationReconciler) resyncVolume(vr *volumeReplicationInstance
686686

687687
if resp.Error != nil {
688688
vr.logger.Error(resp.Error, "failed to resync volume")
689-
setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
689+
setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to resync volume", resp.Error.Error())
690690

691691
return false, resp.Error
692692
}
693693
resyncResponse, ok := resp.Response.(*proto.ResyncVolumeResponse)
694694
if !ok {
695695
err := fmt.Errorf("received response of unexpected type")
696696
vr.logger.Error(err, "unable to parse response")
697-
setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
697+
setFailedResyncCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "unable to parse resync response", "received response of unexpected type")
698698

699699
return false, err
700700
}
@@ -750,7 +750,7 @@ func (r *VolumeReplicationReconciler) enableReplication(vr *volumeReplicationIns
750750
if resp.HasKnownGRPCError(enableReplicationKnownErrors) {
751751
setFailedValidationCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
752752
} else {
753-
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
753+
setFailedPromotionCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to enable volume replication", resp.Error.Error())
754754
}
755755

756756
return resp.Error
@@ -805,14 +805,14 @@ func getCurrentReplicationState(instance *replicationv1alpha1.VolumeReplication)
805805
return instance.Status.State
806806
}
807807

808-
func setFailureCondition(instance *replicationv1alpha1.VolumeReplication) {
808+
func setFailureCondition(instance *replicationv1alpha1.VolumeReplication, errMessage string, errFromCephCSI string) {
809809
switch instance.Spec.ReplicationState {
810810
case replicationv1alpha1.Primary:
811-
setFailedPromotionCondition(&instance.Status.Conditions, instance.Generation)
811+
setFailedPromotionCondition(&instance.Status.Conditions, instance.Generation, errMessage, errFromCephCSI)
812812
case replicationv1alpha1.Secondary:
813-
setFailedDemotionCondition(&instance.Status.Conditions, instance.Generation)
813+
setFailedDemotionCondition(&instance.Status.Conditions, instance.Generation, errMessage, errFromCephCSI)
814814
case replicationv1alpha1.Resync:
815-
setFailedResyncCondition(&instance.Status.Conditions, instance.Generation)
815+
setFailedResyncCondition(&instance.Status.Conditions, instance.Generation, errMessage, errFromCephCSI)
816816
}
817817
}
818818

0 commit comments

Comments
 (0)