persist: merge "network.json"

Merge "network.json" into "persist.json" so that new store can manage
network part.

Signed-off-by: Wei Zhang <weizhang555.zw@gmail.com>
This commit is contained in:
Wei Zhang 2019-07-22 12:01:05 +08:00
parent 99cf3f80d7
commit 3bfbbd666d
12 changed files with 388 additions and 38 deletions

View File

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"github.com/containernetworking/plugins/pkg/ns" "github.com/containernetworking/plugins/pkg/ns"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
) )
// BridgedMacvlanEndpoint represents a macvlan endpoint that is bridged to the VM // BridgedMacvlanEndpoint represents a macvlan endpoint that is bridged to the VM
@ -115,3 +116,52 @@ func (endpoint *BridgedMacvlanEndpoint) HotAttach(h hypervisor) error {
func (endpoint *BridgedMacvlanEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error { func (endpoint *BridgedMacvlanEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error {
return fmt.Errorf("BridgedMacvlanEndpoint does not support Hot detach") return fmt.Errorf("BridgedMacvlanEndpoint does not support Hot detach")
} }
func (endpoint *BridgedMacvlanEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.BridgedMacvlan = &persistapi.BridgedMacvlanEndpoint{
NetPair: persistapi.NetworkInterfacePair{
TapInterface: persistapi.TapInterface{
ID: endpoint.NetPair.TapInterface.ID,
Name: endpoint.NetPair.TapInterface.Name,
TAPIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.TapInterface.TAPIface.Name,
HardAddr: endpoint.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: endpoint.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.VirtIface.Name,
HardAddr: endpoint.NetPair.VirtIface.HardAddr,
Addrs: endpoint.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: int(endpoint.NetPair.NetInterworkingModel),
},
}
return
}
func (endpoint *BridgedMacvlanEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = BridgedMacvlanEndpointType
if s.BridgedMacvlan != nil {
iface := s.BridgedMacvlan
endpoint.NetPair = NetworkInterfacePair{
TapInterface: TapInterface{
ID: iface.NetPair.TapInterface.ID,
Name: iface.NetPair.TapInterface.Name,
TAPIface: NetworkInterface{
Name: iface.NetPair.TapInterface.TAPIface.Name,
HardAddr: iface.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: iface.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: NetworkInterface{
Name: iface.NetPair.VirtIface.Name,
HardAddr: iface.NetPair.VirtIface.HardAddr,
Addrs: iface.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: NetInterworkingModel(iface.NetPair.NetInterworkingModel),
}
}
}

View File

@ -7,6 +7,8 @@ package virtcontainers
import ( import (
"fmt" "fmt"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
) )
// Endpoint represents a physical or virtual network interface. // Endpoint represents a physical or virtual network interface.
@ -24,6 +26,9 @@ type Endpoint interface {
Detach(netNsCreated bool, netNsPath string) error Detach(netNsCreated bool, netNsPath string) error
HotAttach(h hypervisor) error HotAttach(h hypervisor) error
HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error
save() persistapi.NetworkEndpoint
load(persistapi.NetworkEndpoint)
} }
// EndpointType identifies the type of the network endpoint. // EndpointType identifies the type of the network endpoint.

View File

@ -324,12 +324,14 @@ func (fc *firecracker) fcInit(timeout int) error {
// Fetch sandbox network to be able to access it from the sandbox structure. // Fetch sandbox network to be able to access it from the sandbox structure.
var networkNS NetworkNamespace var networkNS NetworkNamespace
if fc.store != nil {
if err := fc.store.Load(store.Network, &networkNS); err == nil { if err := fc.store.Load(store.Network, &networkNS); err == nil {
if networkNS.NetNsPath == "" { if networkNS.NetNsPath == "" {
fc.Logger().WithField("NETWORK NAMESPACE NULL", networkNS).Warn() fc.Logger().WithField("NETWORK NAMESPACE NULL", networkNS).Warn()
} }
fc.netNSPath = networkNS.NetNsPath fc.netNSPath = networkNS.NetNsPath
} }
}
err := os.MkdirAll(fc.jailerRoot, store.DirMode) err := os.MkdirAll(fc.jailerRoot, store.DirMode)
if err != nil { if err != nil {

View File

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"github.com/containernetworking/plugins/pkg/ns" "github.com/containernetworking/plugins/pkg/ns"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
) )
// IPVlanEndpoint represents a ipvlan endpoint that is bridged to the VM // IPVlanEndpoint represents a ipvlan endpoint that is bridged to the VM
@ -118,3 +119,52 @@ func (endpoint *IPVlanEndpoint) HotAttach(h hypervisor) error {
func (endpoint *IPVlanEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error { func (endpoint *IPVlanEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error {
return fmt.Errorf("IPVlanEndpoint does not support Hot detach") return fmt.Errorf("IPVlanEndpoint does not support Hot detach")
} }
func (endpoint *IPVlanEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.IPVlan = &persistapi.IPVlanEndpoint{
NetPair: persistapi.NetworkInterfacePair{
TapInterface: persistapi.TapInterface{
ID: endpoint.NetPair.TapInterface.ID,
Name: endpoint.NetPair.TapInterface.Name,
TAPIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.TapInterface.TAPIface.Name,
HardAddr: endpoint.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: endpoint.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.VirtIface.Name,
HardAddr: endpoint.NetPair.VirtIface.HardAddr,
Addrs: endpoint.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: int(endpoint.NetPair.NetInterworkingModel),
},
}
return
}
func (endpoint *IPVlanEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = IPVlanEndpointType
if s.IPVlan != nil {
iface := s.IPVlan
endpoint.NetPair = NetworkInterfacePair{
TapInterface: TapInterface{
ID: iface.NetPair.TapInterface.ID,
Name: iface.NetPair.TapInterface.Name,
TAPIface: NetworkInterface{
Name: iface.NetPair.TapInterface.TAPIface.Name,
HardAddr: iface.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: iface.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: NetworkInterface{
Name: iface.NetPair.VirtIface.Name,
HardAddr: iface.NetPair.VirtIface.HardAddr,
Addrs: iface.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: NetInterworkingModel(iface.NetPair.NetInterworkingModel),
}
}
}

View File

@ -8,6 +8,8 @@ package virtcontainers
import ( import (
"fmt" "fmt"
"os" "os"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
) )
// MacvtapEndpoint represents a macvtap endpoint // MacvtapEndpoint represents a macvtap endpoint
@ -102,3 +104,17 @@ func (endpoint *MacvtapEndpoint) SetPciAddr(pciAddr string) {
func (endpoint *MacvtapEndpoint) NetworkPair() *NetworkInterfacePair { func (endpoint *MacvtapEndpoint) NetworkPair() *NetworkInterfacePair {
return nil return nil
} }
func (endpoint *MacvtapEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.Macvtap = &persistapi.MacvtapEndpoint{
PCIAddr: endpoint.PCIAddr,
}
return
}
func (endpoint *MacvtapEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = MacvtapEndpointType
if s.Macvtap != nil {
endpoint.PCIAddr = s.Macvtap.PCIAddr
}
}

View File

@ -160,6 +160,17 @@ func (s *Sandbox) dumpAgent(ss *persistapi.SandboxState) {
} }
} }
func (s *Sandbox) dumpNetwork(ss *persistapi.SandboxState) {
ss.Network = persistapi.NetworkInfo{
NetNsPath: s.networkNS.NetNsPath,
NetmonPID: s.networkNS.NetmonPID,
NetNsCreated: s.networkNS.NetNsCreated,
}
for _, e := range s.networkNS.Endpoints {
ss.Network.Endpoints = append(ss.Network.Endpoints, e.save())
}
}
func (s *Sandbox) Save() error { func (s *Sandbox) Save() error {
var ( var (
ss = persistapi.SandboxState{} ss = persistapi.SandboxState{}
@ -173,6 +184,7 @@ func (s *Sandbox) Save() error {
s.dumpProcess(cs) s.dumpProcess(cs)
s.dumpMounts(cs) s.dumpMounts(cs)
s.dumpAgent(&ss) s.dumpAgent(&ss)
s.dumpNetwork(&ss)
if err := s.newStore.ToDisk(ss, cs); err != nil { if err := s.newStore.ToDisk(ss, cs); err != nil {
return err return err
@ -248,6 +260,38 @@ func (c *Container) loadContProcess(cs persistapi.ContainerState) {
} }
} }
func (s *Sandbox) loadNetwork(netInfo persistapi.NetworkInfo) {
s.networkNS = NetworkNamespace{
NetNsPath: netInfo.NetNsPath,
NetmonPID: netInfo.NetmonPID,
NetNsCreated: netInfo.NetNsCreated,
}
for _, e := range netInfo.Endpoints {
var ep Endpoint
switch EndpointType(e.Type) {
case PhysicalEndpointType:
ep = &PhysicalEndpoint{}
case VethEndpointType:
ep = &VethEndpoint{}
case VhostUserEndpointType:
ep = &VhostUserEndpoint{}
case BridgedMacvlanEndpointType:
ep = &BridgedMacvlanEndpoint{}
case MacvtapEndpointType:
ep = &MacvtapEndpoint{}
case TapEndpointType:
ep = &TapEndpoint{}
case IPVlanEndpointType:
ep = &IPVlanEndpoint{}
default:
continue
}
ep.load(e)
s.networkNS.Endpoints = append(s.networkNS.Endpoints, ep)
}
}
// Restore will restore sandbox data from persist file on disk // Restore will restore sandbox data from persist file on disk
func (s *Sandbox) Restore() error { func (s *Sandbox) Restore() error {
ss, _, err := s.newStore.FromDisk(s.id) ss, _, err := s.newStore.FromDisk(s.id)
@ -259,6 +303,7 @@ func (s *Sandbox) Restore() error {
s.loadHypervisor(ss.HypervisorState) s.loadHypervisor(ss.HypervisorState)
s.loadDevices(ss.Devices) s.loadDevices(ss.Devices)
s.loadAgent(ss.AgentState) s.loadAgent(ss.AgentState)
s.loadNetwork(ss.Network)
return nil return nil
} }

View File

@ -6,20 +6,80 @@
package persistapi package persistapi
import (
"github.com/vishvananda/netlink"
)
// ============= sandbox level resources ============= // ============= sandbox level resources =============
type NetworkInterface struct {
Name string
HardAddr string
Addrs []netlink.Addr
}
// TapInterface defines a tap interface
type TapInterface struct {
ID string
Name string
TAPIface NetworkInterface
// remove VMFds and VhostFds
}
// NetworkInterfacePair defines a pair between VM and virtual network interfaces.
type NetworkInterfacePair struct {
TapInterface
VirtIface NetworkInterface
NetInterworkingModel int
}
type PhysicalEndpoint struct {
BDF string
Driver string
VendorDeviceID string
}
type MacvtapEndpoint struct {
// This is for showing information.
// Remove this field won't impact anything.
PCIAddr string
}
type TapEndpoint struct {
TapInterface TapInterface
}
type BridgedMacvlanEndpoint struct {
NetPair NetworkInterfacePair
}
type VethEndpoint struct {
NetPair NetworkInterfacePair
}
type IPVlanEndpoint struct {
NetPair NetworkInterfacePair
}
type VhostUserEndpoint struct {
// This is for showing information.
// Remove these fields won't impact anything.
IfaceName string
PCIAddr string
}
// NetworkEndpoint contains network interface information // NetworkEndpoint contains network interface information
type NetworkEndpoint struct { type NetworkEndpoint struct {
Type string Type string
// ID used to pass the netdev option to qemu // One and only one of these below are not nil according to Type.
ID string Physical *PhysicalEndpoint `json:",omitempty"`
Veth *VethEndpoint `json:",omitempty"`
// Name of the interface VhostUser *VhostUserEndpoint `json:",omitempty"`
Name string BridgedMacvlan *BridgedMacvlanEndpoint `json:",omitempty"`
Macvtap *MacvtapEndpoint `json:",omitempty"`
// Index of interface Tap *TapEndpoint `json:",omitempty"`
Index int IPVlan *IPVlanEndpoint `json:",omitempty"`
} }
// NetworkInfo contains network information of sandbox // NetworkInfo contains network information of sandbox
@ -27,6 +87,5 @@ type NetworkInfo struct {
NetNsPath string NetNsPath string
NetmonPID int NetmonPID int
NetNsCreated bool NetNsCreated bool
InterworkingModel string
Endpoints []NetworkEndpoint Endpoints []NetworkEndpoint
} }

View File

@ -14,6 +14,7 @@ import (
"github.com/kata-containers/runtime/virtcontainers/device/config" "github.com/kata-containers/runtime/virtcontainers/device/config"
"github.com/kata-containers/runtime/virtcontainers/device/drivers" "github.com/kata-containers/runtime/virtcontainers/device/drivers"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
"github.com/safchain/ethtool" "github.com/safchain/ethtool"
) )
@ -200,3 +201,22 @@ func bindNICToVFIO(endpoint *PhysicalEndpoint) error {
func bindNICToHost(endpoint *PhysicalEndpoint) error { func bindNICToHost(endpoint *PhysicalEndpoint) error {
return drivers.BindDevicetoHost(endpoint.BDF, endpoint.Driver, endpoint.VendorDeviceID) return drivers.BindDevicetoHost(endpoint.BDF, endpoint.Driver, endpoint.VendorDeviceID)
} }
func (endpoint *PhysicalEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.Physical = &persistapi.PhysicalEndpoint{
BDF: endpoint.BDF,
Driver: endpoint.Driver,
VendorDeviceID: endpoint.VendorDeviceID,
}
return
}
func (endpoint *PhysicalEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = PhysicalEndpointType
if s.Physical != nil {
endpoint.BDF = s.Physical.BDF
endpoint.Driver = s.Physical.Driver
endpoint.VendorDeviceID = s.Physical.VendorDeviceID
}
}

View File

@ -467,18 +467,18 @@ func createSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Fac
s.Logger().WithField("features", s.config.Experimental).Infof("Enable experimental features") s.Logger().WithField("features", s.config.Experimental).Infof("Enable experimental features")
} }
// Fetch sandbox network to be able to access it from the sandbox structure.
var networkNS NetworkNamespace
if err := s.store.Load(store.Network, &networkNS); err == nil {
s.networkNS = networkNS
}
if s.supportNewStore() { if s.supportNewStore() {
// Restored successfully from newstore before. // Restored successfully from newstore before.
if s.state.State != "" { if s.state.State != "" {
return s, nil return s, nil
} }
} else { } else {
// Fetch sandbox network to be able to access it from the sandbox structure.
var networkNS NetworkNamespace
if err := s.store.Load(store.Network, &networkNS); err == nil {
s.networkNS = networkNS
}
devices, err := s.store.LoadDevices() devices, err := s.store.LoadDevices()
if err != nil { if err != nil {
s.Logger().WithError(err).WithField("sandboxid", s.id).Warning("load sandbox devices failed") s.Logger().WithError(err).WithField("sandboxid", s.id).Warning("load sandbox devices failed")
@ -563,11 +563,6 @@ func newSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factor
if err != nil { if err != nil {
s.Logger().WithError(err).WithField("sandboxid", s.id).Error("Create new sandbox failed") s.Logger().WithError(err).WithField("sandboxid", s.id).Error("Create new sandbox failed")
globalSandboxList.removeSandbox(s.id) globalSandboxList.removeSandbox(s.id)
}
}()
defer func() {
if err != nil {
s.store.Delete() s.store.Delete()
} }
}() }()
@ -846,8 +841,11 @@ func (s *Sandbox) createNetwork() error {
} }
// Store the network // Store the network
if !s.supportNewStore() {
return s.store.Store(store.Network, s.networkNS) return s.store.Store(store.Network, s.networkNS)
} }
return nil
}
func (s *Sandbox) postCreatedNetwork() error { func (s *Sandbox) postCreatedNetwork() error {
@ -919,14 +917,14 @@ func (s *Sandbox) AddInterface(inf *vcTypes.Interface) (*vcTypes.Interface, erro
// Update the sandbox storage // Update the sandbox storage
s.networkNS.Endpoints = append(s.networkNS.Endpoints, endpoint) s.networkNS.Endpoints = append(s.networkNS.Endpoints, endpoint)
if err := s.store.Store(store.Network, s.networkNS); err != nil {
return nil, err
}
if s.supportNewStore() { if s.supportNewStore() {
if err := s.Save(); err != nil { if err := s.Save(); err != nil {
return nil, err return nil, err
} }
} else {
if err := s.store.Store(store.Network, s.networkNS); err != nil {
return nil, err
}
} }
// Add network for vm // Add network for vm
@ -943,14 +941,15 @@ func (s *Sandbox) RemoveInterface(inf *vcTypes.Interface) (*vcTypes.Interface, e
return inf, err return inf, err
} }
s.networkNS.Endpoints = append(s.networkNS.Endpoints[:i], s.networkNS.Endpoints[i+1:]...) s.networkNS.Endpoints = append(s.networkNS.Endpoints[:i], s.networkNS.Endpoints[i+1:]...)
if err := s.store.Store(store.Network, s.networkNS); err != nil {
return inf, err
}
if s.supportNewStore() { if s.supportNewStore() {
if err := s.Save(); err != nil { if err := s.Save(); err != nil {
return inf, err return inf, err
} }
} else {
if err := s.store.Store(store.Network, s.networkNS); err != nil {
return inf, err
}
} }
break break
@ -1024,10 +1023,13 @@ func (s *Sandbox) startVM() (err error) {
return err return err
} }
} }
if !s.supportNewStore() {
if err := s.store.Store(store.Network, s.networkNS); err != nil { if err := s.store.Store(store.Network, s.networkNS); err != nil {
return err return err
} }
} }
}
s.Logger().Info("VM started") s.Logger().Info("VM started")

View File

@ -11,6 +11,7 @@ import (
"github.com/containernetworking/plugins/pkg/ns" "github.com/containernetworking/plugins/pkg/ns"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
"github.com/kata-containers/runtime/virtcontainers/pkg/uuid" "github.com/kata-containers/runtime/virtcontainers/pkg/uuid"
) )
@ -187,3 +188,35 @@ func unTapNetwork(name string) error {
} }
return nil return nil
} }
func (endpoint *TapEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.Tap = &persistapi.TapEndpoint{
TapInterface: persistapi.TapInterface{
ID: endpoint.TapInterface.ID,
Name: endpoint.TapInterface.Name,
TAPIface: persistapi.NetworkInterface{
Name: endpoint.TapInterface.TAPIface.Name,
HardAddr: endpoint.TapInterface.TAPIface.HardAddr,
Addrs: endpoint.TapInterface.TAPIface.Addrs,
},
},
}
return
}
func (endpoint *TapEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = TapEndpointType
if s.Tap != nil {
iface := s.Tap
endpoint.TapInterface = TapInterface{
ID: iface.TapInterface.ID,
Name: iface.TapInterface.Name,
TAPIface: NetworkInterface{
Name: iface.TapInterface.TAPIface.Name,
HardAddr: iface.TapInterface.TAPIface.HardAddr,
Addrs: iface.TapInterface.TAPIface.Addrs,
},
}
}
}

View File

@ -9,6 +9,7 @@ import (
"fmt" "fmt"
"github.com/containernetworking/plugins/pkg/ns" "github.com/containernetworking/plugins/pkg/ns"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
) )
// VethEndpoint gathers a network pair and its properties. // VethEndpoint gathers a network pair and its properties.
@ -141,3 +142,52 @@ func (endpoint *VethEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPa
} }
return nil return nil
} }
func (endpoint *VethEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.Veth = &persistapi.VethEndpoint{
NetPair: persistapi.NetworkInterfacePair{
TapInterface: persistapi.TapInterface{
ID: endpoint.NetPair.TapInterface.ID,
Name: endpoint.NetPair.TapInterface.Name,
TAPIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.TapInterface.TAPIface.Name,
HardAddr: endpoint.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: endpoint.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: persistapi.NetworkInterface{
Name: endpoint.NetPair.VirtIface.Name,
HardAddr: endpoint.NetPair.VirtIface.HardAddr,
Addrs: endpoint.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: int(endpoint.NetPair.NetInterworkingModel),
},
}
return
}
func (endpoint *VethEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = VethEndpointType
if s.Veth != nil {
iface := s.Veth
endpoint.NetPair = NetworkInterfacePair{
TapInterface: TapInterface{
ID: iface.NetPair.TapInterface.ID,
Name: iface.NetPair.TapInterface.Name,
TAPIface: NetworkInterface{
Name: iface.NetPair.TapInterface.TAPIface.Name,
HardAddr: iface.NetPair.TapInterface.TAPIface.HardAddr,
Addrs: iface.NetPair.TapInterface.TAPIface.Addrs,
},
},
VirtIface: NetworkInterface{
Name: iface.NetPair.VirtIface.Name,
HardAddr: iface.NetPair.VirtIface.HardAddr,
Addrs: iface.NetPair.VirtIface.Addrs,
},
NetInterworkingModel: NetInterworkingModel(iface.NetPair.NetInterworkingModel),
}
}
}

View File

@ -11,6 +11,7 @@ import (
"os" "os"
"github.com/kata-containers/runtime/virtcontainers/device/config" "github.com/kata-containers/runtime/virtcontainers/device/config"
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
"github.com/kata-containers/runtime/virtcontainers/utils" "github.com/kata-containers/runtime/virtcontainers/utils"
) )
@ -149,3 +150,20 @@ func vhostUserSocketPath(info interface{}) (string, error) {
} }
} }
func (endpoint *VhostUserEndpoint) save() (s persistapi.NetworkEndpoint) {
s.Type = string(endpoint.Type())
s.VhostUser = &persistapi.VhostUserEndpoint{
IfaceName: endpoint.IfaceName,
PCIAddr: endpoint.PCIAddr,
}
return
}
func (endpoint *VhostUserEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = VhostUserEndpointType
if s.VhostUser != nil {
endpoint.IfaceName = s.VhostUser.IfaceName
endpoint.PCIAddr = s.VhostUser.PCIAddr
}
}