From 084194cd70b2c3d5ea4ce5d89009904e37401788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:05:42 -0500 Subject: [PATCH 01/12] incusd/network/ovs: Introduce new errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/errors.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 internal/server/network/ovs/errors.go diff --git a/internal/server/network/ovs/errors.go b/internal/server/network/ovs/errors.go new file mode 100644 index 00000000000..7ec7e3e0f32 --- /dev/null +++ b/internal/server/network/ovs/errors.go @@ -0,0 +1,16 @@ +package ovs + +import ( + "fmt" + + ovsdbClient "github.com/ovn-org/libovsdb/client" +) + +// ErrExists indicates that a DB record already exists. +var ErrExists = fmt.Errorf("object already exists") + +// ErrNotFound indicates that a DB record doesn't exist. +var ErrNotFound = ovsdbClient.ErrNotFound + +// ErrNotManaged indicates that a DB record wasn't created by Incus. +var ErrNotManaged = fmt.Errorf("object not incus-managed") From c42e23ba99acc441afdca4e215cc0018e5b46fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 17:54:38 -0500 Subject: [PATCH 02/12] incusd/network/ovn/nb: Move SetChassisGroupPriority to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovn/ovn_nb_actions.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/server/network/ovn/ovn_nb_actions.go b/internal/server/network/ovn/ovn_nb_actions.go index c39370b2903..b4da9f75949 100644 --- a/internal/server/network/ovn/ovn_nb_actions.go +++ b/internal/server/network/ovn/ovn_nb_actions.go @@ -1448,9 +1448,8 @@ func (o *NB) ChassisGroupDelete(haChassisGroupName OVNChassisGroup) error { return nil } -// ChassisGroupChassisAdd adds a chassis ID to an HA chassis group with the specified priority. -func (o *NB) ChassisGroupChassisAdd(haChassisGroupName OVNChassisGroup, chassisID string, priority uint) error { - ctx := context.TODO() +// SetChassisGroupPriority sets a given priority for the chassis ID in the chassis group.. +func (o *NB) SetChassisGroupPriority(ctx context.Context, haChassisGroupName OVNChassisGroup, chassisID string, priority uint) error { operations := []ovsdb.Operation{} // Get the chassis group. From ac4fef302d9039f59cfe6113d1e039a2811a224b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 19:24:31 -0500 Subject: [PATCH 03/12] incusd/network/ovn/sb: Move GetLogicalRouterPortActiveChassisHostname to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovn/ovn_sb_actions.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/server/network/ovn/ovn_sb_actions.go b/internal/server/network/ovn/ovn_sb_actions.go index 663068da032..993c41b6f4e 100644 --- a/internal/server/network/ovn/ovn_sb_actions.go +++ b/internal/server/network/ovn/ovn_sb_actions.go @@ -8,9 +8,7 @@ import ( ) // GetLogicalRouterPortActiveChassisHostname gets the hostname of the chassis managing the logical router port. -func (o *SB) GetLogicalRouterPortActiveChassisHostname(ovnRouterPort OVNRouterPort) (string, error) { - ctx := context.TODO() - +func (o *SB) GetLogicalRouterPortActiveChassisHostname(ctx context.Context, ovnRouterPort OVNRouterPort) (string, error) { // Look for the port binding. pb := &ovnSB.PortBinding{ LogicalPort: fmt.Sprintf("cr-%s", ovnRouterPort), From bbcecc9c268884b37d7f84bc0c3dd362cdedfbec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 17:59:28 -0500 Subject: [PATCH 04/12] incusd/network/ovs: Move GetBridge to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index 897692e43a7..c0cc44d2911 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -28,21 +28,16 @@ func (o *VSwitch) Installed() bool { return err == nil } -// BridgeExists returns true if the bridge exists. -func (o *VSwitch) BridgeExists(bridgeName string) (bool, error) { - ctx := context.TODO() +// GetBridge returns a bridge entry. +func (o *VSwitch) GetBridge(ctx context.Context, bridgeName string) (*ovsSwitch.Bridge, error) { bridge := &ovsSwitch.Bridge{Name: bridgeName} err := o.client.Get(ctx, bridge) if err != nil { - if err == ovsdbClient.ErrNotFound { - return false, nil - } - - return false, err + return nil, err } - return true, nil + return bridge, nil } // BridgeAdd adds a new bridge. From 4c29332ddf7af6847adaa5a19e2b428331c39ca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:15:08 -0500 Subject: [PATCH 05/12] incusd/network/ovs: Move CreateBridge to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index c0cc44d2911..c5677731de3 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -40,10 +40,8 @@ func (o *VSwitch) GetBridge(ctx context.Context, bridgeName string) (*ovsSwitch. return bridge, nil } -// BridgeAdd adds a new bridge. -func (o *VSwitch) BridgeAdd(bridgeName string, mayExist bool, hwaddr net.HardwareAddr, mtu uint32) error { - ctx := context.TODO() - +// CreateBridge adds a new bridge. +func (o *VSwitch) CreateBridge(ctx context.Context, bridgeName string, mayExist bool, hwaddr net.HardwareAddr, mtu uint32) error { // Create interface. iface := ovsSwitch.Interface{ UUID: "interface", From 4d6bbf6cbd242cd6022f97e0275f8bff3dbdff68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:15:16 -0500 Subject: [PATCH 06/12] incusd/network/ovs: Move DeleteBridge to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index c5677731de3..c1c878b352f 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -138,10 +138,8 @@ func (o *VSwitch) CreateBridge(ctx context.Context, bridgeName string, mayExist return fmt.Errorf("Bridge interface failed to appear") } -// BridgeDelete deletes a bridge. -func (o *VSwitch) BridgeDelete(bridgeName string) error { - ctx := context.TODO() - +// DeleteBridge deletes a bridge. +func (o *VSwitch) DeleteBridge(ctx context.Context, bridgeName string) error { bridge := ovsSwitch.Bridge{ Name: bridgeName, } From 163f9690524a12c529b0407d02deb73b968e06b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:15:25 -0500 Subject: [PATCH 07/12] incusd/network/ovs: Move CreateBridgePort to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index c1c878b352f..797f6312fce 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -175,10 +175,8 @@ func (o *VSwitch) DeleteBridge(ctx context.Context, bridgeName string) error { return nil } -// BridgePortAdd adds a port to the bridge (if already attached does nothing). -func (o *VSwitch) BridgePortAdd(bridgeName string, portName string, mayExist bool) error { - ctx := context.TODO() - +// CreateBridgePort adds a port to the bridge. +func (o *VSwitch) CreateBridgePort(ctx context.Context, bridgeName string, portName string, mayExist bool) error { // Get the bridge. bridge := ovsSwitch.Bridge{ Name: bridgeName, From 7cc1d9ca0136e681c9c275849df7b73bd1c89fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:15:34 -0500 Subject: [PATCH 08/12] incusd/network/ovs: Move GetChassisID to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index 797f6312fce..1f1850e251d 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -313,10 +313,8 @@ func (o *VSwitch) InterfaceAssociatedOVNSwitchPort(interfaceName string) (string return strings.TrimSpace(ovnSwitchPort), nil } -// ChassisID returns the local chassis ID. -func (o *VSwitch) ChassisID() (string, error) { - ctx := context.TODO() - +// GetChassisID returns the local chassis ID. +func (o *VSwitch) GetChassisID(ctx context.Context) (string, error) { vSwitch := &ovsSwitch.OpenvSwitch{ UUID: o.rootUUID, } From 7c111336a575a31f6e02b763bbf94c223e234543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:15:43 -0500 Subject: [PATCH 09/12] incusd/network/ovs: Move GetOVNBridgeMappings to new function signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/ovs/ovs_actions.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/internal/server/network/ovs/ovs_actions.go b/internal/server/network/ovs/ovs_actions.go index 1f1850e251d..826eaec3b76 100644 --- a/internal/server/network/ovs/ovs_actions.go +++ b/internal/server/network/ovs/ovs_actions.go @@ -353,10 +353,8 @@ func (o *VSwitch) OVNEncapIP() (net.IP, error) { return encapIP, nil } -// OVNBridgeMappings gets the current OVN bridge mappings. -func (o *VSwitch) OVNBridgeMappings(bridgeName string) ([]string, error) { - ctx := context.TODO() - +// GetOVNBridgeMappings gets the current OVN bridge mappings. +func (o *VSwitch) GetOVNBridgeMappings(ctx context.Context, bridgeName string) ([]string, error) { vSwitch := &ovsSwitch.OpenvSwitch{ UUID: o.rootUUID, } @@ -379,7 +377,7 @@ func (o *VSwitch) OVNBridgeMappingAdd(bridgeName string, providerName string) er ovnBridgeMappingMutex.Lock() defer ovnBridgeMappingMutex.Unlock() - mappings, err := o.OVNBridgeMappings(bridgeName) + mappings, err := o.GetOVNBridgeMappings(context.TODO(), bridgeName) if err != nil { return err } @@ -407,7 +405,7 @@ func (o *VSwitch) OVNBridgeMappingDelete(bridgeName string, providerName string) ovnBridgeMappingMutex.Lock() defer ovnBridgeMappingMutex.Unlock() - mappings, err := o.OVNBridgeMappings(bridgeName) + mappings, err := o.GetOVNBridgeMappings(context.TODO(), bridgeName) if err != nil { return err } From ad4cdc40e066abc0a941a6c01379b2afb78ed7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 17:55:55 -0500 Subject: [PATCH 10/12] incusd/network: Update for function changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/network/driver_bridge.go | 6 ++-- internal/server/network/driver_ovn.go | 32 +++++++++++-------- .../server/network/network_utils_bridge.go | 3 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/internal/server/network/driver_bridge.go b/internal/server/network/driver_bridge.go index bfd7c87e9d9..d797fc91733 100644 --- a/internal/server/network/driver_bridge.go +++ b/internal/server/network/driver_bridge.go @@ -589,12 +589,12 @@ func (n *bridge) setup(oldConfig map[string]string) error { // Add and configure the interface in one operation to reduce the number of executions and // to avoid systemd-udevd from applying the default MACAddressPolicy=persistent policy. - err = vswitch.BridgeAdd(n.name, false, bridge.Address, bridge.MTU) + err = vswitch.CreateBridge(context.TODO(), n.name, false, bridge.Address, bridge.MTU) if err != nil { return err } - revert.Add(func() { _ = vswitch.BridgeDelete(n.name) }) + revert.Add(func() { _ = vswitch.DeleteBridge(context.Background(), n.name) }) } else { // Add and configure the interface in one operation to reduce the number of executions and // to avoid systemd-udevd from applying the default MACAddressPolicy=persistent policy. @@ -1455,7 +1455,7 @@ func (n *bridge) Stop() error { return err } - err = vswitch.BridgeDelete(n.name) + err = vswitch.DeleteBridge(context.TODO(), n.name) if err != nil { return err } diff --git a/internal/server/network/driver_ovn.go b/internal/server/network/driver_ovn.go index 6a64ef42eee..7ea3019c141 100644 --- a/internal/server/network/driver_ovn.go +++ b/internal/server/network/driver_ovn.go @@ -150,7 +150,7 @@ func (n *ovn) State() (*api.NetworkState, error) { return nil, err } - chassis, err := ovnsb.GetLogicalRouterPortActiveChassisHostname(n.getRouterExtPortName()) + chassis, err := ovnsb.GetLogicalRouterPortActiveChassisHostname(context.TODO(), n.getRouterExtPortName()) if err != nil { return nil, err } @@ -1359,13 +1359,13 @@ func (n *ovn) startUplinkPortBridgeNative(uplinkNet Network, bridgeDevice string return fmt.Errorf("Failed to connect to OVS: %w", err) } - err = vswitch.BridgeAdd(vars.ovsBridge, true, nil, 0) + err = vswitch.CreateBridge(context.TODO(), vars.ovsBridge, true, nil, 0) if err != nil { return fmt.Errorf("Failed to create uplink OVS bridge %q: %w", vars.ovsBridge, err) } // Connect OVS end veth interface to OVS bridge. - err = vswitch.BridgePortAdd(vars.ovsBridge, vars.ovsEnd, true) + err = vswitch.CreateBridgePort(context.TODO(), vars.ovsBridge, vars.ovsEnd, true) if err != nil { return fmt.Errorf("Failed to connect uplink veth interface %q to uplink OVS bridge %q: %w", vars.ovsEnd, vars.ovsBridge, err) } @@ -1475,8 +1475,10 @@ func (n *ovn) startUplinkPortPhysical(uplinkNet Network) error { return fmt.Errorf("Failed to connect to OVS: %w", err) } - isOVSBridge, _ := vswitch.BridgeExists(uplinkHostName) - if isOVSBridge { + _, err = vswitch.GetBridge(context.TODO(), uplinkHostName) + if err != nil && err != ovs.ErrNotFound { + return err + } else if err == nil { return n.startUplinkPortBridgeOVS(uplinkNet, uplinkHostName) } @@ -1503,13 +1505,13 @@ func (n *ovn) startUplinkPortPhysical(uplinkNet Network) error { } // Create uplink OVS bridge if needed. - err = vswitch.BridgeAdd(vars.ovsBridge, true, nil, 0) + err = vswitch.CreateBridge(context.TODO(), vars.ovsBridge, true, nil, 0) if err != nil { return fmt.Errorf("Failed to create uplink OVS bridge %q: %w", vars.ovsBridge, err) } // Connect OVS end veth interface to OVS bridge. - err = vswitch.BridgePortAdd(vars.ovsBridge, uplinkHostName, true) + err = vswitch.CreateBridgePort(context.TODO(), vars.ovsBridge, uplinkHostName, true) if err != nil { return fmt.Errorf("Failed to connect uplink interface %q to uplink OVS bridge %q: %w", uplinkHostName, vars.ovsBridge, err) } @@ -1632,7 +1634,7 @@ func (n *ovn) deleteUplinkPortBridgeNative(uplinkNet Network) error { return err } - err = vswitch.BridgeDelete(vars.ovsBridge) + err = vswitch.DeleteBridge(context.TODO(), vars.ovsBridge) if err != nil { return err } @@ -1702,8 +1704,10 @@ func (n *ovn) deleteUplinkPortPhysical(uplinkNet Network) error { return fmt.Errorf("Failed to connect to OVS: %w", err) } - isOVSBridge, _ := vswitch.BridgeExists(uplinkHostName) - if isOVSBridge { + _, err = vswitch.GetBridge(context.TODO(), uplinkHostName) + if err != nil && err != ovs.ErrNotFound { + return err + } else if err == nil { return n.deleteUplinkPortBridgeOVS(uplinkNet, uplinkHostName) } @@ -1727,7 +1731,7 @@ func (n *ovn) deleteUplinkPortPhysical(uplinkNet Network) error { return err } - err = vswitch.BridgeDelete(vars.ovsBridge) + err = vswitch.DeleteBridge(context.TODO(), vars.ovsBridge) if err != nil { return err } @@ -2632,7 +2636,7 @@ func (n *ovn) addChassisGroupEntry() error { return fmt.Errorf("Failed to connect to OVS: %w", err) } - chassisID, err := vswitch.ChassisID() + chassisID, err := vswitch.GetChassisID(context.TODO()) if err != nil { return fmt.Errorf("Failed getting OVS Chassis ID: %w", err) } @@ -2678,7 +2682,7 @@ func (n *ovn) addChassisGroupEntry() error { } } - err = ovnnb.ChassisGroupChassisAdd(chassisGroupName, chassisID, priority) + err = ovnnb.SetChassisGroupPriority(context.TODO(), chassisGroupName, chassisID, priority) if err != nil { return fmt.Errorf("Failed adding OVS chassis %q with priority %d to chassis group %q: %w", chassisID, priority, chassisGroupName, err) } @@ -2701,7 +2705,7 @@ func (n *ovn) deleteChassisGroupEntry() error { return fmt.Errorf("Failed to connect to OVS: %w", err) } - chassisID, err := vswitch.ChassisID() + chassisID, err := vswitch.GetChassisID(context.TODO()) if err != nil { return fmt.Errorf("Failed getting OVS Chassis ID: %w", err) } diff --git a/internal/server/network/network_utils_bridge.go b/internal/server/network/network_utils_bridge.go index 01a165b090a..bd742b72988 100644 --- a/internal/server/network/network_utils_bridge.go +++ b/internal/server/network/network_utils_bridge.go @@ -1,6 +1,7 @@ package network import ( + "context" "fmt" "os" "strings" @@ -69,7 +70,7 @@ func AttachInterface(bridgeName string, devName string) error { return fmt.Errorf("Failed to connect to OVS: %w", err) } - err = vswitch.BridgePortAdd(bridgeName, devName, true) + err = vswitch.CreateBridgePort(context.TODO(), bridgeName, devName, true) if err != nil { return err } From 98330c53665b12fa4e866fb7f21d1c82814c2450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:27:00 -0500 Subject: [PATCH 11/12] incusd/device/nic: Update for function changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- internal/server/device/nic_ovn.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/server/device/nic_ovn.go b/internal/server/device/nic_ovn.go index d3834deebe5..99e7498f370 100644 --- a/internal/server/device/nic_ovn.go +++ b/internal/server/device/nic_ovn.go @@ -631,7 +631,7 @@ func (d *nicOVN) Start() (*deviceConfig.RunConfig, error) { return nil, fmt.Errorf("Failed to connect to OVS: %w", err) } - chassisID, err := vswitch.ChassisID() + chassisID, err := vswitch.GetChassisID(context.TODO()) if err != nil { return nil, fmt.Errorf("Failed getting OVS Chassis ID: %w", err) } @@ -1166,7 +1166,7 @@ func (d *nicOVN) setupHostNIC(hostName string, ovnPortName ovn.OVNSwitchPort, up return nil, fmt.Errorf("Failed to connect to OVS: %w", err) } - err = vswitch.BridgePortAdd(integrationBridge, hostName, true) + err = vswitch.CreateBridgePort(context.TODO(), integrationBridge, hostName, true) if err != nil { return nil, err } From 20acb1849d669de66bcf7fab62b3d300031b6898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= Date: Fri, 1 Mar 2024 18:09:14 -0500 Subject: [PATCH 12/12] incusd: Update for function changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber Sponsored-by: Luizalabs (https://luizalabs.com) --- cmd/incusd/networks.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/incusd/networks.go b/cmd/incusd/networks.go index c52724281a9..abba2593d0b 100644 --- a/cmd/incusd/networks.go +++ b/cmd/incusd/networks.go @@ -899,8 +899,8 @@ func doNetworkGet(s *state.State, r *http.Request, allNodes bool, projectName st return api.Network{}, fmt.Errorf("Failed to connect to OVS: %w", err) } - exists, _ := vswitch.BridgeExists(apiNet.Name) - if exists { + _, err = vswitch.GetBridge(context.TODO(), apiNet.Name) + if err == nil { apiNet.Type = "bridge" } else { apiNet.Type = "unknown"