5b94cbd314599e0c4ecf7d0736ef7c55800f5f72
[ric-plt/rtmgr.git] / pkg / sbi / sbi.go
1 /*
2 w
3 ==================================================================================
4   Copyright (c) 2019 AT&T Intellectual Property.
5   Copyright (c) 2019 Nokia
6
7    Licensed under the Apache License, Version 2.0 (the "License");
8    you may not use this file except in compliance with the License.
9    You may obtain a copy of the License at
10
11        http://www.apache.org/licenses/LICENSE-2.0
12
13    Unless required by applicable law or agreed to in writing, software
14    distributed under the License is distributed on an "AS IS" BASIS,
15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16    See the License for the specific language governing permissions and
17    limitations under the License.
18 ==================================================================================
19 */
20 /*
21   Mnemonic:     sbi.go
22   Abstract:     Contains SBI (SouthBound Interface) module definitions and generic SBI components
23   Date:         16 March 2019
24 */
25
26 package sbi
27
28 import (
29         "errors"
30         "routing-manager/pkg/rtmgr"
31         "strconv"
32 )
33
34 const DEFAULT_NNG_PIPELINE_SOCKET_PREFIX = "tcp://"
35 const DEFAULT_NNG_PIPELINE_SOCKET_NUMBER = 4561
36 const PLATFORMTYPE = "platform"
37
38 var (
39         SupportedSbis = []*SbiEngineConfig{
40                 &SbiEngineConfig{
41                         Name:        "nngpush",
42                         Version:     "v1",
43                         Protocol:    "nngpipeline",
44                         Instance:    NewNngPush(),
45                         IsAvailable: true,
46                 },
47         }
48 )
49
50 func GetSbi(sbiName string) (SbiEngine, error) {
51         for _, sbi := range SupportedSbis {
52                 if sbi.Name == sbiName && sbi.IsAvailable {
53                         return sbi.Instance, nil
54                 }
55         }
56         return nil, errors.New("SBI:" + sbiName + " is not supported or still not available")
57 }
58
59 type Sbi struct {
60 }
61
62 func (s *Sbi) pruneEndpointList(sbi SbiEngine) {
63         for _, ep := range rtmgr.Eps {
64                 if !ep.Keepalive {
65                         rtmgr.Logger.Debug("deleting %v", ep)
66                         sbi.DeleteEndpoint(ep)
67                         delete(rtmgr.Eps, ep.Uuid)
68                 } else {
69                         rtmgr.Eps[ep.Uuid].Keepalive = false
70                 }
71         }
72 }
73
74 func (s *Sbi) updateEndpoints(rcs *rtmgr.RicComponents, sbii SbiEngine) {
75         for _, xapp := range (*rcs).Xapps {
76                 for _, instance := range xapp.Instances {
77                         uuid := instance.Ip + ":" + strconv.Itoa(int(instance.Port))
78                         if _, ok := rtmgr.Eps[uuid]; ok {
79                                 rtmgr.Eps[uuid].Keepalive = true
80                         } else {
81                                 ep := &rtmgr.Endpoint{
82                                         uuid,
83                                         instance.Name,
84                                         xapp.Name,
85                                         instance.Ip,
86                                         instance.Port,
87                                         instance.TxMessages,
88                                         instance.RxMessages,
89                                         nil,
90                                         false,
91                                         true,
92                                 }
93                                 if err := sbii.AddEndpoint(ep); err != nil {
94                                         rtmgr.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error())
95                                         continue
96                                 }
97                                 rtmgr.Eps[uuid] = ep
98                         }
99                 }
100         }
101         s.updatePlatformEndpoints(&((*rcs).Pcs), sbii)
102         s.pruneEndpointList(sbii)
103 }
104
105 func (s *Sbi) updatePlatformEndpoints(pcs *rtmgr.PlatformComponents, sbii SbiEngine) {
106         rtmgr.Logger.Debug("updatePlatformEndpoints invoked. PCS: %v", *pcs)
107         for _, pc := range *pcs {
108                 uuid := pc.Fqdn + ":" + strconv.Itoa(int(pc.Port))
109                 if _, ok := rtmgr.Eps[uuid]; ok {
110                         rtmgr.Eps[uuid].Keepalive = true
111                 } else {
112                         ep := &rtmgr.Endpoint{
113                                 uuid,
114                                 pc.Name,
115                                 PLATFORMTYPE,
116                                 pc.Fqdn,
117                                 pc.Port,
118                                 rtmgr.PLATFORMMESSAGETYPES[pc.Name]["tx"],
119                                 rtmgr.PLATFORMMESSAGETYPES[pc.Name]["rx"],
120                                 nil,
121                                 false,
122                                 true,
123                         }
124                         rtmgr.Logger.Debug("ep created: %v", ep)
125                         if err := sbii.AddEndpoint(ep); err != nil {
126                                 rtmgr.Logger.Error("can't create socket for endpoint: " + ep.Name + " due to:" + err.Error())
127                                 continue
128                         }
129                         rtmgr.Eps[uuid] = ep
130                 }
131         }
132 }