summaryrefslogtreecommitdiffhomepage
path: root/policy/policy.go
diff options
context:
space:
mode:
authorHiroshi Yokoi <yokoi.hiroshi@po.ntts.co.jp>2015-05-25 11:33:21 +0900
committerHiroshi Yokoi <yokoi.hiroshi@po.ntts.co.jp>2015-05-27 21:04:43 +0900
commit497412e120d80844e55c79fbe47ce62fbec26edc (patch)
treee0cdfc6061454ae87aecee30d5d659a267cbdedb /policy/policy.go
parent637b5f9ba663b739de54069d91b1d87ddd3b4855 (diff)
scenario_test: add policy test cases for new action and conditions
Diffstat (limited to 'policy/policy.go')
-rw-r--r--policy/policy.go71
1 files changed, 58 insertions, 13 deletions
diff --git a/policy/policy.go b/policy/policy.go
index b97f055f..32799d43 100644
--- a/policy/policy.go
+++ b/policy/policy.go
@@ -238,7 +238,11 @@ func (c *PrefixCondition) evaluate(path table.Path) bool {
for _, cp := range c.PrefixList {
if ipPrefixCalculate(path, cp) {
- log.Debug("prefix matched : ", cp)
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "Prefix": cp.Address.String(),
+ }).Debug("prefix matched")
+
return true
}
}
@@ -284,7 +288,10 @@ func (c *NeighborCondition) evaluate(path table.Path) bool {
cAddr := neighbor
pAddr := path.GetSource().Address
if pAddr.Equal(cAddr) {
- log.Debug("neighbor matched : ", pAddr.String())
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "NeighborAddress": pAddr.String(),
+ }).Debug("neighbor matched")
return true
}
}
@@ -329,20 +336,30 @@ func NewAsPathLengthCondition(defAsPathLength config.AsPathLength) *AsPathLength
func (c *AsPathLengthCondition) evaluate(path table.Path) bool {
length := uint32(path.GetAsPathLen())
+ result := false
switch c.Operator {
case ATTRIBUTE_EQ:
- return c.Value == length
+ result = c.Value == length
case ATTRIBUTE_GE:
- return c.Value <= length
+ result = c.Value <= length
case ATTRIBUTE_LE:
- return c.Value >= length
+ result = c.Value >= length
default:
return false
}
+ if result {
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "Condition": "aspath length",
+ "Reason": c.Operator,
+ }).Debug("condition matched")
+ }
+
+ return result
}
type AsPathCondition struct {
@@ -455,7 +472,12 @@ func (c *AsPathCondition) evaluate(path table.Path) bool {
}
if matched {
- log.Debugf("aspath matched : asn=%d, pos=%v)", member.asn, member.postiion)
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "Condition": "aspath length",
+ "ASN": member.asn,
+ "Position": member.postiion,
+ }).Debug("condition matched")
return true
}
@@ -599,25 +621,38 @@ func (c *CommunityCondition) evaluate(path table.Path) bool {
return false
}
- // create community string in advance.
- strCommunities := make([]string, len(communities))
- for i, c := range communities {
+ makeStr := func(c uint32) string {
upper := strconv.FormatUint(uint64(c&0xFFFF0000>>16), 10)
lower := strconv.FormatUint(uint64(c&0x0000FFFF), 10)
- strCommunities[i] = upper + ":" + lower
+ return upper + ":" + lower
}
+ var strCommunities []string = nil
matched := false
idx := -1
for _, member := range c.CommunityList {
if member.isRegExp {
+
+ if strCommunities == nil {
+ // create community string.
+ strCommunities = make([]string, len(communities))
+ for i, c := range communities {
+ strCommunities[i] = makeStr(c)
+ }
+ }
+
for i, c := range strCommunities {
if member.communityRegExp.MatchString(c) {
matched = true
idx = i
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "RegExp": member.communityRegExp.String(),
+ }).Debug("community regexp used")
break
}
}
+
} else {
for i, c := range communities {
if c == member.community {
@@ -629,7 +664,12 @@ func (c *CommunityCondition) evaluate(path table.Path) bool {
}
if matched {
- log.Debugf("community matched : community=%s)", strCommunities[idx])
+ log.WithFields(log.Fields{
+ "Topic": "Policy",
+ "Condition": "Community",
+ "Community": makeStr(communities[idx]),
+ }).Debug("condition matched")
+
return true
}
}
@@ -689,6 +729,10 @@ func NewCommunityAction(action config.SetCommunity) *CommunityAction {
m := &CommunityAction{}
+ if len(action.Communities) == 0 && action.Options != COMMUNITY_ACTION_NULL{
+ return nil
+ }
+
values := make([]uint32, len(action.Communities))
for i, com := range action.Communities {
matched, value := getCommunityValue(com)
@@ -811,10 +855,11 @@ func (p *Policy) Apply(path table.Path) (bool, RouteType, table.Path) {
p = statement.routingAction.apply(path)
if p != nil {
// apply all modification actions
+ cloned := path.Clone(p.IsWithdraw())
for _, action := range statement.modificationActions {
- p = action.apply(p)
+ cloned = action.apply(cloned)
}
- return true, ROUTE_TYPE_ACCEPT, p
+ return true, ROUTE_TYPE_ACCEPT, cloned
} else {
return true, ROUTE_TYPE_REJECT, nil
}