blob: cf00af35c7cdbe9bb367fa2fdf1e209d2e370741 [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()
Juha Hyttinen83ada002020-01-30 10:36:33 +020053 t.initTransaction(&trans.Transaction)
54 xapp.Logger.Debug("CREATE %s", trans.String())
Juha Hyttinen422d0182020-01-17 13:37:05 +020055 return trans
56}
57
Juha Hyttinen83ada002020-01-30 10:36:33 +020058func (t *Tracker) NewXappTransaction(
Juha Hyttinen86a46202020-01-14 12:49:09 +020059 endpoint *RmrEndpoint,
Juha Hyttinen86a46202020-01-14 12:49:09 +020060 xid string,
Juha Hyttinen47942b42020-02-27 10:41:43 +020061 subid uint32,
Juha Hyttinen83ada002020-01-30 10:36:33 +020062 meid *xapp.RMRMeid) *TransactionXapp {
Juha Hyttinen86a46202020-01-14 12:49:09 +020063
Juha Hyttinen83ada002020-01-30 10:36:33 +020064 trans := &TransactionXapp{}
Juha Hyttinen422d0182020-01-17 13:37:05 +020065 trans.XappKey = &TransactionXappKey{*endpoint, xid}
66 trans.Meid = meid
Juha Hyttinen47942b42020-02-27 10:41:43 +020067 trans.SubId = subid
Juha Hyttinen83ada002020-01-30 10:36:33 +020068 t.initTransaction(&trans.Transaction)
69 xapp.Logger.Debug("CREATE %s", trans.String())
70 return trans
71}
72
73func (t *Tracker) Track(trans *TransactionXapp) error {
74
75 if trans.GetEndpoint() == nil {
76 err := fmt.Errorf("Tracker: No valid endpoint given in %s", trans.String())
77 return err
78 }
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020079
Juha Hyttinen1a503442019-12-10 12:14:24 +020080 t.mutex.Lock()
81 defer t.mutex.Unlock()
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020082
Juha Hyttinen83ada002020-01-30 10:36:33 +020083 theKey := *trans.XappKey
84
85 if othtrans, ok := t.transactionXappTable[theKey]; ok {
86 err := fmt.Errorf("Tracker: %s is ongoing, not tracking %s", othtrans, trans)
87 return err
Juha Hyttinen379ff082019-12-30 15:49:41 +020088 }
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020089
Juha Hyttinen0d064ec2020-01-09 09:08:53 +020090 trans.tracker = t
Juha Hyttinen83ada002020-01-30 10:36:33 +020091 t.transactionXappTable[theKey] = trans
92 xapp.Logger.Debug("Tracker: Append %s", trans.String())
Juha Hyttinen422d0182020-01-17 13:37:05 +020093 //xapp.Logger.Debug("Tracker: transtable=%v", t.transactionXappTable)
Juha Hyttinen83ada002020-01-30 10:36:33 +020094 return nil
kalnagy93cc3e22019-09-19 11:29:29 +020095}
96
Juha Hyttinen83ada002020-01-30 10:36:33 +020097func (t *Tracker) UnTrackTransaction(xappKey TransactionXappKey) (*TransactionXapp, error) {
Juha Hyttinen1a503442019-12-10 12:14:24 +020098 t.mutex.Lock()
99 defer t.mutex.Unlock()
Juha Hyttinen0d064ec2020-01-09 09:08:53 +0200100 if trans, ok2 := t.transactionXappTable[xappKey]; ok2 {
Juha Hyttinen83ada002020-01-30 10:36:33 +0200101 xapp.Logger.Debug("Tracker: Remove %s", trans.String())
Juha Hyttinen0d064ec2020-01-09 09:08:53 +0200102 delete(t.transactionXappTable, xappKey)
Juha Hyttinen422d0182020-01-17 13:37:05 +0200103 //xapp.Logger.Debug("Tracker: transtable=%v", t.transactionXappTable)
Juha Hyttinen379ff082019-12-30 15:49:41 +0200104 return trans, nil
kalnagy93cc3e22019-09-19 11:29:29 +0200105 }
Juha Hyttinen31797b42020-01-16 14:05:01 +0200106 return nil, fmt.Errorf("Tracker: No record %s", xappKey)
Anssi Mannila8046c702020-01-02 13:39:05 +0200107}