blob: 2f54237aa76ca4f06a734457b8fe75f0d437e58f [file] [log] [blame]
kalnagy93cc3e22019-09-19 11:29:29 +02001/*
2==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
5
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17==================================================================================
18*/
19
20package control
21
22import (
23 "fmt"
Juha Hyttinen86a46202020-01-14 12:49:09 +020024 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
Anssi Mannila2e99e2f2019-12-05 13:57:06 +020025 "sync"
kalnagy93cc3e22019-09-19 11:29:29 +020026)
27
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020028//-----------------------------------------------------------------------------
29//
30//-----------------------------------------------------------------------------
kalnagy93cc3e22019-09-19 11:29:29 +020031type Tracker struct {
Juha Hyttinen379ff082019-12-30 15:49:41 +020032 mutex sync.Mutex
Juha Hyttinen83ada002020-01-30 10:36:33 +020033 transactionXappTable map[TransactionXappKey]*TransactionXapp
Juha Hyttinen422d0182020-01-17 13:37:05 +020034 transSeq uint64
Balint Uvegese9608cd2019-09-20 18:00:32 +000035}
36
37func (t *Tracker) Init() {
Juha Hyttinen83ada002020-01-30 10:36:33 +020038 t.transactionXappTable = make(map[TransactionXappKey]*TransactionXapp)
kalnagy93cc3e22019-09-19 11:29:29 +020039}
40
Juha Hyttinen83ada002020-01-30 10:36:33 +020041func (t *Tracker) initTransaction(transBase *Transaction) {
Juha Hyttinen422d0182020-01-17 13:37:05 +020042 t.mutex.Lock()
43 defer t.mutex.Unlock()
Juha Hyttinen83ada002020-01-30 10:36:33 +020044 transBase.EventChan = make(chan interface{})
45 transBase.tracker = t
46 transBase.Seq = t.transSeq
Juha Hyttinen422d0182020-01-17 13:37:05 +020047 t.transSeq++
Juha Hyttinen83ada002020-01-30 10:36:33 +020048}
49
50func (t *Tracker) NewSubsTransaction(subs *Subscription) *TransactionSubs {
51 trans := &TransactionSubs{}
52 trans.Meid = subs.GetMeid()
53 rid := subs.GetReqId()
54 if rid != nil {
55 trans.ReqId = *rid
56 }
57 t.initTransaction(&trans.Transaction)
58 xapp.Logger.Debug("CREATE %s", trans.String())
Juha Hyttinen422d0182020-01-17 13:37:05 +020059 return trans
60}
61
Juha Hyttinen83ada002020-01-30 10:36:33 +020062func (t *Tracker) NewXappTransaction(
Juha Hyttinen86a46202020-01-14 12:49:09 +020063 endpoint *RmrEndpoint,
Juha Hyttinen86a46202020-01-14 12:49:09 +020064 xid string,
Juha Hyttinen83ada002020-01-30 10:36:33 +020065 reqId *RequestId,
66 meid *xapp.RMRMeid) *TransactionXapp {
Juha Hyttinen86a46202020-01-14 12:49:09 +020067
Juha Hyttinen83ada002020-01-30 10:36:33 +020068 trans := &TransactionXapp{}
Juha Hyttinen422d0182020-01-17 13:37:05 +020069 trans.XappKey = &TransactionXappKey{*endpoint, xid}
70 trans.Meid = meid
Juha Hyttinen83ada002020-01-30 10:36:33 +020071 if reqId != nil {
72 trans.ReqId = *reqId
73 }
74 t.initTransaction(&trans.Transaction)
75 xapp.Logger.Debug("CREATE %s", trans.String())
76 return trans
77}
78
79func (t *Tracker) Track(trans *TransactionXapp) error {
80
81 if trans.GetEndpoint() == nil {
82 err := fmt.Errorf("Tracker: No valid endpoint given in %s", trans.String())
83 return err
84 }
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020085
Juha Hyttinen1a503442019-12-10 12:14:24 +020086 t.mutex.Lock()
87 defer t.mutex.Unlock()
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020088
Juha Hyttinen83ada002020-01-30 10:36:33 +020089 theKey := *trans.XappKey
90
91 if othtrans, ok := t.transactionXappTable[theKey]; ok {
92 err := fmt.Errorf("Tracker: %s is ongoing, not tracking %s", othtrans, trans)
93 return err
Juha Hyttinen379ff082019-12-30 15:49:41 +020094 }
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020095
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020096 trans.tracker = t
Juha Hyttinen83ada002020-01-30 10:36:33 +020097 t.transactionXappTable[theKey] = trans
98 xapp.Logger.Debug("Tracker: Append %s", trans.String())
Juha Hyttinen422d0182020-01-17 13:37:05 +020099 //xapp.Logger.Debug("Tracker: transtable=%v", t.transactionXappTable)
Juha Hyttinen83ada002020-01-30 10:36:33 +0200100 return nil
kalnagy93cc3e22019-09-19 11:29:29 +0200101}
102
Juha Hyttinen83ada002020-01-30 10:36:33 +0200103func (t *Tracker) UnTrackTransaction(xappKey TransactionXappKey) (*TransactionXapp, error) {
Juha Hyttinen1a503442019-12-10 12:14:24 +0200104 t.mutex.Lock()
105 defer t.mutex.Unlock()
Juha Hyttinen0d064ec2020-01-09 09:08:53 +0200106 if trans, ok2 := t.transactionXappTable[xappKey]; ok2 {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200107 xapp.Logger.Debug("Tracker: Remove %s", trans.String())
Juha Hyttinen0d064ec2020-01-09 09:08:53 +0200108 delete(t.transactionXappTable, xappKey)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200109 //xapp.Logger.Debug("Tracker: transtable=%v", t.transactionXappTable)
Juha Hyttinen379ff082019-12-30 15:49:41 +0200110 return trans, nil
kalnagy93cc3e22019-09-19 11:29:29 +0200111 }
Juha Hyttinen31797b42020-01-16 14:05:01 +0200112 return nil, fmt.Errorf("Tracker: No record %s", xappKey)
Anssi Mannila8046c702020-01-02 13:39:05 +0200113}