Skip to content

Commit 67e91a2

Browse files
committed
rvr-volume-controller spec
Signed-off-by: Aleksandr Stefurishin <[email protected]>
1 parent 4ab536d commit 67e91a2

File tree

4 files changed

+490
-327
lines changed

4 files changed

+490
-327
lines changed

api/v1alpha3/replicated_volume_replica.go

Lines changed: 26 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ package v1alpha3
33
import (
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
11945
type 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
225171
type DRBDStatus struct {
226172
Name string `json:"name"`

api/v1alpha3/zz_generated.deepcopy.go

Lines changed: 48 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)