Add testo for TerminateEmulate for session with MaxUsage 0

This commit is contained in:
TeoV
2020-09-30 16:19:15 +03:00
committed by Dan Christian Bogos
parent 0fcef2f507
commit fb8011fa69
11 changed files with 371 additions and 9 deletions

View File

@@ -67,10 +67,13 @@ var (
testDiamItCCRSMS,
testDiamItCCRMMS,
testDiamItEmulateTerminate,
testDiamItTemplateErr,
testDiamItCCRInitWithForceDuration,
testDiamItDRR,
testDiamItKillEngine,
}
)
@@ -1423,3 +1426,154 @@ func testDiamItTemplateErr(t *testing.T) {
t.Errorf("expecting: %s, received: <%s>", eVal, val)
}
}
func testDiamItEmulateTerminate(t *testing.T) {
if diamConfigDIR == "dispatchers/diamagent" {
t.SkipNow()
}
var result string
//add the second charger
chargerProfile := &engine.ChargerProfile{
Tenant: "cgrates.com",
ID: "CustomCharger",
RunID: "CustomCharger",
AttributeIDs: []string{"*constant:*req.Category:custom_charger"},
Weight: 20,
}
if err := apierRpc.Call(utils.APIerSv1SetChargerProfile, chargerProfile, &result); err != nil {
t.Error(err)
} else if result != utils.OK {
t.Error("Unexpected reply returned", result)
}
//add the second charger
chargerProfile2 := &engine.ChargerProfile{
Tenant: "cgrates.com",
ID: "Default",
RunID: "*default",
AttributeIDs: []string{"*none"},
Weight: 20,
}
if err := apierRpc.Call(utils.APIerSv1SetChargerProfile, chargerProfile2, &result); err != nil {
t.Error(err)
} else if result != utils.OK {
t.Error("Unexpected reply returned", result)
}
//set the account
attrSetBalance := utils.AttrSetBalance{
Tenant: "cgrates.com",
Account: "testDiamItEmulateTerminate",
Value: float64(1) * float64(time.Hour),
BalanceType: utils.VOICE,
Balance: map[string]interface{}{
utils.ID: "testDiamItEmulateTerminate",
utils.Categories: "custom_charger",
},
}
var reply string
if err := apierRpc.Call(utils.APIerSv2SetBalance, attrSetBalance, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Errorf("Received: %s", reply)
}
var acnt *engine.Account
attrs := &utils.AttrGetAccount{Tenant: "cgrates.com", Account: "testDiamItEmulateTerminate"}
if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
t.Error(err)
} else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != float64(time.Hour) {
t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.VOICE].GetTotalValue())
}
m := diam.NewRequest(diam.CreditControl, 4, nil)
m.NewAVP(avp.SessionID, avp.Mbit, 0, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8"))
m.NewAVP(avp.OriginHost, avp.Mbit, 0, datatype.DiameterIdentity("192.168.1.1"))
m.NewAVP(avp.OriginRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.org"))
m.NewAVP(avp.AuthApplicationID, avp.Mbit, 0, datatype.Unsigned32(4))
m.NewAVP(avp.CCRequestType, avp.Mbit, 0, datatype.Enumerated(1))
m.NewAVP(avp.CCRequestNumber, avp.Mbit, 0, datatype.Unsigned32(0))
m.NewAVP(avp.DestinationHost, avp.Mbit, 0, datatype.DiameterIdentity("CGR-DA"))
m.NewAVP(avp.DestinationRealm, avp.Mbit, 0, datatype.DiameterIdentity("cgrates.com"))
m.NewAVP(avp.ServiceContextID, avp.Mbit, 0, datatype.UTF8String("voice@DiamItCCRInit"))
m.NewAVP(avp.EventTimestamp, avp.Mbit, 0, datatype.Time(time.Date(2018, 10, 4, 14, 42, 20, 0, time.UTC)))
m.NewAVP(avp.SubscriptionID, avp.Mbit, 0, &diam.GroupedAVP{
AVP: []*diam.AVP{
diam.NewAVP(450, avp.Mbit, 0, datatype.Enumerated(0)), // Subscription-Id-Type
diam.NewAVP(444, avp.Mbit, 0, datatype.UTF8String("testDiamItEmulateTerminate")), // Subscription-Id-Data
}})
m.NewAVP(avp.ServiceIdentifier, avp.Mbit, 0, datatype.Unsigned32(0))
m.NewAVP(avp.RequestedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
AVP: []*diam.AVP{
diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(300))}})
m.NewAVP(avp.UsedServiceUnit, avp.Mbit, 0, &diam.GroupedAVP{
AVP: []*diam.AVP{
diam.NewAVP(420, avp.Mbit, 0, datatype.Unsigned32(0))}})
m.NewAVP(873, avp.Mbit, 10415, &diam.GroupedAVP{
AVP: []*diam.AVP{
diam.NewAVP(20300, avp.Mbit, 2011, &diam.GroupedAVP{ // IN-Information
AVP: []*diam.AVP{
diam.NewAVP(831, avp.Mbit, 10415, datatype.UTF8String("1006")), // Calling-Party-Address
diam.NewAVP(832, avp.Mbit, 10415, datatype.UTF8String("1002")), // Called-Party-Address
diam.NewAVP(20327, avp.Mbit, 2011, datatype.UTF8String("1002")), // Real-Called-Number
diam.NewAVP(20339, avp.Mbit, 2011, datatype.Unsigned32(0)), // Charge-Flow-Type
diam.NewAVP(20302, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-Vlr-Number
diam.NewAVP(20303, avp.Mbit, 2011, datatype.UTF8String("")), // Calling-CellID-Or-SAI
diam.NewAVP(20313, avp.Mbit, 2011, datatype.OctetString("")), // Bearer-Capability
diam.NewAVP(20321, avp.Mbit, 2011, datatype.UTF8String("bb97be2b9f37c2be9614fff71c8b1d08b1acbff8")), // Call-Reference-Number
diam.NewAVP(20322, avp.Mbit, 2011, datatype.UTF8String("")), // MSC-Address
diam.NewAVP(20324, avp.Mbit, 2011, datatype.Unsigned32(0)), // Time-Zone
diam.NewAVP(20385, avp.Mbit, 2011, datatype.UTF8String("")), // Called-Party-NP
diam.NewAVP(20386, avp.Mbit, 2011, datatype.UTF8String("")), // SSP-Time
},
}),
}})
// ============================================
// prevent nil pointer dereference
// ============================================
if diamClnt == nil {
t.Fatal("Diameter client should not be nil")
}
if diamClnt.conn == nil {
t.Fatal("Diameter connection should not be nil")
}
if m == nil {
t.Fatal("The mesage to diameter should not be nil")
}
// ============================================
if err := diamClnt.SendMessage(m); err != nil {
t.Error(err)
}
msg := diamClnt.ReceivedMessage(rplyTimeout)
if msg == nil {
t.Fatal("No message returned")
}
// Result-Code
eVal := "2001"
if avps, err := msg.FindAVPsWithPath([]interface{}{"Result-Code"}, dict.UndefinedVendorID); err != nil {
t.Error(err)
} else if len(avps) == 0 {
t.Error("Missing AVP")
} else if val, err := diamAVPAsString(avps[0]); err != nil {
t.Error(err)
} else if val != eVal {
t.Errorf("expecting: %s, received: <%s>", eVal, val)
}
// Result-Code
eVal = "0" // 0 from sessions
if avps, err := msg.FindAVPsWithPath([]interface{}{"Granted-Service-Unit", "CC-Time"},
dict.UndefinedVendorID); err != nil {
t.Error(err)
} else if len(avps) == 0 {
t.Error("Missing AVP")
} else if val, err := diamAVPAsString(avps[0]); err != nil {
t.Error(err)
} else if val != eVal {
t.Errorf("expecting: %s, received: <%s>", eVal, val)
}
if err := apierRpc.Call(utils.APIerSv2GetAccount, attrs, &acnt); err != nil {
t.Error(err)
} else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != float64(time.Hour) {
t.Errorf("Expected: %f, received: %f", float64(time.Hour), acnt.BalanceMap[utils.VOICE].GetTotalValue())
}
}

View File

@@ -109,7 +109,7 @@
"*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"
],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes", "*continue"],
"request_fields":[
{
"tag": "ToR",
@@ -201,6 +201,35 @@
},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": [

View File

@@ -109,7 +109,7 @@
"*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"
],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes","*continue"],
"request_fields":[
{
"tag": "ToR",
@@ -201,6 +201,35 @@
},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": [

View File

@@ -109,7 +109,7 @@
"*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"
],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes", "*continue"],
"request_fields":[
{
"tag": "ToR",
@@ -201,6 +201,35 @@
},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": [

View File

@@ -106,7 +106,7 @@
"id": "VoiceInit",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes","*continue"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
@@ -133,6 +133,35 @@
"value": "~*cgrep.MaxUsage{*duration_seconds}", "mandatory": true},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:2",

View File

@@ -106,7 +106,7 @@
"id": "VoiceInit",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes", "*continue"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
@@ -133,6 +133,35 @@
"value": "~*cgrep.MaxUsage{*duration_seconds}", "mandatory": true},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:2",

View File

@@ -106,7 +106,7 @@
"id": "VoiceInit",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes","*continue"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
@@ -133,6 +133,35 @@
"value": "~*cgrep.MaxUsage{*duration_seconds}", "mandatory": true},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:2",

View File

@@ -106,7 +106,7 @@
"id": "VoiceInit",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice"],
"flags": ["*initiate", "*accounts", "*attributes"],
"flags": ["*initiate", "*accounts", "*attributes","*continue"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "APIKey", "path": "*opts.*apiKey", "type": "*constant", "value": "ses12345"},
@@ -134,6 +134,36 @@
"value": "~*cgrep.MaxUsage{*duration_seconds}", "mandatory": true},
],
},
{
"id": "VoiceTerminateEmulate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:1",
"*prefix:~*req.Service-Context-Id:voice","*eq:~*cgrep.MaxUsage:0"],
"flags": ["*terminate", "*accounts", "*attributes"],
"request_fields":[
{"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"},
{"tag": "APIKey", "path": "*opts.*apiKey", "type": "*constant", "value": "ses12345"},
{"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable",
"value": "~*req.Session-Id", "mandatory": true},
{"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host",
"mandatory": true},
{"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*attributes"},
{"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "call"},
{"tag": "Account", "path": "*cgreq.Account", "type": "*constant", "value": "*attributes"},
{"tag": "Destination", "path": "*cgreq.Destination", "type": "*variable",
"value": "~*req.Service-Information.IN-Information.Real-Called-Number", "mandatory": true},
{"tag": "AnswerTime", "path": "*cgreq.AnswerTime", "type": "*variable",
"value": "~*req.Event-Timestamp", "mandatory": true},
{"tag": "Usage", "path": "*cgreq.Usage", "type": "*variable",
"value": "0s", "mandatory": true},
{"tag": "SubscriberID", "path": "*cgreq.SubscriberId", "type": "*variable",
"value": "~*req.Subscription-Id.Subscription-Id-Data", "mandatory": true}
],
"reply_fields":[
{"tag": "ResultCode", "filters": ["*notempty:~*cgrep.Error:"],
"path": "*rep.Result-Code", "type": "*constant", "value": "5030", "blocker": true},
{"tag": "ResultCode", "path": "*rep.Result-Code", "type": "*constant", "value": "2001"},
],
},
{
"id": "VoiceUpdate",
"filters": ["*string:~*vars.*cmd:CCR", "*string:~*req.CC-Request-Type:2",

View File

@@ -82,8 +82,8 @@
"sessions": {
"enabled": true,
"session_ttl": "50ms",
"chargers_conns": ["*internal"],
"rals_conns": ["*internal"],
"chargers_conns": ["*localhost"],
"rals_conns": ["*localhost"],
"cdrs_conns": ["*internal"],
"resources_conns": ["*internal"],
"thresholds_conns": ["*internal"],

View File

@@ -22,3 +22,5 @@ cgrates.com,ATTR_TNT_ALIAS,*any,,,,*req.RequestType,*constant,*prepaid,,
cgrates.com,ATTR_TNT_ALIAS,*any,,,,*tenant,*constant,cgrates.org,,
cgrates.com,ATTR_TNT_1001,*any,*string:~*req.Account:1001,,,*tenant,*constant,cgrates.org,,
cgrates.com,ATTR_TNT_DISC,*any,*string:~*req.Account:testDiamInitWithSessionDisconnect,,,*tenant,*constant,cgrates.org,,
cgrates.com,ATTR_ACC_EMULATE_TERMINATE,*any,*string:~*req.SubscriberId:testDiamItEmulateTerminate,,,*req.Account,*constant,testDiamItEmulateTerminate,false,10
cgrates.com,ATTR_ACC_EMULATE_TERMINATE,*any,,,,*req.RequestType,*constant,*prepaid,,
1 #Tenant ID Contexts FilterIDs ActivationInterval AttributeFilterIDs Path Type Value Blocker Weight
22 cgrates.com ATTR_TNT_ALIAS *any *tenant *constant cgrates.org
23 cgrates.com ATTR_TNT_1001 *any *string:~*req.Account:1001 *tenant *constant cgrates.org
24 cgrates.com ATTR_TNT_DISC *any *string:~*req.Account:testDiamInitWithSessionDisconnect *tenant *constant cgrates.org
25 cgrates.com ATTR_ACC_EMULATE_TERMINATE *any *string:~*req.SubscriberId:testDiamItEmulateTerminate *req.Account *constant testDiamItEmulateTerminate false 10
26 cgrates.com ATTR_ACC_EMULATE_TERMINATE *any *req.RequestType *constant *prepaid

View File

@@ -4,4 +4,6 @@ cgrates.org,call,1002,2014-01-14T00:00:00Z,RP_1002,
cgrates.org,call,1003,2014-01-14T00:00:00Z,RP_1003,
cgrates.org,sms,*any,2014-01-14T00:00:00Z,RP_SMS,
cgrates.org,mms,*any,2014-01-14T00:00:00Z,RP_MMS,
cgrates.com,custom_charger,*any,2014-01-14T00:00:00Z,RP_1001,
cgrates.com,call,*any,2014-01-14T00:00:00Z,RP_1001,
1 #Tenant Category Subject ActivationTime RatingPlanId RatesFallbackSubject
4 cgrates.org call 1003 2014-01-14T00:00:00Z RP_1003
5 cgrates.org sms *any 2014-01-14T00:00:00Z RP_SMS
6 cgrates.org mms *any 2014-01-14T00:00:00Z RP_MMS
7 cgrates.com custom_charger *any 2014-01-14T00:00:00Z RP_1001
8 cgrates.com call *any 2014-01-14T00:00:00Z RP_1001
9