summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--api/gobgp.pb.go218
-rw-r--r--api/gobgp.proto8
-rw-r--r--gobgp/cmd/common.go8
-rw-r--r--gobgp/cmd/neighbor.go6
-rw-r--r--gobgp/cmd/policy.go91
-rw-r--r--server/grpc_server.go53
-rw-r--r--server/server.go29
-rw-r--r--table/policy.go6
8 files changed, 203 insertions, 216 deletions
diff --git a/api/gobgp.pb.go b/api/gobgp.pb.go
index 5dc0f6fc..e1c6309a 100644
--- a/api/gobgp.pb.go
+++ b/api/gobgp.pb.go
@@ -32,7 +32,7 @@ It has these top-level messages:
AsPrependAction
Actions
Statement
- PolicyDefinition
+ Policy
ApplyPolicy
MrtMessage
RPKIConf
@@ -233,19 +233,19 @@ func (m *ModPathArguments) GetPaths() []*Path {
}
type PolicyArguments struct {
- Resource Resource `protobuf:"varint,1,opt,name=resource,enum=gobgpapi.Resource" json:"resource,omitempty"`
- Operation Operation `protobuf:"varint,2,opt,name=operation,enum=gobgpapi.Operation" json:"operation,omitempty"`
- NeighborAddress string `protobuf:"bytes,3,opt,name=neighbor_address" json:"neighbor_address,omitempty"`
- Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
- PolicyDefinition *PolicyDefinition `protobuf:"bytes,6,opt,name=policy_definition" json:"policy_definition,omitempty"`
- ApplyPolicy *ApplyPolicy `protobuf:"bytes,7,opt,name=apply_policy" json:"apply_policy,omitempty"`
+ Resource Resource `protobuf:"varint,1,opt,name=resource,enum=gobgpapi.Resource" json:"resource,omitempty"`
+ Operation Operation `protobuf:"varint,2,opt,name=operation,enum=gobgpapi.Operation" json:"operation,omitempty"`
+ NeighborAddress string `protobuf:"bytes,3,opt,name=neighbor_address" json:"neighbor_address,omitempty"`
+ Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
+ PolicyDefinition *Policy `protobuf:"bytes,6,opt,name=policy_definition" json:"policy_definition,omitempty"`
+ ApplyPolicy *ApplyPolicy `protobuf:"bytes,7,opt,name=apply_policy" json:"apply_policy,omitempty"`
}
func (m *PolicyArguments) Reset() { *m = PolicyArguments{} }
func (m *PolicyArguments) String() string { return proto.CompactTextString(m) }
func (*PolicyArguments) ProtoMessage() {}
-func (m *PolicyArguments) GetPolicyDefinition() *PolicyDefinition {
+func (m *PolicyArguments) GetPolicyDefinition() *Policy {
if m != nil {
return m.PolicyDefinition
}
@@ -617,16 +617,16 @@ func (m *Statement) GetActions() *Actions {
return nil
}
-type PolicyDefinition struct {
+type Policy struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Statements []*Statement `protobuf:"bytes,2,rep,name=statements" json:"statements,omitempty"`
}
-func (m *PolicyDefinition) Reset() { *m = PolicyDefinition{} }
-func (m *PolicyDefinition) String() string { return proto.CompactTextString(m) }
-func (*PolicyDefinition) ProtoMessage() {}
+func (m *Policy) Reset() { *m = Policy{} }
+func (m *Policy) String() string { return proto.CompactTextString(m) }
+func (*Policy) ProtoMessage() {}
-func (m *PolicyDefinition) GetStatements() []*Statement {
+func (m *Policy) GetStatements() []*Statement {
if m != nil {
return m.Statements
}
@@ -743,8 +743,6 @@ type GobgpApiClient interface {
ModPath(ctx context.Context, opts ...grpc.CallOption) (GobgpApi_ModPathClient, error)
GetNeighborPolicy(ctx context.Context, in *PolicyArguments, opts ...grpc.CallOption) (*ApplyPolicy, error)
ModNeighborPolicy(ctx context.Context, opts ...grpc.CallOption) (GobgpApi_ModNeighborPolicyClient, error)
- GetPolicyRoutePolicies(ctx context.Context, in *PolicyArguments, opts ...grpc.CallOption) (GobgpApi_GetPolicyRoutePoliciesClient, error)
- GetPolicyRoutePolicy(ctx context.Context, in *PolicyArguments, opts ...grpc.CallOption) (*PolicyDefinition, error)
ModPolicyRoutePolicy(ctx context.Context, opts ...grpc.CallOption) (GobgpApi_ModPolicyRoutePolicyClient, error)
MonitorBestChanged(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorBestChangedClient, error)
MonitorPeerState(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorPeerStateClient, error)
@@ -759,6 +757,8 @@ type GobgpApiClient interface {
GetStatement(ctx context.Context, in *Statement, opts ...grpc.CallOption) (*Statement, error)
GetStatements(ctx context.Context, in *Statement, opts ...grpc.CallOption) (GobgpApi_GetStatementsClient, error)
ModStatement(ctx context.Context, in *ModStatementArguments, opts ...grpc.CallOption) (*Error, error)
+ GetPolicy(ctx context.Context, in *Policy, opts ...grpc.CallOption) (*Policy, error)
+ GetPolicies(ctx context.Context, in *Policy, opts ...grpc.CallOption) (GobgpApi_GetPoliciesClient, error)
}
type gobgpApiClient struct {
@@ -979,49 +979,8 @@ func (x *gobgpApiModNeighborPolicyClient) Recv() (*Error, error) {
return m, nil
}
-func (c *gobgpApiClient) GetPolicyRoutePolicies(ctx context.Context, in *PolicyArguments, opts ...grpc.CallOption) (GobgpApi_GetPolicyRoutePoliciesClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[4], c.cc, "/gobgpapi.GobgpApi/GetPolicyRoutePolicies", opts...)
- if err != nil {
- return nil, err
- }
- x := &gobgpApiGetPolicyRoutePoliciesClient{stream}
- if err := x.ClientStream.SendMsg(in); err != nil {
- return nil, err
- }
- if err := x.ClientStream.CloseSend(); err != nil {
- return nil, err
- }
- return x, nil
-}
-
-type GobgpApi_GetPolicyRoutePoliciesClient interface {
- Recv() (*PolicyDefinition, error)
- grpc.ClientStream
-}
-
-type gobgpApiGetPolicyRoutePoliciesClient struct {
- grpc.ClientStream
-}
-
-func (x *gobgpApiGetPolicyRoutePoliciesClient) Recv() (*PolicyDefinition, error) {
- m := new(PolicyDefinition)
- if err := x.ClientStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func (c *gobgpApiClient) GetPolicyRoutePolicy(ctx context.Context, in *PolicyArguments, opts ...grpc.CallOption) (*PolicyDefinition, error) {
- out := new(PolicyDefinition)
- err := grpc.Invoke(ctx, "/gobgpapi.GobgpApi/GetPolicyRoutePolicy", in, out, c.cc, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
func (c *gobgpApiClient) ModPolicyRoutePolicy(ctx context.Context, opts ...grpc.CallOption) (GobgpApi_ModPolicyRoutePolicyClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[5], c.cc, "/gobgpapi.GobgpApi/ModPolicyRoutePolicy", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[4], c.cc, "/gobgpapi.GobgpApi/ModPolicyRoutePolicy", opts...)
if err != nil {
return nil, err
}
@@ -1052,7 +1011,7 @@ func (x *gobgpApiModPolicyRoutePolicyClient) Recv() (*Error, error) {
}
func (c *gobgpApiClient) MonitorBestChanged(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorBestChangedClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[6], c.cc, "/gobgpapi.GobgpApi/MonitorBestChanged", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[5], c.cc, "/gobgpapi.GobgpApi/MonitorBestChanged", opts...)
if err != nil {
return nil, err
}
@@ -1084,7 +1043,7 @@ func (x *gobgpApiMonitorBestChangedClient) Recv() (*Destination, error) {
}
func (c *gobgpApiClient) MonitorPeerState(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_MonitorPeerStateClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[7], c.cc, "/gobgpapi.GobgpApi/MonitorPeerState", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[6], c.cc, "/gobgpapi.GobgpApi/MonitorPeerState", opts...)
if err != nil {
return nil, err
}
@@ -1116,7 +1075,7 @@ func (x *gobgpApiMonitorPeerStateClient) Recv() (*Peer, error) {
}
func (c *gobgpApiClient) GetMrt(ctx context.Context, in *MrtArguments, opts ...grpc.CallOption) (GobgpApi_GetMrtClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[8], c.cc, "/gobgpapi.GobgpApi/GetMrt", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[7], c.cc, "/gobgpapi.GobgpApi/GetMrt", opts...)
if err != nil {
return nil, err
}
@@ -1148,7 +1107,7 @@ func (x *gobgpApiGetMrtClient) Recv() (*MrtMessage, error) {
}
func (c *gobgpApiClient) GetRPKI(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetRPKIClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[9], c.cc, "/gobgpapi.GobgpApi/GetRPKI", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[8], c.cc, "/gobgpapi.GobgpApi/GetRPKI", opts...)
if err != nil {
return nil, err
}
@@ -1180,7 +1139,7 @@ func (x *gobgpApiGetRPKIClient) Recv() (*RPKI, error) {
}
func (c *gobgpApiClient) GetROA(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetROAClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[10], c.cc, "/gobgpapi.GobgpApi/GetROA", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[9], c.cc, "/gobgpapi.GobgpApi/GetROA", opts...)
if err != nil {
return nil, err
}
@@ -1212,7 +1171,7 @@ func (x *gobgpApiGetROAClient) Recv() (*ROA, error) {
}
func (c *gobgpApiClient) GetVrfs(ctx context.Context, in *Arguments, opts ...grpc.CallOption) (GobgpApi_GetVrfsClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[11], c.cc, "/gobgpapi.GobgpApi/GetVrfs", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[10], c.cc, "/gobgpapi.GobgpApi/GetVrfs", opts...)
if err != nil {
return nil, err
}
@@ -1262,7 +1221,7 @@ func (c *gobgpApiClient) GetDefinedSet(ctx context.Context, in *DefinedSet, opts
}
func (c *gobgpApiClient) GetDefinedSets(ctx context.Context, in *DefinedSet, opts ...grpc.CallOption) (GobgpApi_GetDefinedSetsClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[12], c.cc, "/gobgpapi.GobgpApi/GetDefinedSets", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[11], c.cc, "/gobgpapi.GobgpApi/GetDefinedSets", opts...)
if err != nil {
return nil, err
}
@@ -1312,7 +1271,7 @@ func (c *gobgpApiClient) GetStatement(ctx context.Context, in *Statement, opts .
}
func (c *gobgpApiClient) GetStatements(ctx context.Context, in *Statement, opts ...grpc.CallOption) (GobgpApi_GetStatementsClient, error) {
- stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[13], c.cc, "/gobgpapi.GobgpApi/GetStatements", opts...)
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[12], c.cc, "/gobgpapi.GobgpApi/GetStatements", opts...)
if err != nil {
return nil, err
}
@@ -1352,6 +1311,47 @@ func (c *gobgpApiClient) ModStatement(ctx context.Context, in *ModStatementArgum
return out, nil
}
+func (c *gobgpApiClient) GetPolicy(ctx context.Context, in *Policy, opts ...grpc.CallOption) (*Policy, error) {
+ out := new(Policy)
+ err := grpc.Invoke(ctx, "/gobgpapi.GobgpApi/GetPolicy", in, out, c.cc, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *gobgpApiClient) GetPolicies(ctx context.Context, in *Policy, opts ...grpc.CallOption) (GobgpApi_GetPoliciesClient, error) {
+ stream, err := grpc.NewClientStream(ctx, &_GobgpApi_serviceDesc.Streams[13], c.cc, "/gobgpapi.GobgpApi/GetPolicies", opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &gobgpApiGetPoliciesClient{stream}
+ if err := x.ClientStream.SendMsg(in); err != nil {
+ return nil, err
+ }
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ return x, nil
+}
+
+type GobgpApi_GetPoliciesClient interface {
+ Recv() (*Policy, error)
+ grpc.ClientStream
+}
+
+type gobgpApiGetPoliciesClient struct {
+ grpc.ClientStream
+}
+
+func (x *gobgpApiGetPoliciesClient) Recv() (*Policy, error) {
+ m := new(Policy)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
// Server API for GobgpApi service
type GobgpApiServer interface {
@@ -1368,8 +1368,6 @@ type GobgpApiServer interface {
ModPath(GobgpApi_ModPathServer) error
GetNeighborPolicy(context.Context, *PolicyArguments) (*ApplyPolicy, error)
ModNeighborPolicy(GobgpApi_ModNeighborPolicyServer) error
- GetPolicyRoutePolicies(*PolicyArguments, GobgpApi_GetPolicyRoutePoliciesServer) error
- GetPolicyRoutePolicy(context.Context, *PolicyArguments) (*PolicyDefinition, error)
ModPolicyRoutePolicy(GobgpApi_ModPolicyRoutePolicyServer) error
MonitorBestChanged(*Arguments, GobgpApi_MonitorBestChangedServer) error
MonitorPeerState(*Arguments, GobgpApi_MonitorPeerStateServer) error
@@ -1384,6 +1382,8 @@ type GobgpApiServer interface {
GetStatement(context.Context, *Statement) (*Statement, error)
GetStatements(*Statement, GobgpApi_GetStatementsServer) error
ModStatement(context.Context, *ModStatementArguments) (*Error, error)
+ GetPolicy(context.Context, *Policy) (*Policy, error)
+ GetPolicies(*Policy, GobgpApi_GetPoliciesServer) error
}
func RegisterGobgpApiServer(s *grpc.Server, srv GobgpApiServer) {
@@ -1592,39 +1592,6 @@ func (x *gobgpApiModNeighborPolicyServer) Recv() (*PolicyArguments, error) {
return m, nil
}
-func _GobgpApi_GetPolicyRoutePolicies_Handler(srv interface{}, stream grpc.ServerStream) error {
- m := new(PolicyArguments)
- if err := stream.RecvMsg(m); err != nil {
- return err
- }
- return srv.(GobgpApiServer).GetPolicyRoutePolicies(m, &gobgpApiGetPolicyRoutePoliciesServer{stream})
-}
-
-type GobgpApi_GetPolicyRoutePoliciesServer interface {
- Send(*PolicyDefinition) error
- grpc.ServerStream
-}
-
-type gobgpApiGetPolicyRoutePoliciesServer struct {
- grpc.ServerStream
-}
-
-func (x *gobgpApiGetPolicyRoutePoliciesServer) Send(m *PolicyDefinition) error {
- return x.ServerStream.SendMsg(m)
-}
-
-func _GobgpApi_GetPolicyRoutePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
- in := new(PolicyArguments)
- if err := dec(in); err != nil {
- return nil, err
- }
- out, err := srv.(GobgpApiServer).GetPolicyRoutePolicy(ctx, in)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
func _GobgpApi_ModPolicyRoutePolicy_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(GobgpApiServer).ModPolicyRoutePolicy(&gobgpApiModPolicyRoutePolicyServer{stream})
}
@@ -1879,6 +1846,39 @@ func _GobgpApi_ModStatement_Handler(srv interface{}, ctx context.Context, dec fu
return out, nil
}
+func _GobgpApi_GetPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error) (interface{}, error) {
+ in := new(Policy)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ out, err := srv.(GobgpApiServer).GetPolicy(ctx, in)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func _GobgpApi_GetPolicies_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(Policy)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(GobgpApiServer).GetPolicies(m, &gobgpApiGetPoliciesServer{stream})
+}
+
+type GobgpApi_GetPoliciesServer interface {
+ Send(*Policy) error
+ grpc.ServerStream
+}
+
+type gobgpApiGetPoliciesServer struct {
+ grpc.ServerStream
+}
+
+func (x *gobgpApiGetPoliciesServer) Send(m *Policy) error {
+ return x.ServerStream.SendMsg(m)
+}
+
var _GobgpApi_serviceDesc = grpc.ServiceDesc{
ServiceName: "gobgpapi.GobgpApi",
HandlerType: (*GobgpApiServer)(nil),
@@ -1920,10 +1920,6 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
Handler: _GobgpApi_GetNeighborPolicy_Handler,
},
{
- MethodName: "GetPolicyRoutePolicy",
- Handler: _GobgpApi_GetPolicyRoutePolicy_Handler,
- },
- {
MethodName: "ModVrf",
Handler: _GobgpApi_ModVrf_Handler,
},
@@ -1943,6 +1939,10 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
MethodName: "ModStatement",
Handler: _GobgpApi_ModStatement_Handler,
},
+ {
+ MethodName: "GetPolicy",
+ Handler: _GobgpApi_GetPolicy_Handler,
+ },
},
Streams: []grpc.StreamDesc{
{
@@ -1967,11 +1967,6 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
ClientStreams: true,
},
{
- StreamName: "GetPolicyRoutePolicies",
- Handler: _GobgpApi_GetPolicyRoutePolicies_Handler,
- ServerStreams: true,
- },
- {
StreamName: "ModPolicyRoutePolicy",
Handler: _GobgpApi_ModPolicyRoutePolicy_Handler,
ServerStreams: true,
@@ -2017,5 +2012,10 @@ var _GobgpApi_serviceDesc = grpc.ServiceDesc{
Handler: _GobgpApi_GetStatements_Handler,
ServerStreams: true,
},
+ {
+ StreamName: "GetPolicies",
+ Handler: _GobgpApi_GetPolicies_Handler,
+ ServerStreams: true,
+ },
},
}
diff --git a/api/gobgp.proto b/api/gobgp.proto
index 212f4073..d72baaae 100644
--- a/api/gobgp.proto
+++ b/api/gobgp.proto
@@ -33,8 +33,6 @@ service GobgpApi {
rpc ModPath(stream ModPathArguments) returns (Error) {}
rpc GetNeighborPolicy(PolicyArguments) returns (ApplyPolicy) {}
rpc ModNeighborPolicy(stream PolicyArguments) returns (stream Error) {}
- rpc GetPolicyRoutePolicies(PolicyArguments) returns (stream PolicyDefinition) {}
- rpc GetPolicyRoutePolicy(PolicyArguments) returns (PolicyDefinition) {}
rpc ModPolicyRoutePolicy(stream PolicyArguments) returns (stream Error) {}
rpc MonitorBestChanged(Arguments) returns (stream Destination) {}
rpc MonitorPeerState(Arguments) returns (stream Peer) {}
@@ -49,6 +47,8 @@ service GobgpApi {
rpc GetStatement(Statement) returns (Statement) {}
rpc GetStatements(Statement) returns (stream Statement) {}
rpc ModStatement(ModStatementArguments) returns (Error) {}
+ rpc GetPolicy(Policy) returns (Policy) {}
+ rpc GetPolicies(Policy) returns (stream Policy) {}
}
message Error {
@@ -77,7 +77,7 @@ message PolicyArguments {
Operation operation = 2;
string neighbor_address = 3;
string name = 4;
- PolicyDefinition policy_definition = 6;
+ Policy policy_definition = 6;
ApplyPolicy apply_policy = 7;
}
@@ -257,7 +257,7 @@ message Statement {
Actions actions = 3;
}
-message PolicyDefinition {
+message Policy {
string name = 1;
repeated Statement statements = 2;
}
diff --git a/gobgp/cmd/common.go b/gobgp/cmd/common.go
index d3f9a8cd..9e1c3315 100644
--- a/gobgp/cmd/common.go
+++ b/gobgp/cmd/common.go
@@ -325,17 +325,17 @@ func (n sets) Less(i, j int) bool {
return n[i].Name < n[j].Name
}
-type policyDefinitions []*gobgpapi.PolicyDefinition
+type policies []*gobgpapi.Policy
-func (p policyDefinitions) Len() int {
+func (p policies) Len() int {
return len(p)
}
-func (p policyDefinitions) Swap(i, j int) {
+func (p policies) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
-func (p policyDefinitions) Less(i, j int) bool {
+func (p policies) Less(i, j int) bool {
return p[i].Name < p[j].Name
}
diff --git a/gobgp/cmd/neighbor.go b/gobgp/cmd/neighbor.go
index 7627e943..3df9183d 100644
--- a/gobgp/cmd/neighbor.go
+++ b/gobgp/cmd/neighbor.go
@@ -647,12 +647,12 @@ func showNeighborPolicy(remoteIP net.IP, policyType string) error {
return nil
}
-func parsePolicy(pNames string) []*api.PolicyDefinition {
+func parsePolicy(pNames string) []*api.Policy {
pList := strings.Split(pNames, ",")
- policyList := make([]*api.PolicyDefinition, 0, len(pList))
+ policyList := make([]*api.Policy, 0, len(pList))
for _, p := range pList {
if p != "" {
- policy := &api.PolicyDefinition{
+ policy := &api.Policy{
Name: p,
}
policyList = append(policyList, policy)
diff --git a/gobgp/cmd/policy.go b/gobgp/cmd/policy.go
index 239676e8..69dff538 100644
--- a/gobgp/cmd/policy.go
+++ b/gobgp/cmd/policy.go
@@ -468,31 +468,39 @@ func printStatement(indent int, s *api.Statement) {
fmt.Printf("%s%s\n", sIndent(indent+4), s.Actions.RouteAction)
}
-func showPolicyStatement(indent int, pd *api.PolicyDefinition) {
+func printPolicy(indent int, pd *api.Policy) {
for _, s := range pd.Statements {
printStatement(indent, s)
}
}
-func showPolicyRoutePolicies() error {
- arg := &api.PolicyArguments{
- Resource: api.Resource_POLICY_ROUTEPOLICY,
- }
- stream, e := client.GetPolicyRoutePolicies(context.Background(), arg)
- if e != nil {
- return e
- }
- m := policyDefinitions{}
- for {
- n, e := stream.Recv()
- if e == io.EOF {
- break
- } else if e != nil {
+func showPolicy(args []string) error {
+ m := policies{}
+ if len(args) > 0 {
+ arg := &api.Policy{
+ Name: args[0],
+ }
+ p, e := client.GetPolicy(context.Background(), arg)
+ if e != nil {
+ return e
+ }
+ m = append(m, p)
+ } else {
+ arg := &api.Policy{}
+ stream, e := client.GetPolicies(context.Background(), arg)
+ if e != nil {
return e
}
- m = append(m, n)
+ for {
+ p, e := stream.Recv()
+ if e == io.EOF {
+ break
+ } else if e != nil {
+ return e
+ }
+ m = append(m, p)
+ }
}
-
if globalOpts.Json {
j, _ := json.Marshal(m)
fmt.Println(string(j))
@@ -505,42 +513,13 @@ func showPolicyRoutePolicies() error {
return nil
}
sort.Sort(m)
-
for _, pd := range m {
- fmt.Printf("PolicyName %s:\n", pd.Name)
- showPolicyStatement(4, pd)
+ fmt.Printf("Name %s:\n", pd.Name)
+ printPolicy(4, pd)
}
return nil
}
-func showPolicyRoutePolicy(args []string) error {
- arg := &api.PolicyArguments{
- Resource: api.Resource_POLICY_ROUTEPOLICY,
- Name: args[0],
- }
- pd, e := client.GetPolicyRoutePolicy(context.Background(), arg)
- if e != nil {
- return e
- }
-
- if globalOpts.Json {
- j, _ := json.Marshal(pd)
- fmt.Println(string(j))
- return nil
- }
-
- if globalOpts.Quiet {
- for _, st := range pd.Statements {
- fmt.Println(st.Name)
- }
- return nil
- }
-
- fmt.Printf("PolicyName %s:\n", pd.Name)
- showPolicyStatement(2, pd)
- return nil
-}
-
func parseConditions() (*api.Conditions, error) {
checkFormat := func(option string, isRestricted bool) (int32, string, error) {
regStr, _ := regexp.Compile("^(.*)\\[(.*)\\]$")
@@ -777,7 +756,7 @@ func parseActions() (*api.Actions, error) {
}
func modPolicy(resource api.Resource, op api.Operation, data interface{}) error {
- pd := &api.PolicyDefinition{}
+ pd := &api.Policy{}
if resource != api.Resource_POLICY_ROUTEPOLICY {
co := &api.Conditions{}
switch resource {
@@ -794,7 +773,7 @@ func modPolicy(resource api.Resource, op api.Operation, data interface{}) error
}
pd.Statements = []*api.Statement{{Conditions: co}}
} else {
- pd = data.(*api.PolicyDefinition)
+ pd = data.(*api.Policy)
}
arg := &api.PolicyArguments{
Resource: resource,
@@ -823,7 +802,7 @@ func modPolicy(resource api.Resource, op api.Operation, data interface{}) error
func modPolicyRoutePolicy(modtype string, eArgs []string) error {
var operation api.Operation
- pd := &api.PolicyDefinition{}
+ pd := &api.Policy{}
if len(eArgs) > 0 {
pd.Name = eArgs[0]
}
@@ -1213,14 +1192,10 @@ func NewPolicyCmd() *cobra.Command {
policyCmd := &cobra.Command{
Use: CMD_POLICY,
Run: func(cmd *cobra.Command, args []string) {
- var err error
- if len(args) == 0 {
- err = showPolicyRoutePolicies()
- } else {
- err = showPolicyRoutePolicy(args)
- }
+ err := showPolicy(args)
if err != nil {
fmt.Println(err)
+ os.Exit(1)
}
},
}
@@ -1231,6 +1206,7 @@ func NewPolicyCmd() *cobra.Command {
Run: func(cmd *cobra.Command, args []string) {
if err := showDefinedSet(cmd.Use, args); err != nil {
fmt.Println(err)
+ os.Exit(1)
}
},
}
@@ -1240,6 +1216,7 @@ func NewPolicyCmd() *cobra.Command {
Run: func(c *cobra.Command, args []string) {
if err := modDefinedSet(cmd.Use, c.Use, args); err != nil {
fmt.Println(err)
+ os.Exit(1)
}
},
}
diff --git a/server/grpc_server.go b/server/grpc_server.go
index d68ecd96..44c3562d 100644
--- a/server/grpc_server.go
+++ b/server/grpc_server.go
@@ -63,6 +63,7 @@ const (
REQ_MOD_DEFINED_SET
REQ_STATEMENT
REQ_MOD_STATEMENT
+ REQ_POLICY
)
const GRPC_PORT = 8080
@@ -326,42 +327,6 @@ func (s *Server) modPolicy(arg *api.PolicyArguments, stream interface{}) error {
return nil
}
-func (s *Server) GetPolicyRoutePolicies(arg *api.PolicyArguments, stream api.GobgpApi_GetPolicyRoutePoliciesServer) error {
- var rf bgp.RouteFamily
- var reqType int
- switch arg.Resource {
- case api.Resource_POLICY_ROUTEPOLICY:
- reqType = REQ_POLICY_ROUTEPOLICIES
- default:
- return fmt.Errorf("unsupported resource type: %v", arg.Resource)
- }
- req := NewGrpcRequest(reqType, "", rf, arg)
- s.bgpServerCh <- req
- return handleMultipleResponses(req, func(res *GrpcResponse) error {
- return stream.Send(res.Data.(*api.PolicyDefinition))
- })
-}
-
-func (s *Server) GetPolicyRoutePolicy(ctx context.Context, arg *api.PolicyArguments) (*api.PolicyDefinition, error) {
- var rf bgp.RouteFamily
- var reqType int
- switch arg.Resource {
- case api.Resource_POLICY_ROUTEPOLICY:
- reqType = REQ_POLICY_ROUTEPOLICY
- default:
- return nil, fmt.Errorf("unsupported resource type: %v", arg.Resource)
- }
- req := NewGrpcRequest(reqType, "", rf, arg)
- s.bgpServerCh <- req
-
- res := <-req.ResponseCh
- if err := res.Err(); err != nil {
- log.Debug(err.Error())
- return nil, err
- }
- return res.Data.(*api.PolicyDefinition), nil
-}
-
func (s *Server) ModPolicyRoutePolicy(stream api.GobgpApi_ModPolicyRoutePolicyServer) error {
for {
arg, err := stream.Recv()
@@ -486,6 +451,22 @@ func (s *Server) ModStatement(ctx context.Context, arg *api.ModStatementArgument
return s.mod(REQ_MOD_STATEMENT, arg)
}
+func (s *Server) GetPolicy(ctx context.Context, arg *api.Policy) (*api.Policy, error) {
+ d, err := s.get(REQ_POLICY, arg)
+ if err != nil {
+ return nil, err
+ }
+ return d.(*api.Policy), nil
+}
+
+func (s *Server) GetPolicies(arg *api.Policy, stream api.GobgpApi_GetPoliciesServer) error {
+ req := NewGrpcRequest(REQ_POLICY, "", bgp.RouteFamily(0), arg)
+ s.bgpServerCh <- req
+ return handleMultipleResponses(req, func(res *GrpcResponse) error {
+ return stream.Send(res.Data.(*api.Policy))
+ })
+}
+
type GrpcRequest struct {
RequestType int
Name string
diff --git a/server/server.go b/server/server.go
index 69c27f14..91466753 100644
--- a/server/server.go
+++ b/server/server.go
@@ -1656,6 +1656,13 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg {
ResponseErr: err,
}
close(grpcReq.ResponseCh)
+ case REQ_POLICY:
+ if err := server.handleGrpcGetPolicy(grpcReq); err != nil {
+ grpcReq.ResponseCh <- &GrpcResponse{
+ ResponseErr: err,
+ }
+ }
+ close(grpcReq.ResponseCh)
case REQ_POLICY_ROUTEPOLICY, REQ_POLICY_ROUTEPOLICIES:
info := server.policy.PolicyMap
typ := grpcReq.RequestType
@@ -1819,6 +1826,28 @@ func (server *BgpServer) handleGrpcModStatement(grpcReq *GrpcRequest) error {
}
+func (server *BgpServer) handleGrpcGetPolicy(grpcReq *GrpcRequest) error {
+ arg := grpcReq.Data.(*api.Policy)
+ name := arg.Name
+ found := false
+ for _, s := range server.policy.PolicyMap {
+ if name != "" && name != s.Name() {
+ continue
+ }
+ grpcReq.ResponseCh <- &GrpcResponse{
+ Data: s.ToApiStruct(),
+ }
+ found = true
+ if name != "" {
+ break
+ }
+ }
+ if !found {
+ return fmt.Errorf("not found %s", name)
+ }
+ return nil
+}
+
func (server *BgpServer) handleMrt(grpcReq *GrpcRequest) {
now := uint32(time.Now().Unix())
view := ""
diff --git a/table/policy.go b/table/policy.go
index 4b146a0f..06c58df5 100644
--- a/table/policy.go
+++ b/table/policy.go
@@ -2251,12 +2251,12 @@ func (p *Policy) Apply(path *Path) (RouteType, *Path) {
return ROUTE_TYPE_NONE, path
}
-func (p *Policy) ToApiStruct() *api.PolicyDefinition {
+func (p *Policy) ToApiStruct() *api.Policy {
ss := make([]*api.Statement, 0, len(p.Statements))
for _, s := range p.Statements {
ss = append(ss, s.ToApiStruct())
}
- return &api.PolicyDefinition{
+ return &api.Policy{
Name: p.name,
Statements: ss,
}
@@ -2412,7 +2412,7 @@ func CanImportToVrf(v *Vrf, path *Path) bool {
return c.Evaluate(path)
}
-func PoliciesToString(ps []*api.PolicyDefinition) []string {
+func PoliciesToString(ps []*api.Policy) []string {
names := make([]string, 0, len(ps))
for _, p := range ps {
names = append(names, p.Name)