Skip to content

Commit 52c087f

Browse files
init2
Signed-off-by: Yaroslav Borbat <[email protected]>
1 parent 3e0a047 commit 52c087f

File tree

8 files changed

+451
-109
lines changed

8 files changed

+451
-109
lines changed

api/core/v1alpha2/vdcondition/condition.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,5 +178,6 @@ const (
178178
)
179179

180180
const (
181-
MigratingReason MigrationReason = "Migrating"
181+
MigratingReason MigrationReason = "Migrating"
182+
PendingMigratingReason MigrationReason = "Pending"
182183
)

api/core/v1alpha2/virtual_disk.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ type VirtualDiskStatus struct {
8181
StorageClassName string `json:"storageClassName,omitempty"`
8282

8383
// Migration information.
84-
MigrationInfo *VirtualDiskMigrationInfo `json:"migrationInfo,omitempty"`
84+
MigrationInfo VirtualDiskMigrationInfo `json:"migrationInfo,omitempty"`
8585
// Migration requests.
8686
MigrationRequests []VirtualDiskMigrationRequest `json:"migrationRequest,omitempty"`
8787
}
@@ -225,9 +225,12 @@ type VirtualDiskMigrationInfo struct {
225225
// Source PersistentVolumeClaim name.
226226
SourcePVC string `json:"sourcePVC,omitempty"`
227227
// Target PersistentVolumeClaim name.
228-
TargetPVC string `json:"targetPVC,omitempty"`
229-
Completed bool `json:"completed"`
230-
Failed bool `json:"failed"`
228+
TargetPVC string `json:"targetPVC,omitempty"`
229+
Completed bool `json:"completed"`
230+
Failed bool `json:"failed"`
231+
Message string `json:"message,omitempty"`
232+
StartTimestamp metav1.Time `json:"startTimestamp,omitempty"`
233+
EndTimestamp metav1.Time `json:"endTimestamp,omitempty"`
231234
}
232235

233236
type VirtualDiskMigrationRequest struct {
@@ -239,6 +242,7 @@ type VirtualDiskMigrationRequest struct {
239242
type VirtualDiskMigrationRequestAction string
240243

241244
const (
242-
VirtualDiskMigrationRequestActionMigrate VirtualDiskMigrationRequestAction = "migrate"
243-
VirtualDiskMigrationRequestActionRevert VirtualDiskMigrationRequestAction = "revert"
245+
VirtualDiskMigrationRequestActionMigrate VirtualDiskMigrationRequestAction = "migrate"
246+
VirtualDiskMigrationRequestActionRevert VirtualDiskMigrationRequestAction = "revert"
247+
VirtualDiskMigrationRequestActionComplete VirtualDiskMigrationRequestAction = "complete"
244248
)

api/core/v1alpha2/zz_generated.deepcopy.go

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

crds/virtualdisks.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,19 @@ spec:
371371
properties:
372372
completed:
373373
type: boolean
374+
endTimestamp:
375+
format: date-time
376+
type: string
374377
failed:
375378
type: boolean
379+
message:
380+
type: string
376381
sourcePVC:
377382
description: Source PersistentVolumeClaim name.
378383
type: string
384+
startTimestamp:
385+
format: date-time
386+
type: string
379387
targetPVC:
380388
description: Target PersistentVolumeClaim name.
381389
type: string

images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go

Lines changed: 117 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package volumemigrator
2+
3+
import (
4+
"context"
5+
6+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
"k8s.io/apimachinery/pkg/types"
8+
"sigs.k8s.io/controller-runtime/pkg/client"
9+
10+
"github.com/deckhouse/virtualization-controller/pkg/common/patch"
11+
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
12+
"github.com/deckhouse/virtualization/api/core/v1alpha2"
13+
"github.com/deckhouse/virtualization/api/core/v1alpha2/vdcondition"
14+
)
15+
16+
//go:generate go tool moq -rm -out mock.go . VirtualDiskMigrationService
17+
type VirtualDiskMigrationService interface {
18+
Migrate(ctx context.Context, vd *v1alpha2.VirtualDisk, opts ...MigrationOption) error
19+
}
20+
21+
type virtualDiskMigrationService struct {
22+
client client.Client
23+
}
24+
25+
func NewVirtualDiskMigrationService(client client.Client) VirtualDiskMigrationService {
26+
return &virtualDiskMigrationService{
27+
client: client,
28+
}
29+
}
30+
31+
type migrationOptions struct {
32+
storageClassName *string
33+
}
34+
35+
func newMigrationOptions(opts ...MigrationOption) *migrationOptions {
36+
o := &migrationOptions{}
37+
for _, opt := range opts {
38+
opt(o)
39+
}
40+
return o
41+
}
42+
43+
type MigrationOption func(o *migrationOptions)
44+
45+
func WithStorageClassName(name string) MigrationOption {
46+
return func(o *migrationOptions) {
47+
o.storageClassName = &name
48+
}
49+
}
50+
51+
func (v *virtualDiskMigrationService) Migrate(ctx context.Context, vd *v1alpha2.VirtualDisk, opts ...MigrationOption) error {
52+
if !v.requestNeeded(vd) {
53+
return nil
54+
}
55+
56+
options := newMigrationOptions(opts...)
57+
58+
req := v1alpha2.VirtualDiskMigrationRequest{
59+
Action: v1alpha2.VirtualDiskMigrationRequestActionMigrate,
60+
}
61+
if options.storageClassName != nil {
62+
req.StorageClassName = *options.storageClassName
63+
}
64+
65+
requests := make([]v1alpha2.VirtualDiskMigrationRequest, 0, len(vd.Status.MigrationRequests)+1)
66+
for _, r := range vd.Status.MigrationRequests {
67+
requests = append(requests, *r.DeepCopy())
68+
}
69+
requests = append(requests, req)
70+
71+
patchBytes, err := patch.NewJSONPatch(patch.WithReplace("/status/migrationRequests", requests)).Bytes()
72+
if err != nil {
73+
return err
74+
}
75+
76+
return v.client.Patch(ctx, vd, client.RawPatch(types.JSONPatchType, patchBytes))
77+
}
78+
79+
func (v *virtualDiskMigrationService) requestNeeded(vd *v1alpha2.VirtualDisk) bool {
80+
if vd == nil {
81+
return false
82+
}
83+
84+
cond, _ := conditions.GetCondition(vdcondition.MigrationType, vd.Status.Conditions)
85+
if cond.Status == metav1.ConditionTrue {
86+
return false
87+
}
88+
89+
for _, req := range vd.Status.MigrationRequests {
90+
if req.Action == v1alpha2.VirtualDiskMigrationRequestActionMigrate {
91+
return false
92+
}
93+
}
94+
95+
return true
96+
}

0 commit comments

Comments
 (0)