diff --git a/agents/asteriskagent.go b/agents/asteriskagent.go index ccef7ab59..cee52e37a 100644 --- a/agents/asteriskagent.go +++ b/agents/asteriskagent.go @@ -19,6 +19,7 @@ along with this program. If not, see 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 } diff --git a/general_tests/tutorial_calls_test.go b/general_tests/tutorial_calls_test.go index eb5424c3a..55c0ad396 100755 --- a/general_tests/tutorial_calls_test.go +++ b/general_tests/tutorial_calls_test.go @@ -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)) } } diff --git a/glide.lock b/glide.lock index 1fbb5c00e..c0f2f3d18 100644 --- a/glide.lock +++ b/glide.lock @@ -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 diff --git a/sessions/sessions.go b/sessions/sessions.go index 15643a6df..a2271ee83 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -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,