aboutsummaryrefslogtreecommitdiffstats
path: root/internal/pkg/nfnNotify
diff options
context:
space:
mode:
Diffstat (limited to 'internal/pkg/nfnNotify')
-rw-r--r--internal/pkg/nfnNotify/proto/nfn.pb.go493
-rw-r--r--internal/pkg/nfnNotify/proto/nfn.proto44
-rw-r--r--internal/pkg/nfnNotify/server.go262
3 files changed, 799 insertions, 0 deletions
diff --git a/internal/pkg/nfnNotify/proto/nfn.pb.go b/internal/pkg/nfnNotify/proto/nfn.pb.go
new file mode 100644
index 0000000..7f9a182
--- /dev/null
+++ b/internal/pkg/nfnNotify/proto/nfn.pb.go
@@ -0,0 +1,493 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: nfn.proto
+
+package nfn
+
+import (
+ context "context"
+ fmt "fmt"
+ proto "github.com/golang/protobuf/proto"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+ math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type SubscribeContext struct {
+ NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *SubscribeContext) Reset() { *m = SubscribeContext{} }
+func (m *SubscribeContext) String() string { return proto.CompactTextString(m) }
+func (*SubscribeContext) ProtoMessage() {}
+func (*SubscribeContext) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{0}
+}
+
+func (m *SubscribeContext) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_SubscribeContext.Unmarshal(m, b)
+}
+func (m *SubscribeContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_SubscribeContext.Marshal(b, m, deterministic)
+}
+func (m *SubscribeContext) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SubscribeContext.Merge(m, src)
+}
+func (m *SubscribeContext) XXX_Size() int {
+ return xxx_messageInfo_SubscribeContext.Size(m)
+}
+func (m *SubscribeContext) XXX_DiscardUnknown() {
+ xxx_messageInfo_SubscribeContext.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SubscribeContext proto.InternalMessageInfo
+
+func (m *SubscribeContext) GetNodeName() string {
+ if m != nil {
+ return m.NodeName
+ }
+ return ""
+}
+
+type Notification struct {
+ CniType string `protobuf:"bytes,1,opt,name=cni_type,json=cniType,proto3" json:"cni_type,omitempty"`
+ // Types that are valid to be assigned to Payload:
+ // *Notification_InSync
+ // *Notification_ProviderNwCreate
+ // *Notification_ProviderNwRemove
+ Payload isNotification_Payload `protobuf_oneof:"payload"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *Notification) Reset() { *m = Notification{} }
+func (m *Notification) String() string { return proto.CompactTextString(m) }
+func (*Notification) ProtoMessage() {}
+func (*Notification) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{1}
+}
+
+func (m *Notification) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_Notification.Unmarshal(m, b)
+}
+func (m *Notification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_Notification.Marshal(b, m, deterministic)
+}
+func (m *Notification) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Notification.Merge(m, src)
+}
+func (m *Notification) XXX_Size() int {
+ return xxx_messageInfo_Notification.Size(m)
+}
+func (m *Notification) XXX_DiscardUnknown() {
+ xxx_messageInfo_Notification.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Notification proto.InternalMessageInfo
+
+func (m *Notification) GetCniType() string {
+ if m != nil {
+ return m.CniType
+ }
+ return ""
+}
+
+type isNotification_Payload interface {
+ isNotification_Payload()
+}
+
+type Notification_InSync struct {
+ InSync *InSync `protobuf:"bytes,2,opt,name=in_sync,json=inSync,proto3,oneof"`
+}
+
+type Notification_ProviderNwCreate struct {
+ ProviderNwCreate *ProviderNetworkCreate `protobuf:"bytes,3,opt,name=provider_nw_create,json=providerNwCreate,proto3,oneof"`
+}
+
+type Notification_ProviderNwRemove struct {
+ ProviderNwRemove *ProviderNetworkRemove `protobuf:"bytes,4,opt,name=provider_nw_remove,json=providerNwRemove,proto3,oneof"`
+}
+
+func (*Notification_InSync) isNotification_Payload() {}
+
+func (*Notification_ProviderNwCreate) isNotification_Payload() {}
+
+func (*Notification_ProviderNwRemove) isNotification_Payload() {}
+
+func (m *Notification) GetPayload() isNotification_Payload {
+ if m != nil {
+ return m.Payload
+ }
+ return nil
+}
+
+func (m *Notification) GetInSync() *InSync {
+ if x, ok := m.GetPayload().(*Notification_InSync); ok {
+ return x.InSync
+ }
+ return nil
+}
+
+func (m *Notification) GetProviderNwCreate() *ProviderNetworkCreate {
+ if x, ok := m.GetPayload().(*Notification_ProviderNwCreate); ok {
+ return x.ProviderNwCreate
+ }
+ return nil
+}
+
+func (m *Notification) GetProviderNwRemove() *ProviderNetworkRemove {
+ if x, ok := m.GetPayload().(*Notification_ProviderNwRemove); ok {
+ return x.ProviderNwRemove
+ }
+ return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Notification) XXX_OneofWrappers() []interface{} {
+ return []interface{}{
+ (*Notification_InSync)(nil),
+ (*Notification_ProviderNwCreate)(nil),
+ (*Notification_ProviderNwRemove)(nil),
+ }
+}
+
+type ProviderNetworkCreate struct {
+ ProviderNwName string `protobuf:"bytes,1,opt,name=provider_nw_name,json=providerNwName,proto3" json:"provider_nw_name,omitempty"`
+ Vlan *VlanInfo `protobuf:"bytes,2,opt,name=vlan,proto3" json:"vlan,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ProviderNetworkCreate) Reset() { *m = ProviderNetworkCreate{} }
+func (m *ProviderNetworkCreate) String() string { return proto.CompactTextString(m) }
+func (*ProviderNetworkCreate) ProtoMessage() {}
+func (*ProviderNetworkCreate) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{2}
+}
+
+func (m *ProviderNetworkCreate) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ProviderNetworkCreate.Unmarshal(m, b)
+}
+func (m *ProviderNetworkCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ProviderNetworkCreate.Marshal(b, m, deterministic)
+}
+func (m *ProviderNetworkCreate) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ProviderNetworkCreate.Merge(m, src)
+}
+func (m *ProviderNetworkCreate) XXX_Size() int {
+ return xxx_messageInfo_ProviderNetworkCreate.Size(m)
+}
+func (m *ProviderNetworkCreate) XXX_DiscardUnknown() {
+ xxx_messageInfo_ProviderNetworkCreate.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProviderNetworkCreate proto.InternalMessageInfo
+
+func (m *ProviderNetworkCreate) GetProviderNwName() string {
+ if m != nil {
+ return m.ProviderNwName
+ }
+ return ""
+}
+
+func (m *ProviderNetworkCreate) GetVlan() *VlanInfo {
+ if m != nil {
+ return m.Vlan
+ }
+ return nil
+}
+
+type ProviderNetworkRemove struct {
+ ProviderNwName string `protobuf:"bytes,1,opt,name=provider_nw_name,json=providerNwName,proto3" json:"provider_nw_name,omitempty"`
+ VlanLogicalIntf string `protobuf:"bytes,2,opt,name=vlan_logical_intf,json=vlanLogicalIntf,proto3" json:"vlan_logical_intf,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ProviderNetworkRemove) Reset() { *m = ProviderNetworkRemove{} }
+func (m *ProviderNetworkRemove) String() string { return proto.CompactTextString(m) }
+func (*ProviderNetworkRemove) ProtoMessage() {}
+func (*ProviderNetworkRemove) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{3}
+}
+
+func (m *ProviderNetworkRemove) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ProviderNetworkRemove.Unmarshal(m, b)
+}
+func (m *ProviderNetworkRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ProviderNetworkRemove.Marshal(b, m, deterministic)
+}
+func (m *ProviderNetworkRemove) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ProviderNetworkRemove.Merge(m, src)
+}
+func (m *ProviderNetworkRemove) XXX_Size() int {
+ return xxx_messageInfo_ProviderNetworkRemove.Size(m)
+}
+func (m *ProviderNetworkRemove) XXX_DiscardUnknown() {
+ xxx_messageInfo_ProviderNetworkRemove.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProviderNetworkRemove proto.InternalMessageInfo
+
+func (m *ProviderNetworkRemove) GetProviderNwName() string {
+ if m != nil {
+ return m.ProviderNwName
+ }
+ return ""
+}
+
+func (m *ProviderNetworkRemove) GetVlanLogicalIntf() string {
+ if m != nil {
+ return m.VlanLogicalIntf
+ }
+ return ""
+}
+
+type VlanInfo struct {
+ VlanId string `protobuf:"bytes,1,opt,name=vlan_id,json=vlanId,proto3" json:"vlan_id,omitempty"`
+ ProviderIntf string `protobuf:"bytes,2,opt,name=provider_intf,json=providerIntf,proto3" json:"provider_intf,omitempty"`
+ LogicalIntf string `protobuf:"bytes,3,opt,name=logical_intf,json=logicalIntf,proto3" json:"logical_intf,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *VlanInfo) Reset() { *m = VlanInfo{} }
+func (m *VlanInfo) String() string { return proto.CompactTextString(m) }
+func (*VlanInfo) ProtoMessage() {}
+func (*VlanInfo) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{4}
+}
+
+func (m *VlanInfo) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_VlanInfo.Unmarshal(m, b)
+}
+func (m *VlanInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_VlanInfo.Marshal(b, m, deterministic)
+}
+func (m *VlanInfo) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_VlanInfo.Merge(m, src)
+}
+func (m *VlanInfo) XXX_Size() int {
+ return xxx_messageInfo_VlanInfo.Size(m)
+}
+func (m *VlanInfo) XXX_DiscardUnknown() {
+ xxx_messageInfo_VlanInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VlanInfo proto.InternalMessageInfo
+
+func (m *VlanInfo) GetVlanId() string {
+ if m != nil {
+ return m.VlanId
+ }
+ return ""
+}
+
+func (m *VlanInfo) GetProviderIntf() string {
+ if m != nil {
+ return m.ProviderIntf
+ }
+ return ""
+}
+
+func (m *VlanInfo) GetLogicalIntf() string {
+ if m != nil {
+ return m.LogicalIntf
+ }
+ return ""
+}
+
+type InSync struct {
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *InSync) Reset() { *m = InSync{} }
+func (m *InSync) String() string { return proto.CompactTextString(m) }
+func (*InSync) ProtoMessage() {}
+func (*InSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_5b809db4a7814953, []int{5}
+}
+
+func (m *InSync) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_InSync.Unmarshal(m, b)
+}
+func (m *InSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_InSync.Marshal(b, m, deterministic)
+}
+func (m *InSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_InSync.Merge(m, src)
+}
+func (m *InSync) XXX_Size() int {
+ return xxx_messageInfo_InSync.Size(m)
+}
+func (m *InSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_InSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_InSync proto.InternalMessageInfo
+
+func init() {
+ proto.RegisterType((*SubscribeContext)(nil), "SubscribeContext")
+ proto.RegisterType((*Notification)(nil), "Notification")
+ proto.RegisterType((*ProviderNetworkCreate)(nil), "ProviderNetworkCreate")
+ proto.RegisterType((*ProviderNetworkRemove)(nil), "ProviderNetworkRemove")
+ proto.RegisterType((*VlanInfo)(nil), "VlanInfo")
+ proto.RegisterType((*InSync)(nil), "InSync")
+}
+
+func init() { proto.RegisterFile("nfn.proto", fileDescriptor_5b809db4a7814953) }
+
+var fileDescriptor_5b809db4a7814953 = []byte{
+ // 380 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x4f, 0xaf, 0xd2, 0x40,
+ 0x14, 0xc5, 0xa9, 0x90, 0xfe, 0xb9, 0x80, 0xc2, 0x24, 0x6a, 0xd5, 0x98, 0x60, 0xdd, 0x10, 0x17,
+ 0xc5, 0xe0, 0xd6, 0x95, 0x24, 0x86, 0x26, 0xa6, 0x31, 0xc5, 0xb8, 0xad, 0xc3, 0x74, 0x6a, 0x26,
+ 0xb4, 0x77, 0x9a, 0x32, 0x82, 0xfd, 0xc6, 0xef, 0x63, 0xbc, 0x74, 0x4a, 0x79, 0x85, 0xc7, 0xe6,
+ 0xed, 0xda, 0x73, 0xee, 0x9c, 0xdf, 0xf4, 0xf6, 0x80, 0x83, 0x29, 0xfa, 0x45, 0x29, 0x95, 0xf4,
+ 0x16, 0x30, 0xd9, 0xfc, 0xdb, 0xee, 0x59, 0x29, 0xb6, 0x7c, 0x25, 0x51, 0xf1, 0xff, 0x8a, 0xbc,
+ 0x03, 0x07, 0x65, 0xc2, 0x63, 0xa4, 0x39, 0x77, 0x8d, 0x99, 0x31, 0x77, 0x22, 0xbb, 0x16, 0x42,
+ 0x9a, 0x73, 0xef, 0xce, 0x80, 0x51, 0x28, 0x95, 0x48, 0x05, 0xa3, 0x4a, 0x48, 0x24, 0x6f, 0xc0,
+ 0x66, 0x28, 0x62, 0x55, 0x15, 0xed, 0xb0, 0xc5, 0x50, 0xfc, 0xaa, 0x0a, 0x4e, 0x3c, 0xb0, 0x04,
+ 0xc6, 0xfb, 0x0a, 0x99, 0xfb, 0x6c, 0x66, 0xcc, 0x87, 0x4b, 0xcb, 0x0f, 0x70, 0x53, 0x21, 0x5b,
+ 0xf7, 0x22, 0x53, 0xe8, 0x27, 0xf2, 0x1d, 0x48, 0x51, 0xca, 0x83, 0x48, 0x78, 0x19, 0xe3, 0x31,
+ 0x66, 0x25, 0xa7, 0x8a, 0xbb, 0x7d, 0x3d, 0xfe, 0xca, 0xff, 0x79, 0xb2, 0x42, 0xae, 0x8e, 0xb2,
+ 0xdc, 0xad, 0xb4, 0xbb, 0xee, 0x45, 0x93, 0xf6, 0x4c, 0x78, 0x6c, 0xb4, 0xeb, 0x9c, 0x92, 0xe7,
+ 0xf2, 0xc0, 0xdd, 0xc1, 0xed, 0x9c, 0x48, 0xbb, 0x97, 0x39, 0x8d, 0xf6, 0xcd, 0x01, 0xab, 0xa0,
+ 0x55, 0x26, 0x69, 0xe2, 0xfd, 0x81, 0x97, 0x37, 0xf9, 0x64, 0x0e, 0x93, 0x2e, 0xab, 0xb3, 0xa7,
+ 0xe7, 0x0f, 0x79, 0xf5, 0xb6, 0xc8, 0x7b, 0x18, 0x1c, 0x32, 0x8a, 0xa7, 0xcf, 0x77, 0xfc, 0xdf,
+ 0x19, 0xc5, 0x00, 0x53, 0x19, 0x69, 0xd9, 0xcb, 0x1f, 0x11, 0x9a, 0x5b, 0x3c, 0x81, 0xf0, 0x09,
+ 0xa6, 0x75, 0x54, 0x9c, 0xc9, 0xbf, 0x82, 0xd1, 0x2c, 0x16, 0xa8, 0x52, 0x8d, 0x73, 0xa2, 0x17,
+ 0xb5, 0xf1, 0xa3, 0xd1, 0x03, 0x54, 0xa9, 0xb7, 0x03, 0xbb, 0xbd, 0x00, 0x79, 0x0d, 0x96, 0x3e,
+ 0x27, 0x92, 0x53, 0xb0, 0x59, 0xbf, 0x06, 0x09, 0xf9, 0x08, 0xe3, 0x33, 0xba, 0x13, 0x36, 0x6a,
+ 0xc5, 0x3a, 0x89, 0x7c, 0x80, 0xd1, 0x05, 0xb0, 0xaf, 0x67, 0x86, 0x59, 0x07, 0x66, 0x83, 0xd9,
+ 0xfc, 0xec, 0xe5, 0x57, 0x5d, 0x38, 0x5d, 0x9a, 0x8a, 0x2c, 0xc0, 0x39, 0x17, 0x8e, 0x4c, 0xfd,
+ 0xeb, 0xf2, 0xbd, 0x1d, 0xfb, 0xdd, 0x76, 0x7d, 0x36, 0xb6, 0xa6, 0x2e, 0xea, 0x97, 0xfb, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xa6, 0xd9, 0x3e, 0x9e, 0xb5, 0x02, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NfnNotifyClient is the client API for NfnNotify service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NfnNotifyClient interface {
+ Subscribe(ctx context.Context, in *SubscribeContext, opts ...grpc.CallOption) (NfnNotify_SubscribeClient, error)
+}
+
+type nfnNotifyClient struct {
+ cc *grpc.ClientConn
+}
+
+func NewNfnNotifyClient(cc *grpc.ClientConn) NfnNotifyClient {
+ return &nfnNotifyClient{cc}
+}
+
+func (c *nfnNotifyClient) Subscribe(ctx context.Context, in *SubscribeContext, opts ...grpc.CallOption) (NfnNotify_SubscribeClient, error) {
+ stream, err := c.cc.NewStream(ctx, &_NfnNotify_serviceDesc.Streams[0], "/nfnNotify/Subscribe", opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &nfnNotifySubscribeClient{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 NfnNotify_SubscribeClient interface {
+ Recv() (*Notification, error)
+ grpc.ClientStream
+}
+
+type nfnNotifySubscribeClient struct {
+ grpc.ClientStream
+}
+
+func (x *nfnNotifySubscribeClient) Recv() (*Notification, error) {
+ m := new(Notification)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+// NfnNotifyServer is the server API for NfnNotify service.
+type NfnNotifyServer interface {
+ Subscribe(*SubscribeContext, NfnNotify_SubscribeServer) error
+}
+
+// UnimplementedNfnNotifyServer can be embedded to have forward compatible implementations.
+type UnimplementedNfnNotifyServer struct {
+}
+
+func (*UnimplementedNfnNotifyServer) Subscribe(req *SubscribeContext, srv NfnNotify_SubscribeServer) error {
+ return status.Errorf(codes.Unimplemented, "method Subscribe not implemented")
+}
+
+func RegisterNfnNotifyServer(s *grpc.Server, srv NfnNotifyServer) {
+ s.RegisterService(&_NfnNotify_serviceDesc, srv)
+}
+
+func _NfnNotify_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(SubscribeContext)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(NfnNotifyServer).Subscribe(m, &nfnNotifySubscribeServer{stream})
+}
+
+type NfnNotify_SubscribeServer interface {
+ Send(*Notification) error
+ grpc.ServerStream
+}
+
+type nfnNotifySubscribeServer struct {
+ grpc.ServerStream
+}
+
+func (x *nfnNotifySubscribeServer) Send(m *Notification) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+var _NfnNotify_serviceDesc = grpc.ServiceDesc{
+ ServiceName: "nfnNotify",
+ HandlerType: (*NfnNotifyServer)(nil),
+ Methods: []grpc.MethodDesc{},
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "Subscribe",
+ Handler: _NfnNotify_Subscribe_Handler,
+ ServerStreams: true,
+ },
+ },
+ Metadata: "nfn.proto",
+}
diff --git a/internal/pkg/nfnNotify/proto/nfn.proto b/internal/pkg/nfnNotify/proto/nfn.proto
new file mode 100644
index 0000000..85e2131
--- /dev/null
+++ b/internal/pkg/nfnNotify/proto/nfn.proto
@@ -0,0 +1,44 @@
+//
+// nfn.proto
+//
+// Example that implements push notification from grpc server to client
+//
+syntax = "proto3";
+
+service nfnNotify {
+ rpc Subscribe (SubscribeContext) returns (stream Notification);
+}
+
+message SubscribeContext {
+ string node_name = 1;
+}
+
+message Notification {
+ string cni_type = 1;
+ oneof payload {
+ InSync in_sync = 2;
+ ProviderNetworkCreate provider_nw_create = 3;
+ ProviderNetworkRemove provider_nw_remove = 4;
+ }
+}
+
+message ProviderNetworkCreate {
+ string provider_nw_name = 1;
+ VlanInfo vlan = 2;
+ // Add other types supported here beyond vlan
+}
+
+message ProviderNetworkRemove {
+ string provider_nw_name = 1;
+ string vlan_logical_intf = 2;
+ // Add other types supported here
+}
+
+message VlanInfo {
+ string vlan_id = 1;
+ string provider_intf = 2;
+ string logical_intf = 3;
+}
+
+message InSync {
+} \ No newline at end of file
diff --git a/internal/pkg/nfnNotify/server.go b/internal/pkg/nfnNotify/server.go
new file mode 100644
index 0000000..6ec4a98
--- /dev/null
+++ b/internal/pkg/nfnNotify/server.go
@@ -0,0 +1,262 @@
+package nfn
+
+import (
+ "fmt"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/reflection"
+ "net"
+ pb "ovn4nfv-k8s-plugin/internal/pkg/nfnNotify/proto"
+ v1alpha1 "ovn4nfv-k8s-plugin/pkg/apis/k8s/v1alpha1"
+ logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+ "strings"
+ "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/client-go/kubernetes"
+ "k8s.io/client-go/rest"
+ clientset "ovn4nfv-k8s-plugin/pkg/generated/clientset/versioned"
+)
+
+var log = logf.Log.WithName("rpc-server")
+
+type client struct {
+ context *pb.SubscribeContext
+ stream pb.NfnNotify_SubscribeServer
+}
+
+type serverDB struct {
+ name string
+ clientList map[string]client
+}
+
+var notifServer *serverDB
+var stopChan chan interface{}
+
+var pnClientset *clientset.Clientset
+var kubeClientset *kubernetes.Clientset
+
+func newServer() *serverDB {
+ return &serverDB{name: "nfnNotifServer", clientList: make(map[string]client)}
+}
+
+// Subscribe stores the client information & sends data
+func (s *serverDB) Subscribe(sc *pb.SubscribeContext, ss pb.NfnNotify_SubscribeServer) error {
+ nodeName := sc.GetNodeName()
+ log.Info("Subscribe request from node", "Node Name", nodeName)
+ if nodeName == "" {
+ return fmt.Errorf("Node name can't be empty")
+ }
+ cp := client{
+ context: sc,
+ stream: ss,
+ }
+ s.clientList[nodeName] = cp
+
+ providerNetworklist, err := pnClientset.K8sV1alpha1().ProviderNetworks("default").List(v1.ListOptions{})
+ if err == nil {
+ for _, pn := range providerNetworklist.Items {
+ log.Info("Send message", "Provider Network", pn.GetName())
+ SendNotif(&pn, "create", nodeName)
+ }
+ }
+ inSyncMsg := pb.Notification{
+ CniType: "ovn4nfv",
+ Payload: &pb.Notification_InSync{
+ InSync: &pb.InSync{},
+ },
+ }
+ log.Info("Send Insync")
+ if err = cp.stream.Send(&inSyncMsg); err != nil {
+ log.Error(err, "Unable to send sync", "node name", nodeName)
+ }
+ log.Info("Subscribe Completed")
+ // Keep stream open
+ for {
+ select {
+ case <-stopChan:
+ }
+ }
+}
+
+func (s *serverDB) GetClient(nodeName string) client {
+ if val, ok := s.clientList[nodeName]; ok {
+ return val
+ }
+ return client{}
+}
+
+func updatePnStatus(pn *v1alpha1.ProviderNetwork, status string) error {
+ pnCopy := pn.DeepCopy()
+ pnCopy.Status.State = status
+ _, err := pnClientset.K8sV1alpha1().ProviderNetworks(pn.Namespace).Update(pnCopy)
+ return err
+}
+
+func createMsg(pn *v1alpha1.ProviderNetwork) pb.Notification {
+ msg := pb.Notification{
+ CniType: "ovn4nfv",
+ Payload: &pb.Notification_ProviderNwCreate{
+ ProviderNwCreate: &pb.ProviderNetworkCreate{
+ ProviderNwName: pn.Name,
+ Vlan: &pb.VlanInfo{
+ VlanId: pn.Spec.Vlan.VlanId,
+ ProviderIntf: pn.Spec.Vlan.ProviderInterfaceName,
+ LogicalIntf: pn.Spec.Vlan.LogicalInterfaceName,
+ },
+ },
+ },
+ }
+ return msg
+}
+
+func deleteMsg(pn *v1alpha1.ProviderNetwork) pb.Notification {
+ msg := pb.Notification{
+ CniType: "ovn4nfv",
+ Payload: &pb.Notification_ProviderNwRemove{
+ ProviderNwRemove: &pb.ProviderNetworkRemove{
+ ProviderNwName: pn.Name,
+ VlanLogicalIntf: pn.Spec.Vlan.LogicalInterfaceName,
+ },
+ },
+ }
+ return msg
+}
+
+//SendNotif to client
+func SendNotif(pn *v1alpha1.ProviderNetwork, msgType string, nodeReq string) error {
+ var msg pb.Notification
+ var err error
+
+ switch {
+ case pn.Spec.CniType == "ovn4nfv":
+ switch {
+ case pn.Spec.ProviderNetType == "VLAN":
+ if msgType == "create" {
+ msg = createMsg(pn)
+ } else if msgType == "delete" {
+ msg = deleteMsg(pn)
+ }
+ if strings.EqualFold(pn.Spec.Vlan.VlanNodeSelector, "SPECIFIC") {
+ for _, label := range pn.Spec.Vlan.NodeLabelList {
+ l := strings.Split(label, "=")
+ if len(l) == 0 {
+ log.Error(fmt.Errorf("Syntax error label: %v", label), "NodeListIterator")
+ return nil
+ }
+ }
+ labels := strings.Join(pn.Spec.Vlan.NodeLabelList[:], ",")
+ err = sendMsg(msg, labels, "specific", nodeReq)
+ } else if strings.EqualFold(pn.Spec.Vlan.VlanNodeSelector, "ALL") {
+ err = sendMsg(msg, "", "all", nodeReq)
+ } else if strings.EqualFold(pn.Spec.Vlan.VlanNodeSelector, "ANY") {
+ if pn.Status.State != v1alpha1.Created {
+ err = sendMsg(msg, "", "any", nodeReq)
+ if err == nil {
+ updatePnStatus(pn, v1alpha1.Created)
+ }
+ }
+ }
+ default:
+ return fmt.Errorf("Unsupported Provider Network type")
+ }
+ default:
+ return fmt.Errorf("Unsupported CNI type")
+ }
+ return err
+}
+
+// sendMsg send notification to client
+func sendMsg(msg pb.Notification, labels string, option string, nodeReq string) error {
+ if option == "all" {
+ for name, client := range notifServer.clientList {
+ if nodeReq != "" && nodeReq != name {
+ continue
+ }
+ if client.stream != nil {
+ if err := client.stream.Send(&msg); err != nil {
+ log.Error(err, "Msg Send failed", "Node name", name)
+ }
+ }
+ }
+ return nil
+ } else if option == "any" {
+ // Always select the first
+ for _, client := range notifServer.clientList {
+ if client.stream != nil {
+ if err := client.stream.Send(&msg); err != nil {
+ return err
+ }
+ // return after first successful send
+ return nil
+ }
+ }
+ return nil
+ }
+ // This is specific case
+ for name := range nodeListIterator(labels) {
+ if nodeReq != "" && nodeReq != name {
+ continue
+ }
+ client := notifServer.GetClient(name)
+ if client.stream != nil {
+ if err := client.stream.Send(&msg); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+func nodeListIterator(labels string) <-chan string {
+ ch := make(chan string)
+
+ lo := v1.ListOptions{LabelSelector: labels}
+ // List the Nodes matching the Labels
+ nodes, err := kubeClientset.CoreV1().Nodes().List(lo)
+ if err != nil {
+ log.Info("No Nodes found with labels", "list:", lo)
+ return nil
+ }
+ go func() {
+ for _, node := range nodes.Items {
+ log.Info("Send message to", " node:", node.ObjectMeta.Name)
+ ch <- node.ObjectMeta.Name
+ }
+ close(ch)
+ }()
+ return ch
+}
+
+//SetupNotifServer initilizes the gRpc nfn notif server
+func SetupNotifServer(kConfig *rest.Config) {
+
+ log.Info("Starting Notif Server")
+ var err error
+
+ // creates the clientset
+ pnClientset, err = clientset.NewForConfig(kConfig)
+ if err != nil {
+ log.Error(err, "Error building clientset")
+ }
+ kubeClientset, err = kubernetes.NewForConfig(kConfig)
+ if err != nil {
+ log.Error(err, "Error building Kuberenetes clientset")
+ }
+
+ stopChan = make(chan interface{})
+
+ // Start GRPC server
+ lis, err := net.Listen("tcp", ":50000")
+ if err != nil {
+ log.Error(err, "failed to listen")
+ }
+
+ s := grpc.NewServer()
+ // Intialize Notify server
+ notifServer = newServer()
+ pb.RegisterNfnNotifyServer(s, notifServer)
+
+ reflection.Register(s)
+ log.Info("Initialization Completed")
+ if err := s.Serve(lis); err != nil {
+ log.Error(err, "failed to serve")
+ }
+}