@@ -683,77 +683,91 @@ func (r *Builder) mapNetworks(vm *model.VM, object *cnv.VirtualMachineSpec) (err
683
683
684
684
numNetworks := 0
685
685
netMapIn := r .Context .Map .Network .Spec .Map
686
+ for i := range netMapIn {
687
+ mapped := & netMapIn [i ]
686
688
687
- for _ , nic := range vm .NICs {
688
- mapped := r .findNetworkMapping (nic , netMapIn )
689
-
690
- // Skip if no valid mapping found or the destination type is Ignored
691
- if mapped == nil || mapped .Destination .Type == Ignored {
689
+ // Skip network mappings with destination type 'Ignored'
690
+ if mapped .Destination .Type == Ignored {
692
691
continue
693
692
}
694
693
695
- networkName := fmt .Sprintf ("net-%v" , numNetworks )
694
+ ref := mapped .Source
695
+ network := & model.Network {}
696
+ fErr := r .Source .Inventory .Find (network , ref )
697
+ if fErr != nil {
698
+ err = fErr
699
+ return
700
+ }
696
701
697
- // If a name template is defined, try to use it
698
- networkNameTemplate := r .getNetworkNameTemplate (vm )
699
- if networkNameTemplate != "" {
700
- templateData := api.NetworkNameTemplateData {
701
- NetworkName : mapped .Destination .Name ,
702
- NetworkNamespace : mapped .Destination .Namespace ,
703
- NetworkType : mapped .Destination .Type ,
704
- NetworkIndex : numNetworks ,
705
- }
706
- if generated , err := r .executeTemplate (networkNameTemplate , & templateData ); err == nil && generated != "" {
707
- networkName = generated
708
- } else {
709
- r .Log .Info ("Failed to generate network name using template, using default" , "template" , networkNameTemplate , "error" , err )
702
+ needed := []vsphere.NIC {}
703
+ for _ , nic := range vm .NICs {
704
+ switch network .Variant {
705
+ case vsphere .NetDvPortGroup , vsphere .OpaqueNetwork :
706
+ if nic .Network .ID == network .Key {
707
+ needed = append (needed , nic )
708
+ }
709
+ default :
710
+ if nic .Network .ID == network .ID {
711
+ needed = append (needed , nic )
712
+ }
710
713
}
711
714
}
712
-
713
- numNetworks ++
714
- kNetwork := cnv.Network {Name : networkName }
715
- kInterface := cnv.Interface {
716
- Name : networkName ,
717
- Model : Virtio ,
718
- MacAddress : nic .MAC ,
715
+ if len (needed ) == 0 {
716
+ continue
719
717
}
718
+ for _ , nic := range needed {
719
+ networkName := fmt .Sprintf ("net-%v" , numNetworks )
720
+
721
+ // If the network name template is set, use it to generate the network name.
722
+ networkNameTemplate := r .getNetworkNameTemplate (vm )
723
+ if networkNameTemplate != "" {
724
+ // Create template data
725
+ templateData := api.NetworkNameTemplateData {
726
+ NetworkName : mapped .Destination .Name ,
727
+ NetworkNamespace : mapped .Destination .Namespace ,
728
+ NetworkType : mapped .Destination .Type ,
729
+ NetworkIndex : numNetworks ,
730
+ }
731
+
732
+ networkName , err = r .executeTemplate (networkNameTemplate , & templateData )
733
+ if err != nil {
734
+ // Failed to generate network name using template
735
+ r .Log .Info ("Failed to generate network name using template, using default name" , "template" , networkNameTemplate , "error" , err )
720
736
721
- switch mapped .Destination .Type {
722
- case Pod :
723
- kNetwork .Pod = & cnv.PodNetwork {}
724
- kInterface .Masquerade = & cnv.InterfaceMasquerade {}
725
- case Multus :
726
- kNetwork .Multus = & cnv.MultusNetwork {
727
- NetworkName : path .Join (mapped .Destination .Namespace , mapped .Destination .Name ),
737
+ // Fallback to default name and reset error
738
+ networkName = fmt .Sprintf ("net-%v" , numNetworks )
739
+ err = nil
740
+ }
728
741
}
729
- kInterface .Bridge = & cnv.InterfaceBridge {}
730
- }
731
742
732
- kNetworks = append (kNetworks , kNetwork )
733
- kInterfaces = append (kInterfaces , kInterface )
743
+ numNetworks ++
744
+ kNetwork := cnv.Network {
745
+ Name : networkName ,
746
+ }
747
+ kInterface := cnv.Interface {
748
+ Name : networkName ,
749
+ Model : Virtio ,
750
+ MacAddress : nic .MAC ,
751
+ }
752
+ switch mapped .Destination .Type {
753
+ case Pod :
754
+ kNetwork .Pod = & cnv.PodNetwork {}
755
+ kInterface .Masquerade = & cnv.InterfaceMasquerade {}
756
+ case Multus :
757
+ kNetwork .Multus = & cnv.MultusNetwork {
758
+ NetworkName : path .Join (mapped .Destination .Namespace , mapped .Destination .Name ),
759
+ }
760
+ kInterface .Bridge = & cnv.InterfaceBridge {}
761
+ }
762
+ kNetworks = append (kNetworks , kNetwork )
763
+ kInterfaces = append (kInterfaces , kInterface )
764
+ }
734
765
}
735
-
736
766
object .Template .Spec .Networks = kNetworks
737
767
object .Template .Spec .Domain .Devices .Interfaces = kInterfaces
738
768
return
739
769
}
740
770
741
- func (r * Builder ) findNetworkMapping (nic vsphere.NIC , netMap []api.NetworkPair ) * api.NetworkPair {
742
- for i := range netMap {
743
- candidate := & netMap [i ]
744
- network := & model.Network {}
745
- if err := r .Source .Inventory .Find (network , candidate .Source ); err != nil {
746
- continue
747
- }
748
-
749
- if (network .Variant == vsphere .NetDvPortGroup || network .Variant == vsphere .OpaqueNetwork ) &&
750
- nic .Network .ID == network .Key || nic .Network .ID == network .ID {
751
- return candidate
752
- }
753
- }
754
- return nil
755
- }
756
-
757
771
func (r * Builder ) mapInput (object * cnv.VirtualMachineSpec ) {
758
772
tablet := cnv.Input {
759
773
Type : Tablet ,
0 commit comments