mirror of
https://github.com/harvester/vm-import-controller.git
synced 2025-06-03 01:44:51 +00:00
address openstack network duplication when interface may have both ipv6 and ipv4 addresses and add preflight check to identify duplicate source network definitions
This commit is contained in:
parent
ccc02a4edf
commit
03a8ef08e9
@ -226,6 +226,17 @@ func (h *virtualMachineHandler) preFlightChecks(vm *migration.VirtualMachineImpo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dedup source network names as the same source network name cannot appear twice
|
||||||
|
sourceNetworkMap := make(map[string]bool)
|
||||||
|
for _, network := range vm.Spec.Mapping {
|
||||||
|
_, ok := sourceNetworkMap[network.SourceNetwork]
|
||||||
|
if !ok {
|
||||||
|
sourceNetworkMap[network.SourceNetwork] = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return fmt.Errorf("source network %s appears multiple times in vm spec", network.SourceNetwork)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,23 +337,11 @@ func (c *Client) GenerateVirtualMachine(vm *migration.VirtualMachineImport) (*ku
|
|||||||
return nil, fmt.Errorf("error getting firware settings: %v", err)
|
return nil, fmt.Errorf("error getting firware settings: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var networks []networkInfo
|
networks, err := generateNetworkInfo(vmObj.Addresses)
|
||||||
for network, values := range vmObj.Addresses {
|
if err != nil {
|
||||||
valArr, ok := values.([]interface{})
|
return nil, err
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("error asserting interface []interface")
|
|
||||||
}
|
|
||||||
for _, v := range valArr {
|
|
||||||
valMap, ok := v.(map[string]interface{})
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("error asserting network array element into map[string]string")
|
|
||||||
}
|
|
||||||
networks = append(networks, networkInfo{
|
|
||||||
NetworkName: network,
|
|
||||||
MAC: valMap["OS-EXT-IPS-MAC:mac_addr"].(string),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
newVM := &kubevirt.VirtualMachine{
|
newVM := &kubevirt.VirtualMachine{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: vm.Spec.VirtualMachineName,
|
Name: vm.Spec.VirtualMachineName,
|
||||||
@ -640,3 +628,35 @@ func (c *Client) ImageFirmwareSettings(instance *servers.Server) (bool, bool, bo
|
|||||||
}
|
}
|
||||||
return uefiType, tpmEnabled, secureBoot, nil
|
return uefiType, tpmEnabled, secureBoot, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func generateNetworkInfo(info map[string]interface{}) ([]networkInfo, error) {
|
||||||
|
networks := make([]networkInfo, 0)
|
||||||
|
uniqueNetworks := make([]networkInfo, 0)
|
||||||
|
for network, values := range info {
|
||||||
|
valArr, ok := values.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("error asserting interface []interface")
|
||||||
|
}
|
||||||
|
for _, v := range valArr {
|
||||||
|
valMap, ok := v.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("error asserting network array element into map[string]string")
|
||||||
|
}
|
||||||
|
networks = append(networks, networkInfo{
|
||||||
|
NetworkName: network,
|
||||||
|
MAC: valMap["OS-EXT-IPS-MAC:mac_addr"].(string),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// in case of interfaces with ipv6 and ipv4 addresses they are reported twice, so we need to dedup them
|
||||||
|
// based on a mac address
|
||||||
|
networksMap := make(map[string]networkInfo)
|
||||||
|
for _, v := range networks {
|
||||||
|
networksMap[v.MAC] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range networksMap {
|
||||||
|
uniqueNetworks = append(uniqueNetworks, v)
|
||||||
|
}
|
||||||
|
return uniqueNetworks, nil
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package openstack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -124,3 +125,16 @@ func Test_GenerateVirtualMachine(t *testing.T) {
|
|||||||
assert.NotEmpty(newVM.Spec.Template.Spec.Networks, "expected to find atleast 1 network as pod network should have been applied")
|
assert.NotEmpty(newVM.Spec.Template.Spec.Networks, "expected to find atleast 1 network as pod network should have been applied")
|
||||||
assert.NotEmpty(newVM.Spec.Template.Spec.Domain.Devices.Interfaces, "expected to find atleast 1 interface for pod-network")
|
assert.NotEmpty(newVM.Spec.Template.Spec.Domain.Devices.Interfaces, "expected to find atleast 1 interface for pod-network")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_generateNetworkInfo(t *testing.T) {
|
||||||
|
networkInfoByte := []byte(`{"private":[{"OS-EXT-IPS-MAC:mac_addr":"fa:16:3e:92:5f:45","OS-EXT-IPS:type":"fixed","addr":"fd5b:731d:94e1:0:f816:3eff:fe92:5f45","version":6},{"OS-EXT-IPS-MAC:mac_addr":"fa:16:3e:92:5f:45","OS-EXT-IPS:type":"fixed","addr":"10.0.0.38","version":4}],"shared":[{"OS-EXT-IPS-MAC:mac_addr":"fa:16:3e:ec:49:11","OS-EXT-IPS:type":"fixed","addr":"192.168.233.233","version":4}]}`)
|
||||||
|
var networkInfoMap map[string]interface{}
|
||||||
|
assert := require.New(t)
|
||||||
|
err := json.Unmarshal(networkInfoByte, &networkInfoMap)
|
||||||
|
assert.NoError(err, "expected no error while unmarshalling network info")
|
||||||
|
|
||||||
|
vmInterfaceDetails, err := generateNetworkInfo(networkInfoMap)
|
||||||
|
assert.NoError(err, "expected no error while generating network info")
|
||||||
|
assert.Len(vmInterfaceDetails, 2, "expected to find 2 interfaces only")
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user