Skip to content

Commit 5af0733

Browse files
Nikhil-Ladhamergify[bot]
authored andcommitted
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 d662589 commit 5af0733

File tree

4 files changed

+78
-15
lines changed

4 files changed

+78
-15
lines changed

api/replication.storage/v1alpha1/volumereplication_types.go

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,29 @@ const (
3030
// "ConditionDegraded" means the condition is not fulfilled.
3131
// "ConditionResyncing" means the condition is resyncing.
3232
const (
33-
ConditionCompleted = "Completed"
34-
ConditionDegraded = "Degraded"
35-
ConditionResyncing = "Resyncing"
36-
ConditionValidated = "Validated"
33+
ConditionCompleted = "Completed"
34+
ConditionDegraded = "Degraded"
35+
ConditionResyncing = "Resyncing"
36+
ConditionValidated = "Validated"
37+
ConditionReplicating = "Replicating"
3738
)
3839

3940
// These are valid messages for various conditions and states of volume replication.
4041
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"
42+
MessagePromoted = "is promoted to primary and replicating to secondary"
43+
MessageHealthy = "is healthy"
44+
MessageNotResyncing = "is not resyncing"
45+
MessageValidated = "is validated and met all prerequisites"
46+
MessageFailedPromoted = "failed to promote"
47+
MessageFailedDemoted = "failed to demote"
48+
MessageFailedPreCondition = "failed to meet prerequisite"
49+
MessageDemoted = "is demoted to secondary"
50+
MessageDegraded = "is degraded"
51+
MessageResyncTriggered = "is resyncing changes from primary to secondary"
52+
MessageResyncFailed = "failed to resync"
53+
MessageReplicating = "is replicating"
54+
MessageNotReplicating = "is not replicating"
55+
MessageUnknownReplicationState = "replication status is unknown"
5256
)
5357

5458
type Source string
@@ -87,6 +91,10 @@ const (
8791
PrerequisiteMet = "PrerequisiteMet"
8892
// PrerequisiteNotMet condition represents that the prerequisite is not met.
8993
PrerequisiteNotMet = "PrerequisiteNotMet"
94+
// Replicating condition represents that the volume/group is replicating.
95+
Replicating = "Replicating"
96+
// NotReplicating condition represents that the volume/group is not replicating.
97+
NotReplicating = "NotReplicating"
9098
)
9199

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

internal/controller/replication.storage/status.go

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

253+
// sets ConditionUnknown for ConditionReplicating condition in VR status.Conditions.
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 ConditionTrue for ConditionReplicating condition in VR status.Conditions
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 ConditionFalse for ConditionReplicating condition in VR status.Conditions
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+
253289
func setStatusCondition(existingConditions *[]metav1.Condition, newCondition *metav1.Condition) {
254290
if existingConditions == nil {
255291
existingConditions = &[]metav1.Condition{}

internal/controller/replication.storage/volumereplication_controller.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,11 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
455455
instance.Status.LastSyncBytes = &tb
456456
}
457457
}
458+
// Check for nil, as info might be nil for knownGRPCErrors.
459+
if info != nil {
460+
// We set Replicating condition only for primary state and not for secondary state.
461+
setReplicationCondition(vr.instance, vr.instance.Spec.DataSource.Kind, info.StatusMessage, info.Status)
462+
}
458463
requeueForInfo = true
459464
} else if !util.IsUnimplementedError(err) {
460465
logger.Error(err, "Failed to get volume replication info")
@@ -776,6 +781,18 @@ func setFailureCondition(instance *replicationv1alpha1.VolumeReplication, errMes
776781
}
777782
}
778783

784+
// setReplicationCondition sets the replication condition in VR's status.Conditions for the PVC/VolumeGroup dataSource based on the replicationStatus value.
785+
func setReplicationCondition(instance *replicationv1alpha1.VolumeReplication, dataSource, statusMessage string, replicationStatus proto.GetVolumeReplicationInfoResponse_Status) {
786+
switch replicationStatus {
787+
case proto.GetVolumeReplicationInfoResponse_UNKNOWN:
788+
setUnknownReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
789+
case proto.GetVolumeReplicationInfoResponse_HEALTHY:
790+
setHealthyReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
791+
case proto.GetVolumeReplicationInfoResponse_DEGRADED, proto.GetVolumeReplicationInfoResponse_ERROR:
792+
setDegradedReplicationCondition(&instance.Status.Conditions, instance.Generation, dataSource, statusMessage)
793+
}
794+
}
795+
779796
func getCurrentTime() *metav1.Time {
780797
metav1NowTime := metav1.NewTime(time.Now())
781798

internal/sidecar/service/volumereplication.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ func (rs *ReplicationServer) GetVolumeReplicationInfo(
255255
LastSyncTime: lastsynctime,
256256
LastSyncDuration: resp.GetLastSyncDuration(),
257257
LastSyncBytes: resp.GetLastSyncBytes(),
258+
Status: proto.GetVolumeReplicationInfoResponse_Status(resp.GetStatus()),
259+
StatusMessage: resp.StatusMessage,
258260
}, nil
259261
}
260262

0 commit comments

Comments
 (0)