Skip to content

Commit 2769399

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 7d6de84 commit 2769399

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
@@ -449,6 +449,11 @@ func (r *VolumeReplicationReconciler) Reconcile(ctx context.Context, req ctrl.Re
449449
instance.Status.LastSyncBytes = &tb
450450
}
451451
}
452+
// Check for nil, as info might be nil for knownGRPCErrors.
453+
if info != nil {
454+
// We set Replicating condition only for primary state and not for secondary state.
455+
setReplicationCondition(vr.instance, vr.instance.Spec.DataSource.Kind, info.StatusMessage, info.Status)
456+
}
452457
requeueForInfo = true
453458
} else if !util.IsUnimplementedError(err) {
454459
logger.Error(err, "Failed to get volume replication info")
@@ -772,6 +777,18 @@ func setFailureCondition(instance *replicationv1alpha1.VolumeReplication, errMes
772777
}
773778
}
774779

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

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)