summaryrefslogtreecommitdiffhomepage
path: root/test/scenario_test/policy/policy_generator.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/scenario_test/policy/policy_generator.go')
-rw-r--r--test/scenario_test/policy/policy_generator.go667
1 files changed, 667 insertions, 0 deletions
diff --git a/test/scenario_test/policy/policy_generator.go b/test/scenario_test/policy/policy_generator.go
new file mode 100644
index 00000000..f72eb5c8
--- /dev/null
+++ b/test/scenario_test/policy/policy_generator.go
@@ -0,0 +1,667 @@
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "github.com/BurntSushi/toml"
+ "github.com/jessevdk/go-flags"
+ "github.com/osrg/gobgp/config"
+ "io/ioutil"
+ "log"
+ "net"
+ "os"
+)
+
+
+func bindPolicy(outputDir, peer, target, policyName string, isReplace bool) {
+
+ newConf := config.Bgp{}
+ _, d_err := toml.DecodeFile(fmt.Sprintf("%s/gobgpd.conf", outputDir), &newConf)
+ if d_err != nil {
+ log.Fatal(d_err)
+ }
+
+ for idx, neighbor := range newConf.NeighborList {
+ ip := net.ParseIP(peer)
+
+ if ip.String() == neighbor.NeighborAddress.String() {
+ ap := &neighbor.ApplyPolicy
+ switch target {
+ case "import":
+ if isReplace {
+ ap.ImportPolicies = []string{policyName}
+ } else {
+ ap.ImportPolicies = append(ap.ImportPolicies, policyName)
+ }
+ case "export":
+ if isReplace {
+ ap.ExportPolicies = []string{policyName}
+ } else {
+ ap.ExportPolicies = append(ap.ExportPolicies, policyName)
+ }
+ case "distribute":
+ if isReplace {
+ ap.DistributePolicies = []string{policyName}
+ } else {
+ ap.DistributePolicies = append(ap.DistributePolicies, policyName)
+ }
+ }
+ newConf.NeighborList[idx] = neighbor
+ }
+ }
+
+ policyConf := createPolicyConfig()
+ var buffer bytes.Buffer
+ encoder := toml.NewEncoder(&buffer)
+ encoder.Encode(newConf)
+ encoder.Encode(policyConf)
+
+ e_err := ioutil.WriteFile(fmt.Sprintf("%s/gobgpd.conf", outputDir), buffer.Bytes(), 0644)
+ if e_err != nil {
+ log.Fatal(e_err)
+ }
+}
+
+func createPolicyConfig() *config.RoutingPolicy {
+
+ ps0 := config.PrefixSet{
+ PrefixSetName: "ps0",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("192.168.0.0"),
+ Masklength: 16,
+ MasklengthRange: "16..24",
+ }},
+ }
+
+ ps1 := config.PrefixSet{
+ PrefixSetName: "ps1",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("192.168.20.0"),
+ Masklength: 24,
+ }, config.Prefix{
+ Address: net.ParseIP("192.168.200.0"),
+ Masklength: 24,
+ }},
+ }
+
+ ps2 := config.PrefixSet{
+ PrefixSetName: "ps2",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("192.168.20.0"),
+ Masklength: 24,
+ }},
+ }
+
+ ps3 := config.PrefixSet{
+ PrefixSetName: "ps3",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("2001:0:10:2::"),
+ Masklength: 64,
+ MasklengthRange: "64..128",
+ }},
+ }
+
+ ps4 := config.PrefixSet{
+ PrefixSetName: "ps4",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("2001:0:10:20::"),
+ Masklength: 64,
+ }, config.Prefix{
+ Address: net.ParseIP("2001:0:10:200::"),
+ Masklength: 64,
+ }},
+ }
+
+ ps5 := config.PrefixSet{
+ PrefixSetName: "ps5",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("2001:0:10:20::"),
+ Masklength: 64,
+ }},
+ }
+
+ nsPeer2 := config.NeighborSet{
+ NeighborSetName: "nsPeer2",
+ NeighborInfoList: []config.NeighborInfo{
+ config.NeighborInfo{
+ Address: net.ParseIP("10.0.0.2"),
+ }},
+ }
+
+ nsPeer2V6 := config.NeighborSet{
+ NeighborSetName: "nsPeer2V6",
+ NeighborInfoList: []config.NeighborInfo{
+ config.NeighborInfo{
+ Address: net.ParseIP("2001::0:192:168:0:2"),
+ }},
+ }
+
+ nsExabgp := config.NeighborSet{
+ NeighborSetName: "nsExabgp",
+ NeighborInfoList: []config.NeighborInfo{
+ config.NeighborInfo{
+ Address: net.ParseIP("10.0.0.100"),
+ }},
+ }
+
+ psExabgp := config.PrefixSet{
+ PrefixSetName: "psExabgp",
+ PrefixList: []config.Prefix{
+ config.Prefix{
+ Address: net.ParseIP("192.168.100.0"),
+ Masklength: 24,
+ MasklengthRange: "16..24",
+ }},
+ }
+
+ aspathFrom := config.AsPathSet{
+ AsPathSetName: "aspathFrom",
+ AsPathSetMembers: []string{"^65100"},
+ }
+
+ aspathAny := config.AsPathSet{
+ AsPathSetName: "aspAny",
+ AsPathSetMembers: []string{"65098"},
+ }
+
+ aspathOrigin := config.AsPathSet{
+ AsPathSetName: "aspOrigin",
+ AsPathSetMembers: []string{"65091$"},
+ }
+
+ aspathOnly := config.AsPathSet{
+ AsPathSetName: "aspOnly",
+ AsPathSetMembers: []string{"^65100$"},
+ }
+
+ comStr := config.CommunitySet{
+ CommunitySetName: "comStr",
+ CommunityMembers: []string{"65100:10"},
+ }
+
+ comRegExp := config.CommunitySet{
+ CommunitySetName: "comRegExp",
+ CommunityMembers: []string{"6[0-9]+:[0-9]+"},
+ }
+
+ st0 := config.Statement{
+ Name: "st0",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps0",
+ MatchNeighborSet: "nsPeer2",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st1 := config.Statement{
+ Name: "st1",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps1",
+ MatchNeighborSet: "nsPeer2",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st2 := config.Statement{
+ Name: "st2",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps2",
+ MatchNeighborSet: "nsPeer2",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ RejectRoute: true,
+ },
+ }
+
+ st3 := config.Statement{
+ Name: "st3",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps3",
+ MatchNeighborSet: "nsPeer2V6",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st4 := config.Statement{
+ Name: "st4",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps4",
+ MatchNeighborSet: "nsPeer2V6",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st5 := config.Statement{
+ Name: "st5",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "ps5",
+ MatchNeighborSet: "nsPeer2V6",
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ RejectRoute: true,
+ },
+ }
+
+ st_aspathlen := config.Statement{
+ Name: "st_aspathlen",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ AsPathLength: config.AsPathLength{
+ Operator: "ge",
+ Value: 10,
+ },
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_aspathFrom := config.Statement{
+ Name: "st_aspathlen",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchAsPathSet: "aspathFrom",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_aspathAny := config.Statement{
+ Name: "st_aspathlen",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchAsPathSet: "aspAny",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_aspathOrigin := config.Statement{
+ Name: "st_aspathlen",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchAsPathSet: "aspOrigin",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_aspathOnly := config.Statement{
+ Name: "st_aspathlen",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchAsPathSet: "aspOnly",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_comStr := config.Statement{
+ Name: "st_community",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comStr",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_comRegExp := config.Statement{
+ Name: "st_community_regexp",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comRegExp",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: false,
+ },
+ }
+
+ st_comAdd := config.Statement{
+ Name: "st_community_regexp",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comStr",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: true,
+ BgpActions: config.BgpActions{
+ SetCommunity: config.SetCommunity{
+ Communities: []string{"65100:20"},
+ Options: "ADD",
+ },
+ },
+ },
+ }
+
+ st_comReplace := config.Statement{
+ Name: "st_community_regexp",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comStr",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: true,
+ BgpActions: config.BgpActions{
+ SetCommunity: config.SetCommunity{
+ Communities: []string{"65100:20", "65100:30"},
+ Options: "REPLACE",
+ },
+ },
+ },
+ }
+
+ st_comRemove := config.Statement{
+ Name: "st_community_regexp",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comStr",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: true,
+ BgpActions: config.BgpActions{
+ SetCommunity: config.SetCommunity{
+ Communities: []string{"65100:20", "65100:30"},
+ Options: "REMOVE",
+ },
+ },
+ },
+ }
+
+ st_comNull := config.Statement{
+ Name: "st_community_regexp",
+ Conditions: config.Conditions{
+ MatchPrefixSet: "psExabgp",
+ MatchNeighborSet: "nsExabgp",
+ BgpConditions: config.BgpConditions{
+ MatchCommunitySet: "comStr",
+ },
+ MatchSetOptions: config.MATCH_SET_OPTIONS_TYPE_ALL,
+ },
+ Actions: config.Actions{
+ AcceptRoute: true,
+ BgpActions: config.BgpActions{
+ SetCommunity: config.SetCommunity{
+ Communities: []string{},
+ Options: "NULL",
+ },
+ },
+ },
+ }
+
+
+ test_01_import_policy_initial := config.PolicyDefinition{
+ Name: "test_01_import_policy_initial",
+ StatementList: []config.Statement{st0},
+ }
+
+ test_02_export_policy_initial := config.PolicyDefinition{
+ Name: "test_02_export_policy_initial",
+ StatementList: []config.Statement{st0},
+ }
+
+ test_03_import_policy_update := config.PolicyDefinition{
+ Name: "test_03_import_policy_update",
+ StatementList: []config.Statement{st1},
+ }
+
+ test_03_import_policy_update_softreset := config.PolicyDefinition{
+ Name: "test_03_import_policy_update_softreset",
+ StatementList: []config.Statement{st2},
+ }
+
+ test_04_export_policy_update := config.PolicyDefinition{
+ Name: "test_04_export_policy_update",
+ StatementList: []config.Statement{st1},
+ }
+
+ test_04_export_policy_update_softreset := config.PolicyDefinition{
+ Name: "test_04_export_policy_update_softreset",
+ StatementList: []config.Statement{st2},
+ }
+
+ test_05_import_policy_initial_ipv6 := config.PolicyDefinition{
+ Name: "test_05_import_policy_initial_ipv6",
+ StatementList: []config.Statement{st3},
+ }
+
+ test_06_export_policy_initial_ipv6 := config.PolicyDefinition{
+ Name: "test_06_export_policy_initial_ipv6",
+ StatementList: []config.Statement{st3},
+ }
+
+ test_07_import_policy_update := config.PolicyDefinition{
+ Name: "test_07_import_policy_update",
+ StatementList: []config.Statement{st4},
+ }
+
+ test_07_import_policy_update_softreset := config.PolicyDefinition{
+ Name: "test_07_import_policy_update_softreset",
+ StatementList: []config.Statement{st5},
+ }
+
+ test_08_export_policy_update := config.PolicyDefinition{
+ Name: "test_08_export_policy_update",
+ StatementList: []config.Statement{st4},
+ }
+
+ test_08_export_policy_update_softreset := config.PolicyDefinition{
+ Name: "test_08_export_policy_update_softreset",
+ StatementList: []config.Statement{st5},
+ }
+
+ test_09_aspath_length_condition_import := config.PolicyDefinition{
+ Name: "test_09_aspath_length_condition_import",
+ StatementList: []config.Statement{st_aspathlen},
+ }
+
+ test_10_aspath_from_condition_import := config.PolicyDefinition{
+ Name: "test_10_aspath_from_condition_import",
+ StatementList: []config.Statement{st_aspathFrom},
+ }
+
+ test_11_aspath_any_condition_import := config.PolicyDefinition{
+ Name: "test_11_aspath_any_condition_import",
+ StatementList: []config.Statement{st_aspathAny},
+ }
+
+ test_12_aspath_origin_condition_import := config.PolicyDefinition{
+ Name: "test_12_aspath_origin_condition_import",
+ StatementList: []config.Statement{st_aspathOrigin},
+ }
+
+ test_13_aspath_only_condition_import := config.PolicyDefinition{
+ Name: "test_13_aspath_only_condition_import",
+ StatementList: []config.Statement{st_aspathOnly},
+ }
+
+ test_14_aspath_only_condition_import := config.PolicyDefinition{
+ Name: "test_14_aspath_only_condition_import",
+ StatementList: []config.Statement{st_comStr},
+ }
+
+ test_15_community_condition_import := config.PolicyDefinition{
+ Name: "test_15_community_condition_import",
+ StatementList: []config.Statement{st_comStr},
+ }
+
+ test_16_community_condition_regexp_import := config.PolicyDefinition{
+ Name: "test_16_community_condition_regexp_import",
+ StatementList: []config.Statement{st_comRegExp},
+ }
+
+ test_17_community_add_action_import := config.PolicyDefinition{
+ Name: "test_17_community_add_action_import",
+ StatementList: []config.Statement{st_comAdd},
+ }
+
+ test_18_community_replace_action_import := config.PolicyDefinition{
+ Name: "test_18_community_replace_action_import",
+ StatementList: []config.Statement{st_comReplace},
+ }
+
+ test_19_community_remove_action_import := config.PolicyDefinition{
+ Name: "test_19_community_remove_action_import",
+ StatementList: []config.Statement{st_comRemove},
+ }
+
+ test_20_community_null_action_import := config.PolicyDefinition{
+ Name: "test_20_community_null_action_import",
+ StatementList: []config.Statement{st_comNull},
+ }
+
+ test_21_community_add_action_export := config.PolicyDefinition{
+ Name: "test_21_community_add_action_export",
+ StatementList: []config.Statement{st_comAdd},
+ }
+
+ test_22_community_replace_action_export := config.PolicyDefinition{
+ Name: "test_22_community_replace_action_export",
+ StatementList: []config.Statement{st_comReplace},
+ }
+
+ test_23_community_remove_action_export := config.PolicyDefinition{
+ Name: "test_23_community_remove_action_export",
+ StatementList: []config.Statement{st_comRemove},
+ }
+
+ test_24_community_null_action_export := config.PolicyDefinition{
+ Name: "test_24_community_null_action_export",
+ StatementList: []config.Statement{st_comNull},
+ }
+
+ ds := config.DefinedSets{
+ PrefixSetList: []config.PrefixSet{ps0, ps1, ps2, ps3, ps4, ps5, psExabgp},
+ NeighborSetList: []config.NeighborSet{nsPeer2, nsPeer2V6, nsExabgp},
+ BgpDefinedSets: config.BgpDefinedSets{
+ AsPathSetList: []config.AsPathSet{aspathFrom, aspathAny, aspathOrigin, aspathOnly},
+ CommunitySetList: []config.CommunitySet{comStr, comRegExp},
+ },
+ }
+
+ p := &config.RoutingPolicy{
+ DefinedSets: ds,
+ PolicyDefinitionList: []config.PolicyDefinition{
+ test_01_import_policy_initial,
+ test_02_export_policy_initial,
+ test_03_import_policy_update,
+ test_03_import_policy_update_softreset,
+ test_04_export_policy_update,
+ test_04_export_policy_update_softreset,
+ test_05_import_policy_initial_ipv6,
+ test_06_export_policy_initial_ipv6,
+ test_07_import_policy_update,
+ test_07_import_policy_update_softreset,
+ test_08_export_policy_update,
+ test_08_export_policy_update_softreset,
+ test_09_aspath_length_condition_import,
+ test_10_aspath_from_condition_import,
+ test_11_aspath_any_condition_import,
+ test_12_aspath_origin_condition_import,
+ test_13_aspath_only_condition_import,
+ test_14_aspath_only_condition_import,
+ test_15_community_condition_import,
+ test_16_community_condition_regexp_import,
+ test_17_community_add_action_import,
+ test_18_community_replace_action_import,
+ test_19_community_remove_action_import,
+ test_20_community_null_action_import,
+ test_21_community_add_action_export,
+ test_22_community_replace_action_export,
+ test_23_community_remove_action_export,
+ test_24_community_null_action_export,
+ },
+ }
+ return p
+}
+
+
+func main() {
+ var opts struct {
+ OutputDir string `short:"d" long:"output" description:"specifing the output directory"`
+ Neighbor string `short:"n" long:"neighbor" description:"neighbor ip adress to which add policy config"`
+ Target string `short:"t" long:"target" description:"target such as export or import to which add policy"`
+ PolicyName string `short:"p" long:"policy" description:"policy name bound to peer"`
+ Replace bool `short:"r" long:"replace" description:"Replace existing policy with new one" default:"false"`
+ }
+
+ parser := flags.NewParser(&opts, flags.Default)
+ _, err := parser.Parse()
+ if err != nil {
+ fmt.Print(err)
+ os.Exit(1)
+ }
+
+ if _, err := os.Stat(opts.OutputDir + "/gobgpd.conf"); os.IsNotExist(err) {
+ log.Fatal(err)
+ }
+
+ bindPolicy(opts.OutputDir, opts.Neighbor, opts.Target, opts.PolicyName, opts.Replace)
+}