Update aringo library

This commit is contained in:
TeoV
2018-11-15 10:38:57 -05:00
committed by Dan Christian Bogos
parent 40e40710a1
commit 6a89dd1d6b
4 changed files with 60 additions and 25 deletions

View File

@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package agents
import (
"encoding/json"
"fmt"
"net/url"
"strconv"
@@ -99,6 +100,7 @@ func (sma *AsteriskAgent) ListenAndServe() (err error) {
case astRawEv := <-sma.astEvChan:
smAsteriskEvent := NewSMAsteriskEvent(astRawEv,
strings.Split(sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, ":")[0])
switch smAsteriskEvent.EventType() {
case ARIStasisStart:
go sma.handleStasisStart(smAsteriskEvent)
@@ -192,12 +194,13 @@ func (sma *AsteriskAgent) handleStasisStart(ev *SMAsteriskEvent) {
if *authReply.MaxUsage == time.Duration(0) {
sma.hangupChannel(ev.ChannelID(), "")
return
} else if *authReply.MaxUsage != time.Duration(-1) {
// Set absolute timeout for non-postpaid calls
if !sma.setChannelVar(ev.ChannelID(), CGRMaxSessionTime,
strconv.Itoa(int(authReply.MaxUsage.Seconds()*1000))) {
return
}
} else if *authReply.MaxUsage == time.Duration(-1) {
*authReply.MaxUsage = sma.cgrCfg.SessionSCfg().MaxCallDuration
}
// Set absolute timeout for non-postpaid calls
if !sma.setChannelVar(ev.ChannelID(), CGRMaxSessionTime,
strconv.Itoa(int(authReply.MaxUsage.Seconds()*1000))) {
return
}
}
if authReply.ResourceAllocation != nil {
@@ -232,6 +235,7 @@ func (sma *AsteriskAgent) handleChannelStateChange(ev *SMAsteriskEvent) {
if ev.ChannelState() != channelUp {
return
}
sma.evCacheMux.RLock()
cgrEv, hasIt := sma.eventsCache[ev.ChannelID()]
sma.evCacheMux.RUnlock()
@@ -331,23 +335,25 @@ func (sma *AsteriskAgent) Call(serviceMethod string, args interface{}, reply int
}
func (sma *AsteriskAgent) V1GetActiveSessionIDs(ignParam string,
sessionIDs *[]*sessions.SessionID) (err error) {
var sIDs []*sessions.SessionID
i := 0
sma.evCacheMux.RLock()
originIds := make([]string, len(sma.eventsCache))
for orgId := range sma.eventsCache {
originIds[i] = orgId
i++
sessionIDs *[]*sessions.SessionID) error {
var slMpIface []map[string]interface{} // decode the result from ari into a slice of map[string]interface{}
if mp, err := sma.astConn.Call(
aringo.HTTP_GET,
fmt.Sprintf("http://%s/ari/channels",
sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address),
nil); err != nil {
return err
} else if err := json.Unmarshal(mp, &slMpIface); err != nil {
return err
}
sma.evCacheMux.RUnlock()
for _, orgId := range originIds {
var sIDs []*sessions.SessionID
for _, mpIface := range slMpIface {
sIDs = append(sIDs, &sessions.SessionID{
OriginHost: strings.Split(sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, ":")[0],
OriginID: orgId},
OriginID: mpIface["id"].(string)},
)
}
*sessionIDs = sIDs
return
return nil
}

View File

@@ -27,6 +27,7 @@ import (
"os"
"path"
"reflect"
"strings"
"testing"
"time"
@@ -498,6 +499,10 @@ func testCall1001Cdrs(t *testing.T) {
t.Errorf("Unexpected RequestType for CDR: %+v", cdr.RequestType)
}
if cdr.Destination == "1002" {
// in case of Asterisk take the integer part from usage
if optConf == utils.Asterisk {
cdr.Usage = strings.Split(cdr.Usage, ".")[0] + "s"
}
if cdr.Usage != "1m7s" && cdr.Usage != "1m8s" { // Usage as seconds
t.Errorf("Unexpected Usage for CDR: %+v", cdr.Usage)
}
@@ -505,6 +510,10 @@ func testCall1001Cdrs(t *testing.T) {
t.Errorf("Unexpected CostSource for CDR: %+v", cdr.CostSource)
}
} else if cdr.Destination == "1003" {
// in case of Asterisk take the integer part from usage
if optConf == utils.Asterisk {
cdr.Usage = strings.Split(cdr.Usage, ".")[0] + "s"
}
if cdr.Usage != "12s" && cdr.Usage != "13s" { // Usage as seconds
t.Errorf("Unexpected Usage for CDR: %+v", cdr.Usage)
}
@@ -529,6 +538,10 @@ func testCall1002Cdrs(t *testing.T) {
if reply[0].RequestType != utils.META_POSTPAID {
t.Errorf("Unexpected RequestType for CDR: %+v", reply[0].RequestType)
}
// in case of Asterisk take the integer part from usage
if optConf == utils.Asterisk {
reply[0].Usage = strings.Split(reply[0].Usage, ".")[0] + "s"
}
if reply[0].Usage != "1m5s" && reply[0].Usage != "1m6s" { // Usage as seconds
t.Errorf("Unexpected Usage for CDR: %+v", reply[0].Usage)
}
@@ -552,6 +565,10 @@ func testCall1003Cdrs(t *testing.T) {
if cdr.RequestType != utils.META_PREPAID {
t.Errorf("Unexpected RequestType for CDR: %+v", cdr.RequestType)
}
// in case of Asterisk take the integer part from usage
if optConf == utils.Asterisk {
cdr.Usage = strings.Split(cdr.Usage, ".")[0] + "s"
}
if cdr.Usage != "15s" && cdr.Usage != "16s" &&
cdr.Usage != "20s" && cdr.Usage != "21s" { // Usage as seconds
t.Errorf("Unexpected Usage for CDR: %+v", cdr.Usage)
@@ -578,6 +595,10 @@ func testCallStatMetrics(t *testing.T) {
utils.MetaTCC: "1.34009",
utils.MetaTCD: "2m24s",
}
firstStatMetrics4 := map[string]string{
utils.MetaTCC: "1.35346",
utils.MetaTCD: "2m24s",
}
secondStatMetrics1 := map[string]string{
utils.MetaTCC: "0.6",
utils.MetaTCD: "35s",
@@ -590,15 +611,24 @@ func testCallStatMetrics(t *testing.T) {
if err := tutorialCallsRpc.Call(utils.StatSv1GetQueueStringMetrics,
&utils.TenantID{Tenant: "cgrates.org", ID: "Stats2"}, &metrics); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(firstStatMetrics1, metrics) &&
}
if optConf == utils.Asterisk {
metrics[utils.MetaTCD] = strings.Split(metrics[utils.MetaTCD], ".")[0] + "s"
}
if !reflect.DeepEqual(firstStatMetrics1, metrics) &&
!reflect.DeepEqual(firstStatMetrics2, metrics) &&
!reflect.DeepEqual(firstStatMetrics3, metrics) {
!reflect.DeepEqual(firstStatMetrics3, metrics) &&
!reflect.DeepEqual(firstStatMetrics4, metrics) {
t.Errorf("expecting: %+v, received reply: %s", firstStatMetrics1, metrics)
}
if err := tutorialCallsRpc.Call(utils.StatSv1GetQueueStringMetrics,
&utils.TenantID{Tenant: "cgrates.org", ID: "Stats2_1"}, &metrics); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(secondStatMetrics1, metrics) &&
}
if optConf == utils.Asterisk {
metrics[utils.MetaTCD] = strings.Split(metrics[utils.MetaTCD], ".")[0] + "s"
}
if !reflect.DeepEqual(secondStatMetrics1, metrics) &&
!reflect.DeepEqual(secondStatMetrics2, metrics) {
t.Errorf("expecting: %+v, received reply: %s", secondStatMetrics1, metrics)
}
@@ -772,8 +802,7 @@ func testCallSyncSessions(t *testing.T) {
t.Errorf("Resources: %+v", rsAfter)
}
for _, r := range *rsAfter {
if r.ID == "ResGroup1" &&
(len(r.Usages) != 0 || len(r.TTLIdx) != 0) {
if r.ID == "ResGroup1" && len(r.Usages) != 0 {
t.Errorf("Unexpected resource: %+v", utils.ToJSON(r))
}
}

2
glide.lock generated
View File

@@ -8,7 +8,7 @@ imports:
subpackages:
- jsonrpc
- name: github.com/cgrates/aringo
version: 47cdb110c5ff42bddf2b801dc5ae8ceb15d2d602
version: f996da7890eaec95ba13240253744446e17e6598
- name: github.com/cgrates/fsock
version: bcbd5e75c07dddb12ac86f1f861f2bdddc1d4596
- name: github.com/cgrates/kamevapi

View File

@@ -292,7 +292,7 @@ func (smg *SMGeneric) ttlTerminate(s *SMGSession, tmtr *smgSessionTerminator) {
var reply string
argsRU := utils.ArgRSv1ResourceUsage{
CGREvent: utils.CGREvent{
Tenant: s.EventStart.GetStringIgnoreErrors(utils.Tenant),
Tenant: s.Tenant,
Event: s.EventStart.AsMapInterface(),
},
UsageID: s.ResourceID,