Skip to content

Commit

Permalink
net binding plugin: Add binding sidecars to virt-launcher
Browse files Browse the repository at this point in the history
Signed-off-by: Alona Paz <alkaplan@redhat.com>
  • Loading branch information
AlonaKaplan committed Aug 14, 2023
1 parent 968fcc0 commit 274224f
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pkg/virt-controller/services/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go_library(
name = "go_default_library",
srcs = [
"multus_annotations.go",
"net_binding.go",
"nodeselectorrenderer.go",
"rendercontainer.go",
"renderresources.go",
Expand Down Expand Up @@ -54,6 +55,7 @@ go_test(
name = "go_default_test",
srcs = [
"multus_annotations_test.go",
"net_binding_test.go",
"nodeselectorrenderer_test.go",
"rendercontainer_test.go",
"renderresources_test.go",
Expand All @@ -76,6 +78,7 @@ go_test(
"//staging/src/kubevirt.io/client-go/generated/network-attachment-definition-client/clientset/versioned/fake:go_default_library",
"//staging/src/kubevirt.io/client-go/kubecli:go_default_library",
"//staging/src/kubevirt.io/client-go/testutils:go_default_library",
"//tests/libvmi:go_default_library",
"//tools/vms-generator/utils:go_default_library",
"//vendor/github.com/golang/mock/gomock:go_default_library",
"//vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1:go_default_library",
Expand Down
30 changes: 30 additions & 0 deletions pkg/virt-controller/services/net_binding.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package services

import (
"fmt"

v1 "kubevirt.io/api/core/v1"

"kubevirt.io/kubevirt/pkg/hooks"
)

func BindingPluginSidecarList(vmi *v1.VirtualMachineInstance, config *v1.KubeVirtConfiguration) (hooks.HookSidecarList, error) {
var pluginSidecars hooks.HookSidecarList
for _, iface := range vmi.Spec.Domain.Devices.Interfaces {
if iface.Binding != nil {
var exist bool
var pluginInfo v1.InterfaceBindingPlugin
if config.NetworkConfiguration != nil && config.NetworkConfiguration.Binding != nil {
pluginInfo, exist = config.NetworkConfiguration.Binding[iface.Binding.Name]
}

if !exist {
return nil, fmt.Errorf("couldn't find configuration for bindining: %s", iface.Binding.Name)
}
if pluginInfo.SidecarImage != "" {
pluginSidecars = append(pluginSidecars, hooks.HookSidecar{Image: pluginInfo.SidecarImage})
}
}
}
return pluginSidecars, nil
}
85 changes: 85 additions & 0 deletions pkg/virt-controller/services/net_binding_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package services_test

import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
v1 "kubevirt.io/api/core/v1"

"kubevirt.io/kubevirt/pkg/hooks"
"kubevirt.io/kubevirt/pkg/virt-controller/services"
"kubevirt.io/kubevirt/tests/libvmi"
)

var _ = Describe("Network Binding", func() {
const (
testNetworkName1 = "net1"
testBindingName1 = "binding1"
testSidecarImage1 = "image1"
testNetworkName2 = "net2"
testBindingName2 = "binding2"
testSidecarImage2 = "image2"
testNetworkName3 = "net1"

shouldSucceed = true
)

BeforeEach(func() {

})
Context("binding plugin sidecar list", func() {
DescribeTable("should create the correct sidecars", func(vmi *v1.VirtualMachineInstance, bindings map[string]v1.InterfaceBindingPlugin, expectedSidecars hooks.HookSidecarList, shouldSucceed bool) {
config := &v1.KubeVirtConfiguration{
NetworkConfiguration: &v1.NetworkConfiguration{
Binding: bindings,
},
}
sidecars, err := services.BindingPluginSidecarList(vmi, config)
if shouldSucceed {
Expect(err).ToNot(HaveOccurred())
Expect(sidecars).To(Equal(expectedSidecars))
} else {
Expect(err).To(HaveOccurred())
}
},
Entry("VMI has binding plugin but config doesn't exist",
libvmi.New(libvmi.WithInterface(v1.Interface{Name: testNetworkName1, Binding: &v1.PluggedBinding{Name: testBindingName1}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName1}),
),
nil,
nil,
!shouldSucceed),
Entry("VMI has binding plugin but config image is empty",
libvmi.New(libvmi.WithInterface(v1.Interface{Name: testNetworkName1, Binding: &v1.PluggedBinding{Name: testBindingName1}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName1}),
),
map[string]v1.InterfaceBindingPlugin{testBindingName1: {}},
nil,
shouldSucceed),
Entry("VMI has binding plugin and config image",
libvmi.New(libvmi.WithInterface(v1.Interface{Name: testNetworkName1, Binding: &v1.PluggedBinding{Name: testBindingName1}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName1}),
),
map[string]v1.InterfaceBindingPlugin{testBindingName1: {SidecarImage: testSidecarImage1}},
hooks.HookSidecarList{{Image: testSidecarImage1}},
shouldSucceed),
Entry("VMI has multiple plugin bindings",
libvmi.New(libvmi.WithInterface(v1.Interface{Name: testNetworkName1, Binding: &v1.PluggedBinding{Name: testBindingName1}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName1}),
libvmi.WithInterface(v1.Interface{Name: testNetworkName2, Binding: &v1.PluggedBinding{Name: testBindingName2}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName2}),
libvmi.WithInterface(v1.Interface{Name: testNetworkName3, InterfaceBindingMethod: v1.InterfaceBindingMethod{SRIOV: &v1.InterfaceSRIOV{}}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName3}),
),
map[string]v1.InterfaceBindingPlugin{testBindingName1: {SidecarImage: testSidecarImage1}, testBindingName2: {SidecarImage: testSidecarImage2}},
hooks.HookSidecarList{{Image: testSidecarImage1}, {Image: testSidecarImage2}},
shouldSucceed),
Entry("VMI has no plugin bindings",
libvmi.New(libvmi.WithInterface(v1.Interface{Name: testNetworkName1, InterfaceBindingMethod: v1.InterfaceBindingMethod{SRIOV: &v1.InterfaceSRIOV{}}}),
libvmi.WithNetwork(&v1.Network{Name: testNetworkName1}),
),
nil,
nil,
shouldSucceed),
)
})
})
6 changes: 6 additions & 0 deletions pkg/virt-controller/services/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,12 @@ func (t *templateService) renderLaunchManifest(vmi *v1.VirtualMachineInstance, i
return nil, err
}

bindingSidecars, err := BindingPluginSidecarList(vmi, t.clusterConfig.GetConfig())
requestedHookSidecarList = append(requestedHookSidecarList, bindingSidecars...)
if err != nil {
return nil, err
}

var command []string
if tempPod {
logger := log.DefaultLogger()
Expand Down

0 comments on commit 274224f

Please sign in to comment.