xapp-frame v0.8.2 integration to submgr
[ric-plt/submgr.git] / pkg / control / transaction.go
index 2f4acab..f3d5c17 100644 (file)
@@ -22,49 +22,69 @@ package control
 import (
        "strconv"
        "sync"
+       "time"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap"
+       "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
 )
 
 //-----------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------
-type TransactionXappKey struct {
-       RmrEndpoint
-       Xid string // xapp xid in req
-}
-
-func (key *TransactionXappKey) String() string {
-       return key.RmrEndpoint.String() + "/" + key.Xid
+type TransactionIf interface {
+       String() string
+       Release()
+       SendEvent(interface{}, time.Duration) (bool, bool)
+       WaitEvent(time.Duration) (interface{}, bool)
 }
 
 //-----------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------
+
 type Transaction struct {
-       mutex             sync.Mutex
-       tracker           *Tracker // tracker instance
-       Subs              *Subscription
-       RmrEndpoint       RmrEndpoint
-       Mtype             int
-       Xid               string     // xapp xid in req
-       OrigParams        *RMRParams // request orginal params
-       RespReceived      bool
-       ForwardRespToXapp bool
+       mutex     sync.Mutex       //
+       Seq       uint64           //transaction sequence
+       tracker   *Tracker         //tracker instance
+       Meid      *xapp.RMRMeid    //meid transaction related
+       Mtype     int              //Encoded message type to be send
+       Payload   *e2ap.PackedData //Encoded message to be send
+       EventChan chan interface{}
 }
 
 func (t *Transaction) String() string {
-       t.mutex.Lock()
-       defer t.mutex.Unlock()
-       var subId string = "?"
-       if t.Subs != nil {
-               subId = strconv.FormatUint(uint64(t.Subs.Seq), 10)
+       meidstr := "N/A"
+       if t.Meid != nil {
+               meidstr = t.Meid.String()
        }
-       return subId + "/" + t.RmrEndpoint.String() + "/" + t.Xid
+       return "trans(" + strconv.FormatUint(uint64(t.Seq), 10) + "/" + meidstr + ")"
 }
 
-func (t *Transaction) GetXid() string {
-       t.mutex.Lock()
-       defer t.mutex.Unlock()
-       return t.Xid
+func (t *Transaction) 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 *Transaction) 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 *Transaction) GetMtype() int {
@@ -73,38 +93,113 @@ func (t *Transaction) GetMtype() int {
        return t.Mtype
 }
 
-func (t *Transaction) GetSrc() string {
+func (t *Transaction) GetMeid() *xapp.RMRMeid {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       return t.RmrEndpoint.String()
+       if t.Meid != nil {
+               return t.Meid
+       }
+       return nil
 }
 
-func (t *Transaction) CheckResponseReceived() bool {
+/*  // This function is not used. Commented out to get better test coverage result
+func (t *Transaction) GetPayload() *e2ap.PackedData {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       if t.RespReceived == false {
-               t.RespReceived = true
-               return false
+       return t.Payload
+}
+*/
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type TransactionSubs struct {
+       Transaction //
+}
+
+func (t *TransactionSubs) String() string {
+       return "transsubs(" + t.Transaction.String() + ")"
+}
+
+func (t *TransactionSubs) Release() {
+       t.mutex.Lock()
+       xapp.Logger.Debug("RELEASE %s", t.String())
+       t.tracker = nil
+       t.mutex.Unlock()
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type TransactionXappKey struct {
+       InstanceID uint32
+       xapp.RmrEndpoint
+       Xid string // xapp xid in req
+}
+
+func (key *TransactionXappKey) String() string {
+       return "transkey(" + key.RmrEndpoint.String() + "/" + key.Xid + ")"
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type TransactionXapp struct {
+       Transaction
+       XappKey   *TransactionXappKey
+       RequestId e2ap.RequestId
+}
+
+func (t *TransactionXapp) String() string {
+       var transkey string = "transkey(N/A)"
+       if t.XappKey != nil {
+               transkey = t.XappKey.String()
        }
-       return true
+       return "transxapp(" + t.Transaction.String() + "/" + transkey + "/" + strconv.FormatUint(uint64(t.RequestId.InstanceId), 10) + ")"
 }
 
-func (t *Transaction) RetryTransaction() {
+func (t *TransactionXapp) GetEndpoint() *xapp.RmrEndpoint {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       t.RespReceived = false
+       if t.XappKey != nil {
+               return &t.XappKey.RmrEndpoint
+       }
+       return nil
 }
 
-func (t *Transaction) Release() {
+func (t *TransactionXapp) GetXid() string {
        t.mutex.Lock()
        defer t.mutex.Unlock()
-       if t.Subs != nil {
-               t.Subs.UnSetTransaction(t)
+       if t.XappKey != nil {
+               return t.XappKey.Xid
        }
-       if t.tracker != nil {
-               xappkey := TransactionXappKey{t.RmrEndpoint, t.Xid}
-               t.tracker.UnTrackTransaction(xappkey)
+       return ""
+}
+
+/*  // This function is not used. Commented out to get better test coverage result
+func (t *TransactionXapp) GetSrc() string {
+       t.mutex.Lock()
+       defer t.mutex.Unlock()
+       if t.XappKey != nil {
+               return t.XappKey.RmrEndpoint.String()
        }
-       t.Subs = nil
+       return ""
+}
+*/
+func (t *TransactionXapp) GetSubId() uint32 {
+       t.mutex.Lock()
+       defer t.mutex.Unlock()
+       return t.RequestId.InstanceId
+}
+
+func (t *TransactionXapp) Release() {
+       t.mutex.Lock()
+       xapp.Logger.Debug("RELEASE %s", t.String())
+       tracker := t.tracker
+       xappkey := t.XappKey
        t.tracker = nil
+       t.mutex.Unlock()
+
+       if tracker != nil && xappkey != nil {
+               tracker.UnTrackTransaction(*xappkey)
+       }
 }