diff --git a/api/go/gosdn/networkelement/networkelement.pb.go b/api/go/gosdn/networkelement/networkelement.pb.go index 1a75e9b8e15b103bb3585d604a167db1af64d244..597a8b8a38806079eae9193b44d48f5da754c933 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.go +++ b/api/go/gosdn/networkelement/networkelement.pb.go @@ -339,20 +339,19 @@ func (StreamMode) EnumDescriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{5} } -type ManagedNetworkElement struct { +type AddNetworkElementConfiguration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - MneNotification []*gnmi.Notification `protobuf:"bytes,3,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` - Sbi *southbound.SouthboundInterface `protobuf:"bytes,4,opt,name=sbi,proto3" json:"sbi,omitempty"` - Metadata *conflict.Metadata `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Sbi *southbound.SouthboundInterface `protobuf:"bytes,2,opt,name=sbi,proto3" json:"sbi,omitempty"` + NetworkElementName string `protobuf:"bytes,3,opt,name=network_element_name,json=networkElementName,proto3" json:"network_element_name,omitempty"` + TransportOption *transport.TransportOption `protobuf:"bytes,4,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` } -func (x *ManagedNetworkElement) Reset() { - *x = ManagedNetworkElement{} +func (x *AddNetworkElementConfiguration) Reset() { + *x = AddNetworkElementConfiguration{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -360,13 +359,13 @@ func (x *ManagedNetworkElement) Reset() { } } -func (x *ManagedNetworkElement) String() string { +func (x *AddNetworkElementConfiguration) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ManagedNetworkElement) ProtoMessage() {} +func (*AddNetworkElementConfiguration) ProtoMessage() {} -func (x *ManagedNetworkElement) ProtoReflect() protoreflect.Message { +func (x *AddNetworkElementConfiguration) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -378,58 +377,51 @@ func (x *ManagedNetworkElement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ManagedNetworkElement.ProtoReflect.Descriptor instead. -func (*ManagedNetworkElement) Descriptor() ([]byte, []int) { +// Deprecated: Use AddNetworkElementConfiguration.ProtoReflect.Descriptor instead. +func (*AddNetworkElementConfiguration) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{0} } -func (x *ManagedNetworkElement) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ManagedNetworkElement) GetName() string { +func (x *AddNetworkElementConfiguration) GetAddress() string { if x != nil { - return x.Name + return x.Address } return "" } -func (x *ManagedNetworkElement) GetMneNotification() []*gnmi.Notification { +func (x *AddNetworkElementConfiguration) GetSbi() *southbound.SouthboundInterface { if x != nil { - return x.MneNotification + return x.Sbi } return nil } -func (x *ManagedNetworkElement) GetSbi() *southbound.SouthboundInterface { +func (x *AddNetworkElementConfiguration) GetNetworkElementName() string { if x != nil { - return x.Sbi + return x.NetworkElementName } - return nil + return "" } -func (x *ManagedNetworkElement) GetMetadata() *conflict.Metadata { +func (x *AddNetworkElementConfiguration) GetTransportOption() *transport.TransportOption { if x != nil { - return x.Metadata + return x.TransportOption } return nil } -type FlattenedManagedNetworkElement struct { +type AddNetworkElementRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Sbi string `protobuf:"bytes,3,opt,name=sbi,proto3" json:"sbi,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + NetworkElement *AddNetworkElementConfiguration `protobuf:"bytes,2,opt,name=network_element,json=networkElement,proto3" json:"network_element,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` } -func (x *FlattenedManagedNetworkElement) Reset() { - *x = FlattenedManagedNetworkElement{} +func (x *AddNetworkElementRequest) Reset() { + *x = AddNetworkElementRequest{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -437,13 +429,13 @@ func (x *FlattenedManagedNetworkElement) Reset() { } } -func (x *FlattenedManagedNetworkElement) String() string { +func (x *AddNetworkElementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FlattenedManagedNetworkElement) ProtoMessage() {} +func (*AddNetworkElementRequest) ProtoMessage() {} -func (x *FlattenedManagedNetworkElement) ProtoReflect() protoreflect.Message { +func (x *AddNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -455,45 +447,44 @@ func (x *FlattenedManagedNetworkElement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FlattenedManagedNetworkElement.ProtoReflect.Descriptor instead. -func (*FlattenedManagedNetworkElement) Descriptor() ([]byte, []int) { +// Deprecated: Use AddNetworkElementRequest.ProtoReflect.Descriptor instead. +func (*AddNetworkElementRequest) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{1} } -func (x *FlattenedManagedNetworkElement) GetId() string { +func (x *AddNetworkElementRequest) GetTimestamp() int64 { if x != nil { - return x.Id + return x.Timestamp } - return "" + return 0 } -func (x *FlattenedManagedNetworkElement) GetName() string { +func (x *AddNetworkElementRequest) GetNetworkElement() *AddNetworkElementConfiguration { if x != nil { - return x.Name + return x.NetworkElement } - return "" + return nil } -func (x *FlattenedManagedNetworkElement) GetSbi() string { +func (x *AddNetworkElementRequest) GetPid() string { if x != nil { - return x.Sbi + return x.Pid } return "" } -// //TODO(PND): this is maybe only temporary, need to figure out how to include without cycle or duplication -type PrincipalNetworkDomain struct { +type AddNetworkElementResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` + NetworkElementId string `protobuf:"bytes,3,opt,name=network_element_id,json=networkElementId,proto3" json:"network_element_id,omitempty"` } -func (x *PrincipalNetworkDomain) Reset() { - *x = PrincipalNetworkDomain{} +func (x *AddNetworkElementResponse) Reset() { + *x = AddNetworkElementResponse{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -501,13 +492,13 @@ func (x *PrincipalNetworkDomain) Reset() { } } -func (x *PrincipalNetworkDomain) String() string { +func (x *AddNetworkElementResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PrincipalNetworkDomain) ProtoMessage() {} +func (*AddNetworkElementResponse) ProtoMessage() {} -func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message { +func (x *AddNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -519,43 +510,43 @@ func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PrincipalNetworkDomain.ProtoReflect.Descriptor instead. -func (*PrincipalNetworkDomain) Descriptor() ([]byte, []int) { +// Deprecated: Use AddNetworkElementResponse.ProtoReflect.Descriptor instead. +func (*AddNetworkElementResponse) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{2} } -func (x *PrincipalNetworkDomain) GetId() string { +func (x *AddNetworkElementResponse) GetTimestamp() int64 { if x != nil { - return x.Id + return x.Timestamp } - return "" + return 0 } -func (x *PrincipalNetworkDomain) GetName() string { +func (x *AddNetworkElementResponse) GetStatus() Status { if x != nil { - return x.Name + return x.Status } - return "" + return Status_STATUS_UNSPECIFIED } -func (x *PrincipalNetworkDomain) GetDescription() string { +func (x *AddNetworkElementResponse) GetNetworkElementId() string { if x != nil { - return x.Description + return x.NetworkElementId } return "" } -type GetMneListRequest struct { +type GetNetworkElementRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + NetworkElementId string `protobuf:"bytes,2,opt,name=network_element_id,json=networkElementId,proto3" json:"network_element_id,omitempty"` } -func (x *GetMneListRequest) Reset() { - *x = GetMneListRequest{} +func (x *GetNetworkElementRequest) Reset() { + *x = GetNetworkElementRequest{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -563,13 +554,13 @@ func (x *GetMneListRequest) Reset() { } } -func (x *GetMneListRequest) String() string { +func (x *GetNetworkElementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMneListRequest) ProtoMessage() {} +func (*GetNetworkElementRequest) ProtoMessage() {} -func (x *GetMneListRequest) ProtoReflect() protoreflect.Message { +func (x *GetNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -581,39 +572,37 @@ func (x *GetMneListRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMneListRequest.ProtoReflect.Descriptor instead. -func (*GetMneListRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNetworkElementRequest.ProtoReflect.Descriptor instead. +func (*GetNetworkElementRequest) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{3} } -func (x *GetMneListRequest) GetTimestamp() int64 { +func (x *GetNetworkElementRequest) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetMneListRequest) GetPid() string { +func (x *GetNetworkElementRequest) GetNetworkElementId() string { if x != nil { - return x.Pid + return x.NetworkElementId } return "" } -type GetMneListResponse struct { +type GetNetworkElementResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - // TODO: Check if this is really needed. Perhaps a reference to the PND's ID - // is also sufficient. - Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne []*ManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` + NetworkElement *NetworkElement `protobuf:"bytes,3,opt,name=network_element,json=networkElement,proto3" json:"network_element,omitempty"` } -func (x *GetMneListResponse) Reset() { - *x = GetMneListResponse{} +func (x *GetNetworkElementResponse) Reset() { + *x = GetNetworkElementResponse{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -621,13 +610,13 @@ func (x *GetMneListResponse) Reset() { } } -func (x *GetMneListResponse) String() string { +func (x *GetNetworkElementResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMneListResponse) ProtoMessage() {} +func (*GetNetworkElementResponse) ProtoMessage() {} -func (x *GetMneListResponse) ProtoReflect() protoreflect.Message { +func (x *GetNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -639,47 +628,42 @@ func (x *GetMneListResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMneListResponse.ProtoReflect.Descriptor instead. -func (*GetMneListResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNetworkElementResponse.ProtoReflect.Descriptor instead. +func (*GetNetworkElementResponse) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{4} } -func (x *GetMneListResponse) GetTimestamp() int64 { +func (x *GetNetworkElementResponse) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetMneListResponse) GetPnd() *PrincipalNetworkDomain { +func (x *GetNetworkElementResponse) GetStatus() Status { if x != nil { - return x.Pnd + return x.Status } - return nil + return Status_STATUS_UNSPECIFIED } -func (x *GetMneListResponse) GetMne() []*ManagedNetworkElement { +func (x *GetNetworkElementResponse) GetNetworkElement() *NetworkElement { if x != nil { - return x.Mne + return x.NetworkElement } return nil } -//TODO(PND): add request here -type GetFlattenedMneListResponse struct { +type GetAllNetworkElementRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - // TODO: Check if this is really needed. Perhaps a reference to the PND's ID - // is also sufficient. - Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne []*FlattenedManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } -func (x *GetFlattenedMneListResponse) Reset() { - *x = GetFlattenedMneListResponse{} +func (x *GetAllNetworkElementRequest) Reset() { + *x = GetAllNetworkElementRequest{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -687,13 +671,13 @@ func (x *GetFlattenedMneListResponse) Reset() { } } -func (x *GetFlattenedMneListResponse) String() string { +func (x *GetAllNetworkElementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetFlattenedMneListResponse) ProtoMessage() {} +func (*GetAllNetworkElementRequest) ProtoMessage() {} -func (x *GetFlattenedMneListResponse) ProtoReflect() protoreflect.Message { +func (x *GetAllNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -705,44 +689,30 @@ func (x *GetFlattenedMneListResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetFlattenedMneListResponse.ProtoReflect.Descriptor instead. -func (*GetFlattenedMneListResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAllNetworkElementRequest.ProtoReflect.Descriptor instead. +func (*GetAllNetworkElementRequest) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{5} } -func (x *GetFlattenedMneListResponse) GetTimestamp() int64 { +func (x *GetAllNetworkElementRequest) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetFlattenedMneListResponse) GetPnd() *PrincipalNetworkDomain { - if x != nil { - return x.Pnd - } - return nil -} - -func (x *GetFlattenedMneListResponse) GetMne() []*FlattenedManagedNetworkElement { - if x != nil { - return x.Mne - } - return nil -} - -type GetMneRequest struct { +type GetAllNetworkElementResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` + NetworkElement []*NetworkElement `protobuf:"bytes,3,rep,name=network_element,json=networkElement,proto3" json:"network_element,omitempty"` } -func (x *GetMneRequest) Reset() { - *x = GetMneRequest{} +func (x *GetAllNetworkElementResponse) Reset() { + *x = GetAllNetworkElementResponse{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -750,13 +720,13 @@ func (x *GetMneRequest) Reset() { } } -func (x *GetMneRequest) String() string { +func (x *GetAllNetworkElementResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMneRequest) ProtoMessage() {} +func (*GetAllNetworkElementResponse) ProtoMessage() {} -func (x *GetMneRequest) ProtoReflect() protoreflect.Message { +func (x *GetAllNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -768,46 +738,43 @@ func (x *GetMneRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMneRequest.ProtoReflect.Descriptor instead. -func (*GetMneRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAllNetworkElementResponse.ProtoReflect.Descriptor instead. +func (*GetAllNetworkElementResponse) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{6} } -func (x *GetMneRequest) GetTimestamp() int64 { +func (x *GetAllNetworkElementResponse) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetMneRequest) GetMneid() string { +func (x *GetAllNetworkElementResponse) GetStatus() Status { if x != nil { - return x.Mneid + return x.Status } - return "" + return Status_STATUS_UNSPECIFIED } -func (x *GetMneRequest) GetPid() string { +func (x *GetAllNetworkElementResponse) GetNetworkElement() []*NetworkElement { if x != nil { - return x.Pid + return x.NetworkElement } - return "" + return nil } -type GetMneResponse struct { +type UpdateNetworkElementRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - // TODO: Check if this is really needed. Perhaps a reference to the PND's ID - // is also sufficient. - Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` - Mne *ManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + NetworkElement *NetworkElement `protobuf:"bytes,2,opt,name=network_element,json=networkElement,proto3" json:"network_element,omitempty"` } -func (x *GetMneResponse) Reset() { - *x = GetMneResponse{} +func (x *UpdateNetworkElementRequest) Reset() { + *x = UpdateNetworkElementRequest{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -815,13 +782,13 @@ func (x *GetMneResponse) Reset() { } } -func (x *GetMneResponse) String() string { +func (x *UpdateNetworkElementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMneResponse) ProtoMessage() {} +func (*UpdateNetworkElementRequest) ProtoMessage() {} -func (x *GetMneResponse) ProtoReflect() protoreflect.Message { +func (x *UpdateNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -833,45 +800,36 @@ func (x *GetMneResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMneResponse.ProtoReflect.Descriptor instead. -func (*GetMneResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdateNetworkElementRequest.ProtoReflect.Descriptor instead. +func (*UpdateNetworkElementRequest) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{7} } -func (x *GetMneResponse) GetTimestamp() int64 { +func (x *UpdateNetworkElementRequest) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *GetMneResponse) GetPnd() *PrincipalNetworkDomain { - if x != nil { - return x.Pnd - } - return nil -} - -func (x *GetMneResponse) GetMne() *ManagedNetworkElement { +func (x *UpdateNetworkElementRequest) GetNetworkElement() *NetworkElement { if x != nil { - return x.Mne + return x.NetworkElement } return nil } -type SetMne struct { +type UpdateNetworkElementResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Sbi *southbound.SouthboundInterface `protobuf:"bytes,2,opt,name=sbi,proto3" json:"sbi,omitempty"` - MneName string `protobuf:"bytes,3,opt,name=mne_name,json=mneName,proto3" json:"mne_name,omitempty"` - TransportOption *transport.TransportOption `protobuf:"bytes,4,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` } -func (x *SetMne) Reset() { - *x = SetMne{} +func (x *UpdateNetworkElementResponse) Reset() { + *x = UpdateNetworkElementResponse{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -879,13 +837,13 @@ func (x *SetMne) Reset() { } } -func (x *SetMne) String() string { +func (x *UpdateNetworkElementResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetMne) ProtoMessage() {} +func (*UpdateNetworkElementResponse) ProtoMessage() {} -func (x *SetMne) ProtoReflect() protoreflect.Message { +func (x *UpdateNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -897,51 +855,36 @@ func (x *SetMne) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetMne.ProtoReflect.Descriptor instead. -func (*SetMne) Descriptor() ([]byte, []int) { +// Deprecated: Use UpdateNetworkElementResponse.ProtoReflect.Descriptor instead. +func (*UpdateNetworkElementResponse) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{8} } -func (x *SetMne) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -func (x *SetMne) GetSbi() *southbound.SouthboundInterface { - if x != nil { - return x.Sbi - } - return nil -} - -func (x *SetMne) GetMneName() string { +func (x *UpdateNetworkElementResponse) GetTimestamp() int64 { if x != nil { - return x.MneName + return x.Timestamp } - return "" + return 0 } -func (x *SetMne) GetTransportOption() *transport.TransportOption { +func (x *UpdateNetworkElementResponse) GetStatus() Status { if x != nil { - return x.TransportOption + return x.Status } - return nil + return Status_STATUS_UNSPECIFIED } -type SetMneListRequest struct { +type DeleteNetworkElementRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Mne []*SetMne `protobuf:"bytes,2,rep,name=mne,proto3" json:"mne,omitempty"` - Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + NetworkElementId string `protobuf:"bytes,2,opt,name=network_element_id,json=networkElementId,proto3" json:"network_element_id,omitempty"` } -func (x *SetMneListRequest) Reset() { - *x = SetMneListRequest{} +func (x *DeleteNetworkElementRequest) Reset() { + *x = DeleteNetworkElementRequest{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -949,13 +892,13 @@ func (x *SetMneListRequest) Reset() { } } -func (x *SetMneListRequest) String() string { +func (x *DeleteNetworkElementRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetMneListRequest) ProtoMessage() {} +func (*DeleteNetworkElementRequest) ProtoMessage() {} -func (x *SetMneListRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteNetworkElementRequest) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -967,44 +910,36 @@ func (x *SetMneListRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetMneListRequest.ProtoReflect.Descriptor instead. -func (*SetMneListRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteNetworkElementRequest.ProtoReflect.Descriptor instead. +func (*DeleteNetworkElementRequest) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{9} } -func (x *SetMneListRequest) GetTimestamp() int64 { +func (x *DeleteNetworkElementRequest) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *SetMneListRequest) GetMne() []*SetMne { - if x != nil { - return x.Mne - } - return nil -} - -func (x *SetMneListRequest) GetPid() string { +func (x *DeleteNetworkElementRequest) GetNetworkElementId() string { if x != nil { - return x.Pid + return x.NetworkElementId } return "" } -type SetMneListResponse struct { +type DeleteNetworkElementResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. - Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` - Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` } -func (x *SetMneListResponse) Reset() { - *x = SetMneListResponse{} +func (x *DeleteNetworkElementResponse) Reset() { + *x = DeleteNetworkElementResponse{} if protoimpl.UnsafeEnabled { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1012,13 +947,13 @@ func (x *SetMneListResponse) Reset() { } } -func (x *SetMneListResponse) String() string { +func (x *DeleteNetworkElementResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetMneListResponse) ProtoMessage() {} +func (*DeleteNetworkElementResponse) ProtoMessage() {} -func (x *SetMneListResponse) ProtoReflect() protoreflect.Message { +func (x *DeleteNetworkElementResponse) ProtoReflect() protoreflect.Message { mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1030,27 +965,834 @@ func (x *SetMneListResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetMneListResponse.ProtoReflect.Descriptor instead. -func (*SetMneListResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteNetworkElementResponse.ProtoReflect.Descriptor instead. +func (*DeleteNetworkElementResponse) Descriptor() ([]byte, []int) { return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{10} } -func (x *SetMneListResponse) GetTimestamp() int64 { +func (x *DeleteNetworkElementResponse) GetTimestamp() int64 { if x != nil { return x.Timestamp } return 0 } -func (x *SetMneListResponse) GetStatus() Status { +func (x *DeleteNetworkElementResponse) GetStatus() Status { if x != nil { return x.Status } return Status_STATUS_UNSPECIFIED } -func (x *SetMneListResponse) GetResponses() []*SetResponse { - if x != nil { +//TODO(PND):remove this after ManagedNetworkElement is cleaned up +type NetworkElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` + TransportAddress string `protobuf:"bytes,4,opt,name=transport_address,json=transportAddress,proto3" json:"transport_address,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *NetworkElement) Reset() { + *x = NetworkElement{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NetworkElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NetworkElement) ProtoMessage() {} + +func (x *NetworkElement) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NetworkElement.ProtoReflect.Descriptor instead. +func (*NetworkElement) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} +} + +func (x *NetworkElement) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *NetworkElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NetworkElement) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *NetworkElement) GetTransportAddress() string { + if x != nil { + return x.TransportAddress + } + return "" +} + +func (x *NetworkElement) GetMetadata() *conflict.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +//TODO(PND): maybe need to clean this up! +type ManagedNetworkElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Model string `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"` + MneNotification []*gnmi.Notification `protobuf:"bytes,4,rep,name=mne_notification,json=mneNotification,proto3" json:"mne_notification,omitempty"` + Sbi *southbound.SouthboundInterface `protobuf:"bytes,5,opt,name=sbi,proto3" json:"sbi,omitempty"` + TransportAddress string `protobuf:"bytes,6,opt,name=transport_address,json=transportAddress,proto3" json:"transport_address,omitempty"` + Metadata *conflict.Metadata `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *ManagedNetworkElement) Reset() { + *x = ManagedNetworkElement{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ManagedNetworkElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ManagedNetworkElement) ProtoMessage() {} + +func (x *ManagedNetworkElement) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ManagedNetworkElement.ProtoReflect.Descriptor instead. +func (*ManagedNetworkElement) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} +} + +func (x *ManagedNetworkElement) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ManagedNetworkElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ManagedNetworkElement) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *ManagedNetworkElement) GetMneNotification() []*gnmi.Notification { + if x != nil { + return x.MneNotification + } + return nil +} + +func (x *ManagedNetworkElement) GetSbi() *southbound.SouthboundInterface { + if x != nil { + return x.Sbi + } + return nil +} + +func (x *ManagedNetworkElement) GetTransportAddress() string { + if x != nil { + return x.TransportAddress + } + return "" +} + +func (x *ManagedNetworkElement) GetMetadata() *conflict.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +type FlattenedManagedNetworkElement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Sbi string `protobuf:"bytes,3,opt,name=sbi,proto3" json:"sbi,omitempty"` +} + +func (x *FlattenedManagedNetworkElement) Reset() { + *x = FlattenedManagedNetworkElement{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FlattenedManagedNetworkElement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlattenedManagedNetworkElement) ProtoMessage() {} + +func (x *FlattenedManagedNetworkElement) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlattenedManagedNetworkElement.ProtoReflect.Descriptor instead. +func (*FlattenedManagedNetworkElement) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} +} + +func (x *FlattenedManagedNetworkElement) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *FlattenedManagedNetworkElement) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FlattenedManagedNetworkElement) GetSbi() string { + if x != nil { + return x.Sbi + } + return "" +} + +// //TODO(PND): this is maybe only temporary, need to figure out how to include without cycle or duplication +type PrincipalNetworkDomain struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *PrincipalNetworkDomain) Reset() { + *x = PrincipalNetworkDomain{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrincipalNetworkDomain) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrincipalNetworkDomain) ProtoMessage() {} + +func (x *PrincipalNetworkDomain) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrincipalNetworkDomain.ProtoReflect.Descriptor instead. +func (*PrincipalNetworkDomain) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} +} + +func (x *PrincipalNetworkDomain) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *PrincipalNetworkDomain) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PrincipalNetworkDomain) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type GetMneListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Pid string `protobuf:"bytes,2,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *GetMneListRequest) Reset() { + *x = GetMneListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMneListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMneListRequest) ProtoMessage() {} + +func (x *GetMneListRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMneListRequest.ProtoReflect.Descriptor instead. +func (*GetMneListRequest) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} +} + +func (x *GetMneListRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetMneListRequest) GetPid() string { + if x != nil { + return x.Pid + } + return "" +} + +type GetMneListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + // TODO: Check if this is really needed. Perhaps a reference to the PND's ID + // is also sufficient. + Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne []*ManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` +} + +func (x *GetMneListResponse) Reset() { + *x = GetMneListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMneListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMneListResponse) ProtoMessage() {} + +func (x *GetMneListResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMneListResponse.ProtoReflect.Descriptor instead. +func (*GetMneListResponse) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} +} + +func (x *GetMneListResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetMneListResponse) GetPnd() *PrincipalNetworkDomain { + if x != nil { + return x.Pnd + } + return nil +} + +func (x *GetMneListResponse) GetMne() []*ManagedNetworkElement { + if x != nil { + return x.Mne + } + return nil +} + +//TODO(PND): add request here +type GetFlattenedMneListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + // TODO: Check if this is really needed. Perhaps a reference to the PND's ID + // is also sufficient. + Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne []*FlattenedManagedNetworkElement `protobuf:"bytes,3,rep,name=mne,proto3" json:"mne,omitempty"` +} + +func (x *GetFlattenedMneListResponse) Reset() { + *x = GetFlattenedMneListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFlattenedMneListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFlattenedMneListResponse) ProtoMessage() {} + +func (x *GetFlattenedMneListResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFlattenedMneListResponse.ProtoReflect.Descriptor instead. +func (*GetFlattenedMneListResponse) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} +} + +func (x *GetFlattenedMneListResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetFlattenedMneListResponse) GetPnd() *PrincipalNetworkDomain { + if x != nil { + return x.Pnd + } + return nil +} + +func (x *GetFlattenedMneListResponse) GetMne() []*FlattenedManagedNetworkElement { + if x != nil { + return x.Mne + } + return nil +} + +type GetMneRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mneid string `protobuf:"bytes,2,opt,name=mneid,proto3" json:"mneid,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *GetMneRequest) Reset() { + *x = GetMneRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMneRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMneRequest) ProtoMessage() {} + +func (x *GetMneRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMneRequest.ProtoReflect.Descriptor instead. +func (*GetMneRequest) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} +} + +func (x *GetMneRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetMneRequest) GetMneid() string { + if x != nil { + return x.Mneid + } + return "" +} + +func (x *GetMneRequest) GetPid() string { + if x != nil { + return x.Pid + } + return "" +} + +type GetMneResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + // TODO: Check if this is really needed. Perhaps a reference to the PND's ID + // is also sufficient. + Pnd *PrincipalNetworkDomain `protobuf:"bytes,2,opt,name=pnd,proto3" json:"pnd,omitempty"` + Mne *ManagedNetworkElement `protobuf:"bytes,3,opt,name=mne,proto3" json:"mne,omitempty"` +} + +func (x *GetMneResponse) Reset() { + *x = GetMneResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMneResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMneResponse) ProtoMessage() {} + +func (x *GetMneResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMneResponse.ProtoReflect.Descriptor instead. +func (*GetMneResponse) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} +} + +func (x *GetMneResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *GetMneResponse) GetPnd() *PrincipalNetworkDomain { + if x != nil { + return x.Pnd + } + return nil +} + +func (x *GetMneResponse) GetMne() *ManagedNetworkElement { + if x != nil { + return x.Mne + } + return nil +} + +type SetMne struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Sbi *southbound.SouthboundInterface `protobuf:"bytes,2,opt,name=sbi,proto3" json:"sbi,omitempty"` + MneName string `protobuf:"bytes,3,opt,name=mne_name,json=mneName,proto3" json:"mne_name,omitempty"` + TransportOption *transport.TransportOption `protobuf:"bytes,4,opt,name=transport_option,json=transportOption,proto3" json:"transport_option,omitempty"` +} + +func (x *SetMne) Reset() { + *x = SetMne{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetMne) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetMne) ProtoMessage() {} + +func (x *SetMne) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetMne.ProtoReflect.Descriptor instead. +func (*SetMne) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} +} + +func (x *SetMne) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *SetMne) GetSbi() *southbound.SouthboundInterface { + if x != nil { + return x.Sbi + } + return nil +} + +func (x *SetMne) GetMneName() string { + if x != nil { + return x.MneName + } + return "" +} + +func (x *SetMne) GetTransportOption() *transport.TransportOption { + if x != nil { + return x.TransportOption + } + return nil +} + +type SetMneListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Mne []*SetMne `protobuf:"bytes,2,rep,name=mne,proto3" json:"mne,omitempty"` + Pid string `protobuf:"bytes,3,opt,name=pid,proto3" json:"pid,omitempty"` +} + +func (x *SetMneListRequest) Reset() { + *x = SetMneListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetMneListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetMneListRequest) ProtoMessage() {} + +func (x *SetMneListRequest) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetMneListRequest.ProtoReflect.Descriptor instead. +func (*SetMneListRequest) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} +} + +func (x *SetMneListRequest) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *SetMneListRequest) GetMne() []*SetMne { + if x != nil { + return x.Mne + } + return nil +} + +func (x *SetMneListRequest) GetPid() string { + if x != nil { + return x.Pid + } + return "" +} + +type SetMneListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Timestamp in nanoseconds since Epoch. + Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=gosdn.networkelement.Status" json:"status,omitempty"` + Responses []*SetResponse `protobuf:"bytes,3,rep,name=responses,proto3" json:"responses,omitempty"` +} + +func (x *SetMneListResponse) Reset() { + *x = SetMneListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetMneListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetMneListResponse) ProtoMessage() {} + +func (x *SetMneListResponse) ProtoReflect() protoreflect.Message { + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetMneListResponse.ProtoReflect.Descriptor instead. +func (*SetMneListResponse) Descriptor() ([]byte, []int) { + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} +} + +func (x *SetMneListResponse) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *SetMneListResponse) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_STATUS_UNSPECIFIED +} + +func (x *SetMneListResponse) GetResponses() []*SetResponse { + if x != nil { return x.Responses } return nil @@ -1070,7 +1812,7 @@ type GetPathRequest struct { func (x *GetPathRequest) Reset() { *x = GetPathRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1083,7 +1825,7 @@ func (x *GetPathRequest) String() string { func (*GetPathRequest) ProtoMessage() {} func (x *GetPathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[11] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1096,7 +1838,7 @@ func (x *GetPathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathRequest.ProtoReflect.Descriptor instead. func (*GetPathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{11} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} } func (x *GetPathRequest) GetTimestamp() int64 { @@ -1142,7 +1884,7 @@ type GetPathResponse struct { func (x *GetPathResponse) Reset() { *x = GetPathResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1155,7 +1897,7 @@ func (x *GetPathResponse) String() string { func (*GetPathResponse) ProtoMessage() {} func (x *GetPathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[12] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1168,7 +1910,7 @@ func (x *GetPathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPathResponse.ProtoReflect.Descriptor instead. func (*GetPathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{12} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} } func (x *GetPathResponse) GetTimestamp() int64 { @@ -1205,7 +1947,7 @@ type SetResponse struct { func (x *SetResponse) Reset() { *x = SetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1218,7 +1960,7 @@ func (x *SetResponse) String() string { func (*SetResponse) ProtoMessage() {} func (x *SetResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[13] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1231,7 +1973,7 @@ func (x *SetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetResponse.ProtoReflect.Descriptor instead. func (*SetResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{13} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} } func (x *SetResponse) GetTimestamp() int64 { @@ -1268,7 +2010,7 @@ type SetPathListRequest struct { func (x *SetPathListRequest) Reset() { *x = SetPathListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1281,7 +2023,7 @@ func (x *SetPathListRequest) String() string { func (*SetPathListRequest) ProtoMessage() {} func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[14] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1294,7 +2036,7 @@ func (x *SetPathListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListRequest.ProtoReflect.Descriptor instead. func (*SetPathListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{14} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} } func (x *SetPathListRequest) GetTimestamp() int64 { @@ -1331,7 +2073,7 @@ type SetPathListResponse struct { func (x *SetPathListResponse) Reset() { *x = SetPathListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1344,7 +2086,7 @@ func (x *SetPathListResponse) String() string { func (*SetPathListResponse) ProtoMessage() {} func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[15] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1357,7 +2099,7 @@ func (x *SetPathListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPathListResponse.ProtoReflect.Descriptor instead. func (*SetPathListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{15} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} } func (x *SetPathListResponse) GetTimestamp() int64 { @@ -1394,7 +2136,7 @@ type DeleteMneRequest struct { func (x *DeleteMneRequest) Reset() { *x = DeleteMneRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1407,7 +2149,7 @@ func (x *DeleteMneRequest) String() string { func (*DeleteMneRequest) ProtoMessage() {} func (x *DeleteMneRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[16] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1420,7 +2162,7 @@ func (x *DeleteMneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMneRequest.ProtoReflect.Descriptor instead. func (*DeleteMneRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{16} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} } func (x *DeleteMneRequest) GetTimestamp() int64 { @@ -1456,7 +2198,7 @@ type DeleteMneResponse struct { func (x *DeleteMneResponse) Reset() { *x = DeleteMneResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1469,7 +2211,7 @@ func (x *DeleteMneResponse) String() string { func (*DeleteMneResponse) ProtoMessage() {} func (x *DeleteMneResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[17] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1482,7 +2224,7 @@ func (x *DeleteMneResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteMneResponse.ProtoReflect.Descriptor instead. func (*DeleteMneResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{17} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} } func (x *DeleteMneResponse) GetTimestamp() int64 { @@ -1513,7 +2255,7 @@ type Change struct { func (x *Change) Reset() { *x = Change{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1526,7 +2268,7 @@ func (x *Change) String() string { func (*Change) ProtoMessage() {} func (x *Change) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[18] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1539,7 +2281,7 @@ func (x *Change) ProtoReflect() protoreflect.Message { // Deprecated: Use Change.ProtoReflect.Descriptor instead. func (*Change) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{18} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} } func (x *Change) GetId() string { @@ -1585,7 +2327,7 @@ type ChangeRequest struct { func (x *ChangeRequest) Reset() { *x = ChangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1598,7 +2340,7 @@ func (x *ChangeRequest) String() string { func (*ChangeRequest) ProtoMessage() {} func (x *ChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[19] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1611,7 +2353,7 @@ func (x *ChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRequest.ProtoReflect.Descriptor instead. func (*ChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{19} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{31} } func (x *ChangeRequest) GetMneid() string { @@ -1654,7 +2396,7 @@ type SetChange struct { func (x *SetChange) Reset() { *x = SetChange{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1667,7 +2409,7 @@ func (x *SetChange) String() string { func (*SetChange) ProtoMessage() {} func (x *SetChange) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[20] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1680,7 +2422,7 @@ func (x *SetChange) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChange.ProtoReflect.Descriptor instead. func (*SetChange) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{20} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{32} } func (x *SetChange) GetCuid() string { @@ -1709,7 +2451,7 @@ type GetChangeListRequest struct { func (x *GetChangeListRequest) Reset() { *x = GetChangeListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1722,7 +2464,7 @@ func (x *GetChangeListRequest) String() string { func (*GetChangeListRequest) ProtoMessage() {} func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[21] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1735,7 +2477,7 @@ func (x *GetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListRequest.ProtoReflect.Descriptor instead. func (*GetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{21} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{33} } func (x *GetChangeListRequest) GetTimestamp() int64 { @@ -1767,7 +2509,7 @@ type GetChangeListResponse struct { func (x *GetChangeListResponse) Reset() { *x = GetChangeListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1780,7 +2522,7 @@ func (x *GetChangeListResponse) String() string { func (*GetChangeListResponse) ProtoMessage() {} func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[22] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1793,7 +2535,7 @@ func (x *GetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeListResponse.ProtoReflect.Descriptor instead. func (*GetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{22} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{34} } func (x *GetChangeListResponse) GetTimestamp() int64 { @@ -1830,7 +2572,7 @@ type GetChangeRequest struct { func (x *GetChangeRequest) Reset() { *x = GetChangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1843,7 +2585,7 @@ func (x *GetChangeRequest) String() string { func (*GetChangeRequest) ProtoMessage() {} func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[23] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1856,7 +2598,7 @@ func (x *GetChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeRequest.ProtoReflect.Descriptor instead. func (*GetChangeRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{23} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{35} } func (x *GetChangeRequest) GetTimestamp() int64 { @@ -1895,7 +2637,7 @@ type GetChangeResponse struct { func (x *GetChangeResponse) Reset() { *x = GetChangeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1908,7 +2650,7 @@ func (x *GetChangeResponse) String() string { func (*GetChangeResponse) ProtoMessage() {} func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[24] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1921,7 +2663,7 @@ func (x *GetChangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetChangeResponse.ProtoReflect.Descriptor instead. func (*GetChangeResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{24} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{36} } func (x *GetChangeResponse) GetTimestamp() int64 { @@ -1958,7 +2700,7 @@ type SetChangeListRequest struct { func (x *SetChangeListRequest) Reset() { *x = SetChangeListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1971,7 +2713,7 @@ func (x *SetChangeListRequest) String() string { func (*SetChangeListRequest) ProtoMessage() {} func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[25] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1984,7 +2726,7 @@ func (x *SetChangeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListRequest.ProtoReflect.Descriptor instead. func (*SetChangeListRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{25} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{37} } func (x *SetChangeListRequest) GetTimestamp() int64 { @@ -2021,7 +2763,7 @@ type SetChangeListResponse struct { func (x *SetChangeListResponse) Reset() { *x = SetChangeListResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2034,7 +2776,7 @@ func (x *SetChangeListResponse) String() string { func (*SetChangeListResponse) ProtoMessage() {} func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[26] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2047,7 +2789,7 @@ func (x *SetChangeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetChangeListResponse.ProtoReflect.Descriptor instead. func (*SetChangeListResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{26} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{38} } func (x *SetChangeListResponse) GetTimestamp() int64 { @@ -2085,7 +2827,7 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2098,7 +2840,7 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[27] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2111,7 +2853,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{27} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{39} } func (x *SubscriptionList) GetSubscription() []*Subscription { @@ -2141,7 +2883,7 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2154,7 +2896,7 @@ func (x *Subscription) String() string { func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[28] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2167,7 +2909,7 @@ func (x *Subscription) ProtoReflect() protoreflect.Message { // Deprecated: Use Subscription.ProtoReflect.Descriptor instead. func (*Subscription) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{28} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{40} } func (x *Subscription) GetPath() string { @@ -2205,7 +2947,7 @@ type SubscribePathRequest struct { func (x *SubscribePathRequest) Reset() { *x = SubscribePathRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2218,7 +2960,7 @@ func (x *SubscribePathRequest) String() string { func (*SubscribePathRequest) ProtoMessage() {} func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[29] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2231,7 +2973,7 @@ func (x *SubscribePathRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathRequest.ProtoReflect.Descriptor instead. func (*SubscribePathRequest) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{29} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{41} } func (x *SubscribePathRequest) GetTimestamp() int64 { @@ -2275,7 +3017,7 @@ type SubscribePathResponse struct { func (x *SubscribePathResponse) Reset() { *x = SubscribePathResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2288,7 +3030,7 @@ func (x *SubscribePathResponse) String() string { func (*SubscribePathResponse) ProtoMessage() {} func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { - mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[30] + mi := &file_gosdn_networkelement_networkelement_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2301,7 +3043,7 @@ func (x *SubscribePathResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribePathResponse.ProtoReflect.Descriptor instead. func (*SubscribePathResponse) Descriptor() ([]byte, []int) { - return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{30} + return file_gosdn_networkelement_networkelement_proto_rawDescGZIP(), []int{42} } func (x *SubscribePathResponse) GetTimestamp() int64 { @@ -2348,194 +3090,326 @@ var file_gosdn_networkelement_networkelement_proto_rawDesc = []byte{ 0x6f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe9, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf2, 0x01, 0x0a, 0x1e, 0x41, 0x64, 0x64, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x30, 0x0a, 0x14, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, + 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa9, 0x01, 0x0a, 0x18, + 0x41, 0x64, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5d, 0x0a, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x9d, 0x01, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, + 0xbe, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x3b, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc1, 0x01, + 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x8a, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x4d, 0x0a, 0x0f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x72, + 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x69, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x72, 0x0a, + 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0xad, 0x01, 0x0a, 0x0e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2b, + 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0xac, 0x02, 0x0a, 0x15, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x2b, 0x0a, + 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x56, 0x0a, 0x1e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x5e, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, + 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xb1, 0x01, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, + 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, + 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x65, 0x64, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, + 0x46, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x55, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x6e, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xad, + 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, + 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0xc3, + 0x01, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x34, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x56, 0x0a, 0x1e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x62, 0x69, 0x22, 0x5e, 0x0a, 0x16, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, - 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, - 0xb1, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, - 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, - 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, - 0x6d, 0x6e, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, - 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, - 0x64, 0x12, 0x46, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x22, 0x55, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x22, 0xad, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x19, 0x0a, 0x08, + 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, + 0x6e, 0x65, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x12, 0x53, 0x65, + 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, - 0x64, 0x12, 0x3d, 0x0a, 0x03, 0x6d, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x6a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, + 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, + 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x74, + 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x03, 0x6d, 0x6e, 0x65, - 0x22, 0xc3, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, 0x03, 0x73, 0x62, 0x69, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x73, 0x6f, 0x75, 0x74, 0x68, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x03, 0x73, 0x62, 0x69, 0x12, 0x19, - 0x0a, 0x08, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x10, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x6e, 0x65, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, - 0x74, 0x4d, 0x6e, 0x65, 0x52, 0x03, 0x6d, 0x6e, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x12, - 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x6a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x58, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x22, + 0x67, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x06, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, + 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x61, 0x70, 0x69, 0x5f, + 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x61, 0x70, + 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x46, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xab, 0x01, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x50, - 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4a, 0x0a, 0x0e, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x13, 0x53, - 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x58, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x6e, 0x65, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, - 0x64, 0x22, 0x67, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x06, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x26, 0x0a, 0x04, 0x64, 0x69, 0x66, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, - 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x61, 0x70, - 0x69, 0x5f, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x41, 0x70, 0x69, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x61, 0x70, 0x69, 0x4f, 0x70, 0x22, 0x50, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x75, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x46, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x10, 0x0a, - 0x03, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, - 0xab, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, 0x75, 0x69, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, @@ -2544,221 +3418,240 @@ var file_gosdn_networkelement_networkelement_proto_rawDesc = []byte{ 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x56, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xa7, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x70, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x70, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, - 0x7f, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x22, 0xac, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x7f, 0x0a, + 0x14, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0xac, + 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x96, 0x01, + 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, - 0x96, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x41, 0x0a, - 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x9e, 0x01, 0x0a, 0x14, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x41, 0x0a, 0x0b, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x9e, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, + 0x6e, 0x65, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x15, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, - 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, - 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, - 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, - 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, - 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, - 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, - 0x10, 0x03, 0x2a, 0x8b, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, - 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, - 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, - 0x4f, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, - 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, - 0x41, 0x4d, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, - 0x2a, 0x7c, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, - 0x0a, 0x17, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, - 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, - 0x54, 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, - 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, - 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0x8e, - 0x0b, 0x0a, 0x15, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, - 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x67, 0x6f, 0x73, - 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x6e, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, - 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4d, 0x6e, - 0x65, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, - 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, 0x12, 0x7c, 0x0a, - 0x0a, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, + 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x6d, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6e, 0x6d, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x6d, 0x6e, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x41, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x9c, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x52, 0x4d, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, + 0x53, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x2a, 0x7c, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x50, 0x49, 0x5f, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x41, + 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x10, 0x03, + 0x2a, 0x8b, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, + 0x43, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, + 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x03, 0x2a, 0x7c, + 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, + 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x52, + 0x45, 0x41, 0x4d, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x4e, + 0x47, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x4d, + 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x03, 0x32, 0xc4, 0x0f, 0x0a, + 0x15, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x2e, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, - 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, - 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x70, - 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, - 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2f, 0x7b, 0x70, 0x61, - 0x74, 0x68, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, - 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, - 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x7e, 0x0a, 0x09, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, + 0x12, 0x14, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x6c, 0x12, 0x93, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x5f, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x4d, 0x6e, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x65, 0x64, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x70, 0x6e, 0x64, 0x73, + 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x06, 0x47, + 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x6f, 0x73, + 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, + 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, + 0x7d, 0x12, 0x7c, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x2a, 0x18, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, - 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, + 0x53, 0x65, 0x74, 0x4d, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, + 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x12, + 0x85, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x2e, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, + 0x12, 0x25, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, + 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x2f, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x50, + 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, + 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, + 0x7e, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x12, 0x26, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, + 0x64, 0x7d, 0x2f, 0x6d, 0x6e, 0x65, 0x73, 0x2f, 0x7b, 0x6d, 0x6e, 0x65, 0x69, 0x64, 0x7d, 0x12, + 0x85, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x15, 0x12, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x6f, 0x73, 0x64, - 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x70, 0x6e, 0x64, - 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2f, - 0x7b, 0x63, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x63, 0x75, 0x69, 0x64, 0x7d, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x53, + 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x2e, 0x67, + 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x70, - 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, + 0x22, 0x13, 0x2f, 0x70, 0x6e, 0x64, 0x73, 0x2f, 0x7b, 0x70, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, - 0x3a, 0x5a, 0x38, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, 0x68, 0x2d, 0x64, 0x61, - 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, 0x2f, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x69, 0x62, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x30, 0x01, 0x42, 0x3a, 0x5a, 0x38, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x62, 0x69, 0x2e, + 0x68, 0x2d, 0x64, 0x61, 0x2e, 0x64, 0x65, 0x2f, 0x64, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x67, 0x6f, + 0x73, 0x64, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x6f, 0x73, 0x64, 0x6e, + 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2774,7 +3667,7 @@ func file_gosdn_networkelement_networkelement_proto_rawDescGZIP() []byte { } var file_gosdn_networkelement_networkelement_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 31) +var file_gosdn_networkelement_networkelement_proto_msgTypes = make([]protoimpl.MessageInfo, 43) var file_gosdn_networkelement_networkelement_proto_goTypes = []interface{}{ (Status)(0), // 0: gosdn.networkelement.Status (ChangeState)(0), // 1: gosdn.networkelement.ChangeState @@ -2782,108 +3675,140 @@ var file_gosdn_networkelement_networkelement_proto_goTypes = []interface{}{ (Operation)(0), // 3: gosdn.networkelement.Operation (SubscriptionMode)(0), // 4: gosdn.networkelement.SubscriptionMode (StreamMode)(0), // 5: gosdn.networkelement.StreamMode - (*ManagedNetworkElement)(nil), // 6: gosdn.networkelement.ManagedNetworkElement - (*FlattenedManagedNetworkElement)(nil), // 7: gosdn.networkelement.FlattenedManagedNetworkElement - (*PrincipalNetworkDomain)(nil), // 8: gosdn.networkelement.PrincipalNetworkDomain - (*GetMneListRequest)(nil), // 9: gosdn.networkelement.GetMneListRequest - (*GetMneListResponse)(nil), // 10: gosdn.networkelement.GetMneListResponse - (*GetFlattenedMneListResponse)(nil), // 11: gosdn.networkelement.GetFlattenedMneListResponse - (*GetMneRequest)(nil), // 12: gosdn.networkelement.GetMneRequest - (*GetMneResponse)(nil), // 13: gosdn.networkelement.GetMneResponse - (*SetMne)(nil), // 14: gosdn.networkelement.SetMne - (*SetMneListRequest)(nil), // 15: gosdn.networkelement.SetMneListRequest - (*SetMneListResponse)(nil), // 16: gosdn.networkelement.SetMneListResponse - (*GetPathRequest)(nil), // 17: gosdn.networkelement.GetPathRequest - (*GetPathResponse)(nil), // 18: gosdn.networkelement.GetPathResponse - (*SetResponse)(nil), // 19: gosdn.networkelement.SetResponse - (*SetPathListRequest)(nil), // 20: gosdn.networkelement.SetPathListRequest - (*SetPathListResponse)(nil), // 21: gosdn.networkelement.SetPathListResponse - (*DeleteMneRequest)(nil), // 22: gosdn.networkelement.DeleteMneRequest - (*DeleteMneResponse)(nil), // 23: gosdn.networkelement.DeleteMneResponse - (*Change)(nil), // 24: gosdn.networkelement.Change - (*ChangeRequest)(nil), // 25: gosdn.networkelement.ChangeRequest - (*SetChange)(nil), // 26: gosdn.networkelement.SetChange - (*GetChangeListRequest)(nil), // 27: gosdn.networkelement.GetChangeListRequest - (*GetChangeListResponse)(nil), // 28: gosdn.networkelement.GetChangeListResponse - (*GetChangeRequest)(nil), // 29: gosdn.networkelement.GetChangeRequest - (*GetChangeResponse)(nil), // 30: gosdn.networkelement.GetChangeResponse - (*SetChangeListRequest)(nil), // 31: gosdn.networkelement.SetChangeListRequest - (*SetChangeListResponse)(nil), // 32: gosdn.networkelement.SetChangeListResponse - (*SubscriptionList)(nil), // 33: gosdn.networkelement.SubscriptionList - (*Subscription)(nil), // 34: gosdn.networkelement.Subscription - (*SubscribePathRequest)(nil), // 35: gosdn.networkelement.SubscribePathRequest - (*SubscribePathResponse)(nil), // 36: gosdn.networkelement.SubscribePathResponse - (*gnmi.Notification)(nil), // 37: gnmi.Notification - (*southbound.SouthboundInterface)(nil), // 38: gosdn.southbound.SouthboundInterface - (*conflict.Metadata)(nil), // 39: gosdn.conflict.Metadata - (*transport.TransportOption)(nil), // 40: gosdn.transport.TransportOption + (*AddNetworkElementConfiguration)(nil), // 6: gosdn.networkelement.AddNetworkElementConfiguration + (*AddNetworkElementRequest)(nil), // 7: gosdn.networkelement.AddNetworkElementRequest + (*AddNetworkElementResponse)(nil), // 8: gosdn.networkelement.AddNetworkElementResponse + (*GetNetworkElementRequest)(nil), // 9: gosdn.networkelement.GetNetworkElementRequest + (*GetNetworkElementResponse)(nil), // 10: gosdn.networkelement.GetNetworkElementResponse + (*GetAllNetworkElementRequest)(nil), // 11: gosdn.networkelement.GetAllNetworkElementRequest + (*GetAllNetworkElementResponse)(nil), // 12: gosdn.networkelement.GetAllNetworkElementResponse + (*UpdateNetworkElementRequest)(nil), // 13: gosdn.networkelement.UpdateNetworkElementRequest + (*UpdateNetworkElementResponse)(nil), // 14: gosdn.networkelement.UpdateNetworkElementResponse + (*DeleteNetworkElementRequest)(nil), // 15: gosdn.networkelement.DeleteNetworkElementRequest + (*DeleteNetworkElementResponse)(nil), // 16: gosdn.networkelement.DeleteNetworkElementResponse + (*NetworkElement)(nil), // 17: gosdn.networkelement.NetworkElement + (*ManagedNetworkElement)(nil), // 18: gosdn.networkelement.ManagedNetworkElement + (*FlattenedManagedNetworkElement)(nil), // 19: gosdn.networkelement.FlattenedManagedNetworkElement + (*PrincipalNetworkDomain)(nil), // 20: gosdn.networkelement.PrincipalNetworkDomain + (*GetMneListRequest)(nil), // 21: gosdn.networkelement.GetMneListRequest + (*GetMneListResponse)(nil), // 22: gosdn.networkelement.GetMneListResponse + (*GetFlattenedMneListResponse)(nil), // 23: gosdn.networkelement.GetFlattenedMneListResponse + (*GetMneRequest)(nil), // 24: gosdn.networkelement.GetMneRequest + (*GetMneResponse)(nil), // 25: gosdn.networkelement.GetMneResponse + (*SetMne)(nil), // 26: gosdn.networkelement.SetMne + (*SetMneListRequest)(nil), // 27: gosdn.networkelement.SetMneListRequest + (*SetMneListResponse)(nil), // 28: gosdn.networkelement.SetMneListResponse + (*GetPathRequest)(nil), // 29: gosdn.networkelement.GetPathRequest + (*GetPathResponse)(nil), // 30: gosdn.networkelement.GetPathResponse + (*SetResponse)(nil), // 31: gosdn.networkelement.SetResponse + (*SetPathListRequest)(nil), // 32: gosdn.networkelement.SetPathListRequest + (*SetPathListResponse)(nil), // 33: gosdn.networkelement.SetPathListResponse + (*DeleteMneRequest)(nil), // 34: gosdn.networkelement.DeleteMneRequest + (*DeleteMneResponse)(nil), // 35: gosdn.networkelement.DeleteMneResponse + (*Change)(nil), // 36: gosdn.networkelement.Change + (*ChangeRequest)(nil), // 37: gosdn.networkelement.ChangeRequest + (*SetChange)(nil), // 38: gosdn.networkelement.SetChange + (*GetChangeListRequest)(nil), // 39: gosdn.networkelement.GetChangeListRequest + (*GetChangeListResponse)(nil), // 40: gosdn.networkelement.GetChangeListResponse + (*GetChangeRequest)(nil), // 41: gosdn.networkelement.GetChangeRequest + (*GetChangeResponse)(nil), // 42: gosdn.networkelement.GetChangeResponse + (*SetChangeListRequest)(nil), // 43: gosdn.networkelement.SetChangeListRequest + (*SetChangeListResponse)(nil), // 44: gosdn.networkelement.SetChangeListResponse + (*SubscriptionList)(nil), // 45: gosdn.networkelement.SubscriptionList + (*Subscription)(nil), // 46: gosdn.networkelement.Subscription + (*SubscribePathRequest)(nil), // 47: gosdn.networkelement.SubscribePathRequest + (*SubscribePathResponse)(nil), // 48: gosdn.networkelement.SubscribePathResponse + (*southbound.SouthboundInterface)(nil), // 49: gosdn.southbound.SouthboundInterface + (*transport.TransportOption)(nil), // 50: gosdn.transport.TransportOption + (*conflict.Metadata)(nil), // 51: gosdn.conflict.Metadata + (*gnmi.Notification)(nil), // 52: gnmi.Notification } var file_gosdn_networkelement_networkelement_proto_depIdxs = []int32{ - 37, // 0: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification - 38, // 1: gosdn.networkelement.ManagedNetworkElement.sbi:type_name -> gosdn.southbound.SouthboundInterface - 39, // 2: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata - 8, // 3: gosdn.networkelement.GetMneListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 6, // 4: gosdn.networkelement.GetMneListResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 8, // 5: gosdn.networkelement.GetFlattenedMneListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 7, // 6: gosdn.networkelement.GetFlattenedMneListResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement - 8, // 7: gosdn.networkelement.GetMneResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 6, // 8: gosdn.networkelement.GetMneResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement - 38, // 9: gosdn.networkelement.SetMne.sbi:type_name -> gosdn.southbound.SouthboundInterface - 40, // 10: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption - 14, // 11: gosdn.networkelement.SetMneListRequest.mne:type_name -> gosdn.networkelement.SetMne - 0, // 12: gosdn.networkelement.SetMneListResponse.status:type_name -> gosdn.networkelement.Status - 19, // 13: gosdn.networkelement.SetMneListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 8, // 14: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 37, // 15: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification - 0, // 16: gosdn.networkelement.SetResponse.status:type_name -> gosdn.networkelement.Status - 25, // 17: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest - 0, // 18: gosdn.networkelement.SetPathListResponse.status:type_name -> gosdn.networkelement.Status - 19, // 19: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 0, // 20: gosdn.networkelement.DeleteMneResponse.status:type_name -> gosdn.networkelement.Status - 1, // 21: gosdn.networkelement.Change.state:type_name -> gosdn.networkelement.ChangeState - 37, // 22: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification - 2, // 23: gosdn.networkelement.ChangeRequest.api_op:type_name -> gosdn.networkelement.ApiOperation - 3, // 24: gosdn.networkelement.SetChange.op:type_name -> gosdn.networkelement.Operation - 8, // 25: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 24, // 26: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change - 8, // 27: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain - 24, // 28: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change - 26, // 29: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange - 0, // 30: gosdn.networkelement.SetChangeListResponse.status:type_name -> gosdn.networkelement.Status - 19, // 31: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse - 34, // 32: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription - 4, // 33: gosdn.networkelement.SubscriptionList.mode:type_name -> gosdn.networkelement.SubscriptionMode - 5, // 34: gosdn.networkelement.Subscription.stream_mode:type_name -> gosdn.networkelement.StreamMode - 33, // 35: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList - 0, // 36: gosdn.networkelement.SubscribePathResponse.status:type_name -> gosdn.networkelement.Status - 37, // 37: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification - 9, // 38: gosdn.networkelement.NetworkElementService.GetMneList:input_type -> gosdn.networkelement.GetMneListRequest - 9, // 39: gosdn.networkelement.NetworkElementService.GetFlattenedMneList:input_type -> gosdn.networkelement.GetMneListRequest - 12, // 40: gosdn.networkelement.NetworkElementService.GetMne:input_type -> gosdn.networkelement.GetMneRequest - 15, // 41: gosdn.networkelement.NetworkElementService.SetMneList:input_type -> gosdn.networkelement.SetMneListRequest - 17, // 42: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest - 20, // 43: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest - 22, // 44: gosdn.networkelement.NetworkElementService.DeleteMne:input_type -> gosdn.networkelement.DeleteMneRequest - 27, // 45: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest - 29, // 46: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest - 31, // 47: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest - 35, // 48: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest - 10, // 49: gosdn.networkelement.NetworkElementService.GetMneList:output_type -> gosdn.networkelement.GetMneListResponse - 11, // 50: gosdn.networkelement.NetworkElementService.GetFlattenedMneList:output_type -> gosdn.networkelement.GetFlattenedMneListResponse - 13, // 51: gosdn.networkelement.NetworkElementService.GetMne:output_type -> gosdn.networkelement.GetMneResponse - 16, // 52: gosdn.networkelement.NetworkElementService.SetMneList:output_type -> gosdn.networkelement.SetMneListResponse - 18, // 53: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse - 21, // 54: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse - 23, // 55: gosdn.networkelement.NetworkElementService.DeleteMne:output_type -> gosdn.networkelement.DeleteMneResponse - 28, // 56: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse - 30, // 57: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse - 32, // 58: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse - 36, // 59: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse - 49, // [49:60] is the sub-list for method output_type - 38, // [38:49] is the sub-list for method input_type - 38, // [38:38] is the sub-list for extension type_name - 38, // [38:38] is the sub-list for extension extendee - 0, // [0:38] is the sub-list for field type_name + 49, // 0: gosdn.networkelement.AddNetworkElementConfiguration.sbi:type_name -> gosdn.southbound.SouthboundInterface + 50, // 1: gosdn.networkelement.AddNetworkElementConfiguration.transport_option:type_name -> gosdn.transport.TransportOption + 6, // 2: gosdn.networkelement.AddNetworkElementRequest.network_element:type_name -> gosdn.networkelement.AddNetworkElementConfiguration + 0, // 3: gosdn.networkelement.AddNetworkElementResponse.status:type_name -> gosdn.networkelement.Status + 0, // 4: gosdn.networkelement.GetNetworkElementResponse.status:type_name -> gosdn.networkelement.Status + 17, // 5: gosdn.networkelement.GetNetworkElementResponse.network_element:type_name -> gosdn.networkelement.NetworkElement + 0, // 6: gosdn.networkelement.GetAllNetworkElementResponse.status:type_name -> gosdn.networkelement.Status + 17, // 7: gosdn.networkelement.GetAllNetworkElementResponse.network_element:type_name -> gosdn.networkelement.NetworkElement + 17, // 8: gosdn.networkelement.UpdateNetworkElementRequest.network_element:type_name -> gosdn.networkelement.NetworkElement + 0, // 9: gosdn.networkelement.UpdateNetworkElementResponse.status:type_name -> gosdn.networkelement.Status + 0, // 10: gosdn.networkelement.DeleteNetworkElementResponse.status:type_name -> gosdn.networkelement.Status + 51, // 11: gosdn.networkelement.NetworkElement.metadata:type_name -> gosdn.conflict.Metadata + 52, // 12: gosdn.networkelement.ManagedNetworkElement.mne_notification:type_name -> gnmi.Notification + 49, // 13: gosdn.networkelement.ManagedNetworkElement.sbi:type_name -> gosdn.southbound.SouthboundInterface + 51, // 14: gosdn.networkelement.ManagedNetworkElement.metadata:type_name -> gosdn.conflict.Metadata + 20, // 15: gosdn.networkelement.GetMneListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 18, // 16: gosdn.networkelement.GetMneListResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement + 20, // 17: gosdn.networkelement.GetFlattenedMneListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 19, // 18: gosdn.networkelement.GetFlattenedMneListResponse.mne:type_name -> gosdn.networkelement.FlattenedManagedNetworkElement + 20, // 19: gosdn.networkelement.GetMneResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 18, // 20: gosdn.networkelement.GetMneResponse.mne:type_name -> gosdn.networkelement.ManagedNetworkElement + 49, // 21: gosdn.networkelement.SetMne.sbi:type_name -> gosdn.southbound.SouthboundInterface + 50, // 22: gosdn.networkelement.SetMne.transport_option:type_name -> gosdn.transport.TransportOption + 26, // 23: gosdn.networkelement.SetMneListRequest.mne:type_name -> gosdn.networkelement.SetMne + 0, // 24: gosdn.networkelement.SetMneListResponse.status:type_name -> gosdn.networkelement.Status + 31, // 25: gosdn.networkelement.SetMneListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 20, // 26: gosdn.networkelement.GetPathResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 52, // 27: gosdn.networkelement.GetPathResponse.mne_notification:type_name -> gnmi.Notification + 0, // 28: gosdn.networkelement.SetResponse.status:type_name -> gosdn.networkelement.Status + 37, // 29: gosdn.networkelement.SetPathListRequest.change_request:type_name -> gosdn.networkelement.ChangeRequest + 0, // 30: gosdn.networkelement.SetPathListResponse.status:type_name -> gosdn.networkelement.Status + 31, // 31: gosdn.networkelement.SetPathListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 0, // 32: gosdn.networkelement.DeleteMneResponse.status:type_name -> gosdn.networkelement.Status + 1, // 33: gosdn.networkelement.Change.state:type_name -> gosdn.networkelement.ChangeState + 52, // 34: gosdn.networkelement.Change.diff:type_name -> gnmi.Notification + 2, // 35: gosdn.networkelement.ChangeRequest.api_op:type_name -> gosdn.networkelement.ApiOperation + 3, // 36: gosdn.networkelement.SetChange.op:type_name -> gosdn.networkelement.Operation + 20, // 37: gosdn.networkelement.GetChangeListResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 36, // 38: gosdn.networkelement.GetChangeListResponse.change:type_name -> gosdn.networkelement.Change + 20, // 39: gosdn.networkelement.GetChangeResponse.pnd:type_name -> gosdn.networkelement.PrincipalNetworkDomain + 36, // 40: gosdn.networkelement.GetChangeResponse.change:type_name -> gosdn.networkelement.Change + 38, // 41: gosdn.networkelement.SetChangeListRequest.change:type_name -> gosdn.networkelement.SetChange + 0, // 42: gosdn.networkelement.SetChangeListResponse.status:type_name -> gosdn.networkelement.Status + 31, // 43: gosdn.networkelement.SetChangeListResponse.responses:type_name -> gosdn.networkelement.SetResponse + 46, // 44: gosdn.networkelement.SubscriptionList.subscription:type_name -> gosdn.networkelement.Subscription + 4, // 45: gosdn.networkelement.SubscriptionList.mode:type_name -> gosdn.networkelement.SubscriptionMode + 5, // 46: gosdn.networkelement.Subscription.stream_mode:type_name -> gosdn.networkelement.StreamMode + 45, // 47: gosdn.networkelement.SubscribePathRequest.sublist:type_name -> gosdn.networkelement.SubscriptionList + 0, // 48: gosdn.networkelement.SubscribePathResponse.status:type_name -> gosdn.networkelement.Status + 52, // 49: gosdn.networkelement.SubscribePathResponse.mne_notification:type_name -> gnmi.Notification + 7, // 50: gosdn.networkelement.NetworkElementService.Add:input_type -> gosdn.networkelement.AddNetworkElementRequest + 9, // 51: gosdn.networkelement.NetworkElementService.Get:input_type -> gosdn.networkelement.GetNetworkElementRequest + 11, // 52: gosdn.networkelement.NetworkElementService.GetAll:input_type -> gosdn.networkelement.GetAllNetworkElementRequest + 13, // 53: gosdn.networkelement.NetworkElementService.Update:input_type -> gosdn.networkelement.UpdateNetworkElementRequest + 21, // 54: gosdn.networkelement.NetworkElementService.GetMneList:input_type -> gosdn.networkelement.GetMneListRequest + 21, // 55: gosdn.networkelement.NetworkElementService.GetFlattenedMneList:input_type -> gosdn.networkelement.GetMneListRequest + 24, // 56: gosdn.networkelement.NetworkElementService.GetMne:input_type -> gosdn.networkelement.GetMneRequest + 27, // 57: gosdn.networkelement.NetworkElementService.SetMneList:input_type -> gosdn.networkelement.SetMneListRequest + 29, // 58: gosdn.networkelement.NetworkElementService.GetPath:input_type -> gosdn.networkelement.GetPathRequest + 32, // 59: gosdn.networkelement.NetworkElementService.SetPathList:input_type -> gosdn.networkelement.SetPathListRequest + 34, // 60: gosdn.networkelement.NetworkElementService.DeleteMne:input_type -> gosdn.networkelement.DeleteMneRequest + 39, // 61: gosdn.networkelement.NetworkElementService.GetChangeList:input_type -> gosdn.networkelement.GetChangeListRequest + 41, // 62: gosdn.networkelement.NetworkElementService.GetChange:input_type -> gosdn.networkelement.GetChangeRequest + 43, // 63: gosdn.networkelement.NetworkElementService.SetChangeList:input_type -> gosdn.networkelement.SetChangeListRequest + 47, // 64: gosdn.networkelement.NetworkElementService.SubscribePath:input_type -> gosdn.networkelement.SubscribePathRequest + 8, // 65: gosdn.networkelement.NetworkElementService.Add:output_type -> gosdn.networkelement.AddNetworkElementResponse + 10, // 66: gosdn.networkelement.NetworkElementService.Get:output_type -> gosdn.networkelement.GetNetworkElementResponse + 12, // 67: gosdn.networkelement.NetworkElementService.GetAll:output_type -> gosdn.networkelement.GetAllNetworkElementResponse + 14, // 68: gosdn.networkelement.NetworkElementService.Update:output_type -> gosdn.networkelement.UpdateNetworkElementResponse + 22, // 69: gosdn.networkelement.NetworkElementService.GetMneList:output_type -> gosdn.networkelement.GetMneListResponse + 23, // 70: gosdn.networkelement.NetworkElementService.GetFlattenedMneList:output_type -> gosdn.networkelement.GetFlattenedMneListResponse + 25, // 71: gosdn.networkelement.NetworkElementService.GetMne:output_type -> gosdn.networkelement.GetMneResponse + 28, // 72: gosdn.networkelement.NetworkElementService.SetMneList:output_type -> gosdn.networkelement.SetMneListResponse + 30, // 73: gosdn.networkelement.NetworkElementService.GetPath:output_type -> gosdn.networkelement.GetPathResponse + 33, // 74: gosdn.networkelement.NetworkElementService.SetPathList:output_type -> gosdn.networkelement.SetPathListResponse + 35, // 75: gosdn.networkelement.NetworkElementService.DeleteMne:output_type -> gosdn.networkelement.DeleteMneResponse + 40, // 76: gosdn.networkelement.NetworkElementService.GetChangeList:output_type -> gosdn.networkelement.GetChangeListResponse + 42, // 77: gosdn.networkelement.NetworkElementService.GetChange:output_type -> gosdn.networkelement.GetChangeResponse + 44, // 78: gosdn.networkelement.NetworkElementService.SetChangeList:output_type -> gosdn.networkelement.SetChangeListResponse + 48, // 79: gosdn.networkelement.NetworkElementService.SubscribePath:output_type -> gosdn.networkelement.SubscribePathResponse + 65, // [65:80] is the sub-list for method output_type + 50, // [50:65] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_gosdn_networkelement_networkelement_proto_init() } @@ -2893,7 +3818,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } if !protoimpl.UnsafeEnabled { file_gosdn_networkelement_networkelement_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ManagedNetworkElement); i { + switch v := v.(*AddNetworkElementConfiguration); i { case 0: return &v.state case 1: @@ -2905,7 +3830,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlattenedManagedNetworkElement); i { + switch v := v.(*AddNetworkElementRequest); i { case 0: return &v.state case 1: @@ -2917,7 +3842,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PrincipalNetworkDomain); i { + switch v := v.(*AddNetworkElementResponse); i { case 0: return &v.state case 1: @@ -2929,7 +3854,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMneListRequest); i { + switch v := v.(*GetNetworkElementRequest); i { case 0: return &v.state case 1: @@ -2941,7 +3866,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMneListResponse); i { + switch v := v.(*GetNetworkElementResponse); i { case 0: return &v.state case 1: @@ -2953,7 +3878,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFlattenedMneListResponse); i { + switch v := v.(*GetAllNetworkElementRequest); i { case 0: return &v.state case 1: @@ -2965,7 +3890,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMneRequest); i { + switch v := v.(*GetAllNetworkElementResponse); i { case 0: return &v.state case 1: @@ -2977,7 +3902,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMneResponse); i { + switch v := v.(*UpdateNetworkElementRequest); i { case 0: return &v.state case 1: @@ -2989,7 +3914,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMne); i { + switch v := v.(*UpdateNetworkElementResponse); i { case 0: return &v.state case 1: @@ -3001,7 +3926,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMneListRequest); i { + switch v := v.(*DeleteNetworkElementRequest); i { case 0: return &v.state case 1: @@ -3013,7 +3938,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMneListResponse); i { + switch v := v.(*DeleteNetworkElementResponse); i { case 0: return &v.state case 1: @@ -3025,7 +3950,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPathRequest); i { + switch v := v.(*NetworkElement); i { case 0: return &v.state case 1: @@ -3037,7 +3962,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPathResponse); i { + switch v := v.(*ManagedNetworkElement); i { case 0: return &v.state case 1: @@ -3049,7 +3974,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetResponse); i { + switch v := v.(*FlattenedManagedNetworkElement); i { case 0: return &v.state case 1: @@ -3061,7 +3986,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetPathListRequest); i { + switch v := v.(*PrincipalNetworkDomain); i { case 0: return &v.state case 1: @@ -3073,7 +3998,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetPathListResponse); i { + switch v := v.(*GetMneListRequest); i { case 0: return &v.state case 1: @@ -3085,7 +4010,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMneRequest); i { + switch v := v.(*GetMneListResponse); i { case 0: return &v.state case 1: @@ -3097,7 +4022,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMneResponse); i { + switch v := v.(*GetFlattenedMneListResponse); i { case 0: return &v.state case 1: @@ -3109,7 +4034,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Change); i { + switch v := v.(*GetMneRequest); i { case 0: return &v.state case 1: @@ -3121,7 +4046,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRequest); i { + switch v := v.(*GetMneResponse); i { case 0: return &v.state case 1: @@ -3133,7 +4058,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetChange); i { + switch v := v.(*SetMne); i { case 0: return &v.state case 1: @@ -3145,7 +4070,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetChangeListRequest); i { + switch v := v.(*SetMneListRequest); i { case 0: return &v.state case 1: @@ -3157,7 +4082,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetChangeListResponse); i { + switch v := v.(*SetMneListResponse); i { case 0: return &v.state case 1: @@ -3169,7 +4094,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetChangeRequest); i { + switch v := v.(*GetPathRequest); i { case 0: return &v.state case 1: @@ -3181,7 +4106,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetChangeResponse); i { + switch v := v.(*GetPathResponse); i { case 0: return &v.state case 1: @@ -3193,7 +4118,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetChangeListRequest); i { + switch v := v.(*SetResponse); i { case 0: return &v.state case 1: @@ -3205,7 +4130,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetChangeListResponse); i { + switch v := v.(*SetPathListRequest); i { case 0: return &v.state case 1: @@ -3217,7 +4142,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriptionList); i { + switch v := v.(*SetPathListResponse); i { case 0: return &v.state case 1: @@ -3229,7 +4154,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Subscription); i { + switch v := v.(*DeleteMneRequest); i { case 0: return &v.state case 1: @@ -3241,7 +4166,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribePathRequest); i { + switch v := v.(*DeleteMneResponse); i { case 0: return &v.state case 1: @@ -3253,6 +4178,150 @@ func file_gosdn_networkelement_networkelement_proto_init() { } } file_gosdn_networkelement_networkelement_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Change); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetChangeListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetChangeListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetChangeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetChangeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetChangeListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetChangeListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscriptionList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Subscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribePathRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gosdn_networkelement_networkelement_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribePathResponse); i { case 0: return &v.state @@ -3271,7 +4340,7 @@ func file_gosdn_networkelement_networkelement_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gosdn_networkelement_networkelement_proto_rawDesc, NumEnums: 6, - NumMessages: 31, + NumMessages: 43, NumExtensions: 0, NumServices: 1, }, diff --git a/api/go/gosdn/networkelement/networkelement.pb.gw.go b/api/go/gosdn/networkelement/networkelement.pb.gw.go index d803ea38cd6958197a12ce6ab05d73e89d2636fd..bc54ecd353acaf84a72d0ec783bf1bb3f14a1161 100644 --- a/api/go/gosdn/networkelement/networkelement.pb.gw.go +++ b/api/go/gosdn/networkelement/networkelement.pb.gw.go @@ -31,6 +31,146 @@ var _ = runtime.String var _ = utilities.NewDoubleArray var _ = metadata.Join +func request_NetworkElementService_Add_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddNetworkElementRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Add(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_NetworkElementService_Add_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddNetworkElementRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Add(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_NetworkElementService_Get_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_NetworkElementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetNetworkElementRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Get_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Get(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_NetworkElementService_Get_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetNetworkElementRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_Get_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Get(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_NetworkElementService_GetAll_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_NetworkElementService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetAllNetworkElementRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetAll_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetAll(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_NetworkElementService_GetAll_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetAllNetworkElementRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_NetworkElementService_GetAll_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetAll(ctx, &protoReq) + return msg, metadata, err + +} + +func request_NetworkElementService_Update_0(ctx context.Context, marshaler runtime.Marshaler, client NetworkElementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateNetworkElementRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Update(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_NetworkElementService_Update_0(ctx context.Context, marshaler runtime.Marshaler, server NetworkElementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateNetworkElementRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Update(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_NetworkElementService_GetFlattenedMneList_0 = &utilities.DoubleArray{Encoding: map[string]int{"pid": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -761,6 +901,98 @@ func local_request_NetworkElementService_SetChangeList_0(ctx context.Context, ma // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterNetworkElementServiceHandlerFromEndpoint instead. func RegisterNetworkElementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server NetworkElementServiceServer) error { + mux.Handle("POST", pattern_NetworkElementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Add", runtime.WithHTTPPathPattern("/network-element/create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_NetworkElementService_Add_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Add_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/network-element")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_NetworkElementService_Get_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Get_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_NetworkElementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAll", runtime.WithHTTPPathPattern("/network-element/all")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_NetworkElementService_GetAll_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_GetAll_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_NetworkElementService_Update_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Update_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_NetworkElementService_GetFlattenedMneList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1009,6 +1241,86 @@ func RegisterNetworkElementServiceHandler(ctx context.Context, mux *runtime.Serv // "NetworkElementServiceClient" to call the correct interceptors. func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client NetworkElementServiceClient) error { + mux.Handle("POST", pattern_NetworkElementService_Add_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Add", runtime.WithHTTPPathPattern("/network-element/create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_NetworkElementService_Add_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Add_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_NetworkElementService_Get_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Get", runtime.WithHTTPPathPattern("/network-element")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_NetworkElementService_Get_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Get_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_NetworkElementService_GetAll_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/GetAll", runtime.WithHTTPPathPattern("/network-element/all")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_NetworkElementService_GetAll_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_GetAll_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_NetworkElementService_Update_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/gosdn.networkelement.NetworkElementService/Update", runtime.WithHTTPPathPattern("/network-element/update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_NetworkElementService_Update_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_NetworkElementService_Update_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_NetworkElementService_GetFlattenedMneList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1193,6 +1505,14 @@ func RegisterNetworkElementServiceHandlerClient(ctx context.Context, mux *runtim } var ( + pattern_NetworkElementService_Add_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "create"}, "")) + + pattern_NetworkElementService_Get_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"network-element"}, "")) + + pattern_NetworkElementService_GetAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "all"}, "")) + + pattern_NetworkElementService_Update_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"network-element", "update"}, "")) + pattern_NetworkElementService_GetFlattenedMneList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"pnds", "pid", "mnes"}, "")) pattern_NetworkElementService_GetMne_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"pnds", "pid", "mne", "mneid"}, "")) @@ -1213,6 +1533,14 @@ var ( ) var ( + forward_NetworkElementService_Add_0 = runtime.ForwardResponseMessage + + forward_NetworkElementService_Get_0 = runtime.ForwardResponseMessage + + forward_NetworkElementService_GetAll_0 = runtime.ForwardResponseMessage + + forward_NetworkElementService_Update_0 = runtime.ForwardResponseMessage + forward_NetworkElementService_GetFlattenedMneList_0 = runtime.ForwardResponseMessage forward_NetworkElementService_GetMne_0 = runtime.ForwardResponseMessage diff --git a/api/go/gosdn/networkelement/networkelement_grpc.pb.go b/api/go/gosdn/networkelement/networkelement_grpc.pb.go index 963f5e20002ed3c42f3751f77d530019b16f9019..10d29b3d051a2edd4c626fa774513fa69f16d0af 100644 --- a/api/go/gosdn/networkelement/networkelement_grpc.pb.go +++ b/api/go/gosdn/networkelement/networkelement_grpc.pb.go @@ -18,6 +18,10 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type NetworkElementServiceClient interface { + Add(ctx context.Context, in *AddNetworkElementRequest, opts ...grpc.CallOption) (*AddNetworkElementResponse, error) + Get(ctx context.Context, in *GetNetworkElementRequest, opts ...grpc.CallOption) (*GetNetworkElementResponse, error) + GetAll(ctx context.Context, in *GetAllNetworkElementRequest, opts ...grpc.CallOption) (*GetAllNetworkElementResponse, error) + Update(ctx context.Context, in *UpdateNetworkElementRequest, opts ...grpc.CallOption) (*UpdateNetworkElementResponse, error) // Allows to request all Managed Network Elements (MNE) which are // managed by a specific Principal Network Domain. // Full MNEs are provided, which also includes the MNE config as gNMI @@ -64,6 +68,42 @@ func NewNetworkElementServiceClient(cc grpc.ClientConnInterface) NetworkElementS return &networkElementServiceClient{cc} } +func (c *networkElementServiceClient) Add(ctx context.Context, in *AddNetworkElementRequest, opts ...grpc.CallOption) (*AddNetworkElementResponse, error) { + out := new(AddNetworkElementResponse) + err := c.cc.Invoke(ctx, "/gosdn.networkelement.NetworkElementService/Add", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkElementServiceClient) Get(ctx context.Context, in *GetNetworkElementRequest, opts ...grpc.CallOption) (*GetNetworkElementResponse, error) { + out := new(GetNetworkElementResponse) + err := c.cc.Invoke(ctx, "/gosdn.networkelement.NetworkElementService/Get", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkElementServiceClient) GetAll(ctx context.Context, in *GetAllNetworkElementRequest, opts ...grpc.CallOption) (*GetAllNetworkElementResponse, error) { + out := new(GetAllNetworkElementResponse) + err := c.cc.Invoke(ctx, "/gosdn.networkelement.NetworkElementService/GetAll", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *networkElementServiceClient) Update(ctx context.Context, in *UpdateNetworkElementRequest, opts ...grpc.CallOption) (*UpdateNetworkElementResponse, error) { + out := new(UpdateNetworkElementResponse) + err := c.cc.Invoke(ctx, "/gosdn.networkelement.NetworkElementService/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *networkElementServiceClient) GetMneList(ctx context.Context, in *GetMneListRequest, opts ...grpc.CallOption) (*GetMneListResponse, error) { out := new(GetMneListResponse) err := c.cc.Invoke(ctx, "/gosdn.networkelement.NetworkElementService/GetMneList", in, out, opts...) @@ -190,6 +230,10 @@ func (x *networkElementServiceSubscribePathClient) Recv() (*SubscribePathRespons // All implementations must embed UnimplementedNetworkElementServiceServer // for forward compatibility type NetworkElementServiceServer interface { + Add(context.Context, *AddNetworkElementRequest) (*AddNetworkElementResponse, error) + Get(context.Context, *GetNetworkElementRequest) (*GetNetworkElementResponse, error) + GetAll(context.Context, *GetAllNetworkElementRequest) (*GetAllNetworkElementResponse, error) + Update(context.Context, *UpdateNetworkElementRequest) (*UpdateNetworkElementResponse, error) // Allows to request all Managed Network Elements (MNE) which are // managed by a specific Principal Network Domain. // Full MNEs are provided, which also includes the MNE config as gNMI @@ -233,6 +277,18 @@ type NetworkElementServiceServer interface { type UnimplementedNetworkElementServiceServer struct { } +func (UnimplementedNetworkElementServiceServer) Add(context.Context, *AddNetworkElementRequest) (*AddNetworkElementResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Add not implemented") +} +func (UnimplementedNetworkElementServiceServer) Get(context.Context, *GetNetworkElementRequest) (*GetNetworkElementResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedNetworkElementServiceServer) GetAll(context.Context, *GetAllNetworkElementRequest) (*GetAllNetworkElementResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAll not implemented") +} +func (UnimplementedNetworkElementServiceServer) Update(context.Context, *UpdateNetworkElementRequest) (*UpdateNetworkElementResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} func (UnimplementedNetworkElementServiceServer) GetMneList(context.Context, *GetMneListRequest) (*GetMneListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMneList not implemented") } @@ -279,6 +335,78 @@ func RegisterNetworkElementServiceServer(s grpc.ServiceRegistrar, srv NetworkEle s.RegisterService(&NetworkElementService_ServiceDesc, srv) } +func _NetworkElementService_Add_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddNetworkElementRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkElementServiceServer).Add(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gosdn.networkelement.NetworkElementService/Add", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkElementServiceServer).Add(ctx, req.(*AddNetworkElementRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NetworkElementService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNetworkElementRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkElementServiceServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gosdn.networkelement.NetworkElementService/Get", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkElementServiceServer).Get(ctx, req.(*GetNetworkElementRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NetworkElementService_GetAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAllNetworkElementRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkElementServiceServer).GetAll(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gosdn.networkelement.NetworkElementService/GetAll", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkElementServiceServer).GetAll(ctx, req.(*GetAllNetworkElementRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _NetworkElementService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateNetworkElementRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NetworkElementServiceServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gosdn.networkelement.NetworkElementService/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NetworkElementServiceServer).Update(ctx, req.(*UpdateNetworkElementRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _NetworkElementService_GetMneList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetMneListRequest) if err := dec(in); err != nil { @@ -487,6 +615,22 @@ var NetworkElementService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "gosdn.networkelement.NetworkElementService", HandlerType: (*NetworkElementServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "Add", + Handler: _NetworkElementService_Add_Handler, + }, + { + MethodName: "Get", + Handler: _NetworkElementService_Get_Handler, + }, + { + MethodName: "GetAll", + Handler: _NetworkElementService_GetAll_Handler, + }, + { + MethodName: "Update", + Handler: _NetworkElementService_Update_Handler, + }, { MethodName: "GetMneList", Handler: _NetworkElementService_GetMneList_Handler, diff --git a/api/openapiv2/gosdn_northbound.swagger.json b/api/openapiv2/gosdn_northbound.swagger.json index 5704748baa9f52dba2a16da12e469f9a83c67e92..9d897f1e77e2de32bc6993ba0f1706553717a99c 100644 --- a/api/openapiv2/gosdn_northbound.swagger.json +++ b/api/openapiv2/gosdn_northbound.swagger.json @@ -168,6 +168,138 @@ ] } }, + "/network-element": { + "get": { + "operationId": "NetworkElementService_Get", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/networkelementGetNetworkElementResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "timestamp", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "networkElementId", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "NetworkElementService" + ] + } + }, + "/network-element/all": { + "get": { + "operationId": "NetworkElementService_GetAll", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/networkelementGetAllNetworkElementResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "timestamp", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "NetworkElementService" + ] + } + }, + "/network-element/create": { + "post": { + "operationId": "NetworkElementService_Add", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/networkelementAddNetworkElementResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/networkelementAddNetworkElementRequest" + } + } + ], + "tags": [ + "NetworkElementService" + ] + } + }, + "/network-element/update": { + "post": { + "operationId": "NetworkElementService_Update", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/networkelementUpdateNetworkElementResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/networkelementUpdateNetworkElementRequest" + } + } + ], + "tags": [ + "NetworkElementService" + ] + } + }, "/pnd/{pid}": { "get": { "summary": "Allows to request a specific Principal Network Domain.", @@ -3040,6 +3172,53 @@ ], "default": "STATUS_UNSPECIFIED" }, + "networkelementAddNetworkElementConfiguration": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "sbi": { + "$ref": "#/definitions/southboundSouthboundInterface" + }, + "networkElementName": { + "type": "string" + }, + "transportOption": { + "$ref": "#/definitions/transportTransportOption" + } + } + }, + "networkelementAddNetworkElementRequest": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "networkElement": { + "$ref": "#/definitions/networkelementAddNetworkElementConfiguration" + }, + "pid": { + "type": "string" + } + } + }, + "networkelementAddNetworkElementResponse": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "status": { + "$ref": "#/definitions/gosdnnetworkelementStatus" + }, + "networkElementId": { + "type": "string" + } + } + }, "networkelementApiOperation": { "type": "string", "enum": [ @@ -3123,6 +3302,24 @@ } } }, + "networkelementGetAllNetworkElementResponse": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "status": { + "$ref": "#/definitions/gosdnnetworkelementStatus" + }, + "networkElement": { + "type": "array", + "items": { + "$ref": "#/definitions/networkelementNetworkElement" + } + } + } + }, "networkelementGetChangeListResponse": { "type": "object", "properties": { @@ -3216,6 +3413,21 @@ } } }, + "networkelementGetNetworkElementResponse": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "status": { + "$ref": "#/definitions/gosdnnetworkelementStatus" + }, + "networkElement": { + "$ref": "#/definitions/networkelementNetworkElement" + } + } + }, "networkelementGetPathResponse": { "type": "object", "properties": { @@ -3244,6 +3456,9 @@ "name": { "type": "string" }, + "model": { + "type": "string" + }, "mneNotification": { "type": "array", "items": { @@ -3253,10 +3468,35 @@ "sbi": { "$ref": "#/definitions/southboundSouthboundInterface" }, + "transportAddress": { + "type": "string" + }, "metadata": { "$ref": "#/definitions/conflictMetadata" } - } + }, + "title": "TODO(PND): maybe need to clean this up!" + }, + "networkelementNetworkElement": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "model": { + "type": "string" + }, + "transportAddress": { + "type": "string" + }, + "metadata": { + "$ref": "#/definitions/conflictMetadata" + } + }, + "title": "TODO(PND):remove this after ManagedNetworkElement is cleaned up" }, "networkelementSetChange": { "type": "object", @@ -3368,6 +3608,30 @@ } } }, + "networkelementUpdateNetworkElementRequest": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "networkElement": { + "$ref": "#/definitions/networkelementNetworkElement" + } + } + }, + "networkelementUpdateNetworkElementResponse": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "int64" + }, + "status": { + "$ref": "#/definitions/gosdnnetworkelementStatus" + } + } + }, "pndGetSbiListResponse": { "type": "object", "properties": { diff --git a/api/proto/gosdn/networkelement/networkelement.proto b/api/proto/gosdn/networkelement/networkelement.proto index fa4e668d35081032d7b537ac4f12a06beb8afd55..559d606a3ddca28cb39f9d2e03c8ed5c9ac9f41e 100644 --- a/api/proto/gosdn/networkelement/networkelement.proto +++ b/api/proto/gosdn/networkelement/networkelement.proto @@ -15,6 +15,39 @@ option go_package = "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"; //TODO(PND): add option to update our stored MNE (e.g. name, descr)instead of only being able to change YANG service NetworkElementService { + rpc Add(AddNetworkElementRequest) returns (AddNetworkElementResponse) { + option (google.api.http) = { + post: "/network-element/create" + body: "*" + }; + } + + rpc Get(GetNetworkElementRequest) returns (GetNetworkElementResponse) { + option (google.api.http) = { + get: "/network-element" + }; + } + + rpc GetAll(GetAllNetworkElementRequest) returns (GetAllNetworkElementResponse) { + option (google.api.http) = { + get: "/network-element/all" + }; + } + + rpc Update(UpdateNetworkElementRequest) returns (UpdateNetworkElementResponse) { + option (google.api.http) = { + post: "/network-element/update" + body: "*" + }; + } + + // TODO: not implemented yet! + // rpc Delete(DeleteNetworkElementRequest) returns (DeleteNetworkElementRequest) { + // option (google.api.http) = { + // delete: "/network-element" + // }; + // } + // Allows to request all Managed Network Elements (MNE) which are // managed by a specific Principal Network Domain. // Full MNEs are provided, which also includes the MNE config as gNMI @@ -99,20 +132,87 @@ enum Status { STATUS_ERROR = 2; } -// message NetworkElement { -// string id = 1; -// string name = 2; -// string model = 3; -// string transport_address = 4; -// conflict.Metadata metadata = 5; -// } +message AddNetworkElementConfiguration { + string address = 1; + .gosdn.southbound.SouthboundInterface sbi = 2; + string network_element_name = 3; + .gosdn.transport.TransportOption transport_option = 4; +} + +message AddNetworkElementRequest { + int64 timestamp = 1; + AddNetworkElementConfiguration network_element = 2; + string pid = 3; +} -message ManagedNetworkElement { +message AddNetworkElementResponse { + int64 timestamp = 1; + Status status = 2; + string network_element_id = 3; +} + +message GetNetworkElementRequest { + int64 timestamp = 1; + string network_element_id = 2; +} + +message GetNetworkElementResponse { + int64 timestamp = 1; + Status status = 2; + NetworkElement network_element = 3; +} + +message GetAllNetworkElementRequest { + int64 timestamp = 1; +} + +message GetAllNetworkElementResponse { + int64 timestamp = 1; + Status status = 2; + repeated NetworkElement network_element = 3; +} + +message UpdateNetworkElementRequest { + int64 timestamp = 1; + NetworkElement network_element = 2; +} + +message UpdateNetworkElementResponse { + int64 timestamp = 1; + Status status = 2; +} + +message DeleteNetworkElementRequest { + int64 timestamp = 1; + string network_element_id = 2; +} + +message DeleteNetworkElementResponse { + int64 timestamp = 1; + Status status = 2; +} + + + +//TODO(PND):remove this after ManagedNetworkElement is cleaned up +message NetworkElement { string id = 1; string name = 2; - repeated gnmi.Notification mne_notification = 3; - .gosdn.southbound.SouthboundInterface sbi = 4; + string model = 3; + string transport_address = 4; conflict.Metadata metadata = 5; +} + +//TODO(PND): maybe need to clean this up! +//TODO(PND): add pnd id to this object, for reference +message ManagedNetworkElement { + string id = 1; + string name = 2; + string model = 3; + repeated gnmi.Notification mne_notification = 4; + .gosdn.southbound.SouthboundInterface sbi = 5; + string transport_address = 6; + conflict.Metadata metadata = 7; } message FlattenedManagedNetworkElement { diff --git a/cli/adapter/PndAdapter.go b/cli/adapter/PndAdapter.go index 305869cda7aaef001935ef5ac8383b79d17aa621..2f346c73e6a5b9b219917cf16930c743bce7e137 100644 --- a/cli/adapter/PndAdapter.go +++ b/cli/adapter/PndAdapter.go @@ -4,6 +4,7 @@ import ( "context" "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "code.fbi.h-da.de/danet/gosdn/controller/api" @@ -47,7 +48,7 @@ func (p *PndAdapter) RemoveSbi(uuid.UUID) error { // AddNetworkElement adds a new device to the controller. The device name is optional. // If no name is provided a name will be generated upon device creation. -func (p *PndAdapter) AddNetworkElement(ctx context.Context, name string, opts *tpb.TransportOption, sid uuid.UUID) (*ppb.SetMneListResponse, error) { +func (p *PndAdapter) AddNetworkElement(ctx context.Context, name string, opts *tpb.TransportOption, sid uuid.UUID) (*mnepb.SetMneListResponse, error) { resp, err := api.AddNetworkElement(ctx, p.endpoint, name, opts, sid, p.ID()) if err != nil { return nil, err @@ -66,7 +67,7 @@ func (p *PndAdapter) GetSbiSchemaTree(ctx context.Context, sid uuid.UUID) (map[s // GetNetworkElement requests one or multiple devices belonging to a given // PrincipalNetworkDomain from the controller. -func (p *PndAdapter) GetNetworkElement(ctx context.Context, identifier string) (*ppb.GetMneResponse, error) { +func (p *PndAdapter) GetNetworkElement(ctx context.Context, identifier string) (*mnepb.GetMneResponse, error) { resp, err := api.GetNetworkElement(ctx, p.endpoint, p.id.String(), identifier) if err != nil { return nil, err @@ -77,7 +78,7 @@ func (p *PndAdapter) GetNetworkElement(ctx context.Context, identifier string) ( // GetFlattenedNetworkElements requests all devices belonging to the PrincipalNetworkDomain // attached to this adapter. The requested devices also contain their config // information as gNMI notifications. -func (p *PndAdapter) GetFlattenedNetworkElements(ctx context.Context) (*ppb.GetFlattenedMneListResponse, error) { +func (p *PndAdapter) GetFlattenedNetworkElements(ctx context.Context) (*mnepb.GetFlattenedMneListResponse, error) { resp, err := api.GetFlattenedNetworkElements(ctx, p.endpoint, p.id.String()) if err != nil { return nil, err @@ -86,7 +87,7 @@ func (p *PndAdapter) GetFlattenedNetworkElements(ctx context.Context) (*ppb.GetF } // RemoveNetworkElement removes a device from the controller. -func (p *PndAdapter) RemoveNetworkElement(ctx context.Context, did uuid.UUID) (*ppb.DeleteMneResponse, error) { +func (p *PndAdapter) RemoveNetworkElement(ctx context.Context, did uuid.UUID) (*mnepb.DeleteMneResponse, error) { resp, err := api.DeleteNetworkElement(ctx, p.endpoint, p.id.String(), did.String()) if err != nil { return nil, err @@ -106,7 +107,7 @@ func (p *PndAdapter) RemovePnd(ctx context.Context, pid uuid.UUID) (*core.Delete // ChangeMNE sends an API call to the controller requesting the creation of // a change from the provided Operation, path and value. The Change is marked // as Pending and times out after the specified timeout period. -func (p *PndAdapter) ChangeMNE(ctx context.Context, duid uuid.UUID, operation ppb.ApiOperation, path string, value ...string) (*ppb.SetPathListResponse, error) { +func (p *PndAdapter) ChangeMNE(ctx context.Context, duid uuid.UUID, operation mnepb.ApiOperation, path string, value ...string) (*mnepb.SetPathListResponse, error) { var v string if len(value) != 0 { v = value[0] @@ -120,7 +121,7 @@ func (p *PndAdapter) ChangeMNE(ctx context.Context, duid uuid.UUID, operation pp // Request sends an API call to the controller requesting the specified path // for the specified device. -func (p *PndAdapter) Request(ctx context.Context, did uuid.UUID, path string) (*ppb.GetPathResponse, error) { +func (p *PndAdapter) Request(ctx context.Context, did uuid.UUID, path string) (*mnepb.GetPathResponse, error) { resp, err := api.GetPath(ctx, p.endpoint, p.id.String(), did.String(), path) if err != nil { return nil, err @@ -130,7 +131,7 @@ func (p *PndAdapter) Request(ctx context.Context, did uuid.UUID, path string) (* // SubscribeMNEPath sends an API call to the controller requesting to subscribe // to a specific path of a specifc device. -func (p *PndAdapter) SubscribeMNEPath(ctx context.Context, did uuid.UUID, slist *ppb.SubscriptionList) (ppb.PndService_SubscribePathClient, error) { +func (p *PndAdapter) SubscribeMNEPath(ctx context.Context, did uuid.UUID, slist *mnepb.SubscriptionList) (mnepb.NetworkElementService_SubscribePathClient, error) { resp, err := api.SubscribePath(ctx, p.endpoint, p.id.String(), did.String(), slist) if err != nil { return nil, err @@ -206,37 +207,37 @@ func (p *PndAdapter) Endpoint() string { // PendingChanges sends an API call to the controller requesting // the UUIDs of all pending changes. -func (p *PndAdapter) PendingChanges(ctx context.Context) ([]*ppb.Change, error) { +func (p *PndAdapter) PendingChanges(ctx context.Context) ([]*mnepb.Change, error) { resp, err := api.GetChanges(ctx, p.endpoint, p.id.String()) if err != nil { return nil, err } - return filterChanges(ppb.ChangeState_CHANGE_STATE_PENDING, resp), nil + return filterChanges(mnepb.ChangeState_CHANGE_STATE_PENDING, resp), nil } // CommittedChanges sends an API call to the controller requesting // the UUIDs of all committed changes. -func (p *PndAdapter) CommittedChanges(ctx context.Context) ([]*ppb.Change, error) { +func (p *PndAdapter) CommittedChanges(ctx context.Context) ([]*mnepb.Change, error) { resp, err := api.GetChanges(ctx, p.endpoint, p.id.String()) if err != nil { return nil, err } - return filterChanges(ppb.ChangeState_CHANGE_STATE_COMMITTED, resp), nil + return filterChanges(mnepb.ChangeState_CHANGE_STATE_COMMITTED, resp), nil } // ConfirmedChanges sends an API call to the controller requesting // the UUIDs of all confirmed changes. -func (p *PndAdapter) ConfirmedChanges(ctx context.Context) ([]*ppb.Change, error) { +func (p *PndAdapter) ConfirmedChanges(ctx context.Context) ([]*mnepb.Change, error) { resp, err := api.GetChanges(ctx, p.endpoint, p.id.String()) if err != nil { return nil, err } - return filterChanges(ppb.ChangeState_CHANGE_STATE_CONFIRMED, resp), nil + return filterChanges(mnepb.ChangeState_CHANGE_STATE_CONFIRMED, resp), nil } // GetChange sends an API call to the controller requesting one or more changes // for the specific PND. -func (p *PndAdapter) GetChange(ctx context.Context, identifier ...string) (*ppb.GetChangeResponse, error) { +func (p *PndAdapter) GetChange(ctx context.Context, identifier ...string) (*mnepb.GetChangeResponse, error) { resp, err := api.GetChange(ctx, p.endpoint, p.id.String(), identifier...) if err != nil { return nil, err @@ -245,7 +246,7 @@ func (p *PndAdapter) GetChange(ctx context.Context, identifier ...string) (*ppb. } // Commit sends an API call to the controller committing the specified change. -func (p *PndAdapter) Commit(ctx context.Context, cuid uuid.UUID) (*ppb.SetChangeListResponse, error) { +func (p *PndAdapter) Commit(ctx context.Context, cuid uuid.UUID) (*mnepb.SetChangeListResponse, error) { resp, err := api.Commit(ctx, p.endpoint, p.id.String(), cuid.String()) if err != nil { return nil, err @@ -254,7 +255,7 @@ func (p *PndAdapter) Commit(ctx context.Context, cuid uuid.UUID) (*ppb.SetChange } // Confirm sends an API call to the controller confirming the specified change. -func (p *PndAdapter) Confirm(ctx context.Context, cuid uuid.UUID) (*ppb.SetChangeListResponse, error) { +func (p *PndAdapter) Confirm(ctx context.Context, cuid uuid.UUID) (*mnepb.SetChangeListResponse, error) { resp, err := api.Confirm(ctx, p.endpoint, p.id.String(), cuid.String()) if err != nil { return nil, err @@ -262,8 +263,8 @@ func (p *PndAdapter) Confirm(ctx context.Context, cuid uuid.UUID) (*ppb.SetChang return resp, nil } -func filterChanges(state ppb.ChangeState, resp *ppb.GetChangeListResponse) []*ppb.Change { - changes := make([]*ppb.Change, 0) +func filterChanges(state mnepb.ChangeState, resp *mnepb.GetChangeListResponse) []*mnepb.Change { + changes := make([]*mnepb.Change, 0) for _, ch := range resp.Change { if ch.State == state { changes = append(changes, ch) diff --git a/cli/adapter/PndAdapter_test.go b/cli/adapter/PndAdapter_test.go index c4e3ebefed4649f384a09cddd2e761c2f4712512..1ff0c39a16f501de66513728b1caec8afca83c4c 100644 --- a/cli/adapter/PndAdapter_test.go +++ b/cli/adapter/PndAdapter_test.go @@ -6,7 +6,6 @@ import ( "testing" mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" - ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/change" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" @@ -143,7 +142,7 @@ func TestPndAdapter_GetNetworkElement(t *testing.T) { name string fields fields args args - want *mnepb.NetworkElement + want *mnepb.ManagedNetworkElement wantErr bool }{ // TODO: Add test cases. @@ -202,7 +201,7 @@ func TestPndAdapter_ChangeMNE(t *testing.T) { } type args struct { uuid uuid.UUID - operation ppb.ApiOperation + operation mnepb.ApiOperation path string value []string } @@ -512,8 +511,8 @@ func TestPndAdapter_Confirm(t *testing.T) { func Test_filterChanges(t *testing.T) { type args struct { - state ppb.ChangeState - resp *ppb.GetChangeListResponse + state mnepb.ChangeState + resp *mnepb.GetChangeListResponse } tests := []struct { name string diff --git a/cli/cmd/networkElementDelete.go b/cli/cmd/networkElementDelete.go index 134972c4eca504afdb8210dc99c3688ea1636656..4b9c2221d3376e232f8fcb54cfbf27ac24a2dbff 100644 --- a/cli/cmd/networkElementDelete.go +++ b/cli/cmd/networkElementDelete.go @@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. package cmd import ( - ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" "github.com/google/uuid" "github.com/pterm/pterm" "github.com/spf13/cobra" @@ -57,7 +57,7 @@ The network element UUID and request path must be specified as a positional argu resp, err := pndAdapter.ChangeMNE( createContextWithAuthorization(), mneid, - ppb.ApiOperation_API_OPERATION_DELETE, + mnepb.ApiOperation_API_OPERATION_DELETE, args[1], ) if err != nil { @@ -66,7 +66,7 @@ The network element UUID and request path must be specified as a positional argu } for _, r := range resp.Responses { - if r.Status == ppb.Status_STATUS_OK { + if r.Status == mnepb.Status_STATUS_OK { spinner.Success("A change for path deletion for network element: ", mneid.String(), "has been created -> Change ID: ", r.GetId()) } else { spinner.Fail("An error occurred while creating a path deletion request for network element with ID: ", r.GetId(), r.GetStatus()) diff --git a/cli/cmd/networkElementSet.go b/cli/cmd/networkElementSet.go index faa0040e0d7c00fefc82b29c5e41a2beabf93a53..c548f001dda4cc932fb70899c5d905a827099aef 100644 --- a/cli/cmd/networkElementSet.go +++ b/cli/cmd/networkElementSet.go @@ -34,7 +34,7 @@ package cmd import ( "os" - ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" "github.com/google/uuid" "github.com/pterm/pterm" "github.com/spf13/cobra" @@ -62,12 +62,12 @@ To enable replacing behaviour (destructive!), set the --replace flag."`, spinner.Fail(err) } var value string - var operation ppb.ApiOperation + var operation mnepb.ApiOperation if replace { - operation = ppb.ApiOperation_API_OPERATION_REPLACE + operation = mnepb.ApiOperation_API_OPERATION_REPLACE spinner.UpdateText("Replace generated and sent") } else { - operation = ppb.ApiOperation_API_OPERATION_UPDATE + operation = mnepb.ApiOperation_API_OPERATION_UPDATE spinner.UpdateText("Update generated and sent") } diff --git a/cli/cmd/networkElementSubscribe.go b/cli/cmd/networkElementSubscribe.go index e2b98b2c51ee58578f1cc239c41de8d4bee29318..245d9f6fb8c4820d65719cda5a5d3087bd4fe0da 100644 --- a/cli/cmd/networkElementSubscribe.go +++ b/cli/cmd/networkElementSubscribe.go @@ -35,7 +35,7 @@ import ( "errors" "io" - "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" "github.com/google/uuid" "github.com/pterm/pterm" log "github.com/sirupsen/logrus" @@ -60,15 +60,15 @@ The device UUID and requested paths must be specified as a positional arguments. subClient, err := pndAdapter.SubscribeMNEPath( createContextWithAuthorization(), did, - &pnd.SubscriptionList{ - Subscription: []*pnd.Subscription{ + &mnepb.SubscriptionList{ + Subscription: []*mnepb.Subscription{ { Path: args[1], - StreamMode: pnd.StreamMode_STREAM_MODE_SAMPLE, + StreamMode: mnepb.StreamMode_STREAM_MODE_SAMPLE, SampleInterval: 1000000000, }, }, - Mode: pnd.SubscriptionMode_SUBSCRIPTION_MODE_STREAM, + Mode: mnepb.SubscriptionMode_SUBSCRIPTION_MODE_STREAM, }, ) if err != nil { diff --git a/controller/api/change.go b/controller/api/change.go index dfd3115581eb3ae87633d89cc3d3effcb1ec5bf3..afcf113b07452cc9bd0f4e14003277999c33d5ef 100644 --- a/controller/api/change.go +++ b/controller/api/change.go @@ -11,7 +11,7 @@ import ( // GetChanges requests all pending and unconfirmed changes from the controller. func GetChanges(ctx context.Context, addr, pnd string) (*mnepb.GetChangeListResponse, error) { - client, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -24,7 +24,7 @@ func GetChanges(ctx context.Context, addr, pnd string) (*mnepb.GetChangeListResp // GetChange requests one or more changes from the controller. func GetChange(ctx context.Context, addr string, pnd string, args ...string) (*mnepb.GetChangeResponse, error) { - client, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -67,7 +67,7 @@ func Confirm(ctx context.Context, addr, pnd string, cuids ...string) (*mnepb.Set // CommitConfirm confirms a commit. func CommitConfirm(ctx context.Context, addr, pnd string, changes []*mnepb.SetChange) (*mnepb.SetChangeListResponse, error) { - client, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -96,7 +96,7 @@ func ChangeRequest(ctx context.Context, addr, mneid, pid, path, value string, op // SendChangeRequest sends a change request. func SendChangeRequest(ctx context.Context, addr, pid string, req *mnepb.ChangeRequest) (*mnepb.SetPathListResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -106,5 +106,5 @@ func SendChangeRequest(ctx context.Context, addr, pid string, req *mnepb.ChangeR ChangeRequest: []*mnepb.ChangeRequest{req}, Pid: pid, } - return pndClient.SetPathList(ctx, r) + return client.SetPathList(ctx, r) } diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go index b0baf7dab8b8e147de75603b8a6b648428a55e67..c3c4ff76a60f1ff82a08e65972579abbfaa34c46 100644 --- a/controller/api/initialise_test.go +++ b/controller/api/initialise_test.go @@ -8,7 +8,6 @@ import ( "time" - "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/conflict" cpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" @@ -16,6 +15,7 @@ import ( tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" "code.fbi.h-da.de/danet/gosdn/controller/app" "code.fbi.h-da.de/danet/gosdn/controller/config" + "code.fbi.h-da.de/danet/gosdn/controller/conflict" eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" @@ -26,6 +26,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/util/proto" rbacImpl "code.fbi.h-da.de/danet/gosdn/controller/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/topology" "code.fbi.h-da.de/danet/gosdn/controller/topology/links" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" @@ -123,6 +124,7 @@ func bootstrapUnitTest() { }) sbi := &nucleus.OpenConfig{} + sbi.SetID(sbiUUID) mockNetworkElement := &mocks.NetworkElement{} mockNetworkElement.On("SBI").Return(sbi) @@ -171,6 +173,26 @@ func bootstrapUnitTest() { routeStore := store.NewGenericStore[routingtables.RoutingTable]() routeService := routingtables.NewRoutingTableService(routeStore, nodeService, portService, eventService) + sbiService := nucleus.NewSbiService(sbiStore, eventService) + _ = sbiService.Add(sbi) + + networkElementStore := nucleus.NewNetworkElementStore(pndUUID) + networkElementService := nucleus.NewNetworkElementService(networkElementStore, sbiService, eventService) + + //TODO(PND): check/fix api_test: getdevice/adddevice, maybe the mne here is not necessary! + + mne, _ := nucleus.NewNetworkElement("test", mneUUID, &tpb.TransportOption{ + Address: "test", + Username: "test", + Password: "test", + TransportOption: &tpb.TransportOption_GnmiTransportOption{ + GnmiTransportOption: &tpb.GnmiTransportOption{}, + }, + }, sbi, conflict.Metadata{ResourceVersion: 0}) + _ = networkElementService.Add(mne) + + serviceManager := servmgmt.ServiceManager{MneService: networkElementService, SbiService: sbiService, PNDStore: pndStore} + northbound := nbi.NewNBI( pndStore, userService, @@ -182,6 +204,7 @@ func bootstrapUnitTest() { routeService, appService, &mockPnd, + serviceManager, ) cpb.RegisterCoreServiceServer(s, northbound.Core) @@ -189,6 +212,7 @@ func bootstrapUnitTest() { apb.RegisterAuthServiceServer(s, northbound.Auth) apb.RegisterUserServiceServer(s, northbound.User) apb.RegisterRoleServiceServer(s, northbound.Role) + mnepb.RegisterNetworkElementServiceServer(s, northbound.NetworkElement) go func() { if err := s.Serve(lis); err != nil { diff --git a/controller/api/managedNetworkElement.go b/controller/api/managedNetworkElement.go index 5bd1bb8f1e9537296aae77fee9f3385e0f5045f0..48ecebea3c55719df85b8272430c52b878c8ba7c 100644 --- a/controller/api/managedNetworkElement.go +++ b/controller/api/managedNetworkElement.go @@ -20,7 +20,7 @@ import ( // AddNetworkElement adds a new network element to the controller. The network element name is optional. // If no name is provided a name will be generated upon network element creation. func AddNetworkElement(ctx context.Context, addr, mneName string, opt *tpb.TransportOption, sid, pid uuid.UUID) (*mnepb.SetMneListResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -47,14 +47,14 @@ func AddNetworkElement(ctx context.Context, addr, mneName string, opt *tpb.Trans default: } - return pndClient.SetMneList(ctx, req) + return client.SetMneList(ctx, req) } // GetNetworkElement requests one network element belonging to a given // PrincipalNetworkDomain from the controller. If no network element identifier // is provided, an error is thrown. func GetNetworkElement(ctx context.Context, addr, pid string, mneid string) (*mnepb.GetMneResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -69,7 +69,7 @@ func GetNetworkElement(ctx context.Context, addr, pid string, mneid string) (*mn Pid: pid, } - return pndClient.GetMne(ctx, req) + return client.GetMne(ctx, req) } // GetSbiSchemaTree gets the sbi tree for a sbi. @@ -123,7 +123,7 @@ func GetSbiSchemaTree(ctx context.Context, addr string, pid, sid uuid.UUID) (map // GetFlattenedNetworkElements requests all network elements belonging to a given // PrincipalNetworkDomain from the controller. func GetFlattenedNetworkElements(ctx context.Context, addr, pid string) (*mnepb.GetFlattenedMneListResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -133,12 +133,12 @@ func GetFlattenedNetworkElements(ctx context.Context, addr, pid string) (*mnepb. Pid: pid, } - return pndClient.GetFlattenedMneList(ctx, req) + return client.GetFlattenedMneList(ctx, req) } // GetPath requests a specific path. func GetPath(ctx context.Context, addr, pid, mneid, path string) (*mnepb.GetPathResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -150,13 +150,13 @@ func GetPath(ctx context.Context, addr, pid, mneid, path string) (*mnepb.GetPath Path: path, } - return pndClient.GetPath(ctx, req) + return client.GetPath(ctx, req) } // SubscribePath subscribes to paths on a network element. func SubscribePath(ctx context.Context, addr, pid, mneid string, slist *mnepb.SubscriptionList) (mnepb.NetworkElementService_SubscribePathClient, error) { log.Println("subscribePath called") - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -168,12 +168,12 @@ func SubscribePath(ctx context.Context, addr, pid, mneid string, slist *mnepb.Su Sublist: slist, } - return pndClient.SubscribePath(ctx, req) + return client.SubscribePath(ctx, req) } // DeleteNetworkElement deletes a network element. func DeleteNetworkElement(ctx context.Context, addr, pid, mneid string) (*mnepb.DeleteMneResponse, error) { - pndClient, err := nbi.PndClient(addr, dialOptions...) + client, err := nbi.NetworkElementClient(addr, dialOptions...) if err != nil { return nil, err } @@ -184,5 +184,5 @@ func DeleteNetworkElement(ctx context.Context, addr, pid, mneid string) (*mnepb. Pid: pid, } - return pndClient.DeleteMne(ctx, req) + return client.DeleteMne(ctx, req) } diff --git a/controller/controller.go b/controller/controller.go index b025135c9d12900b9792789717a962e53d8d7b9d..4573046bb3cddd6f2ad044ed4f5f7b2f9fb0311e 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -28,8 +28,10 @@ import ( spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology" + //TODO: check if both of 'app' are necessary? "code.fbi.h-da.de/danet/gosdn/controller/app" apps "code.fbi.h-da.de/danet/gosdn/controller/app" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/config" "code.fbi.h-da.de/danet/gosdn/controller/conflict" @@ -72,6 +74,8 @@ type Core struct { stopChan chan os.Signal csbiClient cpb.CsbiServiceClient + + serviceManager servmgmt.ServiceManager } var c *Core @@ -102,6 +106,8 @@ func initialize() error { eventService, ) + serviveManager := initServiceManager(eventService) + c = &Core{ pndStore: nucleus.NewPndStore(), userService: rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService), @@ -112,12 +118,13 @@ func initialize() error { portService, eventService, ), - nodeService: nodeService, - portService: portService, - routeService: routeService, - eventService: eventService, - appService: apps.NewAppService(apps.NewAppStore()), - stopChan: make(chan os.Signal, 1), + nodeService: nodeService, + portService: portService, + routeService: routeService, + eventService: eventService, + appService: apps.NewAppService(apps.NewAppStore()), + stopChan: make(chan os.Signal, 1), + serviceManager: serviveManager, } // Setting up signal capturing @@ -128,7 +135,7 @@ func initialize() error { return err } - c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.pndStore, c.eventService) + c.networkElementWatcher = nucleus.NewNetworkElementWatcher(c.serviceManager, c.eventService) c.networkElementWatcher.SubToNetworkElements(config.GetGnmiSubscriptionPaths(), nil) err = ensureDefaultRoleExists() @@ -163,7 +170,7 @@ func startGrpc() error { jwtManager := rbacImpl.NewJWTManager(config.JWTSecret, config.JWTDuration) setupGRPCServerWithCorrectSecurityLevel(jwtManager, c.userService, c.roleService) - basePnd, err := c.pndStore.Get(store.Query{ID: config.BasePndUUID}) + basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID}) if err != nil { panic(err) } @@ -179,6 +186,7 @@ func startGrpc() error { c.routeService, c.appService, basePnd, + c.serviceManager, ) pb.RegisterCoreServiceServer(c.grpcServer, c.nbi.Core) @@ -210,7 +218,7 @@ func startGrpc() error { // createPrincipalNetworkDomain initializes the controller with an initial PND. func createPrincipalNetworkDomain() error { - basePnd, err := c.pndStore.Get(store.Query{ID: config.BasePndUUID}) + basePnd, err := c.serviceManager.PndService.Get(store.Query{ID: config.BasePndUUID}) if err != nil { log.Info(err) } @@ -375,3 +383,56 @@ func setupGRPCServerWithCorrectSecurityLevel(jwt *rbacImpl.JWTManager, userServi log.Info("set up grpc server in secure mode") } } + +// TODO(PND): add changeStore here?! +func initServiceManager(eventService eventInterfaces.Service) servmgmt.ServiceManager { + + pndStore := nucleus.NewPndStore() + pndService := nucleus.NewPndService(pndStore) + + sbiStore := nucleus.NewSbiStore(uuid.New()) + sbiService := nucleus.NewSbiService(sbiStore, eventService) + + networkElementStore := nucleus.NewNetworkElementStore(uuid.New()) + networkElementService := nucleus.NewNetworkElementService( + networkElementStore, + sbiService, + eventService, + ) + + userService := rbacImpl.NewUserService(rbacImpl.NewUserStore(), eventService) + roleService := rbacImpl.NewRoleService(rbacImpl.NewRoleStore(), eventService) + + nodeService := nodes.NewNodeService(nodes.NewDatabaseNodeStore(), eventService) + portService := ports.NewPortService(ports.NewDatabasePortStore(), eventService) + + //TODO(PND): find way to add servicemanager here instead of having al the extra services in constructor?! + routeService := routingtables.NewRoutingTableService( + routingtables.NewDatabaseRoutingTableStore(), + nodeService, + portService, + eventService, + ) + topologyService := topology.NewTopologyService( + topology.NewDatabaseTopologyStore(), + nodeService, + portService, + eventService, + ) + + appService := app.NewAppService(app.NewAppStore()) + + //TODO(PND): add real change store!? + return *servmgmt.NewServiceManager(pndService, pndStore, + store.ChangeStore{}, + sbiService, + networkElementService, + userService, + roleService, + nodeService, + portService, + topologyService, + routeService, + appService, + ) +} diff --git a/controller/interfaces/networkdomain/pnd.go b/controller/interfaces/networkdomain/pnd.go index 2431c445f960cfefbdb9ed016c51d7860be15a10..256e3ec43ff8c6278cfd8bded7451b3cde90901c 100644 --- a/controller/interfaces/networkdomain/pnd.go +++ b/controller/interfaces/networkdomain/pnd.go @@ -38,3 +38,10 @@ type NetworkDomain interface { Confirm(uuid.UUID) error SubscribePath(uuid.UUID, *mnepb.SubscriptionList) error } + +// LoadedPnd represents a PND that was loaded. +type LoadedPnd struct { + ID string `json:"_id" bson:"_id"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` +} diff --git a/controller/interfaces/networkdomain/pndService.go b/controller/interfaces/networkdomain/pndService.go new file mode 100644 index 0000000000000000000000000000000000000000..a6894bc731fab2bb9c99eca1ad429b2a77113685 --- /dev/null +++ b/controller/interfaces/networkdomain/pndService.go @@ -0,0 +1,17 @@ +package networkdomain + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/store" +) + +// PndService describes an interface for PND service implementation. +type PndService interface { + Add(NetworkDomain) error + Delete(NetworkDomain) error + Get(store.Query) (NetworkDomain, error) + GetAll() ([]NetworkDomain, error) + // Note: Implement these in case we want to use cSBI again. + // PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) + // AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) + // RemovePendingChannel(id uuid.UUID) +} diff --git a/controller/interfaces/networkdomain/pndStore.go b/controller/interfaces/networkdomain/pndStore.go index aca76af93577510fd0b1bc412a7f34500229957e..c031c1fec113246f02aa613cc402cc6d31b48fbe 100644 --- a/controller/interfaces/networkdomain/pndStore.go +++ b/controller/interfaces/networkdomain/pndStore.go @@ -10,8 +10,8 @@ import ( type PndStore interface { Add(NetworkDomain) error Delete(NetworkDomain) error - Get(store.Query) (NetworkDomain, error) - GetAll() ([]NetworkDomain, error) + Get(store.Query) (LoadedPnd, error) + GetAll() ([]LoadedPnd, error) PendingChannels(id uuid.UUID, parseErrors ...error) (chan networkelement.Details, error) AddPendingChannel(id uuid.UUID, ch chan networkelement.Details) RemovePendingChannel(id uuid.UUID) diff --git a/controller/interfaces/rbac/rbacService.go b/controller/interfaces/rbac/rbacService.go index 8aadf7f09d6ac1a79761d1caa97f37400abfdccb..39645f269225e2ff05abe256269002ce947823bd 100644 --- a/controller/interfaces/rbac/rbacService.go +++ b/controller/interfaces/rbac/rbacService.go @@ -1,7 +1,6 @@ package rbac import ( - "code.fbi.h-da.de/danet/gosdn/controller/conflict" "code.fbi.h-da.de/danet/gosdn/controller/store" ) @@ -14,17 +13,6 @@ type UserService interface { GetAll() ([]User, error) } -// LoadedUser represents a User that was loaded. -type LoadedUser struct { - ID string `json:"_id" bson:"_id"` - UserName string `json:"username"` - Roles map[string]string `json:"roles,omitempty"` - Password string `json:"password"` - Token string `json:"token,omitempty"` - Salt string `json:"salt" bson:"salt"` - Metadata conflict.Metadata `json:"metadata" bson:"metadata"` -} - // RoleService describes an interface for role service implementations. type RoleService interface { Add(Role) error @@ -33,11 +21,3 @@ type RoleService interface { Get(store.Query) (Role, error) GetAll() ([]Role, error) } - -// LoadedRole represents a Role that was loaded. -type LoadedRole struct { - ID string `json:"_id" bson:"_id"` - RoleName string `json:"rolename"` - Description string `json:"description,omitempty"` - Permissions []string `json:"permissions,omitempty"` -} diff --git a/controller/interfaces/rbac/role.go b/controller/interfaces/rbac/role.go index d08884215ccaee7231554df76ed946298c65eea8..85658265b7b931f84785cb6c92c6738793cffe94 100644 --- a/controller/interfaces/rbac/role.go +++ b/controller/interfaces/rbac/role.go @@ -10,3 +10,11 @@ type Role interface { GetPermissions() []string RemovePermissionsFromRole([]string) } + +// LoadedRole represents a Role that was loaded. +type LoadedRole struct { + ID string `json:"_id" bson:"_id"` + RoleName string `json:"rolename"` + Description string `json:"description,omitempty"` + Permissions []string `json:"permissions,omitempty"` +} diff --git a/controller/interfaces/rbac/user.go b/controller/interfaces/rbac/user.go index 51051b4dda64cc0d8d1d4dd94304d67945112827..2116e73be7c3346c43281812e167bc33d2504a5b 100644 --- a/controller/interfaces/rbac/user.go +++ b/controller/interfaces/rbac/user.go @@ -17,3 +17,14 @@ type User interface { GetSalt() string GetMetadata() conflict.Metadata } + +// LoadedUser represents a User that was loaded. +type LoadedUser struct { + ID string `json:"_id" bson:"_id"` + UserName string `json:"username"` + Roles map[string]string `json:"roles,omitempty"` + Password string `json:"password"` + Token string `json:"token,omitempty"` + Salt string `json:"salt" bson:"salt"` + Metadata conflict.Metadata `json:"metadata" bson:"metadata"` +} diff --git a/controller/mocks/PndService.go b/controller/mocks/PndService.go new file mode 100644 index 0000000000000000000000000000000000000000..563ef3ce56ff72dae8cb7e228aa49beca41e0b97 --- /dev/null +++ b/controller/mocks/PndService.go @@ -0,0 +1,103 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + networkdomain "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + store "code.fbi.h-da.de/danet/gosdn/controller/store" + mock "github.com/stretchr/testify/mock" +) + +// PndService is an autogenerated mock type for the PndService type +type PndService struct { + mock.Mock +} + +// Add provides a mock function with given fields: _a0 +func (_m *PndService) Add(_a0 networkdomain.NetworkDomain) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Delete provides a mock function with given fields: _a0 +func (_m *PndService) Delete(_a0 networkdomain.NetworkDomain) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(networkdomain.NetworkDomain) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Get provides a mock function with given fields: _a0 +func (_m *PndService) Get(_a0 store.Query) (networkdomain.NetworkDomain, error) { + ret := _m.Called(_a0) + + var r0 networkdomain.NetworkDomain + if rf, ok := ret.Get(0).(func(store.Query) networkdomain.NetworkDomain); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(networkdomain.NetworkDomain) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(store.Query) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAll provides a mock function with given fields: +func (_m *PndService) GetAll() ([]networkdomain.NetworkDomain, error) { + ret := _m.Called() + + var r0 []networkdomain.NetworkDomain + if rf, ok := ret.Get(0).(func() []networkdomain.NetworkDomain); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]networkdomain.NetworkDomain) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewPndService interface { + mock.TestingT + Cleanup(func()) +} + +// NewPndService creates a new instance of PndService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewPndService(t mockConstructorTestingTNewPndService) *PndService { + mock := &PndService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/controller/mocks/PndStore.go b/controller/mocks/PndStore.go index ba943d8d39cd5254621abf22e08fe6ced7530443..8995c85de412e4752cedc5fb89abe511a440e13e 100644 --- a/controller/mocks/PndStore.go +++ b/controller/mocks/PndStore.go @@ -51,16 +51,14 @@ func (_m *PndStore) Delete(_a0 networkdomain.NetworkDomain) error { } // Get provides a mock function with given fields: _a0 -func (_m *PndStore) Get(_a0 store.Query) (networkdomain.NetworkDomain, error) { +func (_m *PndStore) Get(_a0 store.Query) (networkdomain.LoadedPnd, error) { ret := _m.Called(_a0) - var r0 networkdomain.NetworkDomain - if rf, ok := ret.Get(0).(func(store.Query) networkdomain.NetworkDomain); ok { + var r0 networkdomain.LoadedPnd + if rf, ok := ret.Get(0).(func(store.Query) networkdomain.LoadedPnd); ok { r0 = rf(_a0) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(networkdomain.NetworkDomain) - } + r0 = ret.Get(0).(networkdomain.LoadedPnd) } var r1 error @@ -74,15 +72,15 @@ func (_m *PndStore) Get(_a0 store.Query) (networkdomain.NetworkDomain, error) { } // GetAll provides a mock function with given fields: -func (_m *PndStore) GetAll() ([]networkdomain.NetworkDomain, error) { +func (_m *PndStore) GetAll() ([]networkdomain.LoadedPnd, error) { ret := _m.Called() - var r0 []networkdomain.NetworkDomain - if rf, ok := ret.Get(0).(func() []networkdomain.NetworkDomain); ok { + var r0 []networkdomain.LoadedPnd + if rf, ok := ret.Get(0).(func() []networkdomain.LoadedPnd); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]networkdomain.NetworkDomain) + r0 = ret.Get(0).([]networkdomain.LoadedPnd) } } diff --git a/controller/northbound/client/networkElement.go b/controller/northbound/client/networkElement.go new file mode 100644 index 0000000000000000000000000000000000000000..58267f6ba3aac5650566c6ad04dce7f962957649 --- /dev/null +++ b/controller/northbound/client/networkElement.go @@ -0,0 +1,17 @@ +package client + +import ( + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" + "google.golang.org/grpc" +) + +// NetworkElementClient returns a client for the gRPC NetworkElement service. It takes +// the address of the gRPC endpoint and optional grpc.DialOption +// as argument. +func NetworkElementClient(addr string, opts ...grpc.DialOption) (mnepb.NetworkElementServiceClient, error) { + conn, err := grpc.Dial(addr, opts...) + if err != nil { + return nil, err + } + return mnepb.NewNetworkElementServiceClient(conn), nil +} diff --git a/controller/northbound/server/auth_interceptor_test.go b/controller/northbound/server/auth_interceptor_test.go index 89d8169b545b6a06bff182d49dae5cc9210592dc..cddec3a1694001f0a5ed0a82c2a8798828bbfcda 100644 --- a/controller/northbound/server/auth_interceptor_test.go +++ b/controller/northbound/server/auth_interceptor_test.go @@ -12,6 +12,7 @@ import ( eventservice "code.fbi.h-da.de/danet/gosdn/controller/eventService" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" "code.fbi.h-da.de/danet/gosdn/controller/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" @@ -36,10 +37,12 @@ func getTestAuthInterceptorServer(t *testing.T) (*AuthInterceptor, *UserServer, t.Fatal(err) } + serviceManager := &servmgmt.ServiceManager{PNDStore: pndStore} + s := NewAuthInterceptor(jwtManager, userService, roleService) u := NewUserServer(jwtManager, userService) r := NewRoleServer(jwtManager, roleService) - sbiServer := NewSbiServer(pndStore) + sbiServer := NewSbiServer(*serviceManager) if err := clearAndCreateAuthTestSetup(userService, roleService); err != nil { t.Fatal(err) diff --git a/controller/northbound/server/core.go b/controller/northbound/server/core.go index 388b3ad8f94ddd4e2ed478f4d419aa36655b5f49..c20c8c7b168476e5ab7344c3e591f6b679a48a95 100644 --- a/controller/northbound/server/core.go +++ b/controller/northbound/server/core.go @@ -6,9 +6,9 @@ import ( pb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -17,13 +17,13 @@ import ( // CoreServer represents a core server. type CoreServer struct { pb.UnimplementedCoreServiceServer - pndStore networkdomain.PndStore + serviceManager servmgmt.ServiceManager } // NewCoreServer receives a pndStore and returns a new coreServer. -func NewCoreServer(pndStore networkdomain.PndStore) *CoreServer { +func NewCoreServer(serviceManager servmgmt.ServiceManager) *CoreServer { return &CoreServer{ - pndStore: pndStore, + serviceManager: serviceManager, } } @@ -38,7 +38,7 @@ func (s CoreServer) GetPnd(ctx context.Context, request *pb.GetPndRequest) (*pb. return nil, handleRPCError(labels, err) } - storedPnd, err := s.pndStore.Get(store.Query{ID: pndID}) + storedPnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID}) if err != nil { return nil, err } @@ -61,7 +61,7 @@ func (s CoreServer) GetPndList(ctx context.Context, request *pb.GetPndListReques start := metrics.StartHook(labels, grpcRequestsTotal) defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pndList, err := s.pndStore.GetAll() + pndList, err := s.serviceManager.PndService.GetAll() if err != nil { return nil, err } @@ -90,7 +90,7 @@ func (s CoreServer) CreatePndList(ctx context.Context, request *pb.CreatePndList if err != nil { return nil, handleRPCError(labels, err) } - if err := s.pndStore.Add(pnd); err != nil { + if err := s.serviceManager.PndService.Add(pnd); err != nil { return nil, handleRPCError(labels, err) } } @@ -111,11 +111,11 @@ func (s CoreServer) DeletePnd(ctx context.Context, request *pb.DeletePndRequest) return nil, handleRPCError(labels, err) } - pnd, err := s.pndStore.Get(store.Query{ID: pndID}) + pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pndID}) if err != nil { return nil, handleRPCError(labels, err) } - err = s.pndStore.Delete(pnd) + err = s.serviceManager.PndService.Delete(pnd) if err != nil { return &pb.DeletePndResponse{ Timestamp: time.Now().UnixNano(), diff --git a/controller/northbound/server/core_test.go b/controller/northbound/server/core_test.go index 432aa0d52da8b67a33b7bf274781cc2fd6234998..05a30452c56a995b5f713c8b1055a807c044948b 100644 --- a/controller/northbound/server/core_test.go +++ b/controller/northbound/server/core_test.go @@ -11,6 +11,7 @@ import ( spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" "code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/google/uuid" "github.com/stretchr/testify/mock" @@ -93,7 +94,13 @@ func getTestCoreServer(t *testing.T) *CoreServer { t.Fatal(err) } - c := NewCoreServer(pndStore) + pndService := nucleus.NewPndService(pndStore) + + serviceManager := servmgmt.ServiceManager{ + PndService: pndService, + } + + c := NewCoreServer(serviceManager) return c } diff --git a/controller/northbound/server/nbi.go b/controller/northbound/server/nbi.go index a9314781ade93b3a30f465992236633c949001d1..aaec1e2aa2e1b4c4636b9d10f2467a44745a8cf6 100644 --- a/controller/northbound/server/nbi.go +++ b/controller/northbound/server/nbi.go @@ -5,6 +5,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" rbacInterfaces "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" "code.fbi.h-da.de/danet/gosdn/controller/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/topology" "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" @@ -45,19 +46,19 @@ func NewNBI( routeService routingtables.Service, apps app.ManagementService, networkDomain networkdomain.NetworkDomain, - + serviceManager servmgmt.ServiceManager, ) *NorthboundInterface { return &NorthboundInterface{ - Pnd: NewPndServer(pnds), - Core: NewCoreServer(pnds), + Pnd: NewPndServer(serviceManager), + Core: NewCoreServer(serviceManager), Csbi: NewCsbiServer(pnds), - Sbi: NewSbiServer(pnds), + Sbi: NewSbiServer(serviceManager), Auth: NewAuthServer(&jwt, users), User: NewUserServer(&jwt, users), Role: NewRoleServer(&jwt, roles), Topology: NewTopologyServer(topologyService, nodeService, portService), App: NewAppServer(apps), - NetworkElement: NewNetworkElementServer(networkDomain), + NetworkElement: NewNetworkElementServer(networkDomain, serviceManager), Routes: NewRoutingTableServiceServer(routeService, nodeService, portService), } } diff --git a/controller/northbound/server/networkElement.go b/controller/northbound/server/networkElement.go index 8014f79fb10f886429c8539c6e806bfe17f83dd4..0fd870faadedeaf59639ba306b5faeeeb90c0b02 100644 --- a/controller/northbound/server/networkElement.go +++ b/controller/northbound/server/networkElement.go @@ -1,119 +1,873 @@ package server import ( + "context" + "fmt" + "strings" + "time" + mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" + spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" + tpb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/transport" + "code.fbi.h-da.de/danet/gosdn/controller/conflict" + "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" + "code.fbi.h-da.de/danet/gosdn/controller/metrics" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" + "code.fbi.h-da.de/danet/gosdn/controller/store" + aGNMI "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" + "github.com/google/uuid" + "github.com/openconfig/gnmi/proto/gnmi" + "github.com/openconfig/ygot/ygot" + "github.com/openconfig/ygot/ytypes" + "github.com/prometheus/client_golang/prometheus" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" ) // NetworkElementServer represents a NetworkElementServer. type NetworkElementServer struct { mnepb.UnimplementedNetworkElementServiceServer - networkDomain networkdomain.NetworkDomain + networkDomain networkdomain.NetworkDomain + serviceManager servmgmt.ServiceManager } // NewNetworkElementServer returns a new NetWorkElementServer. -func NewNetworkElementServer(networkDomain networkdomain.NetworkDomain) *NetworkElementServer { +func NewNetworkElementServer(networkDomain networkdomain.NetworkDomain, serviceManager servmgmt.ServiceManager) *NetworkElementServer { return &NetworkElementServer{ - networkDomain: networkDomain, - } -} - -// // Add adds a new network element. -// func (s *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) { -// sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id) -// if err != nil { -// return nil, status.Errorf(codes.Aborted, "%v", err) -// } - -// id, err := s.networkDomain.AddNetworkElement( -// request.NetworkElement.NetworkElementName, -// request.NetworkElement.TransportOption, -// sbiID, -// ) -// if err != nil { -// return nil, status.Errorf(codes.Aborted, "%v", err) -// } - -// return &mnepb.AddNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// NetworkElementId: id.String(), -// }, nil -// } - -// // GetAll returns all stored network elements. -// func (s *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) { -// networkElements := s.networkDomain.NetworkElements() - -// mnes := []*mnepb.NetworkElement{} -// for _, mne := range networkElements { -// ygotStructAsJSON, err := mne.GetModelAsString() -// if err != nil { -// log.Error(err) -// return nil, status.Errorf(codes.Aborted, "%v", err) -// } - -// mnes = append(mnes, &mnepb.NetworkElement{ -// Id: mne.ID().String(), -// Name: mne.Name(), -// Model: ygotStructAsJSON, -// }) -// } - -// return &mnepb.GetAllNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// NetworkElement: mnes, -// }, nil -// } - -// // Get returns a network element. -// func (s *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) { -// mne, err := s.networkDomain.GetNetworkElement(request.NetworkElementId) -// if err != nil { -// return nil, status.Errorf(codes.Aborted, "%v", err) -// } - -// ygotStructAsJSON, err := mne.GetModelAsString() -// if err != nil { -// log.Error(err) -// return nil, status.Errorf(codes.Aborted, "%v", err) -// } - -// networkElement := &mnepb.NetworkElement{ -// Id: mne.ID().String(), -// Name: mne.Name(), -// Model: ygotStructAsJSON, -// TransportAddress: mne.TransportAddress(), -// } - -// return &mnepb.GetNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// NetworkElement: networkElement, -// }, nil -// } - -// // Update updates a network element. -// func (s *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) { -// mneID, err := uuid.Parse(request.NetworkElement.Id) -// if err != nil { -// return &mnepb.UpdateNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// }, err -// } - -// err = s.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model) -// if err != nil { -// return &mnepb.UpdateNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// }, err -// } - -// return &mnepb.UpdateNetworkElementResponse{ -// Timestamp: time.Now().UnixNano(), -// Status: mnepb.Status_STATUS_OK, -// }, nil -// } + networkDomain: networkDomain, + serviceManager: serviceManager, + } +} + +// Add adds a new network element. +func (n *NetworkElementServer) Add(ctx context.Context, request *mnepb.AddNetworkElementRequest) (*mnepb.AddNetworkElementResponse, error) { + sbiID, err := uuid.Parse(request.NetworkElement.Sbi.Id) + if err != nil { + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + id, err := n.networkDomain.AddNetworkElement( + request.NetworkElement.NetworkElementName, + request.NetworkElement.TransportOption, + sbiID, + ) + if err != nil { + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + return &mnepb.AddNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + NetworkElementId: id.String(), + }, nil +} + +// GetAll returns all stored network elements. +func (n *NetworkElementServer) GetAll(ctx context.Context, request *mnepb.GetAllNetworkElementRequest) (*mnepb.GetAllNetworkElementResponse, error) { + networkElements := n.networkDomain.NetworkElements() + + mnes := []*mnepb.NetworkElement{} + for _, mne := range networkElements { + ygotStructAsJSON, err := mne.GetModelAsString() + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + mnes = append(mnes, &mnepb.NetworkElement{ + Id: mne.ID().String(), + Name: mne.Name(), + Model: ygotStructAsJSON, + }) + } + + return &mnepb.GetAllNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + NetworkElement: mnes, + }, nil +} + +// Get returns a network element. +func (n *NetworkElementServer) Get(ctx context.Context, request *mnepb.GetNetworkElementRequest) (*mnepb.GetNetworkElementResponse, error) { + mne, err := n.networkDomain.GetNetworkElement(request.NetworkElementId) + if err != nil { + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + ygotStructAsJSON, err := mne.GetModelAsString() + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + networkElement := &mnepb.NetworkElement{ + Id: mne.ID().String(), + Name: mne.Name(), + Model: ygotStructAsJSON, + TransportAddress: mne.TransportAddress(), + } + + return &mnepb.GetNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + NetworkElement: networkElement, + }, nil +} + +// Update updates a network element. +func (n *NetworkElementServer) Update(ctx context.Context, request *mnepb.UpdateNetworkElementRequest) (*mnepb.UpdateNetworkElementResponse, error) { + mneID, err := uuid.Parse(request.NetworkElement.Id) + if err != nil { + return &mnepb.UpdateNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + }, err + } + + err = n.networkDomain.UpdateNetworkElement(mneID, request.NetworkElement.Model) + if err != nil { + return &mnepb.UpdateNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + }, err + } + + return &mnepb.UpdateNetworkElementResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + }, nil +} + +// GetMne gets a specific mne. +func (n *NetworkElementServer) GetMne(ctx context.Context, request *mnepb.GetMneRequest) (*mnepb.GetMneResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + networkElement, err := n.getMne(request.Mneid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + // TODO(path): This needs some adjustments when we're switching towards a new + // path request handling. + mne, err := fillMneBySpecificPath(networkElement, "/") + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + return &mnepb.GetMneResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + Mne: mne, + }, nil +} + +func (n *NetworkElementServer) getMne(identifier string) (networkelement.NetworkElement, error) { + id, err := uuid.Parse(identifier) + if err != nil { + id = uuid.Nil + } + + mne, err := n.serviceManager.MneService.Get(store.Query{ + ID: id, + }) + if mne == nil { + return nil, fmt.Errorf("no network element found") + } + if err != nil { + return nil, err + } + + return mne, nil +} + +// GetMneList returns a list of existing mnes. +func (n *NetworkElementServer) GetMneList(ctx context.Context, request *mnepb.GetMneListRequest) (*mnepb.GetMneListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + storedMNE, err := n.serviceManager.MneService.GetAll() + if err != nil { + return nil, err + } + + mnes := make([]*mnepb.ManagedNetworkElement, len(storedMNE)) + for i, networkElement := range storedMNE { + mne, err := fillMneBySpecificPath(networkElement, "/") + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + mnes[i] = mne + } + + return &mnepb.GetMneListResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + Mne: mnes, + }, nil +} + +// GetFlattenedMneList returns a list of existing mnes. +func (n *NetworkElementServer) GetFlattenedMneList(ctx context.Context, request *mnepb.GetMneListRequest) (*mnepb.GetFlattenedMneListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + mnes, err := n.serviceManager.MneService.GetAllAsLoaded() + if err != nil { + return nil, err + } + + flattenedMnes := make([]*mnepb.FlattenedManagedNetworkElement, len(mnes)) + for i, mne := range mnes { + mne := &mnepb.FlattenedManagedNetworkElement{ + Id: mne.ID, + Name: mne.Name, + Sbi: mne.SBI, + } + flattenedMnes[i] = mne + } + + return &mnepb.GetFlattenedMneListResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + Mne: flattenedMnes, + }, nil +} + +func fillMneBySpecificPath(nme networkelement.NetworkElement, path string) (*mnepb.ManagedNetworkElement, error) { + gnmiPath, err := ygot.StringToStructuredPath(path) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + opts := []ytypes.GetNodeOpt{ + &ytypes.GetHandleWildcards{}, + &ytypes.GetPartialKeyMatch{}, + } + nodes, err := ytypes.GetNode(nme.SBI().Schema().RootSchema(), nme.GetModel(), gnmiPath, opts...) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + notifications := make([]*gnmi.Notification, len(nodes)) + for i, node := range nodes { + mneNotification, err := genGnmiNotification(gnmiPath, node.Data) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + notifications[i] = mneNotification + } + + sbi := spb.SouthboundInterface{} + if nme.SBI() != nil { + sbi.Id = nme.SBI().ID().String() + sbi.Type = nme.SBI().Type() + } + + mne := &mnepb.ManagedNetworkElement{ + Id: nme.ID().String(), + Name: nme.Name(), + MneNotification: notifications, + Sbi: &sbi, + } + + return mne, nil +} + +func genGnmiNotification(path *gnmi.Path, val any) (*gnmi.Notification, error) { + typedVal, err := ygot.EncodeTypedValue(val, gnmi.Encoding_JSON_IETF) + if err != nil { + return nil, err + } + return &gnmi.Notification{ + Timestamp: time.Now().UnixNano(), + Update: []*gnmi.Update{ + { + Path: &gnmi.Path{ + Elem: path.GetElem(), + }, + Val: typedVal, + }, + }, + }, nil +} + +// GetPath gets a path on a mne. +func (n *NetworkElementServer) GetPath(ctx context.Context, request *mnepb.GetPathRequest) (*mnepb.GetPathResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + mneuid, err := uuid.Parse(request.Mneid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + // In case we get the path from grpc-gateway we have to replace + path := strings.ReplaceAll(request.Path, "||", "/") + + resp, err := n.getPath(ctx, mneuid, path) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + return &mnepb.GetPathResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + MneNotification: resp.(*gnmi.GetResponse).Notification, + }, nil +} + +func (n *NetworkElementServer) getPath(ctx context.Context, uuid uuid.UUID, path string) (proto.Message, error) { + mne, err := n.serviceManager.MneService.Get(store.Query{ + ID: uuid, + Name: uuid.String(), + }) + if err != nil { + return nil, err + } + //TODO(PND): check if necessary? + if mne == nil { + return nil, fmt.Errorf("no network element found") + } + + res, err := mne.Transport().Get(ctx, path) + if err != nil { + return nil, err + } + resp, ok := res.(proto.Message) + if !ok { + return nil, &customerrs.InvalidTypeAssertionError{ + Value: res, + Type: (*proto.Message)(nil), + } + } + err = mne.ProcessResponse(resp) + if err != nil { + return nil, err + } + + modelAsString, err := mne.GetModelAsString() + if err != nil { + return nil, err + } + + // TODO(path): We probably have to remove this when we address path request handling. + err = n.serviceManager.MneService.UpdateModel(uuid, modelAsString) + if err != nil { + return nil, err + } + + return resp, nil +} + +// GetChange gets a specific change of a mne. +func (n *NetworkElementServer) GetChange(ctx context.Context, request *mnepb.GetChangeRequest) (*mnepb.GetChangeResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + changes, err := fillChanges(pnd, false, request.Cuid...) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + return &mnepb.GetChangeResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + Change: changes, + }, nil +} + +// GetChangeList gets all existing changes. +func (n *NetworkElementServer) GetChangeList(ctx context.Context, request *mnepb.GetChangeListRequest) (*mnepb.GetChangeListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "get"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + changes, err := fillChanges(pnd, true, "") + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + return &mnepb.GetChangeListResponse{ + Timestamp: time.Now().UnixNano(), + Pnd: &mnepb.PrincipalNetworkDomain{ + Id: pnd.ID().String(), + Name: pnd.GetName(), + Description: pnd.GetDescription(), + }, + Change: changes, + }, nil +} + +func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*mnepb.Change, error) { + var changeList []uuid.UUID + + switch all { + case true: + changeList = pnd.PendingChanges() + changeList = append(changeList, pnd.CommittedChanges()...) + default: + var err error + if len(cuid) == 0 { + return nil, &customerrs.InvalidParametersError{ + Func: fillChanges, + Param: "length of 'mneID' cannot be '0' when 'all' is set to 'false'", + } + } + changeList, err = stringArrayToUUIDs(cuid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + } + + changes := make([]*mnepb.Change, len(changeList)) + for i, ch := range changeList { + c, err := pnd.GetChange(ch) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + diff, err := ygot.Diff(c.PreviousState(), c.IntendedState()) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + changes[i] = &mnepb.Change{ + Id: ch.String(), + Age: c.Age().Microseconds(), + State: c.State(), + Diff: diff, + } + } + return changes, nil +} + +func stringArrayToUUIDs(sid []string) ([]uuid.UUID, error) { + UUIDs := make([]uuid.UUID, len(sid)) + for i, id := range sid { + parsed, err := uuid.Parse(id) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + UUIDs[i] = parsed + } + return UUIDs, nil +} + +// SetMneList updates the list of mnes. +func (n *NetworkElementServer) SetMneList(ctx context.Context, request *mnepb.SetMneListRequest) (*mnepb.SetMneListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "set"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + networkElementIDs := make([]uuid.UUID, 0, len(request.Mne)) + for _, r := range request.Mne { + sid, err := uuid.Parse(r.Sbi.Id) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + mneID, err := n.addMne(ctx, r.MneName, r.TransportOption, sid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + networkElementIDs = append(networkElementIDs, mneID) + } + + r := make([]*mnepb.SetResponse, len(networkElementIDs)) + for i, mneID := range networkElementIDs { + r[i] = &mnepb.SetResponse{Id: mneID.String(), Status: mnepb.Status_STATUS_OK} + } + + return &mnepb.SetMneListResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + Responses: r, + }, nil +} + +func (n *NetworkElementServer) addMne(ctx context.Context, name string, opt *tpb.TransportOption, sid uuid.UUID) (uuid.UUID, error) { + var sbi southbound.SouthboundInterface + var err error + + // TODO(PND): check how to handle this! + + // switch t := opt.Type; t { + // case spb.Type_TYPE_CONTAINERISED: + // return n.handleCsbiEnrolment(name, opt) + // case spb.Type_TYPE_PLUGIN: + // sbi, err = n.requestPlugin(name, opt) + // if err != nil { + // return uuid.Nil, err + // } + // default: + // var err error + // sbi, err = pnd.southboundService.Get(store.Query{ID: sid}) + // if err != nil { + // return uuid.Nil, err + // } + // } + + sbi, err = n.serviceManager.SbiService.Get(store.Query{ID: sid}) + if err != nil { + return uuid.Nil, err + } + + mne, err := nucleus.NewNetworkElement(name, uuid.Nil, opt, sbi, conflict.Metadata{ResourceVersion: 0}) + if err != nil { + return uuid.Nil, err + } + + err = n.serviceManager.MneService.Add(mne) + if err != nil { + return uuid.Nil, err + } + + if mne.IsTransportValid() { + _, err = n.getPath(ctx, mne.ID(), "/interfaces") + if err != nil { + return uuid.Nil, err + } + } + + return mne.ID(), nil +} + +// SetChangeList sets a list of changes. +func (n *NetworkElementServer) SetChangeList(ctx context.Context, request *mnepb.SetChangeListRequest) (*mnepb.SetChangeListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "set"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + return nil, handleRPCError(labels, err) + } + + responses := make([]*mnepb.SetResponse, len(request.Change)) + + for i, r := range request.Change { + cuid, err := uuid.Parse(r.Cuid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + switch r.Op { + case mnepb.Operation_OPERATION_COMMIT: + if err := pnd.Commit(cuid); err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + case mnepb.Operation_OPERATION_CONFIRM: + if err := pnd.Confirm(cuid); err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + default: + return nil, &customerrs.InvalidParametersError{ + Param: r.Op, + } + } + + responses[i] = &mnepb.SetResponse{ + Id: cuid.String(), + Status: mnepb.Status_STATUS_OK, + } + } + return &mnepb.SetChangeListResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + Responses: responses, + }, nil +} + +// SetPathList sets a list of paths. +func (n *NetworkElementServer) SetPathList(ctx context.Context, request *mnepb.SetPathListRequest) (*mnepb.SetPathListResponse, error) { + labels := prometheus.Labels{"service": "mne", "rpc": "set"} + start := metrics.StartHook(labels, grpcRequestsTotal) + defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) + + pid, err := uuid.Parse(request.Pid) + if err != nil { + return nil, handleRPCError(labels, err) + } + + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pid}) + if err != nil { + return nil, handleRPCError(labels, err) + } + + responses := make([]*mnepb.SetResponse, len(request.ChangeRequest)) + + for i, r := range request.ChangeRequest { + mneID, err := uuid.Parse(r.Mneid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + cid, err := pnd.ChangeMNE(mneID, r.ApiOp, r.Path, r.Value) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + responses[i] = &mnepb.SetResponse{ + Status: mnepb.Status_STATUS_OK, + Id: cid.String(), + } + } + return &mnepb.SetPathListResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + Responses: responses, + }, nil +} + +// DeleteMne deletes a mne. +func (n *NetworkElementServer) DeleteMne(ctx context.Context, request *mnepb.DeleteMneRequest) (*mnepb.DeleteMneResponse, error) { + //TODO(PND): decide if this should be added or not, requires some changes in controller/nucleus/metrics.go too + // labels := prometheus.Labels{"service": "mne", "rpc": "delete"} + // start := metrics.StartHook(labels, networkElementDeletionsTotal) + // defer metrics.FinishHook(labels, start, networkElementDeletionDurationSecondsTotal, networkElementDeletionDurationSeconds) + + mneID, err := uuid.Parse(request.Mneid) + if err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + + if err := n.deleteMne(mneID); err != nil { + log.Error(err) + return nil, status.Errorf(codes.Aborted, "%v", err) + } + return &mnepb.DeleteMneResponse{ + Timestamp: time.Now().UnixNano(), + Status: mnepb.Status_STATUS_OK, + }, nil +} + +func (n *NetworkElementServer) deleteMne(id uuid.UUID) error { + mne, err := n.serviceManager.MneService.Get(store.Query{ + ID: id, + Name: id.String(), + }) + + if err != nil { + return err + } + + //TODO(PND): check if necessary! + if mne == nil { + return fmt.Errorf("no network element found") + } + + // TODO(PND): check how to handle this! + // switch mne.(type) { + // case *CsbiNetworkElement: + // return pnd.handleCsbiDeletion(mne) + // default: + // return pnd.networkElementService.Delete(mne) + // } + + return n.serviceManager.MneService.Delete(mne) +} + +// SubscribePath subscribes to specifc paths of an mne. +func (n *NetworkElementServer) SubscribePath(request *mnepb.SubscribePathRequest, stream mnepb.NetworkElementService_SubscribePathServer) error { + mneID, err := uuid.Parse(request.Mneid) + if err != nil { + return err + } + + if err := n.subscribePath(mneID, request.Sublist); err != nil { + return err + } + + return nil +} + +func (n *NetworkElementServer) subscribePath(uuid uuid.UUID, subList *mnepb.SubscriptionList) error { + mne, err := n.serviceManager.MneService.Get(store.Query{ + ID: uuid, + }) + if err != nil { + return err + } + + mode, err := n.mapModeToAristaFork(subList.GetMode()) + if err != nil { + return err + } + + for _, sub := range subList.Subscription { + streamMode, err := n.mapStreamModeToAristaFork(sub.GetStreamMode()) + if err != nil { + return err + } + + opts := &aGNMI.SubscribeOptions{ + Mode: mode, + StreamMode: streamMode, + Paths: [][]string{n.splitStringPath(sub.GetPath())}, + SampleInterval: sub.SampleInterval, + } + + ctx := context.Background() + ctx = context.WithValue(ctx, types.CtxKeyOpts, opts) + + if err = mne.Transport().Subscribe(ctx); err != nil { + return err + } + } + + return nil +} + +func (n *NetworkElementServer) splitStringPath(s string) []string { + return strings.Split(s, "/") +} + +func (n *NetworkElementServer) mapStreamModeToAristaFork(mode mnepb.StreamMode) (string, error) { + switch mode { + case mnepb.StreamMode_STREAM_MODE_TARGET_DEFINED: + return "target_defined", nil + case mnepb.StreamMode_STREAM_MODE_ON_CHANGE: + return "on_change", nil + case mnepb.StreamMode_STREAM_MODE_SAMPLE: + return "sample", nil + default: + return "", fmt.Errorf("StreamMode of type: %T is not supported", mode) + } +} + +func (n *NetworkElementServer) mapModeToAristaFork(mode mnepb.SubscriptionMode) (string, error) { + switch mode { + case mnepb.SubscriptionMode_SUBSCRIPTION_MODE_STREAM: + return "stream", nil + case mnepb.SubscriptionMode_SUBSCRIPTION_MODE_ONCE: + return "once", nil + case mnepb.SubscriptionMode_SUBSCRIPTION_MODE_POLL: + return "poll", nil + default: + return "", fmt.Errorf("SubscriptionMode of type: %T is not supported", mode) + } +} diff --git a/controller/northbound/server/pnd.go b/controller/northbound/server/pnd.go index e1ba41b9410b5bc7f65e4ae55effe1c1a7b84226..908c31fe8115f41b953d08737b41d42132edb5cf 100644 --- a/controller/northbound/server/pnd.go +++ b/controller/northbound/server/pnd.go @@ -2,22 +2,16 @@ package server import ( "context" - "strings" "time" - mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement" ppb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" - "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/metrics" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" - "github.com/openconfig/gnmi/proto/gnmi" - "github.com/openconfig/ygot/ygot" - "github.com/openconfig/ygot/ytypes" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" @@ -27,195 +21,16 @@ import ( // PndServer implements a pnd server. type PndServer struct { ppb.UnimplementedPndServiceServer - pndStore networkdomain.PndStore + serviceManager servmgmt.ServiceManager } // NewPndServer receives a pndStore and returns a new pndServer. -func NewPndServer(pndStore networkdomain.PndStore) *PndServer { +func NewPndServer(serviceManager servmgmt.ServiceManager) *PndServer { return &PndServer{ - pndStore: pndStore, + serviceManager: serviceManager, } } -// GetMne gets a specific mne. -func (p PndServer) GetMne(ctx context.Context, request *mnepb.GetMneRequest) (*mnepb.GetMneResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - networkElement, err := pnd.GetNetworkElement(request.Mneid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - // TODO(path): This needs some adjustments when we're switching towards a new - // path request handling. - mne, err := fillMneBySpecificPath(networkElement, "/") - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - return &mnepb.GetMneResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - Mne: mne, - }, nil -} - -// GetMneList returns a list of existing mnes. -func (p PndServer) GetMneList(ctx context.Context, request *mnepb.GetMneListRequest) (*mnepb.GetMneListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - mnes := make([]*mnepb.ManagedNetworkElement, len(pnd.NetworkElements())) - for i, networkElement := range pnd.NetworkElements() { - mne, err := fillMneBySpecificPath(networkElement, "/") - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - mnes[i] = mne - } - - return &mnepb.GetMneListResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - Mne: mnes, - }, nil -} - -// GetFlattenedMneList returns a list of existing mnes. -func (p PndServer) GetFlattenedMneList(ctx context.Context, request *mnepb.GetMneListRequest) (*mnepb.GetFlattenedMneListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - mnes := pnd.FlattenedNetworkElements() - flattenedMnes := make([]*mnepb.FlattenedManagedNetworkElement, len(mnes)) - for i, mne := range mnes { - mne := &mnepb.FlattenedManagedNetworkElement{ - - Id: mne.ID, - Name: mne.Name, - Sbi: mne.SBI, - } - flattenedMnes[i] = mne - } - - return &mnepb.GetFlattenedMneListResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - Mne: flattenedMnes, - }, nil -} - -func fillMneBySpecificPath(nme networkelement.NetworkElement, path string) (*mnepb.ManagedNetworkElement, error) { - gnmiPath, err := ygot.StringToStructuredPath(path) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - opts := []ytypes.GetNodeOpt{ - &ytypes.GetHandleWildcards{}, - &ytypes.GetPartialKeyMatch{}, - } - nodes, err := ytypes.GetNode(nme.SBI().Schema().RootSchema(), nme.GetModel(), gnmiPath, opts...) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - notifications := make([]*gnmi.Notification, len(nodes)) - for i, node := range nodes { - mneNotification, err := genGnmiNotification(gnmiPath, node.Data) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - notifications[i] = mneNotification - } - - sbi := spb.SouthboundInterface{} - if nme.SBI() != nil { - sbi.Id = nme.SBI().ID().String() - sbi.Type = nme.SBI().Type() - } - - mne := &mnepb.ManagedNetworkElement{ - Id: nme.ID().String(), - Name: nme.Name(), - MneNotification: notifications, - Sbi: &sbi, - } - - return mne, nil -} - -func genGnmiNotification(path *gnmi.Path, val any) (*gnmi.Notification, error) { - typedVal, err := ygot.EncodeTypedValue(val, gnmi.Encoding_JSON_IETF) - if err != nil { - return nil, err - } - return &gnmi.Notification{ - Timestamp: time.Now().UnixNano(), - Update: []*gnmi.Update{ - { - Path: &gnmi.Path{ - Elem: path.GetElem(), - }, - Val: typedVal, - }, - }, - }, nil -} - // GetSbi gets a specific sbi. func (p PndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb.GetSbiResponse, error) { labels := prometheus.Labels{"service": "pnd", "rpc": "get"} @@ -226,7 +41,7 @@ func (p PndServer) GetSbi(ctx context.Context, request *ppb.GetSbiRequest) (*ppb return nil, handleRPCError(labels, err) } - pnd, err := p.pndStore.Get(store.Query{ID: pid}) + pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -266,7 +81,7 @@ func (p PndServer) GetSbiList(ctx context.Context, request *ppb.GetSbiListReques return nil, handleRPCError(labels, err) } - pnd, err := p.pndStore.Get(store.Query{ID: pid}) + pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) if err != nil { log.Error(err) return nil, status.Errorf(codes.Aborted, "%v", err) @@ -304,304 +119,6 @@ func fillSbis(pnd networkdomain.NetworkDomain) ([]*spb.SouthboundInterface, erro return sbisToReturn, nil } -func stringArrayToUUIDs(sid []string) ([]uuid.UUID, error) { - UUIDs := make([]uuid.UUID, len(sid)) - for i, id := range sid { - parsed, err := uuid.Parse(id) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - UUIDs[i] = parsed - } - return UUIDs, nil -} - -// GetPath gets a path on a mne. -func (p PndServer) GetPath(ctx context.Context, request *mnepb.GetPathRequest) (*mnepb.GetPathResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - mneuid, err := uuid.Parse(request.Mneid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - // In case we get the path from grpc-gateway we have to replace - path := strings.ReplaceAll(request.Path, "||", "/") - - resp, err := pnd.Request(mneuid, path) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - return &mnepb.GetPathResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - MneNotification: resp.(*gnmi.GetResponse).Notification, - }, nil -} - -// GetChange gets a specific change of a mne. -func (p PndServer) GetChange(ctx context.Context, request *mnepb.GetChangeRequest) (*mnepb.GetChangeResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - changes, err := fillChanges(pnd, false, request.Cuid...) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - return &mnepb.GetChangeResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - Change: changes, - }, nil -} - -// GetChangeList gets all existing changes. -func (p PndServer) GetChangeList(ctx context.Context, request *mnepb.GetChangeListRequest) (*mnepb.GetChangeListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "get"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - changes, err := fillChanges(pnd, true, "") - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - return &mnepb.GetChangeListResponse{ - Timestamp: time.Now().UnixNano(), - Pnd: &mnepb.PrincipalNetworkDomain{ - Id: pnd.ID().String(), - Name: pnd.GetName(), - Description: pnd.GetDescription(), - }, - Change: changes, - }, nil -} - -func fillChanges(pnd networkdomain.NetworkDomain, all bool, cuid ...string) ([]*mnepb.Change, error) { - var changeList []uuid.UUID - - switch all { - case true: - changeList = pnd.PendingChanges() - changeList = append(changeList, pnd.CommittedChanges()...) - default: - var err error - if len(cuid) == 0 { - return nil, &customerrs.InvalidParametersError{ - Func: fillChanges, - Param: "length of 'mneID' cannot be '0' when 'all' is set to 'false'", - } - } - changeList, err = stringArrayToUUIDs(cuid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - } - - changes := make([]*mnepb.Change, len(changeList)) - for i, ch := range changeList { - c, err := pnd.GetChange(ch) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - diff, err := ygot.Diff(c.PreviousState(), c.IntendedState()) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - changes[i] = &mnepb.Change{ - Id: ch.String(), - Age: c.Age().Microseconds(), - State: c.State(), - Diff: diff, - } - } - return changes, nil -} - -// SetMneList updates the list of mnes. -func (p PndServer) SetMneList(ctx context.Context, request *mnepb.SetMneListRequest) (*mnepb.SetMneListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "set"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - return nil, handleRPCError(labels, err) - } - - networkElementIDs := make([]uuid.UUID, 0, len(request.Mne)) - for _, r := range request.Mne { - sid, err := uuid.Parse(r.Sbi.Id) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - mneID, err := pnd.AddNetworkElement(r.MneName, r.TransportOption, sid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - networkElementIDs = append(networkElementIDs, mneID) - } - - r := make([]*mnepb.SetResponse, len(networkElementIDs)) - for i, mneID := range networkElementIDs { - r[i] = &mnepb.SetResponse{Id: mneID.String(), Status: mnepb.Status_STATUS_OK} - } - - return &mnepb.SetMneListResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - Responses: r, - }, nil -} - -// SetChangeList sets a list of changes. -func (p PndServer) SetChangeList(ctx context.Context, request *mnepb.SetChangeListRequest) (*mnepb.SetChangeListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "set"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - return nil, handleRPCError(labels, err) - } - - responses := make([]*mnepb.SetResponse, len(request.Change)) - - for i, r := range request.Change { - cuid, err := uuid.Parse(r.Cuid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - switch r.Op { - case mnepb.Operation_OPERATION_COMMIT: - if err := pnd.Commit(cuid); err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - case mnepb.Operation_OPERATION_CONFIRM: - if err := pnd.Confirm(cuid); err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - default: - return nil, &customerrs.InvalidParametersError{ - Param: r.Op, - } - } - - responses[i] = &mnepb.SetResponse{ - Id: cuid.String(), - Status: mnepb.Status_STATUS_OK, - } - } - return &mnepb.SetChangeListResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - Responses: responses, - }, nil -} - -// SetPathList sets a list of paths. -func (p PndServer) SetPathList(ctx context.Context, request *mnepb.SetPathListRequest) (*mnepb.SetPathListResponse, error) { - labels := prometheus.Labels{"service": "pnd", "rpc": "set"} - start := metrics.StartHook(labels, grpcRequestsTotal) - defer metrics.FinishHook(labels, start, grpcRequestDurationSecondsTotal, grpcRequestDurationSeconds) - pid, err := uuid.Parse(request.Pid) - if err != nil { - return nil, handleRPCError(labels, err) - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - return nil, handleRPCError(labels, err) - } - - responses := make([]*mnepb.SetResponse, len(request.ChangeRequest)) - - for i, r := range request.ChangeRequest { - mneID, err := uuid.Parse(r.Mneid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - cid, err := pnd.ChangeMNE(mneID, r.ApiOp, r.Path, r.Value) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - responses[i] = &mnepb.SetResponse{ - Status: mnepb.Status_STATUS_OK, - Id: cid.String(), - } - } - return &mnepb.SetPathListResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - Responses: responses, - }, nil -} - // SetSbiList sets a list of sbis. func (p PndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListRequest) (*ppb.SetSbiListResponse, error) { labels := prometheus.Labels{"service": "pnd", "rpc": "set"} @@ -612,7 +129,7 @@ func (p PndServer) SetSbiList(ctx context.Context, request *ppb.SetSbiListReques return nil, handleRPCError(labels, err) } - pnd, err := p.pndStore.Get(store.Query{ID: pid}) + pnd, err := p.serviceManager.PndService.Get(store.Query{ID: pid}) if err != nil { return nil, handleRPCError(labels, err) } @@ -657,55 +174,3 @@ func filterSbiType(sbiType ppb.SbiType) spb.Type { return spbType } - -// DeleteMne deletes a mne. -func (p PndServer) DeleteMne(ctx context.Context, request *mnepb.DeleteMneRequest) (*mnepb.DeleteMneResponse, error) { - pid, err := uuid.Parse(request.Pid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - - mneID, err := uuid.Parse(request.Mneid) - if err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - if err := pnd.RemoveNetworkElement(mneID); err != nil { - log.Error(err) - return nil, status.Errorf(codes.Aborted, "%v", err) - } - return &mnepb.DeleteMneResponse{ - Timestamp: time.Now().UnixNano(), - Status: mnepb.Status_STATUS_OK, - }, nil -} - -// SubscribePath subscribes to specifc paths of an mne. -func (p PndServer) SubscribePath(request *mnepb.SubscribePathRequest, stream mnepb.NetworkElementService_SubscribePathServer) error { - pid, err := uuid.Parse(request.Pid) - if err != nil { - return err - } - - pnd, err := p.pndStore.Get(store.Query{ID: pid}) - if err != nil { - return err - } - - mneID, err := uuid.Parse(request.Mneid) - if err != nil { - return err - } - - if err := pnd.SubscribePath(mneID, request.Sublist); err != nil { - return err - } - - return nil -} diff --git a/controller/northbound/server/pnd_test.go b/controller/northbound/server/pnd_test.go index fbf20c00d7c046bab578469006270c1475e68188..6608cd19ad99d4375f89dbef7a5d7e44b62a4a7f 100644 --- a/controller/northbound/server/pnd_test.go +++ b/controller/northbound/server/pnd_test.go @@ -9,12 +9,14 @@ import ( spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" "code.fbi.h-da.de/danet/gosdn/controller/mocks" "code.fbi.h-da.de/danet/gosdn/controller/nucleus" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/models/generated/openconfig" "github.com/google/uuid" "github.com/openconfig/gnmi/proto/gnmi" "github.com/stretchr/testify/mock" ) +// TODO(PND): this whole file needs to be reworked! func getTestPndServer(t *testing.T) *PndServer { var err error pndUUID, err = uuid.Parse(pndID) @@ -92,7 +94,11 @@ func getTestPndServer(t *testing.T) *PndServer { t.Fatal(err) } - c := NewPndServer(pndStore) + pndService := nucleus.NewPndService(pndStore) + + serviceManager := &servmgmt.ServiceManager{PndService: pndService} + + c := NewPndServer(*serviceManager) return c } @@ -207,12 +213,12 @@ func Test_pnd_GetPath(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - s := getTestPndServer(t) - _, err := s.GetPath(tt.args.ctx, tt.args.request) - if (err != nil) != tt.wantErr { - t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr) - return - } + // s := getTestPndServer(t) + // _, err := s.GetPath(tt.args.ctx, tt.args.request) + // if (err != nil) != tt.wantErr { + // t.Errorf("GetPath() error = %v, wantErr %v", err, tt.wantErr) + // return + // } //got := resp.GetMneNotification() diff --git a/controller/northbound/server/sbi.go b/controller/northbound/server/sbi.go index 32374d5265155ec4ef6c0595c245e367910e8b8b..8edfaae2357ea68f3c564f8f4d81a3a04b1bff4a 100644 --- a/controller/northbound/server/sbi.go +++ b/controller/northbound/server/sbi.go @@ -6,8 +6,8 @@ import ( "io" spb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/southbound" - "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/metrics" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -27,13 +27,13 @@ const ( // SbiServer represents a sbi server. type SbiServer struct { spb.UnimplementedSbiServiceServer - pndStore networkdomain.PndStore + serviceManager servmgmt.ServiceManager } // NewSbiServer receives a pndStore and returns a new sbiServer. -func NewSbiServer(pndStore networkdomain.PndStore) *SbiServer { +func NewSbiServer(serviceManager servmgmt.ServiceManager) *SbiServer { return &SbiServer{ - pndStore: pndStore, + serviceManager: serviceManager, } } @@ -53,7 +53,7 @@ func (s SbiServer) GetSchema(request *spb.GetSchemaRequest, stream spb.SbiServic return handleRPCError(labels, err) } - pnd, err := s.pndStore.Get(store.Query{ID: pid}) + pnd, err := s.serviceManager.PndService.Get(store.Query{ID: pid}) if err != nil { return handleRPCError(labels, err) } diff --git a/controller/nucleus/databasePndStore.go b/controller/nucleus/databasePndStore.go index aa70d0fdf666f5783d6b73e4fc901999fe11afe0..8f30af9fce6f819ed092b4374bca1fe4ccd0efaf 100644 --- a/controller/nucleus/databasePndStore.go +++ b/controller/nucleus/databasePndStore.go @@ -28,9 +28,37 @@ type DatabasePndStore struct { // Get takes a PrincipalNetworkDomain's UUID or name and returns the PrincipalNetworkDomain. If the requested // PrincipalNetworkDomain does not exist an error is returned. -func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.NetworkDomain, err error) { - var loadedPND LoadedPnd +func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.LoadedPnd, err error) { + var loadedPND networkdomain.LoadedPnd + if query.ID != uuid.Nil { + loadedPND, err := s.getByID(query.ID) + if err != nil { + return loadedPND, err + } + } + + loadedPND, err = s.getByName(query.Name) + if err != nil { + return loadedPND, err + } + + // Note: add this if using cSBI agian + // csbiClient, err := s.getCsbiClient() + // if err != nil { + // return loadedPND, err + // } + + // newPnd, err := NewPND( + // loadedPND.Name, + // loadedPND.Description, + // uuid.MustParse(loadedPND.ID), + // ) + + return loadedPND, nil +} + +func (s *DatabasePndStore) getByID(idOfPnd uuid.UUID) (loadedPnd networkdomain.LoadedPnd, err error) { client, ctx, cancel := database.GetMongoConnection() defer cancel() defer func() { @@ -39,42 +67,52 @@ func (s *DatabasePndStore) Get(query store.Query) (newPnd networkdomain.NetworkD err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) } }() + db := client.Database(database.DatabaseName) collection := db.Collection(s.pndStoreName) - result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: query.ID.String()}}) + result := collection.FindOne(ctx, bson.D{primitive.E{Key: "_id", Value: idOfPnd.String()}}) if result == nil { - return nil, customerrs.CouldNotFindError{ID: query.ID} + return loadedPnd, customerrs.CouldNotFindError{ID: idOfPnd} } - err = result.Decode(&loadedPND) + err = result.Decode(&loadedPnd) if err != nil { log.Printf("Failed marshalling %v", err) - - return nil, customerrs.CouldNotMarshallError{Identifier: query.ID, Type: loadedPND, Err: err} + return loadedPnd, customerrs.CouldNotMarshallError{Identifier: idOfPnd, Type: loadedPnd, Err: err} } - csbiClient, err := s.getCsbiClient() - if err != nil { - return nil, err + return loadedPnd, nil +} + +func (s *DatabasePndStore) getByName(nameOfPnd string) (loadedPnd networkdomain.LoadedPnd, err error) { + client, ctx, cancel := database.GetMongoConnection() + defer cancel() + defer func() { + if ferr := client.Disconnect(ctx); ferr != nil { + fErrString := ferr.Error() + err = fmt.Errorf("InternalError=%w DeferError=%+s", err, fErrString) + } + }() + + db := client.Database(database.DatabaseName) + collection := db.Collection(s.pndStoreName) + result := collection.FindOne(ctx, bson.D{primitive.E{Key: "name", Value: nameOfPnd}}) + if result == nil { + return loadedPnd, customerrs.CouldNotFindError{ID: nameOfPnd} } - newPnd, err = NewPND( - loadedPND.Name, - loadedPND.Description, - uuid.MustParse(loadedPND.ID), - csbiClient, - s.callback, - ) + err = result.Decode(&loadedPnd) if err != nil { - return nil, err + log.Printf("Failed marshalling %v", err) + return loadedPnd, customerrs.CouldNotMarshallError{Identifier: nameOfPnd, Type: loadedPnd, Err: err} } - return newPnd, nil + return loadedPnd, nil } // GetAll returns all stored pnds. -func (s *DatabasePndStore) GetAll() (pnds []networkdomain.NetworkDomain, err error) { - var loadedPnds []LoadedPnd +func (s *DatabasePndStore) GetAll() (pnds []networkdomain.LoadedPnd, err error) { + var loadedPnds []networkdomain.LoadedPnd client, ctx, cancel := database.GetMongoConnection() defer cancel() @@ -106,27 +144,28 @@ func (s *DatabasePndStore) GetAll() (pnds []networkdomain.NetworkDomain, err err return nil, customerrs.CouldNotMarshallError{Type: loadedPnds, Err: err} } - csbiClient, err := s.getCsbiClient() - if err != nil { - return nil, err - } - - for _, loadedPND := range loadedPnds { - newPnd, err := NewPND( - loadedPND.Name, - loadedPND.Description, - uuid.MustParse(loadedPND.ID), - csbiClient, - s.callback, - ) - if err != nil { - return nil, err - } - - pnds = append(pnds, newPnd) - } - - return pnds, nil + // Note: add this if using cSBI again + // csbiClient, err := s.getCsbiClient() + // if err != nil { + // return nil, err + // } + + // for _, loadedPND := range loadedPnds { + // newPnd, err := NewPND( + // loadedPND.Name, + // loadedPND.Description, + // uuid.MustParse(loadedPND.ID), + // csbiClient, + // s.callback, + // ) + // if err != nil { + // return nil, err + // } + + // pnds = append(pnds, newPnd) + // } + + return loadedPnds, nil } // Add adds a pnd to the pnd store. diff --git a/controller/nucleus/memoryPndStore.go b/controller/nucleus/memoryPndStore.go index e454095a2c6da10dac1edb8d28c890d2dae91051..8fe4286e95ba819ccf099b38ae8f819364a6817b 100644 --- a/controller/nucleus/memoryPndStore.go +++ b/controller/nucleus/memoryPndStore.go @@ -1,6 +1,8 @@ package nucleus import ( + "encoding/json" + "code.fbi.h-da.de/danet/gosdn/controller/customerrs" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" @@ -10,26 +12,38 @@ import ( // MemoryPndStore provides a in-memory implementation for a pnd store. type MemoryPndStore struct { - Store map[uuid.UUID]networkdomain.NetworkDomain + Store map[uuid.UUID]networkdomain.LoadedPnd pendingChannels map[uuid.UUID]chan networkelement.Details } // NewMemoryPndStore returns a in-memory implementation for a pnd store. func NewMemoryPndStore() networkdomain.PndStore { return &MemoryPndStore{ - Store: make(map[uuid.UUID]networkdomain.NetworkDomain), + Store: make(map[uuid.UUID]networkdomain.LoadedPnd), pendingChannels: make(map[uuid.UUID]chan networkelement.Details), } } // Add adds a pnd to the store. func (t *MemoryPndStore) Add(item networkdomain.NetworkDomain) error { - _, ok := t.Store[item.ID()] + var pnd networkdomain.LoadedPnd + + b, err := json.Marshal(item) + if err != nil { + return err + } + + err = json.Unmarshal(b, &pnd) + if err != nil { + return err + } + + _, ok := t.Store[uuid.MustParse(pnd.ID)] if ok { return nil } - t.Store[item.ID()] = item + t.Store[item.ID()] = pnd return nil } @@ -42,18 +56,19 @@ func (t *MemoryPndStore) Delete(item networkdomain.NetworkDomain) error { } // Get provides a the query interface to find a stored pnd. -func (t *MemoryPndStore) Get(query store.Query) (networkdomain.NetworkDomain, error) { +func (t *MemoryPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) { + // First search for direct hit on UUID. item, ok := t.Store[query.ID] if !ok { - return nil, &customerrs.CouldNotFindError{ID: query.ID, Name: query.Name} + return item, &customerrs.CouldNotFindError{ID: query.ID, Name: query.Name} } return item, nil } // GetAll returns all pnds currently on the store. -func (t *MemoryPndStore) GetAll() ([]networkdomain.NetworkDomain, error) { - var allItems []networkdomain.NetworkDomain +func (t *MemoryPndStore) GetAll() ([]networkdomain.LoadedPnd, error) { + var allItems []networkdomain.LoadedPnd for _, item := range t.Store { allItems = append(allItems, item) diff --git a/controller/nucleus/networkElementStore.go b/controller/nucleus/networkElementStore.go index 72b663adbe7a82750386736c77f0987b3e1a12bc..857b36bb232d7b85382cb1d7d9e26794cc9e997a 100644 --- a/controller/nucleus/networkElementStore.go +++ b/controller/nucleus/networkElementStore.go @@ -11,6 +11,7 @@ import ( ) // NewNetworkElementStore returns a NetworkElementStore. +// TODO(PND): remove uuid from name! func NewNetworkElementStore(pndUUID uuid.UUID) networkelement.Store { storeMode := store.GetStoreMode() log.Debugf("StoreMode: %s", storeMode) diff --git a/controller/nucleus/networkElementWatcher.go b/controller/nucleus/networkElementWatcher.go index 44775ef8be72501132cfeed76e84997eee2ae867..2afb43c56caee13fd7c839bcf893918e44a83ef4 100644 --- a/controller/nucleus/networkElementWatcher.go +++ b/controller/nucleus/networkElementWatcher.go @@ -12,6 +12,7 @@ import ( "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" "code.fbi.h-da.de/danet/gosdn/controller/interfaces/transport" "code.fbi.h-da.de/danet/gosdn/controller/nucleus/types" + "code.fbi.h-da.de/danet/gosdn/controller/servmgmt" "code.fbi.h-da.de/danet/gosdn/controller/store" "code.fbi.h-da.de/danet/gosdn/forks/goarista/gnmi" "github.com/google/uuid" @@ -29,7 +30,7 @@ const ( // NetworkElementWatcher is a component that subscribes to network elements via gNMI from within the controller and handles // responses by triggering the internal event process. type NetworkElementWatcher struct { - pndStore networkdomain.PndStore + serviceManager servmgmt.ServiceManager networkelementSubcriptions map[uuid.UUID]*networkelementSubscriptionHelper eventService eventInterfaces.Service } @@ -41,9 +42,9 @@ type networkelementSubscriptionHelper struct { } // NewNetworkElementWatcher takes a pndStore to subscribe to network element paths. -func NewNetworkElementWatcher(pndStore networkdomain.PndStore, eventService eventInterfaces.Service) *NetworkElementWatcher { +func NewNetworkElementWatcher(serviceManager servmgmt.ServiceManager, eventService eventInterfaces.Service) *NetworkElementWatcher { return &NetworkElementWatcher{ - pndStore: pndStore, + serviceManager: serviceManager, networkelementSubcriptions: make(map[uuid.UUID]*networkelementSubscriptionHelper), eventService: eventService, } @@ -62,7 +63,7 @@ func (n *NetworkElementWatcher) SubToNetworkElements(paths [][]string, opts *gnm } } - pnds, err := n.pndStore.GetAll() + pnds, err := n.serviceManager.PndService.GetAll() if err != nil { log.Error(err) } @@ -152,7 +153,7 @@ func (n *NetworkElementWatcher) handleSubscribeResponseUpdate(resp *gpb.Subscrib log.Error(err) } - pnd, err := n.pndStore.Get(store.Query{ID: pndID}) + pnd, err := n.serviceManager.PndService.Get(store.Query{ID: pndID}) if err != nil { log.Error(err) } diff --git a/controller/nucleus/pndFilesystemStore.go b/controller/nucleus/pndFilesystemStore.go index d7fb1f5978e3ac04b3dadc2fbf3def280f864019..b739a52e8074cadc72b6632a51866007587beef5 100644 --- a/controller/nucleus/pndFilesystemStore.go +++ b/controller/nucleus/pndFilesystemStore.go @@ -38,8 +38,8 @@ func NewFilesystemPndStore() FilesystemPndStore { } } -func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.NetworkDomain, error) { - var loadedPnds []LoadedPnd +func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.LoadedPnd, error) { + var loadedPnds []networkdomain.LoadedPnd content, err := os.ReadFile(t.pathToPndFile) if err != nil { @@ -72,10 +72,10 @@ func (t *FilesystemPndStore) readAllPndsFromFile() ([]networkdomain.NetworkDomai pnds[i] = newPnd } - return pnds, nil + return loadedPnds, nil } -func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.NetworkDomain) error { +func (t *FilesystemPndStore) writeAllPndsToFile(pnds []networkdomain.LoadedPnd) error { serializedData, err := json.Marshal(pnds) if err != nil { return err @@ -99,7 +99,13 @@ func (t *FilesystemPndStore) Add(pndToAdd networkdomain.NetworkDomain) error { return err } - pnds = append(pnds, pndToAdd) + var loadedPnd networkdomain.LoadedPnd + loadedPnd, err = store.TransformObjectToLoadedObject[networkdomain.NetworkDomain, networkdomain.LoadedPnd](pndToAdd) + if err != nil { + return err + } + + pnds = append(pnds, loadedPnd) err = t.writeAllPndsToFile(pnds) if err != nil { @@ -120,7 +126,7 @@ func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) err } for i, pnd := range pnds { - if pnd.ID() == pndToDelete.ID() { + if pnd.ID == pndToDelete.ID().String() { //remove item from slice pnds[i] = pnds[len(pnds)-1] pnds = pnds[:len(pnds)-1] @@ -138,26 +144,28 @@ func (t *FilesystemPndStore) Delete(pndToDelete networkdomain.NetworkDomain) err } // Get provides a the query interface to find a stored pnd. -func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.NetworkDomain, error) { +func (t *FilesystemPndStore) Get(query store.Query) (networkdomain.LoadedPnd, error) { t.fileMutex.Lock() defer t.fileMutex.Unlock() + var loadedPND networkdomain.LoadedPnd + pnds, err := t.readAllPndsFromFile() if err != nil { - return nil, err + return loadedPND, err } for _, pnd := range pnds { - if pnd.ID() == query.ID || pnd.GetName() == query.Name { + if pnd.ID == query.ID.String() || pnd.Name == query.Name { return pnd, nil } } - return nil, &customerrs.CouldNotFindError{ID: query.ID, Name: query.Name} + return loadedPND, &customerrs.CouldNotFindError{ID: query.ID, Name: query.Name} } // GetAll returns all pnds currently on the store. -func (t *FilesystemPndStore) GetAll() ([]networkdomain.NetworkDomain, error) { +func (t *FilesystemPndStore) GetAll() ([]networkdomain.LoadedPnd, error) { t.fileMutex.Lock() defer t.fileMutex.Unlock() diff --git a/controller/nucleus/pndFilesystemStore_test.go b/controller/nucleus/pndFilesystemStore_test.go index 420c9d27b69d63f22897cffb0ffdaf35fcd49a80..35c0c7ce0e5e25cf83f6e74053b1bdee8665274f 100644 --- a/controller/nucleus/pndFilesystemStore_test.go +++ b/controller/nucleus/pndFilesystemStore_test.go @@ -47,14 +47,14 @@ func TestGetAllPnds(t *testing.T) { } for i, pnd := range returnPnds { - if pnd.GetName() != inputPnds[i].GetName() { - t.Errorf("GetAll() = %v, want %v", pnd.GetName(), inputPnds[i].GetName()) + if pnd.Name != inputPnds[i].GetName() { + t.Errorf("GetAll() = %v, want %v", pnd.Name, inputPnds[i].GetName()) } - if pnd.GetDescription() != inputPnds[i].GetDescription() { - t.Errorf("GetAll() = %v, want %v", pnd.GetDescription(), inputPnds[i].GetDescription()) + if pnd.Description != inputPnds[i].GetDescription() { + t.Errorf("GetAll() = %v, want %v", pnd.Description, inputPnds[i].GetDescription()) } - if pnd.ID() != inputPnds[i].ID() { - t.Errorf("GetAll() = %v, want %v", pnd.ID(), inputPnds[i].ID()) + if pnd.ID != inputPnds[i].ID().String() { + t.Errorf("GetAll() = %v, want %v", pnd.ID, inputPnds[i].ID()) } } } @@ -82,14 +82,14 @@ func TestGetPnd(t *testing.T) { t.Error(err) } - if returnPnd.GetName() != pnd2.GetName() { - t.Errorf("GetAll() = %v, want %v", pnd2.GetName(), returnPnd.GetName()) + if returnPnd.Name != pnd2.GetName() { + t.Errorf("GetAll() = %v, want %v", pnd2.GetName(), returnPnd.Name) } - if returnPnd.GetDescription() != pnd2.GetDescription() { - t.Errorf("GetAll() = %v, want %v", pnd2.GetDescription(), returnPnd.GetDescription()) + if returnPnd.Description != pnd2.GetDescription() { + t.Errorf("GetAll() = %v, want %v", pnd2.GetDescription(), returnPnd.Description) } - if returnPnd.ID() != pnd2.ID() { - t.Errorf("GetAll() = %v, want %v", pnd2.ID(), returnPnd.ID()) + if returnPnd.ID != pnd2.ID().String() { + t.Errorf("GetAll() = %v, want %v", pnd2.ID(), returnPnd.ID) } } @@ -128,14 +128,14 @@ func TestDeletePnd(t *testing.T) { //only check first element in this case for i, pnd := range returnPnds[1:] { - if pnd.GetName() != inputPnds[i].GetName() { - t.Errorf("GetAll() = %v, want %v", pnd.GetName(), inputPnds[i].GetName()) + if pnd.Name != inputPnds[i].GetName() { + t.Errorf("GetAll() = %v, want %v", pnd.Name, inputPnds[i].GetName()) } - if pnd.GetDescription() != inputPnds[i].GetDescription() { - t.Errorf("GetAll() = %v, want %v", pnd.GetDescription(), inputPnds[i].GetDescription()) + if pnd.Description != inputPnds[i].GetDescription() { + t.Errorf("GetAll() = %v, want %v", pnd.Description, inputPnds[i].GetDescription()) } - if pnd.ID() != inputPnds[i].ID() { - t.Errorf("GetAll() = %v, want %v", pnd.ID(), inputPnds[i].ID()) + if pnd.ID != inputPnds[i].ID().String() { + t.Errorf("GetAll() = %v, want %v", pnd.ID, inputPnds[i].ID()) } } } diff --git a/controller/nucleus/pndService.go b/controller/nucleus/pndService.go new file mode 100644 index 0000000000000000000000000000000000000000..a8a6b1098c4683cd6fa45fdec075776fcc397391 --- /dev/null +++ b/controller/nucleus/pndService.go @@ -0,0 +1,74 @@ +package nucleus + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/controller/store" + "github.com/google/uuid" +) + +// TODO(PND): add PND to event system? + +// PndService provides a PND service implementation. +type PndService struct { + pndStore networkdomain.PndStore +} + +// NewPndService creates a PND service. +func NewPndService(pndStore networkdomain.PndStore) networkdomain.PndService { + pndService := &PndService{ + pndStore: pndStore, + } + + return pndService +} + +// Add adds a PND to the PND store. +func (p *PndService) Add(pndToAdd networkdomain.NetworkDomain) error { + err := p.pndStore.Add(pndToAdd) + if err != nil { + return err + } + + return nil +} + +// Delete deletes a PND from the PND store. +func (p *PndService) Delete(pndToDelete networkdomain.NetworkDomain) error { + err := p.pndStore.Delete(pndToDelete) + if err != nil { + return err + } + + return nil +} + +// Get takes a PND's UUID or name and returns the PND. +func (p *PndService) Get(query store.Query) (networkdomain.NetworkDomain, error) { + loadedPnd, err := p.pndStore.Get(query) + if err != nil { + return nil, err + } + + return p.createPndFromStore(loadedPnd), nil +} + +// GetAll returns all stores PNDs. +func (p *PndService) GetAll() ([]networkdomain.NetworkDomain, error) { + var pnds []networkdomain.NetworkDomain + + loadedPnds, err := p.pndStore.GetAll() + if err != nil { + return nil, err + } + + for _, loadedPnd := range loadedPnds { + pnds = append(pnds, p.createPndFromStore(loadedPnd)) + } + + return pnds, nil +} + +// TODO(PND): add missing pnd stuff! +func (p *PndService) createPndFromStore(loadedPnd networkdomain.LoadedPnd) networkdomain.NetworkDomain { + return NewPNDEntity(uuid.MustParse(loadedPnd.ID), loadedPnd.Name, loadedPnd.Description) +} diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/principalNetworkDomain.go index 9f7ff1a0c8eebcb2d33a6fd499c35fb0f84130ff..fe5e765ae8f7e4de5e2e74bb76a8fe695b01bd55 100644 --- a/controller/nucleus/principalNetworkDomain.go +++ b/controller/nucleus/principalNetworkDomain.go @@ -108,6 +108,16 @@ func NewPND( return pnd, nil } +func NewPNDEntity(pndID uuid.UUID, name string, description string) networkdomain.NetworkDomain { + pnd := &pndImplementation{ + Id: pndID, + Name: name, + Description: description, + } + + return pnd +} + type pndImplementation struct { Name string `json:"name,omitempty"` Description string `json:"description,omitempty"` diff --git a/controller/nucleus/sbiStore.go b/controller/nucleus/sbiStore.go index 81cfc077d2fd95198f244dafed5ba7257cea711c..24feec923199aa0fc291f69aff9cfa536167e9e6 100644 --- a/controller/nucleus/sbiStore.go +++ b/controller/nucleus/sbiStore.go @@ -10,6 +10,7 @@ import ( ) // NewSbiStore returns a sbiStore. +// TODO(PND): remove uuid from name! func NewSbiStore(pndUUID uuid.UUID) southbound.Store { storeMode := store.GetStoreMode() diff --git a/controller/servmgmt/serviceManager.go b/controller/servmgmt/serviceManager.go new file mode 100644 index 0000000000000000000000000000000000000000..c114941453fa82959d068336e5d697b36f5fe4b8 --- /dev/null +++ b/controller/servmgmt/serviceManager.go @@ -0,0 +1,57 @@ +package servmgmt + +import ( + "code.fbi.h-da.de/danet/gosdn/controller/app" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkdomain" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/networkelement" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac" + "code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound" + "code.fbi.h-da.de/danet/gosdn/controller/store" + "code.fbi.h-da.de/danet/gosdn/controller/topology" + "code.fbi.h-da.de/danet/gosdn/controller/topology/nodes" + "code.fbi.h-da.de/danet/gosdn/controller/topology/ports" + routingtables "code.fbi.h-da.de/danet/gosdn/controller/topology/routing-tables" + "github.com/google/uuid" +) + +// NOTE: Until we've added database support for changes, we will hold +// changeStores in memory for now. +var changeStoreMap = make(map[uuid.UUID]*store.ChangeStore) + +// ServiceManager is an aggregation of all services which handle storage access. +type ServiceManager struct { + //TODO(PND):change these to services! + PndService networkdomain.PndService + PNDStore networkdomain.PndStore + ChangeStore store.ChangeStore + SbiService southbound.Service + MneService networkelement.Service + UserService rbac.UserService + RoleService rbac.RoleService + NodeService nodes.Service + PortService ports.Service + TopologyService topology.Service + RouteService routingtables.Service + AppService app.ManagementService +} + +// NewServiceManager returns a ServiceManager. +func NewServiceManager(pndService networkdomain.PndService, pndStore networkdomain.PndStore, changeStore store.ChangeStore, sbiServ southbound.Service, + mneServ networkelement.Service, userServ rbac.UserService, roleServ rbac.RoleService, + nodeServ nodes.Service, portServ ports.Service, topoServ topology.Service, + routeServ routingtables.Service, appServ app.ManagementService) *ServiceManager { + return &ServiceManager{ + PndService: pndService, + PNDStore: pndStore, + ChangeStore: changeStore, + SbiService: sbiServ, + MneService: mneServ, + UserService: userServ, + RoleService: roleServ, + NodeService: nodeServ, + PortService: portServ, + TopologyService: topoServ, + RouteService: routeServ, + AppService: appServ, + } +} diff --git a/controller/topology/topologyService.go b/controller/topology/topologyService.go index 68530269302514decd0e15d262a6907d3ee99a77..c48824efa6f198a12b6d072a86f6e93eb968f6fc 100644 --- a/controller/topology/topologyService.go +++ b/controller/topology/topologyService.go @@ -24,8 +24,8 @@ type Service interface { GetAll() ([]links.Link, error) } -// service is a service for ports. -type service struct { +// TopoService is a TopoService for ports. +type TopoService struct { store Store nodeService nodes.Service portService ports.Service @@ -39,7 +39,7 @@ func NewTopologyService( portService ports.Service, eventService eventInterfaces.Service, ) Service { - return &service{ + return &TopoService{ store: store, nodeService: nodeService, portService: portService, @@ -48,7 +48,7 @@ func NewTopologyService( } // AddLink adds a new link to the topology. -func (t *service) AddLink(link links.Link) error { +func (t *TopoService) AddLink(link links.Link) error { // These checks are also happening in the current NBI implementation. // This should be refactored to only to these checks here. // _, err := t.nodeService.EnsureExists(link.SourceNode) @@ -90,7 +90,7 @@ func (t *service) AddLink(link links.Link) error { } // UpdateLink updates an existing link. -func (t *service) UpdateLink(link links.Link) error { +func (t *TopoService) UpdateLink(link links.Link) error { err := t.store.Update(link) if err != nil { return err @@ -112,7 +112,7 @@ func (t *service) UpdateLink(link links.Link) error { } // DeleteLink deletes a link. -func (t *service) DeleteLink(link links.Link) error { +func (t *TopoService) DeleteLink(link links.Link) error { // TODO: Delete should also check if a node or port is used somewhere else and // if not, delete the node and its ports err := t.store.Delete(link) @@ -136,7 +136,7 @@ func (t *service) DeleteLink(link links.Link) error { } // GetAll returns the current topology. -func (t *service) GetAll() ([]links.Link, error) { +func (t *TopoService) GetAll() ([]links.Link, error) { topo, err := t.store.GetAll() if err != nil { return topo, err @@ -145,7 +145,7 @@ func (t *service) GetAll() ([]links.Link, error) { } // GetAll returns the current topology. -func (t *service) Get(query query.Query) (links.Link, error) { +func (t *TopoService) Get(query query.Query) (links.Link, error) { link, err := t.store.Get(query) if err != nil { return link, err diff --git a/controller/topology/topologyService_test.go b/controller/topology/topologyService_test.go index 899acc98c4e31b5e5b89258843efb76cf5a1be4d..e28df6d9e6990c63528bbd7130c5ea5e0d7f1c98 100644 --- a/controller/topology/topologyService_test.go +++ b/controller/topology/topologyService_test.go @@ -185,7 +185,7 @@ func TestTopologyService_AddLink(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := &service{ + p := &TopoService{ store: tt.fields.store, nodeService: tt.fields.nodeService, portService: tt.fields.portService, @@ -243,7 +243,7 @@ func TestTopologyService_Update(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := &service{ + p := &TopoService{ store: tt.fields.store, nodeService: tt.fields.nodeService, portService: tt.fields.portService, @@ -312,7 +312,7 @@ func TestNodeService_Delete(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := &service{ + p := &TopoService{ store: tt.fields.store, nodeService: tt.fields.nodeService, portService: tt.fields.portService, @@ -375,7 +375,7 @@ func TestTopologyService_Get(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := &service{ + p := &TopoService{ store: tt.fields.store, nodeService: tt.fields.nodeService, portService: tt.fields.portService, @@ -420,7 +420,7 @@ func TestTopologyService_GetAll(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := &service{ + p := &TopoService{ store: tt.fields.store, nodeService: tt.fields.nodeService, portService: tt.fields.portService,