@@ -3,9 +3,7 @@ package v1alpha3
33import (
44 "fmt"
55 "strings"
6- "time"
76
8- "k8s.io/apimachinery/pkg/api/meta"
97 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
108 "k8s.io/apimachinery/pkg/fields"
119)
@@ -43,78 +41,6 @@ func (rvr *ReplicatedVolumeReplica) NodeNameSelector(nodeName string) fields.Sel
4341 return fields .OneTermEqualSelector ("spec.nodeName" , nodeName )
4442}
4543
46- func (rvr * ReplicatedVolumeReplica ) IsConfigured () bool {
47- return rvr .Status != nil && rvr .Status .Config != nil
48- }
49-
50- func (rvr * ReplicatedVolumeReplica ) InitializeStatusConditions () {
51- if rvr .Status == nil {
52- rvr .Status = & ReplicatedVolumeReplicaStatus {}
53- }
54-
55- if rvr .Status .Conditions == nil {
56- rvr .Status .Conditions = []metav1.Condition {}
57- }
58-
59- for t , opts := range ReplicatedVolumeReplicaConditions {
60- if meta .FindStatusCondition (rvr .Status .Conditions , t ) != nil {
61- continue
62- }
63- cond := metav1.Condition {
64- Type : t ,
65- Status : metav1 .ConditionUnknown ,
66- Reason : "Initializing" ,
67- Message : "" ,
68- LastTransitionTime : metav1 .NewTime (time .Now ()),
69- }
70- if opts .UseObservedGeneration {
71- cond .ObservedGeneration = rvr .Generation
72- }
73- rvr .Status .Conditions = append (rvr .Status .Conditions , cond )
74- }
75- }
76-
77- func (rvr * ReplicatedVolumeReplica ) RecalculateStatusConditionReady () {
78- if rvr .Status == nil || rvr .Status .Conditions == nil {
79- return
80- }
81-
82- cfgAdjCondition := meta .FindStatusCondition (
83- rvr .Status .Conditions ,
84- ConditionTypeConfigurationAdjusted ,
85- )
86-
87- readyCond := metav1.Condition {
88- Type : ConditionTypeReady ,
89- Status : metav1 .ConditionFalse ,
90- ObservedGeneration : rvr .Generation ,
91- }
92-
93- if cfgAdjCondition != nil &&
94- cfgAdjCondition .Status == metav1 .ConditionFalse &&
95- cfgAdjCondition .Reason == ReasonConfigurationAdjustmentPausedUntilInitialSync {
96- readyCond .Reason = ReasonWaitingForInitialSync
97- readyCond .Message = "Configuration adjustment waits for InitialSync"
98- } else if cfgAdjCondition == nil ||
99- cfgAdjCondition .Status != metav1 .ConditionTrue {
100- readyCond .Reason = ReasonAdjustmentFailed
101- readyCond .Message = "Resource adjustment failed"
102- } else if ! meta .IsStatusConditionTrue (rvr .Status .Conditions , ConditionTypeDevicesReady ) {
103- readyCond .Reason = ReasonDevicesAreNotReady
104- readyCond .Message = "Devices are not ready"
105- } else if ! meta .IsStatusConditionTrue (rvr .Status .Conditions , ConditionTypeQuorum ) {
106- readyCond .Reason = ReasonNoQuorum
107- } else if meta .IsStatusConditionTrue (rvr .Status .Conditions , ConditionTypeDiskIOSuspended ) {
108- readyCond .Reason = ReasonDiskIOSuspended
109- } else {
110- readyCond .Status = metav1 .ConditionTrue
111- readyCond .Reason = ReasonReady
112- readyCond .Message = "Replica is configured and operational"
113- }
114-
115- meta .SetStatusCondition (& rvr .Status .Conditions , readyCond )
116- }
117-
11844// +k8s:deepcopy-gen=true
11945type ReplicatedVolumeReplicaSpec struct {
12046 // +kubebuilder:validation:Required
@@ -124,14 +50,13 @@ type ReplicatedVolumeReplicaSpec struct {
12450 // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="replicatedVolumeName is immutable"
12551 ReplicatedVolumeName string `json:"replicatedVolumeName"`
12652
127- // +kubebuilder:validation:Required
53+ // +optional
12854 // +kubebuilder:validation:MinLength=1
12955 // +kubebuilder:validation:MaxLength=253
130- // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="nodeName is immutable"
13156 NodeName string `json:"nodeName"`
13257
133- // +kubebuilder:default=false
134- Diskless bool `json:"diskless ,omitempty"`
58+ // +kubebuilder:validation:Enum=Diskful;Access;TieBreaker
59+ Type string `json:"type ,omitempty"`
13560}
13661
13762// +k8s:deepcopy-gen=true
@@ -166,9 +91,12 @@ type ReplicatedVolumeReplicaStatus struct {
16691 // +listMapKey=type
16792 // +optional
16893 Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"`
94+
95+ // +kubebuilder:validation:Enum=Diskful;Access;TieBreaker
96+ ActualType string `json:"actualType,omitempty"`
97+
16998 // +patchStrategy=merge
170- Config * DRBDConfig `json:"config,omitempty" patchStrategy:"merge"`
171- DRBD * DRBDStatus `json:"drbd,omitempty"`
99+ DRBD * DRBD `json:"drbd,omitempty" patchStrategy:"merge"`
172100}
173101
174102// +k8s:deepcopy-gen=true
@@ -221,6 +149,24 @@ func (v *DRBDConfig) ParseDisk() (actualVGNameOnTheNode, actualLVNameOnTheNode s
221149 return parts [2 ], parts [3 ], nil
222150}
223151
152+ // +k8s:deepcopy-gen=true
153+ type DRBD struct {
154+ // +patchStrategy=merge
155+ Config * DRBDConfig `json:"config,omitempty" patchStrategy:"merge"`
156+ // +patchStrategy=merge
157+ Actual * DRBDActual `json:"actual,omitempty" patchStrategy:"merge"`
158+ // +patchStrategy=merge
159+ Status * DRBDStatus `json:"status,omitempty" patchStrategy:"merge"`
160+ }
161+
162+ // +k8s:deepcopy-gen=true
163+ type DRBDActual struct {
164+ // +optional
165+ // +kubebuilder:validation:Pattern=`^(/[a-zA-Z0-9/.+_-]+)?$`
166+ // +kubebuilder:validation:MaxLength=256
167+ Disk string `json:"disk,omitempty"`
168+ }
169+
224170// +k8s:deepcopy-gen=true
225171type DRBDStatus struct {
226172 Name string `json:"name"`
0 commit comments