diff options
author | Naoto Hanaue <hanaue.naoto@po.ntts.co.jp> | 2015-06-16 18:32:48 +0900 |
---|---|---|
committer | Naoto Hanaue <hanaue.naoto@po.ntts.co.jp> | 2015-06-16 18:48:49 +0900 |
commit | 5bdee9c91b4c0af701d37916d24808fb323f3cb9 (patch) | |
tree | 57f622f33dbb9584c91a8f7272524c3d678be0b2 | |
parent | b109116fb80767040dddeabd45f64bd236b43be2 (diff) |
cli: fix cli of policy
- fix bug that del all command can not be used
- fix bug that can enter the option of conditions other than add subcommand
- fix bug that can not enter the option of actions in the routepolicy (add) subcommand
- chenge syntax of routepolicy (add) subcommand
aggregate the option flags of conditions and actions
+ before
% gobgp routepolicy add <policy> <statement name> conditions [<option flags of conditions> ...]
% gobgp routepolicy add <policy> <statement name> actions [<option flags of actions> ...]
+ after
% gobgp routepolicy add <policy> <statement name> [<option flags of conditions and actions>...]
-rw-r--r-- | gobgp/policy.go | 134 |
1 files changed, 88 insertions, 46 deletions
diff --git a/gobgp/policy.go b/gobgp/policy.go index eda45afc..86f9e691 100644 --- a/gobgp/policy.go +++ b/gobgp/policy.go @@ -238,19 +238,25 @@ func modPolicyPrefix(modtype string, eArgs []string) error { operation = api.Operation_ADD case CMD_DEL: if len(eArgs) == 0 { - operation = api.Operation_DEL_ALL + return fmt.Errorf("usage: policy prefix del <prefix set name> [<prefix> [<mask length renge>]]") } else if len(eArgs) == 1 { prefixSet = &api.PrefixSet{ PrefixSetName: eArgs[0], PrefixList: nil, } - operation = api.Operation_DEL } else { if prefixSet, e = parsePrefixSet(eArgs); e != nil { return e } - operation = api.Operation_DEL } + operation = api.Operation_DEL + case CMD_ALL: + if len(eArgs) > 0 { + return fmt.Errorf("Argument can not be entered: %s", eArgs[0:]) + } + operation = api.Operation_DEL_ALL + default: + return fmt.Errorf("invalid modType %s", modtype) } if e = modPolicy(api.Resource_POLICY_PREFIX, operation, prefixSet); e != nil { return e @@ -391,19 +397,25 @@ func modPolicyNeighbor(modtype string, eArgs []string) error { operation = api.Operation_ADD case CMD_DEL: if len(eArgs) == 0 { - operation = api.Operation_DEL_ALL + return fmt.Errorf("usage: policy neighbor del <neighbor set name> [<address>]") } else if len(eArgs) == 1 { neighborSet = &api.NeighborSet{ NeighborSetName: eArgs[0], NeighborList: nil, } - operation = api.Operation_DEL } else { if neighborSet, e = parseNeighborSet(eArgs); e != nil { return e } - operation = api.Operation_DEL } + operation = api.Operation_DEL + case CMD_ALL: + if len(eArgs) > 0 { + return fmt.Errorf("Argument can not be entered: %s", eArgs[0:]) + } + operation = api.Operation_DEL_ALL + default: + return fmt.Errorf("invalid modType %s", modtype) } if e = modPolicy(api.Resource_POLICY_NEIGHBOR, operation, neighborSet); e != nil { return e @@ -585,35 +597,29 @@ func modPolicyRoutePolicy(modtype string, eArgs []string) error { switch modtype { case CMD_ADD: - if len(eArgs) < 3 { - return fmt.Errorf("usage: gobgp policy routepoilcy add <route policy name> <statement name> [conditions|actions]") + if len(eArgs) != 2 { + return fmt.Errorf("usage: gobgp policy routepoilcy add <route policy name> <statement name>") } - stmtType := eArgs[2] stmt := &api.Statement{} - switch stmtType { - case CMD_CONDITIONS: - conditions, err := parseConditions() - if err != nil { - return err - } - stmt.StatementNeme = eArgs[1] - stmt.Conditions = conditions - case CMD_ACTIONS: - actions, err := parseActions() - if err != nil { - return err - } - stmt.StatementNeme = eArgs[1] - stmt.Actions = actions - default: - return fmt.Errorf("invalid statement type %s", stmtType) + conditions, err := parseConditions() + if err != nil { + return err } + stmt.Conditions = conditions + + actions, err := parseActions() + if err != nil { + return err + } + stmt.StatementNeme = eArgs[1] + stmt.Actions = actions + pd.StatementList = []*api.Statement{stmt} operation = api.Operation_ADD case CMD_DEL: if len(eArgs) == 0 { - operation = api.Operation_DEL_ALL + return fmt.Errorf("usage: policy neighbor del <route policy name> [<statement name>]") } else if len(eArgs) == 1 { operation = api.Operation_DEL } else if len(eArgs) == 2 { @@ -623,6 +629,11 @@ func modPolicyRoutePolicy(modtype string, eArgs []string) error { pd.StatementList = []*api.Statement{stmt} operation = api.Operation_DEL } + case CMD_ALL: + if len(eArgs) > 0 { + return fmt.Errorf("Argument can not be entered: %s", eArgs[0:]) + } + operation = api.Operation_DEL_ALL default: return fmt.Errorf("invalid modType %s", modtype) } @@ -632,9 +643,54 @@ func modPolicyRoutePolicy(modtype string, eArgs []string) error { return nil } +func NewPolicyAddCmd(v string, mod func(string, []string) error) *cobra.Command { + policyAddCmd := &cobra.Command{ + Use: CMD_ADD, + Run: func(cmd *cobra.Command, args []string) { + err := mod(cmd.Use, args) + if err != nil { + fmt.Println(err) + } + }, + } + if v == CMD_ROUTEPOLICY { + policyAddCmd.Flags().StringVarP(&conditionOpts.Prefix, "c-prefix", "", "", "a prefix set name of policy condition") + policyAddCmd.Flags().StringVarP(&conditionOpts.Neighbor, "c-neighbor", "", "", "a neighbor set name of policy condition") + policyAddCmd.Flags().StringVarP(&conditionOpts.AsPathLength, "c-aslen", "", "", "an as path length of policy condition (<operator>,<numeric>)") + policyAddCmd.Flags().StringVarP(&conditionOpts.Option, "c-option", "", "", "an option of policy condition") + policyAddCmd.Flags().StringVarP(&actionOpts.RouteAction, "a-route", "", "", "a route action of policy action (accept | reject)") + } + + return policyAddCmd +} + +func NewPolicyDelCmd(mod func(string, []string) error) *cobra.Command { + policyDelCmd := &cobra.Command{ + Use: CMD_DEL, + Run: func(cmd *cobra.Command, args []string) { + err := mod(cmd.Use, args) + if err != nil { + fmt.Println(err) + } + }, + } + + subcmd := &cobra.Command{ + Use: CMD_ALL, + Run: func(cmd *cobra.Command, args []string) { + err := mod(cmd.Use, args) + if err != nil { + fmt.Println(err) + } + }, + } + policyDelCmd.AddCommand(subcmd) + return policyDelCmd +} + func NewPolicyCmd() *cobra.Command { policyCmd := &cobra.Command{ - Use: "policy", + Use: CMD_POLICY, } for _, v := range []string{CMD_PREFIX, CMD_NEIGHBOR, CMD_ROUTEPOLICY} { @@ -671,24 +727,10 @@ func NewPolicyCmd() *cobra.Command { }, } - for _, w := range []string{CMD_ADD, CMD_DEL} { - subcmd := &cobra.Command{ - Use: w, - Run: func(cmd *cobra.Command, args []string) { - err := mod(cmd.Use, args) - if err != nil { - fmt.Println(err) - } - }, - } - cmd.AddCommand(subcmd) - if w == CMD_ADD { - subcmd.Flags().StringVarP(&conditionOpts.Prefix, "prefix", "", "", "a prefix set name of policy") - subcmd.Flags().StringVarP(&conditionOpts.Neighbor, "neighbor", "", "", "a neighbor set name of policy") - subcmd.Flags().StringVarP(&conditionOpts.AsPathLength, "aspath-len", "", "", "an AS path length of policy") - subcmd.Flags().StringVarP(&conditionOpts.Option, "option", "", "", "an option of policy") - } - } + policyAddCmd := NewPolicyAddCmd(v, mod) + cmd.AddCommand(policyAddCmd) + policyDelCmd := NewPolicyDelCmd(mod) + cmd.AddCommand(policyDelCmd) policyCmd.AddCommand(cmd) } |