Skip to content
This repository has been archived by the owner on May 12, 2021. It is now read-only.

Commit

Permalink
virtcontainers/network: Change signature of Enpoint Attach method
Browse files Browse the repository at this point in the history
In order to use the device manager and receiver from the network enpoints,
the signature of the Attach method must change to revice a Sandbox instead of
a Hypervisor, this way devices can be added through the device manager API.

Signed-off-by: Julio Montes <[email protected]>
  • Loading branch information
Julio Montes committed Jun 16, 2020
1 parent 581ff97 commit 3c8c650
Show file tree
Hide file tree
Showing 12 changed files with 38 additions and 28 deletions.
3 changes: 2 additions & 1 deletion virtcontainers/bridgedmacvlan_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ func (endpoint *BridgedMacvlanEndpoint) NetworkPair() *NetworkInterfacePair {

// Attach for virtual endpoint bridges the network pair and adds the
// tap interface of the network pair to the hypervisor.
func (endpoint *BridgedMacvlanEndpoint) Attach(h hypervisor) error {
func (endpoint *BridgedMacvlanEndpoint) Attach(s *Sandbox) error {
h := s.hypervisor
if err := xConnectVMNetwork(endpoint, h); err != nil {
networkLogger().WithError(err).Error("Error bridging virtual ep")
return err
Expand Down
2 changes: 1 addition & 1 deletion virtcontainers/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ type Endpoint interface {

SetProperties(NetworkInfo)
SetPciAddr(string)
Attach(hypervisor) error
Attach(*Sandbox) error
Detach(netNsCreated bool, netNsPath string) error
HotAttach(h hypervisor) error
HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error
Expand Down
3 changes: 2 additions & 1 deletion virtcontainers/ipvlan_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ func (endpoint *IPVlanEndpoint) NetworkPair() *NetworkInterfacePair {

// Attach for virtual endpoint bridges the network pair and adds the
// tap interface of the network pair to the hypervisor.
func (endpoint *IPVlanEndpoint) Attach(h hypervisor) error {
func (endpoint *IPVlanEndpoint) Attach(s *Sandbox) error {
h := s.hypervisor
if err := xConnectVMNetwork(endpoint, h); err != nil {
networkLogger().WithError(err).Error("Error bridging virtual ep")
return err
Expand Down
3 changes: 2 additions & 1 deletion virtcontainers/macvtap_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ func (endpoint *MacvtapEndpoint) SetProperties(properties NetworkInfo) {
}

// Attach for macvtap endpoint passes macvtap device to the hypervisor.
func (endpoint *MacvtapEndpoint) Attach(h hypervisor) error {
func (endpoint *MacvtapEndpoint) Attach(s *Sandbox) error {
var err error
h := s.hypervisor

endpoint.VMFds, err = createMacvtapFds(endpoint.EndpointProperties.Iface.Index, int(h.hypervisorConfig().NumVCPUs))
if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions virtcontainers/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,7 @@ func (n *Network) Run(networkNSPath string, cb func() error) error {
}

// Add adds all needed interfaces inside the network namespace.
func (n *Network) Add(ctx context.Context, config *NetworkConfig, hypervisor hypervisor, hotplug bool) ([]Endpoint, error) {
func (n *Network) Add(ctx context.Context, config *NetworkConfig, s *Sandbox, hotplug bool) ([]Endpoint, error) {
span, _ := n.trace(ctx, "add")
defer span.Finish()

Expand All @@ -1283,11 +1283,11 @@ func (n *Network) Add(ctx context.Context, config *NetworkConfig, hypervisor hyp
for _, endpoint := range endpoints {
networkLogger().WithField("endpoint-type", endpoint.Type()).WithField("hotplug", hotplug).Info("Attaching endpoint")
if hotplug {
if err := endpoint.HotAttach(hypervisor); err != nil {
if err := endpoint.HotAttach(s.hypervisor); err != nil {
return err
}
} else {
if err := endpoint.Attach(hypervisor); err != nil {
if err := endpoint.Attach(s); err != nil {
return err
}
}
Expand Down
27 changes: 15 additions & 12 deletions virtcontainers/physical_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/kata-containers/runtime/virtcontainers/device/config"
"github.com/kata-containers/runtime/virtcontainers/device/drivers"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
"github.com/kata-containers/runtime/virtcontainers/pkg/cgroups"
"github.com/safchain/ethtool"
)

Expand Down Expand Up @@ -72,27 +73,29 @@ func (endpoint *PhysicalEndpoint) NetworkPair() *NetworkInterfacePair {

// Attach for physical endpoint binds the physical network interface to
// vfio-pci and adds device to the hypervisor with vfio-passthrough.
func (endpoint *PhysicalEndpoint) Attach(h hypervisor) error {
func (endpoint *PhysicalEndpoint) Attach(s *Sandbox) error {
// Unbind physical interface from host driver and bind to vfio
// so that it can be passed to qemu.
if err := bindNICToVFIO(endpoint); err != nil {
vfioPath, err := bindNICToVFIO(endpoint)
if err != nil {
return err
}

// TODO: use device manager as general device management entrance
var vendorID, deviceID string
if splits := strings.Split(endpoint.VendorDeviceID, " "); len(splits) == 2 {
vendorID = splits[0]
deviceID = splits[1]
c, err := cgroups.DeviceToCgroupDevice(vfioPath)
if err != nil {
return err
}

d := config.VFIODev{
BDF: endpoint.BDF,
VendorID: vendorID,
DeviceID: deviceID,
d := config.DeviceInfo{
ContainerPath: c.Path,
DevType: string(c.Type),
Major: c.Major,
Minor: c.Minor,
ColdPlug: true,
}

return h.addDevice(d, vfioDev)
_, err = s.AddDevice(d)
return err
}

// Detach for physical endpoint unbinds the physical network interface from vfio-pci
Expand Down
4 changes: 2 additions & 2 deletions virtcontainers/sandbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ func (s *Sandbox) createNetwork() error {
// after vm is started.
if s.factory == nil {
// Add the network
endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s.hypervisor, false)
endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s, false)
if err != nil {
return err
}
Expand Down Expand Up @@ -1044,7 +1044,7 @@ func (s *Sandbox) startVM() (err error) {
// In case of vm factory, network interfaces are hotplugged
// after vm is started.
if s.factory != nil {
endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s.hypervisor, true)
endpoints, err := s.network.Add(s.ctx, &s.config.NetworkConfig, s, true)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion virtcontainers/tap_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (endpoint *TapEndpoint) SetProperties(properties NetworkInfo) {
}

// Attach for tap endpoint adds the tap interface to the hypervisor.
func (endpoint *TapEndpoint) Attach(h hypervisor) error {
func (endpoint *TapEndpoint) Attach(s *Sandbox) error {
return fmt.Errorf("TapEndpoint does not support Attach, if you're using docker please use --net none")
}

Expand Down
3 changes: 2 additions & 1 deletion virtcontainers/tuntap_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ func (endpoint *TuntapEndpoint) SetProperties(properties NetworkInfo) {
}

// Attach for tap endpoint adds the tap interface to the hypervisor.
func (endpoint *TuntapEndpoint) Attach(h hypervisor) error {
func (endpoint *TuntapEndpoint) Attach(s *Sandbox) error {
h := s.hypervisor
if err := xConnectVMNetwork(endpoint, h); err != nil {
networkLogger().WithError(err).Error("Error bridging virtual endpoint")
return err
Expand Down
3 changes: 2 additions & 1 deletion virtcontainers/veth_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ func (endpoint *VethEndpoint) SetProperties(properties NetworkInfo) {

// Attach for veth endpoint bridges the network pair and adds the
// tap interface of the network pair to the hypervisor.
func (endpoint *VethEndpoint) Attach(h hypervisor) error {
func (endpoint *VethEndpoint) Attach(s *Sandbox) error {
h := s.hypervisor
if err := xConnectVMNetwork(endpoint, h); err != nil {
networkLogger().WithError(err).Error("Error bridging virtual endpoint")
return err
Expand Down
4 changes: 2 additions & 2 deletions virtcontainers/vhostuser_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func (endpoint *VhostUserEndpoint) NetworkPair() *NetworkInterfacePair {
}

// Attach for vhostuser endpoint
func (endpoint *VhostUserEndpoint) Attach(h hypervisor) error {
func (endpoint *VhostUserEndpoint) Attach(s *Sandbox) error {
// Generate a unique ID to be used for hypervisor commandline fields
randBytes, err := utils.GenerateRandomBytes(8)
if err != nil {
Expand All @@ -89,7 +89,7 @@ func (endpoint *VhostUserEndpoint) Attach(h hypervisor) error {
Type: config.VhostUserNet,
}

return h.addDevice(d, vhostuserDev)
return s.hypervisor.addDevice(d, vhostuserDev)
}

// Detach for vhostuser endpoint
Expand Down
6 changes: 4 additions & 2 deletions virtcontainers/vhostuser_endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,11 @@ func TestVhostUserEndpointAttach(t *testing.T) {
EndpointType: VhostUserEndpointType,
}

h := &mockHypervisor{}
s := &Sandbox{
hypervisor: &mockHypervisor{},
}

err := v.Attach(h)
err := v.Attach(s)
assert.NoError(err)
}

Expand Down

0 comments on commit 3c8c650

Please sign in to comment.