RICPLT-3014 Subscription multiple endpoints
[ric-plt/submgr.git] / pkg / control / transaction.go
index 9adaeca..a0a260f 100644 (file)
 package control
 
 import (
-       "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
        "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/packer"
        "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
        "strconv"
        "sync"
+       "time"
 )
 
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+type TransactionBase struct {
+       mutex     sync.Mutex         //
+       Seq       uint64             //
+       tracker   *Tracker           //tracker instance
+       Meid      *xapp.RMRMeid      //meid transaction related
+       Mtype     int                //Encoded message type to be send
+       Payload   *packer.PackedData //Encoded message to be send
+       EventChan chan interface{}
+}
+
+func (t *TransactionBase) SendEvent(event interface{}, waittime time.Duration) (bool, bool) {
+       if waittime > 0 {
+               select {
+               case t.EventChan <- event:
+                       return true, false
+               case <-time.After(waittime):
+                       return false, true
+               }
+               return false, false
+       }
+       t.EventChan <- event
+       return true, false
+}
+
+func (t *TransactionBase) WaitEvent(waittime time.Duration) (interface{}, bool) {
+       if waittime > 0 {
+               select {
+               case event := <-t.EventChan:
+                       return event, false
+               case <-time.After(waittime):
+                       return nil, true
+               }
+       }
+       event := <-t.EventChan
+       return event, false
+}
+
+func (t *TransactionBase) GetMtype() int {
+       t.mutex.Lock()
+       defer t.mutex.Unlock()
+       return t.Mtype
+}
+
+func (t *TransactionBase) GetMeid() *xapp.RMRMeid {
+       t.mutex.Lock()
+       defer t.mutex.Unlock()
+       if t.Meid != nil {
+               return t.Meid
+       }
+       return nil
+}
+
+func (t *TransactionBase) GetPayload() *packer.PackedData {
+       t.mutex.Lock()
+       defer t.mutex.Unlock()
+       return t.Payload
+}
+
 //-----------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------
@@ -43,30 +105,16 @@ func (key *TransactionXappKey) String() string {
 //
 //-----------------------------------------------------------------------------
 type Transaction struct {
-       mutex             sync.Mutex
-       tracker           *Tracker                             //tracker instance
-       Subs              *Subscription                        //related subscription
-       RmrEndpoint       RmrEndpoint                          //xapp endpoint
-       Xid               string                               //xapp xid in req
-       Meid              *xapp.RMRMeid                        //meid transaction related
-       SubReqMsg         *e2ap.E2APSubscriptionRequest        //SubReq TODO: maybe own transactions per type
-       SubRespMsg        *e2ap.E2APSubscriptionResponse       //SubResp TODO: maybe own transactions per type
-       SubFailMsg        *e2ap.E2APSubscriptionFailure        //SubFail TODO: maybe own transactions per type
-       SubDelReqMsg      *e2ap.E2APSubscriptionDeleteRequest  //SubDelReq TODO: maybe own transactions per type
-       SubDelRespMsg     *e2ap.E2APSubscriptionDeleteResponse //SubDelResp TODO: maybe own transactions per type
-       SubDelFailMsg     *e2ap.E2APSubscriptionDeleteFailure  //SubDelFail TODO: maybe own transactions per type
-       Mtype             int                                  //Encoded message type to be send
-       Payload           *packer.PackedData                   //Encoded message to be send
-       RespReceived      bool
-       ForwardRespToXapp bool
+       TransactionBase                     //
+       XappKey         *TransactionXappKey //
 }
 
 func (t *Transaction) StringImpl() string {
-       var subId string = "?"
-       if t.Subs != nil {
-               subId = strconv.FormatUint(uint64(t.Subs.Seq), 10)
+       var transkey string = "transkey(N/A)"
+       if t.XappKey != nil {
+               transkey = t.XappKey.String()
        }
-       return "trans(" + t.RmrEndpoint.String() + "/" + t.Xid + "/" + t.Meid.RanName + "/" + subId + ")"
+       return "trans(" + strconv.FormatUint(uint64(t.Seq), 10) + "/" + t.Meid.RanName + "/" + transkey + ")"
 }
 
 func (t *Transaction) String() string {
@@ -75,62 +123,42 @@ func (t *Transaction) String() string {
        return t.StringImpl()
 }
 
-func (t *Transaction) GetXid() string {
+func (t *Transaction) GetEndpoint() *RmrEndpoint {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       return t.Xid
-}
-
-func (t *Transaction) GetMtype() int {
-       t.mutex.Lock()
-       defer t.mutex.Unlock()
-       return t.Mtype
-}
-
-func (t *Transaction) GetMeid() *xapp.RMRMeid {
-       t.mutex.Lock()
-       defer t.mutex.Unlock()
-       if t.Meid != nil {
-               return t.Meid
+       if t.XappKey != nil {
+               return &t.XappKey.RmrEndpoint
        }
        return nil
 }
 
-func (t *Transaction) GetSrc() string {
-       t.mutex.Lock()
-       defer t.mutex.Unlock()
-       return t.RmrEndpoint.String()
-}
-
-func (t *Transaction) CheckResponseReceived() bool {
+func (t *Transaction) GetXid() string {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       if t.RespReceived == false {
-               t.RespReceived = true
-               return false
+       if t.XappKey != nil {
+               return t.XappKey.Xid
        }
-       return true
+       return ""
 }
 
-func (t *Transaction) RetryTransaction() {
+func (t *Transaction) GetSrc() string {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       t.RespReceived = false
+       if t.XappKey != nil {
+               return t.XappKey.RmrEndpoint.String()
+       }
+       return ""
 }
 
 func (t *Transaction) Release() {
        t.mutex.Lock()
-       subs := t.Subs
+       xapp.Logger.Debug("Transaction: Release %s", t.StringImpl())
        tracker := t.tracker
-       xappkey := TransactionXappKey{t.RmrEndpoint, t.Xid}
-       t.Subs = nil
+       xappkey := t.XappKey
        t.tracker = nil
        t.mutex.Unlock()
 
-       if subs != nil {
-               subs.UnSetTransaction(t)
-       }
-       if tracker != nil {
-               tracker.UnTrackTransaction(xappkey)
+       if tracker != nil && xappkey != nil {
+               tracker.UnTrackTransaction(*xappkey)
        }
 }