Skip to content

Commit

Permalink
incusd: Port to state.OVS
Browse files Browse the repository at this point in the history
Signed-off-by: Stéphane Graber <[email protected]>
  • Loading branch information
stgraber committed Aug 27, 2024
1 parent 8041891 commit ab44781
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 36 deletions.
3 changes: 1 addition & 2 deletions cmd/incusd/networks.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import (
"github.com/lxc/incus/v6/internal/server/instance/instancetype"
"github.com/lxc/incus/v6/internal/server/lifecycle"
"github.com/lxc/incus/v6/internal/server/network"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/project"
"github.com/lxc/incus/v6/internal/server/request"
"github.com/lxc/incus/v6/internal/server/resources"
Expand Down Expand Up @@ -961,7 +960,7 @@ func doNetworkGet(s *state.State, r *http.Request, allNodes bool, projectName st
} else if util.PathExists(fmt.Sprintf("/sys/class/net/%s/bonding", apiNet.Name)) {
apiNet.Type = "bond"
} else {
vswitch, err := ovs.NewVSwitch()
vswitch, err := s.OVS()
if err != nil {
return api.Network{}, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down
9 changes: 4 additions & 5 deletions internal/server/device/nic_bridged.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import (
"github.com/lxc/incus/v6/internal/server/instance/instancetype"
"github.com/lxc/incus/v6/internal/server/ip"
"github.com/lxc/incus/v6/internal/server/network"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/resources"
localUtil "github.com/lxc/incus/v6/internal/server/util"
internalUtil "github.com/lxc/incus/v6/internal/util"
Expand Down Expand Up @@ -566,12 +565,12 @@ func (d *nicBridged) Start() (*deviceConfig.RunConfig, error) {
revert.Add(r)

// Attach host side veth interface to bridge.
err = network.AttachInterface(d.config["parent"], saveData["host_name"])
err = network.AttachInterface(d.state, d.config["parent"], saveData["host_name"])
if err != nil {
return nil, err
}

revert.Add(func() { _ = network.DetachInterface(d.config["parent"], saveData["host_name"]) })
revert.Add(func() { _ = network.DetachInterface(d.state, d.config["parent"], saveData["host_name"]) })

// Attempt to disable router advertisement acceptance.
err = localUtil.SysctlSet(fmt.Sprintf("net/ipv6/conf/%s/accept_ra", saveData["host_name"]), "0")
Expand Down Expand Up @@ -824,7 +823,7 @@ func (d *nicBridged) postStop() error {

if d.config["host_name"] != "" && network.InterfaceExists(d.config["host_name"]) {
// Detach host-side end of veth pair from bridge (required for openvswitch particularly).
err := network.DetachInterface(d.config["parent"], d.config["host_name"])
err := network.DetachInterface(d.state, d.config["parent"], d.config["host_name"])
if err != nil {
return fmt.Errorf("Failed to detach interface %q from %q: %w", d.config["host_name"], d.config["parent"], err)
}
Expand Down Expand Up @@ -1537,7 +1536,7 @@ func (d *nicBridged) setupNativeBridgePortVLANs(hostName string) error {

// setupOVSBridgePortVLANs configures the bridge port with the specified VLAN settings on the openvswitch bridge.
func (d *nicBridged) setupOVSBridgePortVLANs(hostName string) error {
vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down
11 changes: 5 additions & 6 deletions internal/server/device/nic_ovn.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"github.com/lxc/incus/v6/internal/server/network"
"github.com/lxc/incus/v6/internal/server/network/acl"
"github.com/lxc/incus/v6/internal/server/network/ovn"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/project"
"github.com/lxc/incus/v6/internal/server/resources"
"github.com/lxc/incus/v6/internal/server/state"
Expand Down Expand Up @@ -439,7 +438,7 @@ func (d *nicOVN) Start() (*deviceConfig.RunConfig, error) {
delete(saveData, "host_name") // Nested NICs don't have a host side interface.
} else {
if d.config["acceleration"] == "sriov" {
vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
return nil, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -495,7 +494,7 @@ func (d *nicOVN) Start() (*deviceConfig.RunConfig, error) {
integrationBridgeNICName = vfRepresentor
peerName = vfDev
} else if d.config["acceleration"] == "vdpa" {
vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
return nil, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -657,7 +656,7 @@ func (d *nicOVN) Start() (*deviceConfig.RunConfig, error) {
runConf := deviceConfig.RunConfig{}

// Get local chassis ID for chassis group.
vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
return nil, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -880,7 +879,7 @@ func (d *nicOVN) Stop() (*deviceConfig.RunConfig, error) {
// port name using the same regime it does for new ports. This part is only here in order to allow
// instance ports generated under an older regime to be cleaned up properly.
networkVethFillFromVolatile(d.config, v)
vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
d.logger.Error("Failed to connect to OVS", logger.Ctx{"err": err})
}
Expand Down Expand Up @@ -1181,7 +1180,7 @@ func (d *nicOVN) setupHostNIC(hostName string, ovnPortName ovn.OVNSwitchPort) (r
// Attach host side veth interface to bridge.
integrationBridge := d.state.GlobalConfig.NetworkOVNIntegrationBridge()

vswitch, err := ovs.NewVSwitch()
vswitch, err := d.state.OVS()
if err != nil {
return nil, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down
13 changes: 6 additions & 7 deletions internal/server/network/driver_bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import (
firewallDrivers "github.com/lxc/incus/v6/internal/server/firewall/drivers"
"github.com/lxc/incus/v6/internal/server/ip"
"github.com/lxc/incus/v6/internal/server/network/acl"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/project"
localUtil "github.com/lxc/incus/v6/internal/server/util"
"github.com/lxc/incus/v6/internal/server/warnings"
Expand Down Expand Up @@ -628,7 +627,7 @@ func (n *bridge) setup(oldConfig map[string]string) error {
// Create the bridge interface if doesn't exist.
if !n.isRunning() {
if n.config["bridge.driver"] == "openvswitch" {
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Couldn't connect to OpenVSwitch: %v", err)
}
Expand Down Expand Up @@ -733,7 +732,7 @@ func (n *bridge) setup(oldConfig map[string]string) error {
revert.Add(func() { _ = dummy.Delete() })
err = dummy.SetUp()
if err == nil {
_ = AttachInterface(n.name, fmt.Sprintf("%s-mtu", n.name))
_ = AttachInterface(n.state, n.name, fmt.Sprintf("%s-mtu", n.name))
}
}
}
Expand Down Expand Up @@ -818,7 +817,7 @@ func (n *bridge) setup(oldConfig map[string]string) error {
return fmt.Errorf("Only unconfigured network interfaces can be bridged")
}

err = AttachInterface(n.name, entry)
err = AttachInterface(n.state, n.name, entry)
if err != nil {
return err
}
Expand Down Expand Up @@ -1320,7 +1319,7 @@ func (n *bridge) setup(oldConfig map[string]string) error {
}

// Bridge it and bring up.
err = AttachInterface(n.name, tunName)
err = AttachInterface(n.state, n.name, tunName)
if err != nil {
return err
}
Expand Down Expand Up @@ -1535,7 +1534,7 @@ func (n *bridge) Stop() error {

// Destroy the bridge interface
if n.config["bridge.driver"] == "openvswitch" {
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return err
}
Expand Down Expand Up @@ -1673,7 +1672,7 @@ func (n *bridge) Update(newNetwork api.NetworkPut, targetNode string, clientType
}

if !slices.Contains(devices, dev) && InterfaceExists(ifName) {
err = DetachInterface(n.name, ifName)
err = DetachInterface(n.state, n.name, ifName)
if err != nil {
return err
}
Expand Down
18 changes: 9 additions & 9 deletions internal/server/network/driver_ovn.go
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ func (n *ovn) getUnderlayInfo() (uint32, net.IP, error) {
return 0, fmt.Errorf("No matching interface found for OVN enscapsulation IP %q", findIP.String())
}

vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return 0, nil, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -1386,7 +1386,7 @@ func (n *ovn) startUplinkPortBridgeNative(uplinkNet Network, bridgeDevice string
}

// Create uplink OVS bridge if needed.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -1422,7 +1422,7 @@ func (n *ovn) startUplinkPortBridgeOVS(uplinkNet Network, bridgeDevice string) e
defer revert.Fail()

// If uplink is an openvswitch bridge, have OVN logical provider connect directly to it.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -1502,7 +1502,7 @@ func (n *ovn) startUplinkPortPhysical(uplinkNet Network) error {
}

// Detect if uplink interface is a OVS bridge.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -1660,7 +1660,7 @@ func (n *ovn) deleteUplinkPortBridgeNative(uplinkNet Network) error {
if !uplinkUsed {
removeVeths = true

vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -1714,7 +1714,7 @@ func (n *ovn) deleteUplinkPortBridgeOVS(uplinkNet Network, ovsBridge string) err

// Remove uplink OVS bridge mapping if not in use by other OVN networks.
if !uplinkUsed {
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand All @@ -1739,7 +1739,7 @@ func (n *ovn) deleteUplinkPortPhysical(uplinkNet Network) error {
}

// Detect if uplink interface is a OVS bridge.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -2682,7 +2682,7 @@ func (n *ovn) ensureNetworkPortGroup(projectID int64) error {
// don't end up using the same chassis for the primary uplink chassis for all OVN networks in a cluster.
func (n *ovn) addChassisGroupEntry() error {
// Get local chassis ID for chassis group.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down Expand Up @@ -2746,7 +2746,7 @@ func (n *ovn) addChassisGroupEntry() error {
// deleteChassisGroupEntry deletes an entry for the local OVS chassis from the OVN logical network's chassis group.
func (n *ovn) deleteChassisGroupEntry() error {
// Remove local chassis from chassis group.
vswitch, err := ovs.NewVSwitch()
vswitch, err := n.state.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down
10 changes: 5 additions & 5 deletions internal/server/network/network_utils_bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"strings"

"github.com/lxc/incus/v6/internal/server/ip"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/state"
"github.com/lxc/incus/v6/shared/util"
)

Expand Down Expand Up @@ -57,15 +57,15 @@ func IsNativeBridge(bridgeName string) bool {
}

// AttachInterface attaches an interface to a bridge.
func AttachInterface(bridgeName string, devName string) error {
func AttachInterface(s *state.State, bridgeName string, devName string) error {
if IsNativeBridge(bridgeName) {
link := &ip.Link{Name: devName}
err := link.SetMaster(bridgeName)
if err != nil {
return err
}
} else {
vswitch, err := ovs.NewVSwitch()
vswitch, err := s.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand All @@ -80,15 +80,15 @@ func AttachInterface(bridgeName string, devName string) error {
}

// DetachInterface detaches an interface from a bridge.
func DetachInterface(bridgeName string, devName string) error {
func DetachInterface(s *state.State, bridgeName string, devName string) error {
if IsNativeBridge(bridgeName) {
link := &ip.Link{Name: devName}
err := link.SetNoMaster()
if err != nil {
return err
}
} else {
vswitch, err := ovs.NewVSwitch()
vswitch, err := s.OVS()
if err != nil {
return fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down
3 changes: 1 addition & 2 deletions internal/server/network/network_utils_sriov.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
dbCluster "github.com/lxc/incus/v6/internal/server/db/cluster"
"github.com/lxc/incus/v6/internal/server/device/pci"
"github.com/lxc/incus/v6/internal/server/ip"
"github.com/lxc/incus/v6/internal/server/network/ovs"
"github.com/lxc/incus/v6/internal/server/state"
"github.com/lxc/incus/v6/shared/api"
"github.com/lxc/incus/v6/shared/logger"
Expand Down Expand Up @@ -377,7 +376,7 @@ func SRIOVFindFreeVFAndRepresentor(state *state.State, ovsBridgeName string) (st
return "", "", "", -1, fmt.Errorf("Failed to read directory %q: %w", sysClassNet, err)
}

vswitch, err := ovs.NewVSwitch()
vswitch, err := state.OVS()
if err != nil {
return "", "", "", -1, fmt.Errorf("Failed to connect to OVS: %w", err)
}
Expand Down

0 comments on commit ab44781

Please sign in to comment.