From 3fb33fe0c1ab9c131ff8c4d51b0ee9203a412a4e Mon Sep 17 00:00:00 2001 From: Sergey Matov Date: Thu, 8 Feb 2024 19:30:19 +0400 Subject: [PATCH] [external] Prefer external rotues to fabric-originated --- pkg/agent/dozer/bcm/plan.go | 23 +++++++++++++++++++++++ pkg/ctrl/agent/agent_ctrl.go | 12 ++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/pkg/agent/dozer/bcm/plan.go b/pkg/agent/dozer/bcm/plan.go index 5603ac8e..f778d0ca 100644 --- a/pkg/agent/dozer/bcm/plan.go +++ b/pkg/agent/dozer/bcm/plan.go @@ -50,6 +50,7 @@ const ( PREFIX_LIST_VPC_LOOPBACK = "vpc-loopback-prefix" NO_COMMUNITY = "no-community" LST_GROUP_SPINELINK = "spinelink" + BGP_COMM_LIST_ALL_EXTERNALS = "all-externals" ) func (p *broadcomProcessor) PlanDesiredState(ctx context.Context, agent *agentapi.Agent) (*dozer.Spec, error) { @@ -560,7 +561,29 @@ func planExternals(agent *agentapi.Agent, spec *dozer.Spec) error { } + attachedExternals := map[string]bool{} + for _, attach := range agent.Spec.ExternalAttachments { + attachedExternals[attach.External] = true + } + + spec.CommunityLists[BGP_COMM_LIST_ALL_EXTERNALS] = &dozer.SpecCommunityList{ + Members: []string{}, + } + + spec.RouteMaps[ROUTE_MAP_BLOCK_EVPN_DEFAULT_REMOTE].Statements[fmt.Sprintf("%d", ROUTE_MAP_MAX_STATEMENT-10)] = &dozer.SpecRouteMapStatement{ + Conditions: dozer.SpecRouteMapConditions{ + MatchCommunityList: stringPtr(BGP_COMM_LIST_ALL_EXTERNALS), + }, + SetLocalPreference: uint32Ptr(500), + Result: dozer.SpecRouteMapResultAccept, + } + for externalName, external := range agent.Spec.Externals { + spec.CommunityLists[BGP_COMM_LIST_ALL_EXTERNALS].Members = append(spec.CommunityLists[BGP_COMM_LIST_ALL_EXTERNALS].Members, external.InboundCommunity) + if !attachedExternals[externalName] { + continue + } + ipnsVrfName := ipnsVrfName(external.IPv4Namespace) externalCommsCommList := ipNsExtCommsCommListName(external.IPv4Namespace) diff --git a/pkg/ctrl/agent/agent_ctrl.go b/pkg/ctrl/agent/agent_ctrl.go index f3587e65..e598de83 100644 --- a/pkg/ctrl/agent/agent_ctrl.go +++ b/pkg/ctrl/agent/agent_ctrl.go @@ -365,17 +365,17 @@ func (r *AgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } externals := map[string]vpcapi.ExternalSpec{} + externalsToConfig := map[string]vpcapi.ExternalSpec{} externalList := &vpcapi.ExternalList{} err = r.List(ctx, externalList, client.InNamespace(sw.Namespace)) if err != nil { return ctrl.Result{}, errors.Wrapf(err, "error listing externals") } for _, ext := range externalList.Items { - if !attachedExternals[ext.Name] { - continue - } - externals[ext.Name] = ext.Spec + if attachedExternals[ext.Name] { + externalsToConfig[ext.Name] = ext.Spec + } } externalPeerings := map[string]vpcapi.ExternalPeeringSpec{} @@ -385,7 +385,7 @@ func (r *AgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl return ctrl.Result{}, errors.Wrapf(err, "error listing external peerings") } for _, peering := range externalPeeringList.Items { - if _, exists := externals[peering.Spec.Permit.External.Name]; !exists { + if _, exists := externalsToConfig[peering.Spec.Permit.External.Name]; !exists { continue } @@ -533,7 +533,7 @@ func (r *AgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl } externalsReq := map[string]bool{} - for name := range externals { + for name := range externalsToConfig { externalsReq[name] = true }