Skip to content

Commit 1650b2e

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 8762dfa commit 1650b2e

File tree

3 files changed

+63
-21
lines changed

3 files changed

+63
-21
lines changed

api/replication.storage/v1alpha1/volumereplication_types.go

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

39+
// These are valid messages for various conditions and states of volume replication.
40+
const (
41+
MessagePromoted = "volume is promoted to primary and replicating to secondary volume"
42+
MessageHealthy = "volume is healthy"
43+
MessageNotResyncing = "volume is not resyncing"
44+
MessageValidated = "volume is validated and met all prerequisites"
45+
MessageFailedPromoted = "failed to promote volume"
46+
MessageFailedDemoted = "failed to demote volume"
47+
MessageFailedPreCondition = "failed to meet prerequisite"
48+
MessageDemoted = "volume is demoted to secondary"
49+
MessageDegraded = "volume is degraded"
50+
MessageResyncTriggered = "volume is resyncing changes from primary to secondary"
51+
MessageResyncFailed = "failed to resync"
52+
)
53+
3954
// These are valid conditions.
4055

4156
const (

internal/controller/replication.storage/status.go

+31-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package controller
1818

1919
import (
20+
"fmt"
2021
"time"
2122

2223
"github.com/csi-addons/kubernetes-csi-addons/api/replication.storage/v1alpha1"
@@ -26,18 +27,21 @@ import (
2627
// sets conditions when volume was promoted successfully.
2728
func setPromotedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
2829
setStatusCondition(conditions, &metav1.Condition{
30+
Message: v1alpha1.MessagePromoted,
2931
Type: v1alpha1.ConditionCompleted,
3032
Reason: v1alpha1.Promoted,
3133
ObservedGeneration: observedGeneration,
3234
Status: metav1.ConditionTrue,
3335
})
3436
setStatusCondition(conditions, &metav1.Condition{
37+
Message: v1alpha1.MessageHealthy,
3538
Type: v1alpha1.ConditionDegraded,
3639
Reason: v1alpha1.Healthy,
3740
ObservedGeneration: observedGeneration,
3841
Status: metav1.ConditionFalse,
3942
})
4043
setStatusCondition(conditions, &metav1.Condition{
44+
Message: v1alpha1.MessageNotResyncing,
4145
Type: v1alpha1.ConditionResyncing,
4246
Reason: v1alpha1.NotResyncing,
4347
ObservedGeneration: observedGeneration,
@@ -46,26 +50,30 @@ func setPromotedCondition(conditions *[]metav1.Condition, observedGeneration int
4650
}
4751

4852
// sets conditions when volume promotion was failed.
49-
func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGeneration int64) {
53+
func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGeneration int64, message, messageFromDriver string) {
5054
setStatusCondition(conditions, &metav1.Condition{
55+
Message: message,
5156
Type: v1alpha1.ConditionCompleted,
5257
Reason: v1alpha1.FailedToPromote,
5358
ObservedGeneration: observedGeneration,
5459
Status: metav1.ConditionFalse,
5560
})
5661
setStatusCondition(conditions, &metav1.Condition{
62+
Message: fmt.Sprintf("%s: %s", v1alpha1.MessageFailedPromoted, messageFromDriver),
5763
Type: v1alpha1.ConditionDegraded,
5864
Reason: v1alpha1.Error,
5965
ObservedGeneration: observedGeneration,
6066
Status: metav1.ConditionTrue,
6167
})
6268
setStatusCondition(conditions, &metav1.Condition{
69+
Message: v1alpha1.MessageNotResyncing,
6370
Type: v1alpha1.ConditionResyncing,
6471
Reason: v1alpha1.NotResyncing,
6572
ObservedGeneration: observedGeneration,
6673
Status: metav1.ConditionFalse,
6774
})
6875
setStatusCondition(conditions, &metav1.Condition{
76+
Message: v1alpha1.MessageValidated,
6977
Type: v1alpha1.ConditionValidated,
7078
Reason: v1alpha1.PrerequisiteMet,
7179
ObservedGeneration: observedGeneration,
@@ -74,26 +82,30 @@ func setFailedPromotionCondition(conditions *[]metav1.Condition, observedGenerat
7482
}
7583

7684
// sets conditions when volume promotion was failed due to failed validation.
77-
func setFailedValidationCondition(conditions *[]metav1.Condition, observedGeneration int64) {
85+
func setFailedValidationCondition(conditions *[]metav1.Condition, observedGeneration int64, message, messageFromDriver string) {
7886
setStatusCondition(conditions, &metav1.Condition{
87+
Message: v1alpha1.MessageFailedPromoted,
7988
Type: v1alpha1.ConditionCompleted,
8089
Reason: v1alpha1.FailedToPromote,
8190
ObservedGeneration: observedGeneration,
8291
Status: metav1.ConditionFalse,
8392
})
8493
setStatusCondition(conditions, &metav1.Condition{
94+
Message: message,
8595
Type: v1alpha1.ConditionDegraded,
8696
Reason: v1alpha1.Error,
8797
ObservedGeneration: observedGeneration,
8898
Status: metav1.ConditionTrue,
8999
})
90100
setStatusCondition(conditions, &metav1.Condition{
101+
Message: v1alpha1.MessageNotResyncing,
91102
Type: v1alpha1.ConditionResyncing,
92103
Reason: v1alpha1.NotResyncing,
93104
ObservedGeneration: observedGeneration,
94105
Status: metav1.ConditionFalse,
95106
})
96107
setStatusCondition(conditions, &metav1.Condition{
108+
Message: fmt.Sprintf("%s: %s", v1alpha1.MessageFailedPreCondition, messageFromDriver),
97109
Type: v1alpha1.ConditionValidated,
98110
Reason: v1alpha1.PrerequisiteNotMet,
99111
ObservedGeneration: observedGeneration,
@@ -104,12 +116,14 @@ func setFailedValidationCondition(conditions *[]metav1.Condition, observedGenera
104116
// sets conditions when volume is demoted and ready to use (resync completed).
105117
func setNotDegradedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
106118
setStatusCondition(conditions, &metav1.Condition{
119+
Message: v1alpha1.MessageDemoted,
107120
Type: v1alpha1.ConditionDegraded,
108121
Reason: v1alpha1.Healthy,
109122
ObservedGeneration: observedGeneration,
110123
Status: metav1.ConditionFalse,
111124
})
112125
setStatusCondition(conditions, &metav1.Condition{
126+
Message: v1alpha1.MessageNotResyncing,
113127
Type: v1alpha1.ConditionResyncing,
114128
Reason: v1alpha1.NotResyncing,
115129
ObservedGeneration: observedGeneration,
@@ -120,18 +134,21 @@ func setNotDegradedCondition(conditions *[]metav1.Condition, observedGeneration
120134
// sets conditions when volume was demoted successfully.
121135
func setDemotedCondition(conditions *[]metav1.Condition, observedGeneration int64) {
122136
setStatusCondition(conditions, &metav1.Condition{
137+
Message: v1alpha1.MessageDemoted,
123138
Type: v1alpha1.ConditionCompleted,
124139
Reason: v1alpha1.Demoted,
125140
ObservedGeneration: observedGeneration,
126141
Status: metav1.ConditionTrue,
127142
})
128143
setStatusCondition(conditions, &metav1.Condition{
144+
Message: v1alpha1.MessageDegraded,
129145
Type: v1alpha1.ConditionDegraded,
130146
Reason: v1alpha1.VolumeDegraded,
131147
ObservedGeneration: observedGeneration,
132148
Status: metav1.ConditionTrue,
133149
})
134150
setStatusCondition(conditions, &metav1.Condition{
151+
Message: v1alpha1.MessageNotResyncing,
135152
Type: v1alpha1.ConditionResyncing,
136153
Reason: v1alpha1.NotResyncing,
137154
ObservedGeneration: observedGeneration,
@@ -140,20 +157,23 @@ func setDemotedCondition(conditions *[]metav1.Condition, observedGeneration int6
140157
}
141158

142159
// sets conditions when volume demotion was failed.
143-
func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGeneration int64) {
160+
func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGeneration int64, message, messageFromDriver string) {
144161
setStatusCondition(conditions, &metav1.Condition{
162+
Message: message,
145163
Type: v1alpha1.ConditionCompleted,
146164
Reason: v1alpha1.FailedToDemote,
147165
ObservedGeneration: observedGeneration,
148166
Status: metav1.ConditionFalse,
149167
})
150168
setStatusCondition(conditions, &metav1.Condition{
169+
Message: fmt.Sprintf("%s: %s", v1alpha1.MessageFailedDemoted, messageFromDriver),
151170
Type: v1alpha1.ConditionDegraded,
152171
Reason: v1alpha1.Error,
153172
ObservedGeneration: observedGeneration,
154173
Status: metav1.ConditionTrue,
155174
})
156175
setStatusCondition(conditions, &metav1.Condition{
176+
Message: v1alpha1.MessageNotResyncing,
157177
Type: v1alpha1.ConditionResyncing,
158178
Reason: v1alpha1.NotResyncing,
159179
ObservedGeneration: observedGeneration,
@@ -164,18 +184,21 @@ func setFailedDemotionCondition(conditions *[]metav1.Condition, observedGenerati
164184
// sets conditions when volume resync was triggered successfully.
165185
func setResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) {
166186
setStatusCondition(conditions, &metav1.Condition{
187+
Message: v1alpha1.MessageDemoted,
167188
Type: v1alpha1.ConditionCompleted,
168189
Reason: v1alpha1.Demoted,
169190
ObservedGeneration: observedGeneration,
170191
Status: metav1.ConditionTrue,
171192
})
172193
setStatusCondition(conditions, &metav1.Condition{
194+
Message: v1alpha1.MessageDegraded,
173195
Type: v1alpha1.ConditionDegraded,
174196
Reason: v1alpha1.VolumeDegraded,
175197
ObservedGeneration: observedGeneration,
176198
Status: metav1.ConditionTrue,
177199
})
178200
setStatusCondition(conditions, &metav1.Condition{
201+
Message: v1alpha1.MessageResyncTriggered,
179202
Type: v1alpha1.ConditionResyncing,
180203
Reason: v1alpha1.ResyncTriggered,
181204
ObservedGeneration: observedGeneration,
@@ -184,20 +207,23 @@ func setResyncCondition(conditions *[]metav1.Condition, observedGeneration int64
184207
}
185208

186209
// sets conditions when volume resync failed.
187-
func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration int64) {
210+
func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration int64, message, messageFromDriver string) {
188211
setStatusCondition(conditions, &metav1.Condition{
212+
Message: message,
189213
Type: v1alpha1.ConditionCompleted,
190214
Reason: v1alpha1.FailedToResync,
191215
ObservedGeneration: observedGeneration,
192216
Status: metav1.ConditionFalse,
193217
})
194218
setStatusCondition(conditions, &metav1.Condition{
219+
Message: fmt.Sprintf("%s: %s", v1alpha1.MessageResyncFailed, messageFromDriver),
195220
Type: v1alpha1.ConditionDegraded,
196221
Reason: v1alpha1.Error,
197222
ObservedGeneration: observedGeneration,
198223
Status: metav1.ConditionTrue,
199224
})
200225
setStatusCondition(conditions, &metav1.Condition{
226+
Message: v1alpha1.MessageResyncFailed,
201227
Type: v1alpha1.ConditionResyncing,
202228
Reason: v1alpha1.FailedToResync,
203229
ObservedGeneration: observedGeneration,
@@ -223,6 +249,7 @@ func setStatusCondition(existingConditions *[]metav1.Condition, newCondition *me
223249
existingCondition.LastTransitionTime = metav1.NewTime(time.Now())
224250
}
225251

252+
existingCondition.Message = newCondition.Message
226253
existingCondition.Reason = newCondition.Reason
227254
existingCondition.ObservedGeneration = newCondition.ObservedGeneration
228255
}

internal/controller/replication.storage/volumereplication_controller.go

+17-17
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 find 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
}
@@ -748,9 +748,9 @@ func (r *VolumeReplicationReconciler) enableReplication(vr *volumeReplicationIns
748748
vr.logger.Error(resp.Error, "failed to enable volume replication")
749749

750750
if resp.HasKnownGRPCError(enableReplicationKnownErrors) {
751-
setFailedValidationCondition(&vr.instance.Status.Conditions, vr.instance.Generation)
751+
setFailedValidationCondition(&vr.instance.Status.Conditions, vr.instance.Generation, "failed to enable volume replication", resp.Error.Error())
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)