diff --git a/PROJECT b/PROJECT
index c5a6f881d..ed588f7d2 100644
--- a/PROJECT
+++ b/PROJECT
@@ -328,6 +328,14 @@ resources:
kind: AAAConfig
path: github.com/ironcore-dev/network-operator/api/cisco/nx/v1alpha1
version: v1alpha1
+- api:
+ crdVersion: v1
+ namespaced: true
+ domain: cisco.networking.metal.ironcore.dev
+ group: nx
+ kind: EVPNInstanceConfig
+ path: github.com/ironcore-dev/network-operator/api/cisco/nx/v1alpha1
+ version: v1alpha1
- api:
crdVersion: v1
namespaced: true
diff --git a/Tiltfile b/Tiltfile
index c1c757ce3..169484b58 100644
--- a/Tiltfile
+++ b/Tiltfile
@@ -147,6 +147,9 @@ k8s_resource(new_name='ospf-underlay', objects=['underlay:ospf'], resource_deps=
k8s_yaml('./config/samples/v1alpha1_vlan.yaml')
k8s_resource(new_name='vlan-10', objects=['vlan-10:vlan'], trigger_mode=TRIGGER_MODE_MANUAL, auto_init=False, labels=['samples'])
+k8s_yaml('./config/samples/cisco/nx/v1alpha1_evpninstanceconfig.yaml')
+k8s_resource(new_name='evpninstanceconfig-multisite', objects=['evpninstanceconfig-multisite:evpninstanceconfig'], trigger_mode=TRIGGER_MODE_MANUAL, auto_init=False, labels=['samples'])
+
k8s_yaml('./config/samples/v1alpha1_evi.yaml')
k8s_resource(new_name='vxlan-100010', objects=['vxlan-100010:evpninstance'], resource_deps=['vlan-10'], trigger_mode=TRIGGER_MODE_MANUAL, auto_init=False, labels=['samples'])
diff --git a/api/cisco/nx/v1alpha1/evpninstanceconfig_types.go b/api/cisco/nx/v1alpha1/evpninstanceconfig_types.go
new file mode 100644
index 000000000..49f3b1bd7
--- /dev/null
+++ b/api/cisco/nx/v1alpha1/evpninstanceconfig_types.go
@@ -0,0 +1,71 @@
+// SPDX-FileCopyrightText: SAP SE or an SAP affiliate company and IronCore contributors
+// SPDX-License-Identifier: Apache-2.0
+
+package v1alpha1
+
+import (
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+
+ v1alpha1 "github.com/ironcore-dev/network-operator/api/core/v1alpha1"
+)
+
+// +kubebuilder:rbac:groups=nx.cisco.networking.metal.ironcore.dev,resources=evpninstanceconfigs,verbs=get;list;watch
+
+// EVPNInstanceConfigSpec defines the Cisco NX-OS-specific configuration of an EVPNInstance.
+type EVPNInstanceConfigSpec struct {
+ // MultisiteIngressReplication controls per-VNI multisite ingress replication.
+ // When enabled, BUM traffic for this VNI is replicated to remote VTEP peers
+ // in the multisite domain via ingress replication.
+ // Typically used on Border Gateway (BGW) nodes.
+ // +optional
+ // +kubebuilder:default=Disabled
+ MultisiteIngressReplication MultisiteIngReplMode `json:"multisiteIngressReplication,omitempty"`
+}
+
+// MultisiteIngReplMode defines the per-VNI multisite ingress-replication mode.
+// +kubebuilder:validation:Enum=Disabled;Enabled;EnabledOptimized
+type MultisiteIngReplMode string
+
+const (
+ // MultisiteIngReplDisabled disables multisite ingress replication (default).
+ MultisiteIngReplDisabled MultisiteIngReplMode = "Disabled"
+ // MultisiteIngReplEnabled enables multisite ingress replication.
+ MultisiteIngReplEnabled MultisiteIngReplMode = "Enabled"
+ // MultisiteIngReplEnabledOptimized enables optimized multisite ingress replication.
+ MultisiteIngReplEnabledOptimized MultisiteIngReplMode = "EnabledOptimized"
+)
+
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:path=evpninstanceconfigs
+// +kubebuilder:resource:singular=evpninstanceconfig
+// +kubebuilder:resource:shortName=nxevi
+
+// EVPNInstanceConfig is the Schema for the evpninstanceconfigs API
+type EVPNInstanceConfig struct {
+ metav1.TypeMeta `json:",inline"`
+ metav1.ObjectMeta `json:"metadata,omitempty,omitzero"`
+
+ // spec defines the desired state of the EVPNInstanceConfig
+ // +required
+ Spec EVPNInstanceConfigSpec `json:"spec"`
+}
+
+// +kubebuilder:object:root=true
+
+// EVPNInstanceConfigList contains a list of EVPNInstanceConfig
+type EVPNInstanceConfigList struct {
+ metav1.TypeMeta `json:",inline"`
+ metav1.ListMeta `json:"metadata,omitempty"`
+ Items []EVPNInstanceConfig `json:"items"`
+}
+
+// init registers the EVPNInstanceConfig type with the core v1alpha1 scheme and sets
+// itself as a dependency for the EVPNInstance core type.
+func init() {
+ v1alpha1.RegisterEVPNInstanceDependency(GroupVersion.WithKind("EVPNInstanceConfig"))
+ SchemeBuilder.Register(func(s *runtime.Scheme) error {
+ s.AddKnownTypes(GroupVersion, &EVPNInstanceConfig{}, &EVPNInstanceConfigList{})
+ return nil
+ })
+}
diff --git a/api/cisco/nx/v1alpha1/zz_generated.deepcopy.go b/api/cisco/nx/v1alpha1/zz_generated.deepcopy.go
index 1475968f6..8aa461772 100644
--- a/api/cisco/nx/v1alpha1/zz_generated.deepcopy.go
+++ b/api/cisco/nx/v1alpha1/zz_generated.deepcopy.go
@@ -435,6 +435,79 @@ func (in *Console) DeepCopy() *Console {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EVPNInstanceConfig) DeepCopyInto(out *EVPNInstanceConfig) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ out.Spec = in.Spec
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EVPNInstanceConfig.
+func (in *EVPNInstanceConfig) DeepCopy() *EVPNInstanceConfig {
+ if in == nil {
+ return nil
+ }
+ out := new(EVPNInstanceConfig)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EVPNInstanceConfig) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EVPNInstanceConfigList) DeepCopyInto(out *EVPNInstanceConfigList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]EVPNInstanceConfig, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EVPNInstanceConfigList.
+func (in *EVPNInstanceConfigList) DeepCopy() *EVPNInstanceConfigList {
+ if in == nil {
+ return nil
+ }
+ out := new(EVPNInstanceConfigList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EVPNInstanceConfigList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EVPNInstanceConfigSpec) DeepCopyInto(out *EVPNInstanceConfigSpec) {
+ *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EVPNInstanceConfigSpec.
+func (in *EVPNInstanceConfigSpec) DeepCopy() *EVPNInstanceConfigSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(EVPNInstanceConfigSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EVPNMultihoming) DeepCopyInto(out *EVPNMultihoming) {
*out = *in
diff --git a/charts/network-operator/templates/crd/evpninstanceconfigs.nx.cisco.networking.metal.ironcore.dev.yaml b/charts/network-operator/templates/crd/evpninstanceconfigs.nx.cisco.networking.metal.ironcore.dev.yaml
new file mode 100644
index 000000000..b47b20ce3
--- /dev/null
+++ b/charts/network-operator/templates/crd/evpninstanceconfigs.nx.cisco.networking.metal.ironcore.dev.yaml
@@ -0,0 +1,66 @@
+{{- if .Values.crd.enabled }}
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ {{- if .Values.crd.keep }}
+ "helm.sh/resource-policy": keep
+ {{- end }}
+ controller-gen.kubebuilder.io/version: v0.22.0
+ name: evpninstanceconfigs.nx.cisco.networking.metal.ironcore.dev
+spec:
+ group: nx.cisco.networking.metal.ironcore.dev
+ names:
+ kind: EVPNInstanceConfig
+ listKind: EVPNInstanceConfigList
+ plural: evpninstanceconfigs
+ shortNames:
+ - nxevi
+ singular: evpninstanceconfig
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: EVPNInstanceConfig is the Schema for the evpninstanceconfigs
+ API
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec defines the desired state of the EVPNInstanceConfig
+ properties:
+ multisiteIngressReplication:
+ default: Disabled
+ description: |-
+ MultisiteIngressReplication controls per-VNI multisite ingress replication.
+ When enabled, BUM traffic for this VNI is replicated to remote VTEP peers
+ in the multisite domain via ingress replication.
+ Typically used on Border Gateway (BGW) nodes.
+ enum:
+ - Disabled
+ - Enabled
+ - EnabledOptimized
+ type: string
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
+{{- end }}
diff --git a/charts/network-operator/templates/rbac/manager-role.yaml b/charts/network-operator/templates/rbac/manager-role.yaml
index 79729cf5f..ed0f0055e 100644
--- a/charts/network-operator/templates/rbac/manager-role.yaml
+++ b/charts/network-operator/templates/rbac/manager-role.yaml
@@ -181,6 +181,7 @@ rules:
resources:
- aaaconfigs
- bgpconfigs
+ - evpninstanceconfigs
- interfaceconfigs
- lldpconfigs
- managementaccessconfigs
diff --git a/config/crd/bases/nx.cisco.networking.metal.ironcore.dev_evpninstanceconfigs.yaml b/config/crd/bases/nx.cisco.networking.metal.ironcore.dev_evpninstanceconfigs.yaml
new file mode 100644
index 000000000..8535da6d0
--- /dev/null
+++ b/config/crd/bases/nx.cisco.networking.metal.ironcore.dev_evpninstanceconfigs.yaml
@@ -0,0 +1,62 @@
+---
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ controller-gen.kubebuilder.io/version: v0.22.0
+ name: evpninstanceconfigs.nx.cisco.networking.metal.ironcore.dev
+spec:
+ group: nx.cisco.networking.metal.ironcore.dev
+ names:
+ kind: EVPNInstanceConfig
+ listKind: EVPNInstanceConfigList
+ plural: evpninstanceconfigs
+ shortNames:
+ - nxevi
+ singular: evpninstanceconfig
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: EVPNInstanceConfig is the Schema for the evpninstanceconfigs
+ API
+ properties:
+ apiVersion:
+ description: |-
+ APIVersion defines the versioned schema of this representation of an object.
+ Servers should convert recognized schemas to the latest internal value, and
+ may reject unrecognized values.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
+ type: string
+ kind:
+ description: |-
+ Kind is a string value representing the REST resource this object represents.
+ Servers may infer this from the endpoint the client submits requests to.
+ Cannot be updated.
+ In CamelCase.
+ More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: spec defines the desired state of the EVPNInstanceConfig
+ properties:
+ multisiteIngressReplication:
+ default: Disabled
+ description: |-
+ MultisiteIngressReplication controls per-VNI multisite ingress replication.
+ When enabled, BUM traffic for this VNI is replicated to remote VTEP peers
+ in the multisite domain via ingress replication.
+ Typically used on Border Gateway (BGW) nodes.
+ enum:
+ - Disabled
+ - Enabled
+ - EnabledOptimized
+ type: string
+ type: object
+ required:
+ - spec
+ type: object
+ served: true
+ storage: true
diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml
index 0281b3f4e..a97087181 100644
--- a/config/crd/kustomization.yaml
+++ b/config/crd/kustomization.yaml
@@ -47,6 +47,7 @@ resources:
- bases/nx.cisco.networking.metal.ironcore.dev_lldpconfigs.yaml
- bases/nx.cisco.networking.metal.ironcore.dev_bgpconfigs.yaml
- bases/nx.cisco.networking.metal.ironcore.dev_aaaconfigs.yaml
+- bases/nx.cisco.networking.metal.ironcore.dev_evpninstanceconfigs.yaml
# +kubebuilder:scaffold:crdkustomizeresource
patches: []
diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml
index 66cdebb60..29076e235 100644
--- a/config/rbac/role.yaml
+++ b/config/rbac/role.yaml
@@ -175,6 +175,7 @@ rules:
resources:
- aaaconfigs
- bgpconfigs
+ - evpninstanceconfigs
- interfaceconfigs
- lldpconfigs
- managementaccessconfigs
diff --git a/config/samples/cisco/nx/v1alpha1_evpninstanceconfig.yaml b/config/samples/cisco/nx/v1alpha1_evpninstanceconfig.yaml
new file mode 100644
index 000000000..5e551e6b9
--- /dev/null
+++ b/config/samples/cisco/nx/v1alpha1_evpninstanceconfig.yaml
@@ -0,0 +1,9 @@
+apiVersion: nx.cisco.networking.metal.ironcore.dev/v1alpha1
+kind: EVPNInstanceConfig
+metadata:
+ labels:
+ app.kubernetes.io/name: network-operator
+ app.kubernetes.io/managed-by: kustomize
+ name: evpninstanceconfig-multisite
+spec:
+ multisiteIngressReplication: EnabledOptimized
diff --git a/config/samples/kustomization.yaml b/config/samples/kustomization.yaml
index 4fdb74fa5..6dcd92d7e 100644
--- a/config/samples/kustomization.yaml
+++ b/config/samples/kustomization.yaml
@@ -45,4 +45,5 @@ resources:
- cisco/nx/v1alpha1_lldpconfig.yaml
- cisco/nx/v1alpha1_bgpconfig.yaml
- cisco/nx/v1alpha1_aaaconfig.yaml
+- cisco/nx/v1alpha1_evpninstanceconfig.yaml
# +kubebuilder:scaffold:manifestskustomizesamples
diff --git a/config/samples/v1alpha1_evi.yaml b/config/samples/v1alpha1_evi.yaml
index 093ee73a5..b95c849b5 100644
--- a/config/samples/v1alpha1_evi.yaml
+++ b/config/samples/v1alpha1_evi.yaml
@@ -8,6 +8,12 @@ metadata:
spec:
deviceRef:
name: leaf1
+ # Uncomment to add NXOS provider-specific config
+ # See: ./cisco/nx/v1alpha1_evpninstanceconfig.yaml
+ # providerConfigRef:
+ # apiVersion: nx.cisco.networking.metal.ironcore.dev/v1alpha1
+ # kind: EVPNInstanceConfig
+ # name: evpninstanceconfig-multisite
vni: 100010
type: Bridged
multicastGroupAddress: 239.1.1.100
diff --git a/docs/api-reference/index.md b/docs/api-reference/index.md
index fef20cbf9..14730bfc4 100644
--- a/docs/api-reference/index.md
+++ b/docs/api-reference/index.md
@@ -4573,6 +4573,7 @@ Package v1alpha1 contains API Schema definitions for the nx.cisco.networking.met
- [AAAConfig](#aaaconfig)
- [BGPConfig](#bgpconfig)
- [BorderGateway](#bordergateway)
+- [EVPNInstanceConfig](#evpninstanceconfig)
- [InterfaceConfig](#interfaceconfig)
- [LLDPConfig](#lldpconfig)
- [ManagementAccessConfig](#managementaccessconfig)
@@ -4847,6 +4848,40 @@ _Appears in:_
| `timeout` _[Duration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.35/#duration-v1-meta)_ | Timeout defines the inactivity timeout for console sessions.
If a session is inactive for the specified duration, it will be automatically disconnected.
The format is a string representing a duration (e.g., "10m" for 10 minutes). | 10m | Pattern: `^([0-9]+(\.[0-9]+)?(ns\|us\|µs\|ms\|s\|m\|h))+$`
Type: string
Optional: \{\}
|
+#### EVPNInstanceConfig
+
+
+
+EVPNInstanceConfig is the Schema for the evpninstanceconfigs API
+
+
+
+
+
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `apiVersion` _string_ | `nx.cisco.networking.metal.ironcore.dev/v1alpha1` | | |
+| `kind` _string_ | `EVPNInstanceConfig` | | |
+| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.35/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | |
+| `spec` _[EVPNInstanceConfigSpec](#evpninstanceconfigspec)_ | spec defines the desired state of the EVPNInstanceConfig | | Required: \{\}
|
+
+
+#### EVPNInstanceConfigSpec
+
+
+
+EVPNInstanceConfigSpec defines the Cisco NX-OS-specific configuration of an EVPNInstance.
+
+
+
+_Appears in:_
+- [EVPNInstanceConfig](#evpninstanceconfig)
+
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `multisiteIngressReplication` _[MultisiteIngReplMode](#multisiteingreplmode)_ | MultisiteIngressReplication controls per-VNI multisite ingress replication.
When enabled, BUM traffic for this VNI is replicated to remote VTEP peers
in the multisite domain via ingress replication.
Typically used on Border Gateway (BGW) nodes. | Disabled | Enum: [Disabled Enabled EnabledOptimized]
Optional: \{\}
|
+
+
#### EVPNMultihoming
@@ -5061,6 +5096,25 @@ _Appears in:_
| `ssh` _[SSH](#ssh)_ | SSH defines the SSH server configuration for the VTY terminal access on the device. | | Optional: \{\}
|
+#### MultisiteIngReplMode
+
+_Underlying type:_ _string_
+
+MultisiteIngReplMode defines the per-VNI multisite ingress-replication mode.
+
+_Validation:_
+- Enum: [Disabled Enabled EnabledOptimized]
+
+_Appears in:_
+- [EVPNInstanceConfigSpec](#evpninstanceconfigspec)
+
+| Field | Description |
+| --- | --- |
+| `Disabled` | MultisiteIngReplDisabled disables multisite ingress replication (default).
|
+| `Enabled` | MultisiteIngReplEnabled enables multisite ingress replication.
|
+| `EnabledOptimized` | MultisiteIngReplEnabledOptimized enables optimized multisite ingress replication.
|
+
+
#### NetworkVirtualizationEdgeConfig
diff --git a/internal/provider/cisco/nxos/nve.go b/internal/provider/cisco/nxos/nve.go
index 7b25cd3ca..130de34ac 100644
--- a/internal/provider/cisco/nxos/nve.go
+++ b/internal/provider/cisco/nxos/nve.go
@@ -73,11 +73,22 @@ const (
suppressARPDisabled SuppressARP = "disabled"
)
+// MultisiteIngRepl represents the per-VNI multisite ingress-replication state
+// on NX-OS (nvo_MultisiteIngReplStateT).
+type MultisiteIngRepl string
+
+const (
+ MultisiteIngReplDisable MultisiteIngRepl = "disable"
+ MultisiteIngReplEnable MultisiteIngRepl = "enable"
+ MultisiteIngReplEnableOptimized MultisiteIngRepl = "enableOptimized"
+)
+
type VNI struct {
- AssociateVrfFlag bool `json:"associateVrfFlag"`
- McastGroup Option[string] `json:"mcastGroup"`
- Vni int32 `json:"vni"`
- SuppressARP SuppressARP `json:"suppressARP"`
+ AssociateVrfFlag bool `json:"associateVrfFlag"`
+ McastGroup Option[string] `json:"mcastGroup"`
+ MultisiteIngRepl MultisiteIngRepl `json:"multisiteIngRepl"`
+ Vni int32 `json:"vni"`
+ SuppressARP SuppressARP `json:"suppressARP"`
}
func (*VNI) IsListItem() {}
diff --git a/internal/provider/cisco/nxos/nve_test.go b/internal/provider/cisco/nxos/nve_test.go
index c72aff529..0a3971380 100644
--- a/internal/provider/cisco/nxos/nve_test.go
+++ b/internal/provider/cisco/nxos/nve_test.go
@@ -18,12 +18,24 @@ func init() {
Register("nve", nve)
vni := &VNI{
- Vni: 100010,
- McastGroup: NewOption("239.1.1.100"),
- SuppressARP: suppressARPOff,
+ Vni: 100010,
+ McastGroup: NewOption("239.1.1.100"),
+ SuppressARP: suppressARPOff,
+ MultisiteIngRepl: MultisiteIngReplDisable,
}
Register("vni", vni)
+ vniMultisite := &VNI{
+ Vni: 100010,
+ MultisiteIngRepl: MultisiteIngReplEnable,
+ }
+ Register("vni_multisite_ingress_replication", vniMultisite)
+
+ vniMultisiteOptimized := &VNI{
+ Vni: 100010,
+ MultisiteIngRepl: MultisiteIngReplEnableOptimized,
+ }
+ Register("vni_multisite_ingress_replication_optimized", vniMultisiteOptimized)
infraVLANs := &NVEInfraVLANs{}
infraVLANs.InfraVLANList.Set(&NVEInfraVLAN{ID: 4052})
infraVLANs.InfraVLANList.Set(&NVEInfraVLAN{ID: 4092})
diff --git a/internal/provider/cisco/nxos/provider.go b/internal/provider/cisco/nxos/provider.go
index 7efc46d1c..44d638985 100644
--- a/internal/provider/cisco/nxos/provider.go
+++ b/internal/provider/cisco/nxos/provider.go
@@ -1109,6 +1109,13 @@ func (p *Provider) DeleteDNS(ctx context.Context) error {
func (p *Provider) EnsureEVPNInstance(ctx context.Context, req *provider.EVPNInstanceRequest) (err error) {
sb := new(gnmiext.SetBuilder).Limit(maxSetOperations)
+ var cfg nxv1alpha1.EVPNInstanceConfig
+ if req.ProviderConfig != nil {
+ if err := req.ProviderConfig.Into(&cfg); err != nil {
+ return err
+ }
+ }
+
f := new(Feature)
f.Name = "nvo"
f.AdminSt = AdminStEnabled
@@ -1147,6 +1154,14 @@ func (p *Provider) EnsureEVPNInstance(ctx context.Context, req *provider.EVPNIns
default:
vni.SuppressARP = suppressARPDisabled
}
+ switch cfg.Spec.MultisiteIngressReplication {
+ case nxv1alpha1.MultisiteIngReplEnabled:
+ vni.MultisiteIngRepl = MultisiteIngReplEnable
+ case nxv1alpha1.MultisiteIngReplEnabledOptimized:
+ vni.MultisiteIngRepl = MultisiteIngReplEnableOptimized
+ default:
+ vni.MultisiteIngRepl = MultisiteIngReplDisable
+ }
sb.Update(vni)
switch req.EVPNInstance.Spec.Type {
diff --git a/internal/provider/cisco/nxos/testdata/vni.json b/internal/provider/cisco/nxos/testdata/vni.json
index b8f008234..5586f3876 100644
--- a/internal/provider/cisco/nxos/testdata/vni.json
+++ b/internal/provider/cisco/nxos/testdata/vni.json
@@ -10,6 +10,7 @@
{
"associateVrfFlag": false,
"mcastGroup": "239.1.1.100",
+ "multisiteIngRepl": "disable",
"vni": 100010,
"suppressARP": "off"
}
diff --git a/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication.json b/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication.json
new file mode 100644
index 000000000..552d2a53e
--- /dev/null
+++ b/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication.json
@@ -0,0 +1,24 @@
+{
+ "eps-items": {
+ "epId-items": {
+ "Ep-list": [
+ {
+ "epId": "1",
+ "nws-items": {
+ "vni-items": {
+ "Nw-list": [
+ {
+ "associateVrfFlag": false,
+ "mcastGroup": "DME_UNSET_PROPERTY_MARKER",
+ "multisiteIngRepl": "enable",
+ "vni": 100010,
+ "suppressARP": ""
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication_optimized.json b/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication_optimized.json
new file mode 100644
index 000000000..a5588f5df
--- /dev/null
+++ b/internal/provider/cisco/nxos/testdata/vni_multisite_ingress_replication_optimized.json
@@ -0,0 +1,24 @@
+{
+ "eps-items": {
+ "epId-items": {
+ "Ep-list": [
+ {
+ "epId": "1",
+ "nws-items": {
+ "vni-items": {
+ "Nw-list": [
+ {
+ "associateVrfFlag": false,
+ "mcastGroup": "DME_UNSET_PROPERTY_MARKER",
+ "multisiteIngRepl": "enableOptimized",
+ "vni": 100010,
+ "suppressARP": ""
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/test/gnmi/testdata/nx.cisco.networking.metal.ironcore.dev/evpninstance.txtar b/test/gnmi/testdata/nx.cisco.networking.metal.ironcore.dev/evpninstance.txtar
index 1dd37c90f..55cc1d54d 100644
--- a/test/gnmi/testdata/nx.cisco.networking.metal.ironcore.dev/evpninstance.txtar
+++ b/test/gnmi/testdata/nx.cisco.networking.metal.ironcore.dev/evpninstance.txtar
@@ -86,6 +86,7 @@ spec:
{
"associateVrfFlag": false,
"mcastGroup": "DME_UNSET_PROPERTY_MARKER",
+ "multisiteIngRepl": "disable",
"vni": 10100,
"suppressARP": "off"
}