Skip to content

Commit ef2eb57

Browse files
authored
Merge of #826
2 parents 116ff8f + 2769399 commit ef2eb57

File tree

10 files changed

+485
-207
lines changed

10 files changed

+485
-207
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.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24.0
44

55
require (
66
github.com/container-storage-interface/spec v1.11.0
7-
github.com/csi-addons/spec v0.2.1-0.20241104111131-27825f744db5
7+
github.com/csi-addons/spec v0.2.1-0.20250610152019-b5a7205f6a79
88
github.com/go-logr/logr v1.4.3
99
github.com/kubernetes-csi/csi-lib-utils v0.22.0
1010
github.com/onsi/ginkgo/v2 v2.23.4

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
1313
github.com/container-storage-interface/spec v1.11.0 h1:H/YKTOeUZwHtyPOr9raR+HgFmGluGCklulxDYxSdVNM=
1414
github.com/container-storage-interface/spec v1.11.0/go.mod h1:DtUvaQszPml1YJfIK7c00mlv6/g4wNMLanLgiUbKFRI=
1515
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
16-
github.com/csi-addons/spec v0.2.1-0.20241104111131-27825f744db5 h1:j9NaWj5KmzEVarmsjxS/NDAhes6Uzq1qhkUGHvDlVBk=
17-
github.com/csi-addons/spec v0.2.1-0.20241104111131-27825f744db5/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
16+
github.com/csi-addons/spec v0.2.1-0.20250610152019-b5a7205f6a79 h1:ditFTa+wl7DLanGQHSS/AwuITGuWeBXyl7syPO4n+4s=
17+
github.com/csi-addons/spec v0.2.1-0.20250610152019-b5a7205f6a79/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
1818
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1919
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2020
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=

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

0 commit comments

Comments
 (0)