Skip to content

Commit 1dfc4ca

Browse files
author
Valeriy Khorunzhin
committed
tmp
Signed-off-by: Valeriy Khorunzhin <[email protected]>
1 parent a8849ba commit 1dfc4ca

File tree

20 files changed

+176
-172
lines changed

20 files changed

+176
-172
lines changed

api/core/v1alpha2/vdscondition/condition.go

+19-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ limitations under the License.
1717
package vdscondition
1818

1919
// Type represents the various condition types for the `VirtualDiskSnapshot`.
20-
type Type = string
20+
type Type string
21+
22+
func (s Type) String() string {
23+
return string(s)
24+
}
2125

2226
const (
2327
// VirtualDiskReadyType indicates that the source `VirtualDisk` is ready for snapshotting.
@@ -28,11 +32,23 @@ const (
2832

2933
type (
3034
// VirtualDiskReadyReason represents the various reasons for the `VirtualDiskReady` condition type.
31-
VirtualDiskReadyReason = string
35+
VirtualDiskReadyReason string
3236
// VirtualDiskSnapshotReadyReason represents the various reasons for the `VirtualDiskSnapshotReady` condition type.
33-
VirtualDiskSnapshotReadyReason = string
37+
VirtualDiskSnapshotReadyReason string
3438
)
3539

40+
func (s VirtualDiskReadyReason) String() string {
41+
return string(s)
42+
}
43+
44+
func (s VirtualDiskSnapshotReadyReason) String() string {
45+
return string(s)
46+
}
47+
48+
func (s Type) VirtualDiskSnapshotReadyReason() string {
49+
return string(s)
50+
}
51+
3652
const (
3753
// VirtualDiskReady signifies that the source virtual disk is ready for snapshotting, allowing the snapshot process to begin.
3854
VirtualDiskReady VirtualDiskReadyReason = "VirtualDiskReady"

images/virtualization-artifact/pkg/controller/service/condition.go

-16
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,10 @@ import (
2020
"unicode"
2121

2222
corev1 "k8s.io/api/core/v1"
23-
"k8s.io/apimachinery/pkg/api/meta"
24-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2523
virtv1 "kubevirt.io/api/core/v1"
2624
cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1"
2725
)
2826

29-
func GetCondition(condType string, conds []metav1.Condition) (metav1.Condition, bool) {
30-
for _, cond := range conds {
31-
if cond.Type == condType {
32-
return cond, true
33-
}
34-
}
35-
36-
return metav1.Condition{}, false
37-
}
38-
39-
func SetCondition(cond metav1.Condition, conditions *[]metav1.Condition) {
40-
meta.SetStatusCondition(conditions, cond)
41-
}
42-
4327
func CapitalizeFirstLetter(s string) string {
4428
if s == "" {
4529
return ""

images/virtualization-artifact/pkg/controller/service/snapshot_service.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"k8s.io/apimachinery/pkg/types"
2828
"sigs.k8s.io/controller-runtime/pkg/client"
2929

30+
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
3031
"github.com/deckhouse/virtualization-controller/pkg/sdk/framework/helper"
3132
"github.com/deckhouse/virtualization/api/client/kubeclient"
3233
virtv2 "github.com/deckhouse/virtualization/api/core/v1alpha2"
@@ -53,7 +54,7 @@ func (s *SnapshotService) IsFrozen(vm *virtv2.VirtualMachine) bool {
5354
return false
5455
}
5556

56-
filesystemReady, _ := GetCondition(vmcondition.TypeFilesystemReady.String(), vm.Status.Conditions)
57+
filesystemReady, _ := conditions.GetCondition(vmcondition.TypeFilesystemReady, vm.Status.Conditions)
5758

5859
return filesystemReady.Status == metav1.ConditionFalse && filesystemReady.Reason == vmcondition.ReasonFilesystemFrozen.String()
5960
}
@@ -63,7 +64,7 @@ func (s *SnapshotService) CanFreeze(vm *virtv2.VirtualMachine) bool {
6364
return false
6465
}
6566

66-
agentReady, _ := GetCondition(vmcondition.TypeAgentReady.String(), vm.Status.Conditions)
67+
agentReady, _ := conditions.GetCondition(vmcondition.TypeAgentReady, vm.Status.Conditions)
6768

6869
return agentReady.Status == metav1.ConditionTrue
6970
}

images/virtualization-artifact/pkg/controller/service/vm_operation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ func (s VMOperationService) IsComplete(ctx context.Context, vmop *virtv2.Virtual
235235
func (s VMOperationService) isAfterSignalSentOrCreation(timestamp time.Time, vmop *virtv2.VirtualMachineOperation) bool {
236236
// Use vmop creation time or time from SignalSent condition.
237237
signalSentTime := vmop.GetCreationTimestamp().Time
238-
signalSendCond, found := GetCondition(vmopcondition.SignalSentType.String(), vmop.Status.Conditions)
238+
signalSendCond, found := conditions.GetCondition(vmopcondition.SignalSentType, vmop.Status.Conditions)
239239
if found && signalSendCond.Status == metav1.ConditionTrue && signalSendCond.LastTransitionTime.After(signalSentTime) {
240240
signalSentTime = signalSendCond.LastTransitionTime.Time
241241
}

images/virtualization-artifact/pkg/controller/vdsnapshot/internal/life_cycle.go

+68-63
Original file line numberDiff line numberDiff line change
@@ -47,40 +47,34 @@ func NewLifeCycleHandler(snapshotter LifeCycleSnapshotter) *LifeCycleHandler {
4747
func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.VirtualDiskSnapshot) (reconcile.Result, error) {
4848
log := logger.FromContext(ctx).With(logger.SlogHandler("lifecycle"))
4949

50-
condition, ok := service.GetCondition(vdscondition.VirtualDiskSnapshotReadyType, vdSnapshot.Status.Conditions)
51-
if !ok {
52-
condition = metav1.Condition{
53-
Type: vdscondition.VirtualDiskSnapshotReadyType,
54-
Status: metav1.ConditionUnknown,
55-
Reason: conditions.ReasonUnknown.String(),
56-
}
57-
}
50+
cb := conditions.NewConditionBuilder(vdscondition.VirtualDiskSnapshotReadyType).Generation(vdSnapshot.Generation)
5851

59-
defer func() { service.SetCondition(condition, &vdSnapshot.Status.Conditions) }()
52+
defer func() { conditions.SetCondition(cb, &vdSnapshot.Status.Conditions) }()
6053

6154
vs, err := h.snapshotter.GetVolumeSnapshot(ctx, vdSnapshot.Name, vdSnapshot.Namespace)
6255
if err != nil {
63-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
56+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
6457
return reconcile.Result{}, err
6558
}
6659

6760
vd, err := h.snapshotter.GetVirtualDisk(ctx, vdSnapshot.Spec.VirtualDiskName, vdSnapshot.Namespace)
6861
if err != nil {
69-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
62+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
7063
return reconcile.Result{}, err
7164
}
7265

7366
vm, err := getVirtualMachine(ctx, vd, h.snapshotter)
7467
if err != nil {
75-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
68+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
7669
return reconcile.Result{}, err
7770
}
7871

7972
if vdSnapshot.DeletionTimestamp != nil {
8073
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseTerminating
81-
condition.Status = metav1.ConditionUnknown
82-
condition.Reason = conditions.ReasonUnknown.String()
83-
condition.Message = ""
74+
cb.
75+
Status(metav1.ConditionUnknown).
76+
Reason(conditions.ReasonUnknown).
77+
Message("")
8478

8579
return reconcile.Result{}, nil
8680
}
@@ -91,42 +85,46 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.Virtual
9185
case virtv2.VirtualDiskSnapshotPhaseReady:
9286
if vs == nil || vs.Status == nil || vs.Status.ReadyToUse == nil || !*vs.Status.ReadyToUse {
9387
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseFailed
94-
condition.Status = metav1.ConditionFalse
95-
condition.Reason = vdscondition.VolumeSnapshotLost
96-
condition.Message = fmt.Sprintf("The underlieng volume snapshot %q is not ready to use.", vdSnapshot.Status.VolumeSnapshotName)
88+
cb.
89+
Status(metav1.ConditionFalse).
90+
Reason(vdscondition.VolumeSnapshotLost).
91+
Message(fmt.Sprintf("The underlieng volume snapshot %q is not ready to use.", vdSnapshot.Status.VolumeSnapshotName))
9792
return reconcile.Result{Requeue: true}, nil
9893
}
9994

10095
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseReady
101-
condition.Status = metav1.ConditionTrue
102-
condition.Reason = vdscondition.VirtualDiskSnapshotReady
103-
condition.Message = ""
96+
cb.
97+
Status(metav1.ConditionTrue).
98+
Reason(vdscondition.VirtualDiskSnapshotReady).
99+
Message("")
104100
return reconcile.Result{}, nil
105101
}
106102

107-
virtualDiskReadyCondition, _ := service.GetCondition(vdscondition.VirtualDiskReadyType, vdSnapshot.Status.Conditions)
103+
virtualDiskReadyCondition, _ := conditions.GetCondition(vdscondition.VirtualDiskReadyType, vdSnapshot.Status.Conditions)
108104
if vd == nil || virtualDiskReadyCondition.Status != metav1.ConditionTrue {
109105
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhasePending
110-
condition.Status = metav1.ConditionFalse
111-
condition.Reason = vdscondition.WaitingForTheVirtualDisk
112-
condition.Message = fmt.Sprintf("Waiting for the virtual disk %q to be ready for snapshotting.", vdSnapshot.Spec.VirtualDiskName)
106+
cb.
107+
Status(metav1.ConditionFalse).
108+
Reason(vdscondition.WaitingForTheVirtualDisk).
109+
Message(fmt.Sprintf("Waiting for the virtual disk %q to be ready for snapshotting.", vdSnapshot.Spec.VirtualDiskName))
113110
return reconcile.Result{}, nil
114111
}
115112

116113
var pvc *corev1.PersistentVolumeClaim
117114
if vd.Status.Target.PersistentVolumeClaim != "" {
118115
pvc, err = h.snapshotter.GetPersistentVolumeClaim(ctx, vd.Status.Target.PersistentVolumeClaim, vd.Namespace)
119116
if err != nil {
120-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
117+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
121118
return reconcile.Result{}, err
122119
}
123120
}
124121

125122
if pvc == nil || pvc.Status.Phase != corev1.ClaimBound {
126123
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhasePending
127-
condition.Status = metav1.ConditionFalse
128-
condition.Reason = vdscondition.WaitingForTheVirtualDisk
129-
condition.Message = "Waiting for the virtual disk's pvc to be in phase Bound."
124+
cb.
125+
Status(metav1.ConditionFalse).
126+
Reason(vdscondition.WaitingForTheVirtualDisk).
127+
Message("Waiting for the virtual disk's pvc to be in phase Bound.")
130128
return reconcile.Result{}, nil
131129
}
132130

@@ -138,30 +136,32 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.Virtual
138136

139137
err = h.snapshotter.Freeze(ctx, vm.Name, vm.Namespace)
140138
if err != nil {
141-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
139+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
142140
return reconcile.Result{}, err
143141
}
144142

145143
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseInProgress
146-
condition.Status = metav1.ConditionFalse
147-
condition.Reason = vdscondition.FileSystemFreezing
148-
condition.Message = fmt.Sprintf(
149-
"The virtual machine %q with an attached virtual disk %q is in the process of being frozen for taking a snapshot.",
150-
vm.Name, vdSnapshot.Spec.VirtualDiskName,
151-
)
144+
cb.
145+
Status(metav1.ConditionFalse).
146+
Reason(vdscondition.FileSystemFreezing).
147+
Message(fmt.Sprintf(
148+
"The virtual machine %q with an attached virtual disk %q is in the process of being frozen for taking a snapshot.",
149+
vm.Name, vdSnapshot.Spec.VirtualDiskName,
150+
))
152151
return reconcile.Result{}, nil
153152
}
154153

155154
if vdSnapshot.Spec.RequiredConsistency {
156155
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhasePending
157-
condition.Status = metav1.ConditionFalse
158-
condition.Reason = vdscondition.PotentiallyInconsistent
159-
condition.Message = fmt.Sprintf(
160-
"The virtual machine %q with an attached virtual disk %q is %s: "+
161-
"the snapshotting of virtual disk might result in an inconsistent snapshot: "+
162-
"waiting for the virtual machine to be %s or the disk to be detached",
163-
vm.Name, vd.Name, vm.Status.Phase, virtv2.MachineStopped,
164-
)
156+
cb.
157+
Status(metav1.ConditionFalse).
158+
Reason(vdscondition.PotentiallyInconsistent).
159+
Message(fmt.Sprintf(
160+
"The virtual machine %q with an attached virtual disk %q is %s: "+
161+
"the snapshotting of virtual disk might result in an inconsistent snapshot: "+
162+
"waiting for the virtual machine to be %s or the disk to be detached",
163+
vm.Name, vd.Name, vm.Status.Phase, virtv2.MachineStopped,
164+
))
165165
return reconcile.Result{}, nil
166166
}
167167
}
@@ -203,31 +203,34 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.Virtual
203203

204204
vs, err = h.snapshotter.CreateVolumeSnapshot(ctx, vs)
205205
if err != nil {
206-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
206+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
207207
return reconcile.Result{}, err
208208
}
209209

210210
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseInProgress
211211
vdSnapshot.Status.VolumeSnapshotName = vs.Name
212-
condition.Status = metav1.ConditionFalse
213-
condition.Reason = vdscondition.Snapshotting
214-
condition.Message = fmt.Sprintf("The snapshotting process for virtual disk %q has started.", vdSnapshot.Spec.VirtualDiskName)
212+
cb.
213+
Status(metav1.ConditionFalse).
214+
Reason(vdscondition.Snapshotting).
215+
Message(fmt.Sprintf("The snapshotting process for virtual disk %q has started.", vdSnapshot.Spec.VirtualDiskName))
215216
return reconcile.Result{}, nil
216217
case vs.Status != nil && vs.Status.Error != nil && vs.Status.Error.Message != nil:
217218
log.Debug("The volume snapshot has an error")
218219

219220
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseFailed
220-
condition.Status = metav1.ConditionFalse
221-
condition.Reason = vdscondition.VirtualDiskSnapshotFailed
222-
condition.Message = fmt.Sprintf("VolumeSnapshot %q has an error: %s.", vs.Name, *vs.Status.Error.Message)
221+
cb.
222+
Status(metav1.ConditionFalse).
223+
Reason(vdscondition.VirtualDiskSnapshotFailed).
224+
Message(fmt.Sprintf("VolumeSnapshot %q has an error: %s.", vs.Name, *vs.Status.Error.Message))
223225
return reconcile.Result{}, nil
224226
case vs.Status == nil || vs.Status.ReadyToUse == nil || !*vs.Status.ReadyToUse:
225227
log.Debug("Waiting for the volume snapshot to be ready to use")
226228

227229
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseInProgress
228-
condition.Status = metav1.ConditionFalse
229-
condition.Reason = vdscondition.Snapshotting
230-
condition.Message = fmt.Sprintf("Waiting fot the volume snapshot %q to be ready to use.", vdSnapshot.Name)
230+
cb.
231+
Status(metav1.ConditionFalse).
232+
Reason(vdscondition.Snapshotting).
233+
Message(fmt.Sprintf("Waiting fot the volume snapshot %q to be ready to use.", vdSnapshot.Name))
231234
return reconcile.Result{}, nil
232235
default:
233236
log.Debug("The volume snapshot is ready to use")
@@ -241,7 +244,7 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.Virtual
241244
var canUnfreeze bool
242245
canUnfreeze, err = h.snapshotter.CanUnfreeze(ctx, vdSnapshot.Name, vm)
243246
if err != nil {
244-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
247+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
245248
return reconcile.Result{}, err
246249
}
247250

@@ -250,16 +253,17 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vdSnapshot *virtv2.Virtual
250253

251254
err = h.snapshotter.Unfreeze(ctx, vm.Name, vm.Namespace)
252255
if err != nil {
253-
setPhaseConditionToFailed(&condition, &vdSnapshot.Status.Phase, err)
256+
setPhaseConditionToFailed(cb, &vdSnapshot.Status.Phase, err)
254257
return reconcile.Result{}, err
255258
}
256259
}
257260
}
258261

259262
vdSnapshot.Status.Phase = virtv2.VirtualDiskSnapshotPhaseReady
260-
condition.Status = metav1.ConditionTrue
261-
condition.Reason = vdscondition.VirtualDiskSnapshotReady
262-
condition.Message = ""
263+
cb.
264+
Status(metav1.ConditionTrue).
265+
Reason(vdscondition.VirtualDiskSnapshotReady).
266+
Message("")
263267

264268
return reconcile.Result{}, nil
265269
}
@@ -286,9 +290,10 @@ func getVirtualMachine(ctx context.Context, vd *virtv2.VirtualDisk, snapshotter
286290
}
287291
}
288292

289-
func setPhaseConditionToFailed(cond *metav1.Condition, phase *virtv2.VirtualDiskSnapshotPhase, err error) {
293+
func setPhaseConditionToFailed(cb *conditions.ConditionBuilder, phase *virtv2.VirtualDiskSnapshotPhase, err error) {
290294
*phase = virtv2.VirtualDiskSnapshotPhaseFailed
291-
cond.Status = metav1.ConditionFalse
292-
cond.Reason = vdscondition.VirtualDiskSnapshotFailed
293-
cond.Message = service.CapitalizeFirstLetter(err.Error())
295+
cb.
296+
Status(metav1.ConditionFalse).
297+
Reason(vdscondition.VirtualDiskSnapshotFailed).
298+
Message(service.CapitalizeFirstLetter(err.Error()))
294299
}

0 commit comments

Comments
 (0)