Skip to content

Commit 164e12f

Browse files
committed
add conditions for replication status
add replication status condition to VR Status which helps in understanding the current replication state of the image/group Signed-off-by: Nikhil-Ladha <nikhilladha1999@gmail.com>
1 parent 9b0ad1e commit 164e12f

File tree

3 files changed

+90
-15
lines changed

3 files changed

+90
-15
lines changed

api/replication.storage/v1alpha1/volumereplication_types.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,31 @@ const (
2929
// "ConditionCompleted" means the condition is fulfilled.
3030
// "ConditionDegraded" means the condition is not fulfilled.
3131
// "ConditionResyncing" means the condition is resyncing.
32+
// "ConditionReplicating" means the condition is replicating.
3233
const (
33-
ConditionCompleted = "Completed"
34-
ConditionDegraded = "Degraded"
35-
ConditionResyncing = "Resyncing"
36-
ConditionValidated = "Validated"
34+
ConditionCompleted = "Completed"
35+
ConditionDegraded = "Degraded"
36+
ConditionResyncing = "Resyncing"
37+
ConditionValidated = "Validated"
38+
ConditionReplicating = "Replicating"
3739
)
3840

3941
// These are valid messages for various conditions and states of volume replication.
4042
const (
41-
MessagePromoted = "is promoted to primary and replicating to secondary"
42-
MessageHealthy = "is healthy"
43-
MessageNotResyncing = "is not resyncing"
44-
MessageValidated = "is validated and met all prerequisites"
45-
MessageFailedPromoted = "failed to promote"
46-
MessageFailedDemoted = "failed to demote"
47-
MessageFailedPreCondition = "failed to meet prerequisite"
48-
MessageDemoted = "is demoted to secondary"
49-
MessageDegraded = "is degraded"
50-
MessageResyncTriggered = "is resyncing changes from primary to secondary"
51-
MessageResyncFailed = "failed to resync"
43+
MessagePromoted = "is promoted to primary and replicating to secondary"
44+
MessageHealthy = "is healthy"
45+
MessageNotResyncing = "is not resyncing"
46+
MessageValidated = "is validated and met all prerequisites"
47+
MessageFailedPromoted = "failed to promote"
48+
MessageFailedDemoted = "failed to demote"
49+
MessageFailedPreCondition = "failed to meet prerequisite"
50+
MessageDemoted = "is demoted to secondary"
51+
MessageDegraded = "is degraded"
52+
MessageResyncTriggered = "is resyncing changes from primary to secondary"
53+
MessageResyncFailed = "failed to resync"
54+
MessageReplicating = "is replicating"
55+
MessageNotReplicating = "is not replicating"
56+
MessageUnknownReplicationState = "replication status is unknown"
5257
)
5358

5459
type Source string
@@ -87,6 +92,10 @@ const (
8792
PrerequisiteMet = "PrerequisiteMet"
8893
// PrerequisiteNotMet condition represents that the prerequisite is not met.
8994
PrerequisiteNotMet = "PrerequisiteNotMet"
95+
// Replicating condition represents that the volume/group is replicating.
96+
Replicating = "Replicating"
97+
// NotReplicating condition represents that the volume/group is not replicating.
98+
NotReplicating = "NotReplicating"
9099
)
91100

92101
// ReplicationState represents the replication operations to be performed on the volume.

internal/controller/replication.storage/status.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,54 @@ func setFailedResyncCondition(conditions *[]metav1.Condition, observedGeneration
250250
})
251251
}
252252

253+
// sets unknown replication condition
254+
func setUnknownReplicationCondition(conditions *[]metav1.Condition, observedGeneration int64, dataSource, statusMessage string) {
255+
source := getSource(dataSource)
256+
setStatusCondition(conditions, &metav1.Condition{
257+
Message: fmt.Sprintf("%s %s: %s", source, v1alpha1.MessageUnknownReplicationState, statusMessage),
258+
Type: v1alpha1.ConditionReplicating,
259+
Reason: v1alpha1.Replicating,
260+
ObservedGeneration: observedGeneration,
261+
Status: metav1.ConditionUnknown,
262+
})
263+
}
264+
265+
// sets healthy replication condition
266+
func setHealthyReplicationCondition(conditions *[]metav1.Condition, observedGeneration int64, dataSource, statusMessage string) {
267+
source := getSource(dataSource)
268+
setStatusCondition(conditions, &metav1.Condition{
269+
Message: fmt.Sprintf("%s %s: %s", source, v1alpha1.MessageReplicating, statusMessage),
270+
Type: v1alpha1.ConditionReplicating,
271+
Reason: v1alpha1.Replicating,
272+
ObservedGeneration: observedGeneration,
273+
Status: metav1.ConditionTrue,
274+
})
275+
}
276+
277+
// sets degraded replication condition
278+
func setDegradedReplicationCondition(conditions *[]metav1.Condition, observedGeneration int64, dataSource, statusMessage string) {
279+
source := getSource(dataSource)
280+
setStatusCondition(conditions, &metav1.Condition{
281+
Message: fmt.Sprintf("%s %s: %s", source, v1alpha1.MessageNotReplicating, statusMessage),
282+
Type: v1alpha1.ConditionReplicating,
283+
Reason: v1alpha1.NotReplicating,
284+
ObservedGeneration: observedGeneration,
285+
Status: metav1.ConditionFalse,
286+
})
287+
}
288+
289+
// sets error replication condition
290+
func setErrorReplicationCondition(conditions *[]metav1.Condition, observedGeneration int64, dataSource, statusMessage string) {
291+
source := getSource(dataSource)
292+
setStatusCondition(conditions, &metav1.Condition{
293+
Message: fmt.Sprintf("%s %s: %s", source, v1alpha1.MessageNotReplicating, statusMessage),
294+
Type: v1alpha1.ConditionReplicating,
295+
Reason: v1alpha1.NotReplicating,
296+
ObservedGeneration: observedGeneration,
297+
Status: metav1.ConditionFalse,
298+
})
299+
}
300+
253301
func setStatusCondition(existingConditions *[]metav1.Condition, newCondition *metav1.Condition) {
254302
if existingConditions == nil {
255303
existingConditions = &[]metav1.Condition{}

internal/controller/replication.storage/volumereplication_controller.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,11 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
449449
instance.Status.LastSyncBytes = &tb
450450
}
451451
}
452+
msg := info.StatusMessage
453+
if msg == "" {
454+
msg = "message not provided by vendor"
455+
}
456+
setReplicationCondition(vr.instance, vr.instance.Spec.DataSource.Kind, msg, info.Status)
452457
requeueForInfo = true
453458
} else if !util.IsUnimplementedError(err) {
454459
logger.Error(err, "Failed to get volume replication info")
@@ -772,6 +777,19 @@ func setFailureCondition(instance *replicationv1alpha1.VolumeReplication, errMes
772777
}
773778
}
774779

780+
func setReplicationCondition(instance *replicationv1alpha1.VolumeReplication, dataSource, statusMessage string, replicationStatus proto.GetVolumeReplicationInfoResponse_Status) {
781+
switch replicationStatus {
782+
case proto.GetVolumeReplicationInfoResponse_UNKNOWN:
783+
setUnknownReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
784+
case proto.GetVolumeReplicationInfoResponse_HEALTHY:
785+
setHealthyReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
786+
case proto.GetVolumeReplicationInfoResponse_DEGRADED:
787+
setDegradedReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
788+
case proto.GetVolumeReplicationInfoResponse_ERROR:
789+
setErrorReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
790+
}
791+
}
792+
775793
func getCurrentTime() *metav1.Time {
776794
metav1NowTime := metav1.NewTime(time.Now())
777795

0 commit comments

Comments
 (0)