Skip to content

Mutual network acl peerings fail #3987

Closed
Closed

Description

@jochumdev

Is there an existing issue for this?

  • There is no existing issue for this bug

Is this happening on an up to date version of Incus?

  • This is happening on a supported version of Incus

Incus system details

Server: daily / 7.4  
Client: 7.4

Instance details

No response

Instance log

No response

Current behavior

Error: More than one matching network peer was found

Expected behavior

No error

Steps to reproduce

# 1. Create a central hub network and two client networks
incus project create hub -c features.networks=true
incus project create c1 -c features.networks=true
incus project create c2 -c features.networks=true

incus network create hub-net --project hub --type=ovn network=none
incus network create c1-net --project c1 --type=ovn network=none
incus network create c2-net --project c2 --type=ovn network=none

# 2. Both client networks initiate peering to hub-net
incus network peer create c1-net to-hub hub/hub-net --project c1
incus network peer create c2-net to-hub hub/hub-net --project c2

# 3. hub-net attempts to peer back with c1-net
incus network peer create hub-net to-c1 c1/c1-net --project hub

Result:

Error: More than one matching network peer was found

Activity

  1. added theissue type on Sep 13, 2026
  2. jochumdev commented on Sep 13, 2026

    @jochumdev
    MemberAuthor

    LLM Proposed Fix / Patch

    The generated cluster mapper in internal/server/db/cluster/networks_peers.mapper.go already includes a prepared statement specifically for this lookup:
    networkPeerObjectsByNetworkIDAndTargetNetworkProjectAndTargetNetworkName
    (matching NetworkID, TargetNetworkProject, and TargetNetworkName).

    By looking up targetNetID via tx.GetNetworkID(ctx, peer.TargetProject, peer.TargetNetwork), PeerCreate can pass NetworkID: &targetNetID to scope the search directly to the intended peer network. In PeerDelete, only the reciprocal peer matching dbPeer.TargetNetworkID should be cleared.

    diff --git a/internal/server/network/driver_ovn.go b/internal/server/network/driver_ovn.go
    index 63d1a89..a3e7fc1 100644
    --- a/internal/server/network/driver_ovn.go
    +++ b/internal/server/network/driver_ovn.go
    @@ -7736,8 +7736,14 @@ func (n *ovn) PeerCreate(peer api.NetworkPeersPost) error {
     		case "local":
    +			targetNetID, err := tx.GetNetworkID(ctx, peer.TargetProject, peer.TargetNetwork)
    +			if err != nil {
    +				return fmt.Errorf("Failed loading target network ID: %w", err)
    +			}
    +
     			// Check if target peer already exists.
     			peers, err := dbCluster.GetNetworkPeers(ctx, tx.Tx(), dbCluster.NetworkPeerFilter{
    -				Type:                 &record.Type,
    +				NetworkID:            &targetNetID,
     				TargetNetworkProject: &n.project,
     				TargetNetworkName:    &n.name,
     			})
    @@ -8233,12 +8239,17 @@ func (n *ovn) PeerDelete(peerName string) error {
     	err = n.state.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
    -		// Deactivate any existing peer.
    -		if peer.Type == "local" {
    +		// Deactivate any reciprocal peer.
    +		if peer.Type == "local" && dbPeer.TargetNetworkID.Valid {
    +			targetNetID := dbPeer.TargetNetworkID.Int64
     			peers, err := dbCluster.GetNetworkPeers(ctx, tx.Tx(), dbCluster.NetworkPeerFilter{TargetNetworkID: &n.id})
     			if err != nil && !errors.Is(err, sql.ErrNoRows) {
     				return err
     			}
     
     			for _, peer := range peers {
    +				if peer.NetworkID != targetNetID {
    +					continue
    +				}
    +
     				peer.TargetNetworkID = sql.NullInt64{}
     
     				err = dbCluster.UpdateNetworkPeer(ctx, tx.Tx(), peer.NetworkID, peer.Name, peer)
  3. added a commit that references this issue on Sep 13, 2026
    e3c6e74
  4. added a commit that references this issue on Sep 21, 2026
    0c3de23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions