github.com/cilium/cilium@v1.16.2/pkg/bgpv1/manager/reconcilerv2/peer_advertisements_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package reconcilerv2
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/sirupsen/logrus"
    10  	"github.com/stretchr/testify/require"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/utils/ptr"
    13  
    14  	"github.com/cilium/cilium/pkg/bgpv1/manager/store"
    15  	"github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1"
    16  	slimv1 "github.com/cilium/cilium/pkg/k8s/slim/k8s/apis/meta/v1"
    17  )
    18  
    19  var (
    20  	peerAdvertTestLogger = logrus.WithField("unit_test", "advertisements")
    21  )
    22  
    23  // test fixtures
    24  var (
    25  	redPodCIDRAdvert = v2alpha1.BGPAdvertisement{
    26  		AdvertisementType: v2alpha1.BGPPodCIDRAdvert,
    27  		Attributes: &v2alpha1.BGPAttributes{
    28  			Communities: &v2alpha1.BGPCommunities{
    29  				Standard: []v2alpha1.BGPStandardCommunity{
    30  					"65000:100",
    31  				},
    32  			},
    33  		},
    34  	}
    35  
    36  	redPodIPPoolAdvert = v2alpha1.BGPAdvertisement{
    37  		AdvertisementType: v2alpha1.BGPCiliumPodIPPoolAdvert,
    38  		// CiliumPodIPPool selector is not set for this test
    39  		Attributes: &v2alpha1.BGPAttributes{
    40  			Communities: &v2alpha1.BGPCommunities{
    41  				Standard: []v2alpha1.BGPStandardCommunity{
    42  					"65000:200",
    43  				},
    44  			},
    45  		},
    46  	}
    47  
    48  	redServiceLBAdvert = v2alpha1.BGPAdvertisement{
    49  		AdvertisementType: v2alpha1.BGPServiceAdvert,
    50  		Service: &v2alpha1.BGPServiceOptions{
    51  			Addresses: []v2alpha1.BGPServiceAddressType{
    52  				v2alpha1.BGPLoadBalancerIPAddr,
    53  			},
    54  		},
    55  		Attributes: &v2alpha1.BGPAttributes{
    56  			Communities: &v2alpha1.BGPCommunities{
    57  				Standard: []v2alpha1.BGPStandardCommunity{
    58  					"65000:300",
    59  				},
    60  			},
    61  		},
    62  	}
    63  
    64  	redAdvert = &v2alpha1.CiliumBGPAdvertisement{
    65  		ObjectMeta: metav1.ObjectMeta{
    66  			Name: "red-podCIDR-advertisement",
    67  			Labels: map[string]string{
    68  				"advertise": "red_bgp",
    69  			},
    70  		},
    71  		Spec: v2alpha1.CiliumBGPAdvertisementSpec{
    72  			Advertisements: []v2alpha1.BGPAdvertisement{
    73  				redPodCIDRAdvert,
    74  				redPodIPPoolAdvert,
    75  				redServiceLBAdvert,
    76  			},
    77  		},
    78  	}
    79  
    80  	redAdvertWithSelector = func(selector *slimv1.LabelSelector) *v2alpha1.CiliumBGPAdvertisement {
    81  		cpy := redAdvert.DeepCopy()
    82  		for i := range cpy.Spec.Advertisements {
    83  			cpy.Spec.Advertisements[i].Selector = selector
    84  		}
    85  		return cpy
    86  	}
    87  
    88  	bluePodCIDRAdvert = v2alpha1.BGPAdvertisement{
    89  		AdvertisementType: v2alpha1.BGPPodCIDRAdvert,
    90  		Attributes: &v2alpha1.BGPAttributes{
    91  			Communities: &v2alpha1.BGPCommunities{
    92  				Standard: []v2alpha1.BGPStandardCommunity{
    93  					"65355:100",
    94  				},
    95  			},
    96  		},
    97  	}
    98  	bluePodIPPoolAdvert = v2alpha1.BGPAdvertisement{
    99  		AdvertisementType: v2alpha1.BGPCiliumPodIPPoolAdvert,
   100  		// CiliumPodIPPool selector is not set for this test
   101  		Attributes: &v2alpha1.BGPAttributes{
   102  			Communities: &v2alpha1.BGPCommunities{
   103  				Standard: []v2alpha1.BGPStandardCommunity{
   104  					"65355:200",
   105  				},
   106  			},
   107  		},
   108  	}
   109  	blueServicePodAdvert = v2alpha1.BGPAdvertisement{
   110  		AdvertisementType: v2alpha1.BGPServiceAdvert,
   111  		Service: &v2alpha1.BGPServiceOptions{
   112  			Addresses: []v2alpha1.BGPServiceAddressType{
   113  				v2alpha1.BGPLoadBalancerIPAddr,
   114  			},
   115  		},
   116  		Attributes: &v2alpha1.BGPAttributes{
   117  			Communities: &v2alpha1.BGPCommunities{
   118  				Standard: []v2alpha1.BGPStandardCommunity{
   119  					"65355:300",
   120  				},
   121  			},
   122  		},
   123  	}
   124  
   125  	blueAdvert = &v2alpha1.CiliumBGPAdvertisement{
   126  		ObjectMeta: metav1.ObjectMeta{
   127  			Name: "blue-podCIDR-advertisement",
   128  			Labels: map[string]string{
   129  				"advertise": "blue_bgp",
   130  			},
   131  		},
   132  		Spec: v2alpha1.CiliumBGPAdvertisementSpec{
   133  			Advertisements: []v2alpha1.BGPAdvertisement{
   134  				bluePodCIDRAdvert,
   135  				bluePodIPPoolAdvert,
   136  				blueServicePodAdvert,
   137  			},
   138  		},
   139  	}
   140  
   141  	blueAdvertWithSelector = func(selector *slimv1.LabelSelector) *v2alpha1.CiliumBGPAdvertisement {
   142  		cpy := blueAdvert.DeepCopy()
   143  		for i := range cpy.Spec.Advertisements {
   144  			cpy.Spec.Advertisements[i].Selector = selector
   145  		}
   146  		return cpy
   147  	}
   148  
   149  	// red peer config
   150  	redPeerConfig = &v2alpha1.CiliumBGPPeerConfig{
   151  		ObjectMeta: metav1.ObjectMeta{
   152  			Name: "peer-config-red",
   153  		},
   154  		Spec: v2alpha1.CiliumBGPPeerConfigSpec{
   155  			Families: []v2alpha1.CiliumBGPFamilyWithAdverts{
   156  				{
   157  					CiliumBGPFamily: v2alpha1.CiliumBGPFamily{
   158  						Afi:  "ipv4",
   159  						Safi: "unicast",
   160  					},
   161  					Advertisements: &slimv1.LabelSelector{
   162  						MatchLabels: map[string]string{
   163  							"advertise": "red_bgp",
   164  						},
   165  					},
   166  				},
   167  				{
   168  					CiliumBGPFamily: v2alpha1.CiliumBGPFamily{
   169  						Afi:  "ipv6",
   170  						Safi: "unicast",
   171  					},
   172  					Advertisements: &slimv1.LabelSelector{
   173  						MatchLabels: map[string]string{
   174  							"advertise": "red_bgp",
   175  						},
   176  					},
   177  				},
   178  			},
   179  		},
   180  	}
   181  
   182  	// red peer config - v4
   183  	redPeerConfigV4 = &v2alpha1.CiliumBGPPeerConfig{
   184  		ObjectMeta: metav1.ObjectMeta{
   185  			Name: "peer-config-red-v4",
   186  		},
   187  		Spec: v2alpha1.CiliumBGPPeerConfigSpec{
   188  			Families: []v2alpha1.CiliumBGPFamilyWithAdverts{
   189  				{
   190  					CiliumBGPFamily: v2alpha1.CiliumBGPFamily{
   191  						Afi:  "ipv4",
   192  						Safi: "unicast",
   193  					},
   194  					Advertisements: &slimv1.LabelSelector{
   195  						MatchLabels: map[string]string{
   196  							"advertise": "red_bgp",
   197  						},
   198  					},
   199  				},
   200  			},
   201  		},
   202  	}
   203  
   204  	// blue peer config
   205  	bluePeerConfig = &v2alpha1.CiliumBGPPeerConfig{
   206  		ObjectMeta: metav1.ObjectMeta{
   207  			Name: "peer-config-blue",
   208  		},
   209  		Spec: v2alpha1.CiliumBGPPeerConfigSpec{
   210  			Families: []v2alpha1.CiliumBGPFamilyWithAdverts{
   211  				{
   212  					CiliumBGPFamily: v2alpha1.CiliumBGPFamily{
   213  						Afi:  "ipv4",
   214  						Safi: "unicast",
   215  					},
   216  					Advertisements: &slimv1.LabelSelector{
   217  						MatchLabels: map[string]string{
   218  							"advertise": "blue_bgp",
   219  						},
   220  					},
   221  				},
   222  				{
   223  					CiliumBGPFamily: v2alpha1.CiliumBGPFamily{
   224  						Afi:  "ipv6",
   225  						Safi: "unicast",
   226  					},
   227  					Advertisements: &slimv1.LabelSelector{
   228  						MatchLabels: map[string]string{
   229  							"advertise": "blue_bgp",
   230  						},
   231  					},
   232  				},
   233  			},
   234  		},
   235  	}
   236  
   237  	// peer configuration
   238  	redPeer65001 = v2alpha1.CiliumBGPNodePeer{
   239  		Name:        "red-peer-65001",
   240  		PeerAddress: ptr.To[string]("10.10.10.1"),
   241  		PeerConfigRef: &v2alpha1.PeerConfigReference{
   242  			Group: "cilium.io",
   243  			Kind:  "CiliumBGPPeerConfig",
   244  			Name:  "peer-config-red",
   245  		},
   246  	}
   247  
   248  	bluePeer65001 = v2alpha1.CiliumBGPNodePeer{
   249  		Name:        "blue-peer-65001",
   250  		PeerAddress: ptr.To[string]("10.10.10.2"),
   251  		PeerConfigRef: &v2alpha1.PeerConfigReference{
   252  			Group: "cilium.io",
   253  			Kind:  "CiliumBGPPeerConfig",
   254  			Name:  "peer-config-blue",
   255  		},
   256  	}
   257  )
   258  
   259  func Test_GetAdvertisements(t *testing.T) {
   260  	tests := []struct {
   261  		name               string
   262  		peerConfig         []*v2alpha1.CiliumBGPPeerConfig
   263  		advertisements     []*v2alpha1.CiliumBGPAdvertisement
   264  		reqAdvertTypes     []v2alpha1.BGPAdvertisementType
   265  		reqBGPNodeInstance *v2alpha1.CiliumBGPNodeInstance
   266  		expectedError      bool
   267  		expectedAdverts    PeerAdvertisements
   268  	}{
   269  		{
   270  			name:       "Peer config does not exist for peer in BGPNodeInstance",
   271  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{},
   272  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   273  				redAdvert,
   274  			},
   275  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   276  				Name:     "bgp-65001",
   277  				LocalASN: ptr.To[int64](65001),
   278  				Peers: []v2alpha1.CiliumBGPNodePeer{
   279  					{
   280  						Name: "red-peer-65001",
   281  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   282  							Group: "cilium.io",
   283  							Kind:  "CiliumBGPPeerConfig",
   284  							Name:  "peer-config-red",
   285  						},
   286  					},
   287  				},
   288  			},
   289  			reqAdvertTypes:  []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert},
   290  			expectedAdverts: map[string]PeerFamilyAdvertisements{},
   291  		},
   292  		{
   293  			name: "Expecting PodCIDR advertisement for single peer",
   294  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{
   295  				redPeerConfig,
   296  				bluePeerConfig,
   297  			},
   298  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   299  				redAdvert,
   300  				blueAdvert,
   301  			},
   302  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   303  				Name:     "bgp-65001",
   304  				LocalASN: ptr.To[int64](65001),
   305  				Peers: []v2alpha1.CiliumBGPNodePeer{
   306  					{
   307  						Name: "red-peer-65001",
   308  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   309  							Group: "cilium.io",
   310  							Kind:  "CiliumBGPPeerConfig",
   311  							Name:  "peer-config-red",
   312  						},
   313  					},
   314  				},
   315  			},
   316  			reqAdvertTypes: []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert},
   317  			expectedAdverts: map[string]PeerFamilyAdvertisements{
   318  				"red-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   319  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   320  					{Afi: "ipv6", Safi: "unicast"}: {redPodCIDRAdvert},
   321  				},
   322  			},
   323  		},
   324  		{
   325  			name: "Expecting PodCIDR advertisement for dual peers",
   326  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{
   327  				redPeerConfig,
   328  				bluePeerConfig,
   329  			},
   330  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   331  				redAdvert,
   332  				blueAdvert,
   333  			},
   334  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   335  				Name:     "bgp-65001",
   336  				LocalASN: ptr.To[int64](65001),
   337  				Peers: []v2alpha1.CiliumBGPNodePeer{
   338  					{
   339  						Name: "red-peer-65001",
   340  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   341  							Group: "cilium.io",
   342  							Kind:  "CiliumBGPPeerConfig",
   343  							Name:  "peer-config-red",
   344  						},
   345  					},
   346  					{
   347  						Name: "blue-peer-65001",
   348  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   349  							Group: "cilium.io",
   350  							Kind:  "CiliumBGPPeerConfig",
   351  							Name:  "peer-config-blue",
   352  						},
   353  					},
   354  				},
   355  			},
   356  			reqAdvertTypes: []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert},
   357  			expectedAdverts: map[string]PeerFamilyAdvertisements{
   358  				"red-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   359  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   360  					{Afi: "ipv6", Safi: "unicast"}: {redPodCIDRAdvert},
   361  				},
   362  				"blue-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   363  					{Afi: "ipv4", Safi: "unicast"}: {bluePodCIDRAdvert},
   364  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert},
   365  				},
   366  			},
   367  		},
   368  		{
   369  			name: "Expecting no advertisement, unknown label",
   370  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{
   371  				redPeerConfig,
   372  				bluePeerConfig,
   373  			},
   374  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   375  				// redAdvert, red advertisement not present for this test case
   376  				blueAdvert,
   377  			},
   378  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   379  				Name:     "bgp-65001",
   380  				LocalASN: ptr.To[int64](65001),
   381  				Peers: []v2alpha1.CiliumBGPNodePeer{
   382  					{
   383  						Name: "red-peer-65001",
   384  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   385  							Group: "cilium.io",
   386  							Kind:  "CiliumBGPPeerConfig",
   387  							Name:  "peer-config-red",
   388  						},
   389  					},
   390  				},
   391  			},
   392  			reqAdvertTypes: []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert},
   393  			expectedAdverts: map[string]PeerFamilyAdvertisements{
   394  				"red-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   395  					{Afi: "ipv4", Safi: "unicast"}: nil, // empty advertisement
   396  					{Afi: "ipv6", Safi: "unicast"}: nil, // empty advertisement
   397  				},
   398  			},
   399  		},
   400  		{
   401  			name: "Expecting PodCIDR and Service advertisement for single peer",
   402  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{
   403  				redPeerConfig,
   404  				bluePeerConfig,
   405  			},
   406  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   407  				redAdvert,
   408  				blueAdvert,
   409  			},
   410  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   411  				Name:     "bgp-65001",
   412  				LocalASN: ptr.To[int64](65001),
   413  				Peers: []v2alpha1.CiliumBGPNodePeer{
   414  					{
   415  						Name: "red-peer-65001",
   416  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   417  							Group: "cilium.io",
   418  							Kind:  "CiliumBGPPeerConfig",
   419  							Name:  "peer-config-red",
   420  						},
   421  					},
   422  				},
   423  			},
   424  			reqAdvertTypes: []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert, v2alpha1.BGPServiceAdvert},
   425  			expectedAdverts: map[string]PeerFamilyAdvertisements{
   426  				"red-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   427  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert, redServiceLBAdvert},
   428  					{Afi: "ipv6", Safi: "unicast"}: {redPodCIDRAdvert, redServiceLBAdvert},
   429  				},
   430  			},
   431  		},
   432  		{
   433  			name: "Expecting PodCIDR and Service advertisement for dual peers",
   434  			peerConfig: []*v2alpha1.CiliumBGPPeerConfig{
   435  				redPeerConfig,
   436  				bluePeerConfig,
   437  			},
   438  			advertisements: []*v2alpha1.CiliumBGPAdvertisement{
   439  				redAdvert,
   440  				blueAdvert,
   441  			},
   442  			reqBGPNodeInstance: &v2alpha1.CiliumBGPNodeInstance{
   443  				Name:     "bgp-65001",
   444  				LocalASN: ptr.To[int64](65001),
   445  				Peers: []v2alpha1.CiliumBGPNodePeer{
   446  					{
   447  						Name: "red-peer-65001",
   448  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   449  							Group: "cilium.io",
   450  							Kind:  "CiliumBGPPeerConfig",
   451  							Name:  "peer-config-red",
   452  						},
   453  					},
   454  					{
   455  						Name: "blue-peer-65001",
   456  						PeerConfigRef: &v2alpha1.PeerConfigReference{
   457  							Group: "cilium.io",
   458  							Kind:  "CiliumBGPPeerConfig",
   459  							Name:  "peer-config-blue",
   460  						},
   461  					},
   462  				},
   463  			},
   464  			reqAdvertTypes: []v2alpha1.BGPAdvertisementType{v2alpha1.BGPPodCIDRAdvert, v2alpha1.BGPServiceAdvert},
   465  			expectedAdverts: map[string]PeerFamilyAdvertisements{
   466  				"red-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   467  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert, redServiceLBAdvert},
   468  					{Afi: "ipv6", Safi: "unicast"}: {redPodCIDRAdvert, redServiceLBAdvert},
   469  				},
   470  				"blue-peer-65001": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   471  					{Afi: "ipv4", Safi: "unicast"}: {bluePodCIDRAdvert, blueServicePodAdvert},
   472  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert, blueServicePodAdvert},
   473  				},
   474  			},
   475  		},
   476  	}
   477  
   478  	for _, tt := range tests {
   479  		t.Run(tt.name, func(t *testing.T) {
   480  			req := require.New(t)
   481  			params := PeerAdvertisementIn{
   482  				Logger:          peerAdvertTestLogger,
   483  				PeerConfigStore: store.InitMockStore[*v2alpha1.CiliumBGPPeerConfig](tt.peerConfig),
   484  				AdvertStore:     store.InitMockStore[*v2alpha1.CiliumBGPAdvertisement](tt.advertisements),
   485  			}
   486  
   487  			r := NewCiliumPeerAdvertisement(params)
   488  
   489  			advertisements, err := r.GetConfiguredAdvertisements(tt.reqBGPNodeInstance, tt.reqAdvertTypes...)
   490  			if tt.expectedError {
   491  				req.Error(err)
   492  				return
   493  			} else {
   494  				req.NoError(err)
   495  			}
   496  
   497  			req.Equal(tt.expectedAdverts, advertisements)
   498  		})
   499  	}
   500  }
   501  
   502  // Test_PeerAdvertisementsEqual tests the equality of two PeerAdvertisements
   503  func Test_PeerAdvertisementsEqual(t *testing.T) {
   504  	tests := []struct {
   505  		name          string
   506  		peerAdvert1   PeerAdvertisements
   507  		peerAdvert2   PeerAdvertisements
   508  		expectedEqual bool
   509  	}{
   510  		{
   511  			name:          "Empty PeerAdvertisements",
   512  			peerAdvert1:   PeerAdvertisements{},
   513  			peerAdvert2:   PeerAdvertisements{},
   514  			expectedEqual: true,
   515  		},
   516  		{
   517  			name:          "Nil PeerAdvertisements",
   518  			peerAdvert1:   nil,
   519  			peerAdvert2:   PeerAdvertisements{},
   520  			expectedEqual: true,
   521  		},
   522  		{
   523  			name: "Empty FamilyAdvertisements in peers",
   524  			peerAdvert1: PeerAdvertisements{
   525  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{},
   526  			},
   527  			peerAdvert2: PeerAdvertisements{
   528  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{},
   529  			},
   530  			expectedEqual: true,
   531  		},
   532  		{
   533  			name: "Nil FamilyAdvertisements in peers",
   534  			peerAdvert1: PeerAdvertisements{
   535  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{},
   536  			},
   537  			peerAdvert2: PeerAdvertisements{
   538  				"peer-1": nil,
   539  			},
   540  			expectedEqual: true,
   541  		},
   542  		{
   543  			name: "Equal FamilyAdvertisements in peers",
   544  			peerAdvert1: PeerAdvertisements{
   545  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   546  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   547  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert},
   548  				},
   549  			},
   550  			peerAdvert2: PeerAdvertisements{
   551  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   552  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   553  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert},
   554  				},
   555  			},
   556  			expectedEqual: true,
   557  		},
   558  		{
   559  			name: "Unequal length in FamilyAdvertisements in peers",
   560  			peerAdvert1: PeerAdvertisements{
   561  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   562  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   563  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert},
   564  				},
   565  			},
   566  			peerAdvert2: PeerAdvertisements{
   567  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   568  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   569  				},
   570  			},
   571  			expectedEqual: false,
   572  		},
   573  		{
   574  			name: "Unequal value in FamilyAdvertisements in peers",
   575  			peerAdvert1: PeerAdvertisements{
   576  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   577  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   578  					{Afi: "ipv6", Safi: "unicast"}: {bluePodCIDRAdvert},
   579  				},
   580  			},
   581  			peerAdvert2: PeerAdvertisements{
   582  				"peer-1": map[v2alpha1.CiliumBGPFamily][]v2alpha1.BGPAdvertisement{
   583  					{Afi: "ipv4", Safi: "unicast"}: {redPodCIDRAdvert},
   584  					{Afi: "ipv6", Safi: "unicast"}: {redPodCIDRAdvert},
   585  				},
   586  			},
   587  			expectedEqual: false,
   588  		},
   589  	}
   590  
   591  	for _, tt := range tests {
   592  		t.Run(tt.name, func(t *testing.T) {
   593  			req := require.New(t)
   594  			equal := PeerAdvertisementsEqual(tt.peerAdvert1, tt.peerAdvert2)
   595  			req.Equal(tt.expectedEqual, equal)
   596  		})
   597  	}
   598  }