Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pool-manager: Prevent panic if VM template is nil #431

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions pkg/pool-manager/pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,16 @@ var _ = Describe("Pool", func() {
updateTransactionTimestamp := func(secondsPassed time.Duration) time.Time {
return time.Now().Add(secondsPassed * time.Second)
}
It("should not allocate if VM template is nil", func() {
poolManager := createPoolManager("02:00:00:00:00:00", "02:00:00:00:00:02")
newInvalidVM := multipleInterfacesVM.DeepCopy()
newInvalidVM.Name = "newVM"
newInvalidVM.Spec.Template = nil

transactionTimestamp := updateTransactionTimestamp(0)
err := poolManager.AllocateVirtualMachineMac(newInvalidVM, &transactionTimestamp, true, logger)
Expect(err).ToNot(HaveOccurred())
})
It("should reject allocation if there are interfaces with the same name", func() {
poolManager := createPoolManager("02:00:00:00:00:00", "02:00:00:00:00:02")
newVM := duplicateInterfacesVM.DeepCopy()
Expand Down Expand Up @@ -419,6 +429,26 @@ var _ = Describe("Pool", func() {
})
})
Describe("Update vm object", func() {
It("should not allocate if VM template is nil", func() {
poolManager := createPoolManager("02:00:00:00:00:00", "02:00:00:00:00:02")
newVM := multipleInterfacesVM.DeepCopy()
newVM.Name = "newVM"

transactionTimestamp := updateTransactionTimestamp(0)
err := poolManager.AllocateVirtualMachineMac(newVM, &transactionTimestamp, true, logger)
Expect(err).ToNot(HaveOccurred())

updateVm := multipleInterfacesVM.DeepCopy()
newInvalidVM := newVM.DeepCopy()
newInvalidVM.Spec.Template = nil
err = poolManager.UpdateMacAddressesForVirtualMachine(newInvalidVM, updateVm, &transactionTimestamp, true, logger)
Expect(err).ToNot(HaveOccurred())

updateInvalidVm := multipleInterfacesVM.DeepCopy()
updateInvalidVm.Spec.Template = nil
err = poolManager.UpdateMacAddressesForVirtualMachine(newVM, updateInvalidVm, &transactionTimestamp, true, logger)
Expect(err).ToNot(HaveOccurred())
})
It("should preserve disk.io configuration on update", func() {
addDiskIO := func(vm *kubevirt.VirtualMachine, ioName kubevirt.DriverIO) {
vm.Spec.Template.Spec.Domain.Devices.Disks = make([]kubevirt.Disk, 1)
Expand Down
13 changes: 13 additions & 0 deletions pkg/pool-manager/virtualmachine_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ func (p *PoolManager) AllocateVirtualMachineMac(virtualMachine *kubevirt.Virtual
defer p.poolMutex.Unlock()
logger := parentLogger.WithName("AllocateVirtualMachineMac")

if virtualMachine.Spec.Template == nil {
logger.Info("virtual machine template is nil, skipping mac allocation", "virtualMachine", virtualMachine)
return nil
}
if len(virtualMachine.Spec.Template.Spec.Domain.Devices.Interfaces) == 0 {
logger.Info("no interfaces found for virtual machine, skipping mac allocation", "virtualMachine", virtualMachine)
return nil
Expand Down Expand Up @@ -133,6 +137,15 @@ func (p *PoolManager) UpdateMacAddressesForVirtualMachine(previousVirtualMachine
}
defer p.poolMutex.Unlock()

if previousVirtualMachine.Spec.Template == nil {
logger.Info("virtual machine template is nil, skipping mac allocation", "virtualMachine", virtualMachine)
return nil
}
if virtualMachine.Spec.Template == nil {
logger.Info("virtual machine template is nil, skipping mac allocation", "virtualMachine", virtualMachine)
return nil
}

// We can't allow for duplicate interfaces names, as interface.Name is macMap's key.
if isNotDryRun {
if err := checkVmForInterfaceDuplication(virtualMachine); err != nil {
Expand Down
Loading