RICPLT-3015 Reusing subscription if same EventTrigger and Action

Change-Id: Ibda45d0864ce1626fb3973519a799a69579e7614
Signed-off-by: Juha Hyttinen <juha.hyttinen@nokia.com>
diff --git a/pkg/control/subscription.go b/pkg/control/subscription.go
index 45c13ec..5bfe2e1 100644
--- a/pkg/control/subscription.go
+++ b/pkg/control/subscription.go
@@ -31,6 +31,7 @@
 //-----------------------------------------------------------------------------
 type Subscription struct {
 	mutex      sync.Mutex                     // Lock
+	valid      bool                           // valid
 	registry   *Registry                      // Registry
 	Seq        uint16                         // SubsId
 	Meid       *xapp.RMRMeid                  // Meid/ RanName
@@ -39,6 +40,7 @@
 	TheTrans   *Transaction                   // Ongoing transaction from xapp
 	SubReqMsg  *e2ap.E2APSubscriptionRequest  // Subscription information
 	SubRespMsg *e2ap.E2APSubscriptionResponse // Subscription information
+	SubFailMsg *e2ap.E2APSubscriptionFailure  // Subscription information
 }
 
 func (s *Subscription) String() string {
@@ -91,3 +93,81 @@
 	s.mutex.Unlock()
 	s.TransLock.Unlock()
 }
+
+func (s *Subscription) IsSame(trans *Transaction, subReqMsg *e2ap.E2APSubscriptionRequest) bool {
+	s.mutex.Lock()
+	defer s.mutex.Unlock()
+
+	if s.valid == false {
+		return false
+	}
+
+	if s.SubReqMsg == nil {
+		return false
+	}
+
+	if s.Meid.RanName != trans.Meid.RanName {
+		return false
+	}
+
+	if s.EpList.Size() == 0 {
+		return false
+	}
+
+	//Somehow special case ... ?
+	if s.EpList.HasEndpoint(trans.GetEndpoint()) == true {
+		return false
+	}
+
+	// EventTrigger check
+	if s.SubReqMsg.EventTriggerDefinition.InterfaceDirection != subReqMsg.EventTriggerDefinition.InterfaceDirection ||
+		s.SubReqMsg.EventTriggerDefinition.ProcedureCode != subReqMsg.EventTriggerDefinition.ProcedureCode ||
+		s.SubReqMsg.EventTriggerDefinition.TypeOfMessage != subReqMsg.EventTriggerDefinition.TypeOfMessage {
+		return false
+	}
+
+	if s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.Present ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.NodeId ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[0] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[0] ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[1] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[1] ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[2] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalEnbId.PlmnIdentity.Val[2] {
+		return false
+	}
+
+	if s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.Present != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.Present ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.NodeId != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.NodeId ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[0] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[0] ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[1] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[1] ||
+		s.SubReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[2] != subReqMsg.EventTriggerDefinition.InterfaceId.GlobalGnbId.PlmnIdentity.Val[2] {
+		return false
+	}
+
+	// Actions check
+	if len(s.SubReqMsg.ActionSetups) != len(subReqMsg.ActionSetups) {
+		return false
+	}
+
+	for _, acts := range s.SubReqMsg.ActionSetups {
+		for _, actt := range subReqMsg.ActionSetups {
+			if acts.ActionId != actt.ActionId {
+				return false
+			}
+			if acts.ActionType != actt.ActionType {
+				return false
+			}
+
+			if acts.ActionDefinition.Present != actt.ActionDefinition.Present ||
+				acts.ActionDefinition.StyleId != actt.ActionDefinition.StyleId ||
+				acts.ActionDefinition.ParamId != actt.ActionDefinition.ParamId {
+				return false
+			}
+			if acts.SubsequentAction.Present != actt.SubsequentAction.Present ||
+				acts.SubsequentAction.Type != actt.SubsequentAction.Type ||
+				acts.SubsequentAction.TimetoWait != actt.SubsequentAction.TimetoWait {
+				return false
+			}
+		}
+	}
+
+	return true
+}