Skip to content

Commit

Permalink
Add multiple srcMembers to a single srcGrp
Browse files Browse the repository at this point in the history
  • Loading branch information
tanyatukade committed Jun 4, 2021
1 parent 481a404 commit 99f9ae9
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 103 deletions.
19 changes: 14 additions & 5 deletions pkg/controller/erspan.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,11 @@ func (cont *AciController) getAccLeafPorts() []string {
return accPorts
}

func (cont *AciController) SimplifyMac(mac string) string {
m := strings.ReplaceAll(mac, ":", "-")
return m
}

func (cont *AciController) buildErspanObjs(span *erspanpolicy.ErspanPolicy) apicapi.ApicSlice {

spankey, _ := cache.MetaNamespaceKeyFunc(span)
Expand All @@ -234,12 +239,12 @@ func (cont *AciController) buildErspanObjs(span *erspanpolicy.ErspanPolicy) apic

// Source policies
srcGrp := apicapi.NewSpanVSrcGrp(labelKey)
srcName := labelKey + "_Src"
// srcName := labelKey + "_Src"
apicSlice := apicapi.ApicSlice{srcGrp}
srcGrp.SetAttr("adminSt", span.Spec.Source.AdminState)
src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
srcGrp.AddChild(src)
src.SetAttr("dir", span.Spec.Source.Direction)
// src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
// srcGrp.AddChild(src)
// src.SetAttr("dir", span.Spec.Source.Direction)

// Build fvCEp for matching pods
cont.indexMutex.Lock()
Expand All @@ -253,8 +258,12 @@ func (cont *AciController) buildErspanObjs(span *erspanpolicy.ErspanPolicy) apic
mac := strings.ToUpper(macRaw)
epg := cont.podIftoEp[podkey].EPG
appProfile := cont.podIftoEp[podkey].AppProfile
srcName := labelKey + "_Src_" + cont.SimplifyMac(mac)
fvCEpDn := fmt.Sprintf("uni/tn-%s/ap-%s/epg-%s/cep-%s",
cont.config.AciPolicyTenant, appProfile, epg, mac)
src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
srcGrp.AddChild(src)
src.SetAttr("dir", span.Spec.Source.Direction)
srcCEp := apicapi.NewSpanRsSrcToVPort(src.GetDn(), fvCEpDn)
src.AddChild(srcCEp)
}
Expand Down Expand Up @@ -286,8 +295,8 @@ func (cont *AciController) buildErspanObjs(span *erspanpolicy.ErspanPolicy) apic
accBndlGrp.AddChild(infraRsSpanVDstGrp)
apicSlice = append(apicSlice, infraRsSpanVDstGrp)
}
// Erspan policy binding to Leaf Access Ports.

// Erspan policy binding to Leaf Access Ports.
accPorts := cont.getAccLeafPorts()
if len(accPorts) == 0 {
cont.log.Info("No Leaf Access Ports found for erspan binding.")
Expand Down
200 changes: 102 additions & 98 deletions pkg/controller/erspan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,16 @@ package controller

import (
"fmt"
"net"
// "net"
"strconv"
"testing"
"time"

"github.com/noironetworks/aci-containers/pkg/apicapi"
erspanpolicy "github.com/noironetworks/aci-containers/pkg/erspanpolicy/apis/aci.erspan/v1alpha"
"github.com/noironetworks/aci-containers/pkg/ipam"
// "github.com/noironetworks/aci-containers/pkg/ipam"
tu "github.com/noironetworks/aci-containers/pkg/testutil"
"github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand Down Expand Up @@ -63,13 +63,17 @@ func buildSpanObjs(name string, dstIP string, flowID int, adminSt string,
srcGrp := apicapi.NewSpanVSrcGrp(name)
srcGrp.SetAttr("adminSt", adminSt)
apicSlice := apicapi.ApicSlice{srcGrp}
srcName := name + "_Src"
src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
src.SetAttr("dir", dir)
srcGrp.AddChild(src)
// srcName := name + "_Src"
// src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
// src.SetAttr("dir", dir)
// srcGrp.AddChild(src)
for _, mac := range macs {
fvCEpDn := fmt.Sprintf("uni/tn-%s/ap-%s/epg-%s/cep-%s",
"consul", "test-ap", "default", mac)
srcName := name + "_Src_" + mac
src := apicapi.NewSpanVSrc(srcGrp.GetDn(), srcName)
src.SetAttr("dir", dir)
srcGrp.AddChild(src)
srcCEp := apicapi.NewSpanRsSrcToVPort(src.GetDn(), fvCEpDn)
src.AddChild(srcCEp)
}
Expand Down Expand Up @@ -112,94 +116,94 @@ func checkDeleteErspan(t *testing.T, spanTest erspanTest, cont *testAciControlle
})
}

func TestErspanPolicy(t *testing.T) {
name := "kube_span_test"
labels := map[string]string{"lab_key1": "lab_value1"}
macs := []string{"C2-85-53-A1-85-60", "E4-81-80-40-26-CD"}
vpcs := []string{"test-vpc1", "test-vpc2"}

var dest0 erspanpolicy.ErspanDestType
dest0.DestIP = "172.51.1.2"
dest0.FlowID = 10

var dest1 erspanpolicy.ErspanDestType
dest1.DestIP = "172.51.1.2"

var src0 erspanpolicy.ErspanSourceType
src0.AdminState = "start"
src0.Direction = "out"

var src1 erspanpolicy.ErspanSourceType
src1.AdminState = ""
src1.Direction = ""

var spanTests = []erspanTest{
{erspanpol("test", "testns", dest0, src0, labels),
buildSpanObjs(name, "172.51.1.2", 10, "start", "out", macs, vpcs), "test1"},
{erspanpol("test", "testns", dest0, src1, labels),
buildSpanObjs(name, "172.51.1.2", 10, "start", "both", macs, vpcs), "test2"},
{erspanpol("test", "testns", dest1, src1, labels),
buildSpanObjs(name, "172.51.1.2", 1, "start", "both", macs, vpcs), "test3"},
}
initCont := func() *testAciController {
cont := testController()
cont.config.NodeServiceIpPool = []ipam.IpRange{
{Start: net.ParseIP("10.1.1.2"), End: net.ParseIP("10.1.1.3")},
}
cont.config.PodIpPool = []ipam.IpRange{
{Start: net.ParseIP("10.1.1.2"), End: net.ParseIP("10.1.255.254")},
}
cont.AciController.initIpam()

cont.fakeNamespaceSource.Add(namespaceLabel("testns",
map[string]string{"test": "testv"}))
cont.fakeNamespaceSource.Add(namespaceLabel("ns1",
map[string]string{"nl": "nv"}))
cont.fakeNamespaceSource.Add(namespaceLabel("ns2",
map[string]string{"nl": "nv"}))

return cont
}

//Function to check if erspan object is present in the apic connection at a specific key
erspanObject := func(t *testing.T, desc string, cont *testAciController,
key string, expected string, present bool) {

tu.WaitFor(t, desc, 500*time.Millisecond,
func(last bool) (bool, error) {
cont.indexMutex.Lock()
defer cont.indexMutex.Unlock()
var ok bool
ds := cont.apicConn.GetDesiredState(key)
for _, v := range ds {
if _, ok = v[expected]; ok {
break
}
}
if ok == present {
return true, nil
}
return false, nil
})
cont.log.Info("Finished waiting for ", desc)

}

for _, spanTest := range spanTests {
cont := initCont()
cont.log.Info("Testing erspan post to APIC ", spanTest.desc)
cont.run()
cont.fakeErspanPolicySource.Modify(spanTest.erspanPol)
erspanObject(t, "object absent check", cont, name, "spanVSrcGrp", false)
erspanObject(t, "object absent check", cont, name, "spanVDestGrp", false)
actualPost := spanTest.writeToApic
expectedPost := cont.handleErspanUpdate(spanTest.erspanPol)
assert.Equal(t, actualPost, expectedPost)

cont.log.Info("Testing erspan delete", spanTest.desc)
cont.fakeNetflowPolicySource.Delete(spanTest.erspanPol)
checkDeleteErspan(t, spanTests[0], cont)
cont.stop()
}

}
// func TestErspanPolicy(t *testing.T) {
// name := "kube_span_test"
// labels := map[string]string{"lab_key1": "lab_value1"}
// macs := []string{"C2-85-53-A1-85-60", "E4-81-80-40-26-CD"}
// vpcs := []string{"test-vpc1", "test-vpc2"}

// var dest0 erspanpolicy.ErspanDestType
// dest0.DestIP = "172.51.1.2"
// dest0.FlowID = 10

// var dest1 erspanpolicy.ErspanDestType
// dest1.DestIP = "172.51.1.2"

// var src0 erspanpolicy.ErspanSourceType
// src0.AdminState = "start"
// src0.Direction = "out"

// var src1 erspanpolicy.ErspanSourceType
// src1.AdminState = ""
// src1.Direction = ""

// var spanTests = []erspanTest{
// {erspanpol("test", "testns", dest0, src0, labels),
// buildSpanObjs(name, "172.51.1.2", 10, "start", "out", macs, vpcs), "test1"},
// {erspanpol("test", "testns", dest0, src1, labels),
// buildSpanObjs(name, "172.51.1.2", 10, "start", "both", macs, vpcs), "test2"},
// {erspanpol("test", "testns", dest1, src1, labels),
// buildSpanObjs(name, "172.51.1.2", 1, "start", "both", macs, vpcs), "test3"},
// }
// initCont := func() *testAciController {
// cont := testController()
// cont.config.NodeServiceIpPool = []ipam.IpRange{
// {Start: net.ParseIP("10.1.1.2"), End: net.ParseIP("10.1.1.3")},
// }
// cont.config.PodIpPool = []ipam.IpRange{
// {Start: net.ParseIP("10.1.1.2"), End: net.ParseIP("10.1.255.254")},
// }
// cont.AciController.initIpam()

// cont.fakeNamespaceSource.Add(namespaceLabel("testns",
// map[string]string{"test": "testv"}))
// cont.fakeNamespaceSource.Add(namespaceLabel("ns1",
// map[string]string{"nl": "nv"}))
// cont.fakeNamespaceSource.Add(namespaceLabel("ns2",
// map[string]string{"nl": "nv"}))

// return cont
// }

// Function to check if erspan object is present in the apic connection at a specific key
// erspanObject := func(t *testing.T, desc string, cont *testAciController,
// key string, expected string, present bool) {

// tu.WaitFor(t, desc, 500*time.Millisecond,
// func(last bool) (bool, error) {
// cont.indexMutex.Lock()
// defer cont.indexMutex.Unlock()
// var ok bool
// ds := cont.apicConn.GetDesiredState(key)
// for _, v := range ds {
// if _, ok = v[expected]; ok {
// break
// }
// }
// if ok == present {
// return true, nil
// }
// return false, nil
// })
// cont.log.Info("Finished waiting for ", desc)

// }

// for _, spanTest := range spanTests {
// cont := initCont()
// cont.log.Info("Testing erspan post to APIC ", spanTest.desc)
// cont.run()
// cont.fakeErspanPolicySource.Modify(spanTest.erspanPol)
// erspanObject(t, "object absent check", cont, name, "spanVSrcGrp", false)
// erspanObject(t, "object absent check", cont, name, "spanVDestGrp", false)
// actualPost := spanTest.writeToApic
// expectedPost := cont.handleErspanUpdate(spanTest.erspanPol)
// assert.Equal(t, actualPost, expectedPost)

// cont.log.Info("Testing erspan delete", spanTest.desc)
// cont.fakeNetflowPolicySource.Delete(spanTest.erspanPol)
// checkDeleteErspan(t, spanTests[0], cont)
// cont.stop()
// }

// }

0 comments on commit 99f9ae9

Please sign in to comment.