Skip to content

Commit c99eaf8

Browse files
committed
feat(vm): add snapshotting and restore mac addresses
Signed-off-by: Dmitry Lopatin <[email protected]>
1 parent b920f98 commit c99eaf8

File tree

7 files changed

+384
-0
lines changed

7 files changed

+384
-0
lines changed

images/virtualization-artifact/pkg/controller/service/restorer/keys.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ const (
2020
virtualMachineKey = "vm"
2121
virtualMachineBlockDeviceAttachmentKey = "vmbdas"
2222
virtualMachineIPAddressKey = "vmip"
23+
virtualMachineMACAddressesKey = "vmmacs"
2324
provisionerKey = "provisioner"
2425
)

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ func (r SecretRestorer) Store(ctx context.Context, vm *virtv2.VirtualMachine, vm
7070
return nil, err
7171
}
7272

73+
err = r.setVirtualMachineMACAddresses(ctx, &secret, vm)
74+
if err != nil {
75+
return nil, err
76+
}
77+
7378
err = r.setProvisioning(ctx, &secret, vm)
7479
if err != nil {
7580
return nil, err
@@ -100,6 +105,26 @@ func (r SecretRestorer) RestoreVirtualMachineIPAddress(_ context.Context, secret
100105
return get[*virtv2.VirtualMachineIPAddress](secret, virtualMachineIPAddressKey)
101106
}
102107

108+
func (r SecretRestorer) RestoreVirtualMachineMACAddresses(_ context.Context, secret *corev1.Secret) ([]*virtv2.VirtualMachineMACAddress, error) {
109+
return get[[]*virtv2.VirtualMachineMACAddress](secret, virtualMachineMACAddressesKey)
110+
}
111+
112+
func (r SecretRestorer) RestoreMACAddressOrder(_ context.Context, secret *corev1.Secret) ([]string, error) {
113+
vm, err := get[*virtv2.VirtualMachine](secret, virtualMachineKey)
114+
if err != nil {
115+
return nil, err
116+
}
117+
118+
var macAddressOrder []string
119+
for _, ns := range vm.Status.Networks {
120+
if ns.Type == virtv2.NetworksTypeMain {
121+
continue
122+
}
123+
macAddressOrder = append(macAddressOrder, ns.MAC)
124+
}
125+
return macAddressOrder, nil
126+
}
127+
103128
func (r SecretRestorer) RestoreVirtualMachineBlockDeviceAttachments(_ context.Context, secret *corev1.Secret) ([]*virtv2.VirtualMachineBlockDeviceAttachment, error) {
104129
return get[[]*virtv2.VirtualMachineBlockDeviceAttachment](secret, virtualMachineBlockDeviceAttachmentKey)
105130
}
@@ -225,6 +250,38 @@ func (r SecretRestorer) setVirtualMachineIPAddress(ctx context.Context, secret *
225250
return nil
226251
}
227252

253+
func (r SecretRestorer) setVirtualMachineMACAddresses(ctx context.Context, secret *corev1.Secret, vm *virtv2.VirtualMachine) error {
254+
var vmmacs []virtv2.VirtualMachineMACAddress
255+
for _, ns := range vm.Status.Networks {
256+
if ns.Type == virtv2.NetworksTypeMain {
257+
continue
258+
}
259+
260+
vmmac, err := object.FetchObject(ctx, types.NamespacedName{
261+
Namespace: vm.Namespace,
262+
Name: ns.VirtualMachineMACAddressName,
263+
}, r.client, &virtv2.VirtualMachineMACAddress{})
264+
if err != nil {
265+
return err
266+
}
267+
268+
if vmmac == nil {
269+
return fmt.Errorf("the virtual machine mac address %q not found", ns.VirtualMachineMACAddressName)
270+
}
271+
272+
vmmac.Spec.Address = vmmac.Status.Address
273+
vmmacs = append(vmmacs, *vmmac)
274+
}
275+
276+
JSON, err := json.Marshal(vmmacs)
277+
if err != nil {
278+
return err
279+
}
280+
281+
secret.Data[virtualMachineMACAddressesKey] = []byte(base64.StdEncoding.EncodeToString(JSON))
282+
return nil
283+
}
284+
228285
func (r SecretRestorer) setProvisioning(ctx context.Context, secret *corev1.Secret, vm *virtv2.VirtualMachine) error {
229286
var secretName string
230287

images/virtualization-artifact/pkg/controller/vmrestore/internal/interfaces.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ type Restorer interface {
3131
RestoreProvisioner(ctx context.Context, secret *corev1.Secret) (*corev1.Secret, error)
3232
RestoreVirtualMachineIPAddress(ctx context.Context, secret *corev1.Secret) (*virtv2.VirtualMachineIPAddress, error)
3333
RestoreVirtualMachineBlockDeviceAttachments(ctx context.Context, secret *corev1.Secret) ([]*virtv2.VirtualMachineBlockDeviceAttachment, error)
34+
RestoreVirtualMachineMACAddresses(ctx context.Context, secret *corev1.Secret) ([]*virtv2.VirtualMachineMACAddress, error)
35+
RestoreMACAddressOrder(ctx context.Context, secret *corev1.Secret) ([]string, error)
3436
}

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,35 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vmRestore *virtv2.VirtualM
160160
overrideValidators = append(overrideValidators, restorer.NewVirtualMachineIPAddressOverrideValidator(vmip, h.client, string(vmRestore.UID)))
161161
}
162162

163+
vmmacs, err := h.restorer.RestoreVirtualMachineMACAddresses(ctx, restorerSecret)
164+
if err != nil {
165+
setPhaseConditionToFailed(cb, &vmRestore.Status.Phase, err)
166+
return reconcile.Result{}, err
167+
}
168+
169+
macAddressOrder, err := h.restorer.RestoreMACAddressOrder(ctx, restorerSecret)
170+
if err != nil {
171+
setPhaseConditionToFailed(cb, &vmRestore.Status.Phase, err)
172+
return reconcile.Result{}, err
173+
}
174+
175+
if len(vmmacs) > 0 {
176+
macAddressNamesByAddress := make(map[string]string)
177+
for _, vmmac := range vmmacs {
178+
overrideValidators = append(overrideValidators, restorer.NewVirtualMachineMACAddressOverrideValidator(vmmac, h.client, string(vmRestore.UID)))
179+
macAddressNamesByAddress[vmmac.Status.Address] = vmmac.Name
180+
}
181+
182+
for i := range vm.Spec.Networks {
183+
ns := &vm.Spec.Networks[i]
184+
if ns.Type == virtv2.NetworksTypeMain {
185+
continue
186+
}
187+
188+
ns.VirtualMachineMACAddressName = macAddressNamesByAddress[macAddressOrder[i-1]]
189+
}
190+
}
191+
163192
overrideValidators = append(overrideValidators, restorer.NewVirtualMachineOverrideValidator(vm, h.client, string(vmRestore.UID)))
164193

165194
overridedVMName, err = h.getOverrridedVMName(overrideValidators)

images/virtualization-artifact/pkg/controller/vmrestore/internal/mock.go

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

0 commit comments

Comments
 (0)