CDRLOG for TOPUP and TOPUP_RESET actions, fixes #313, fixes #214

This commit is contained in:
DanB
2016-01-03 13:24:07 +01:00
parent 1719e96351
commit 74d510aeb5
3 changed files with 75 additions and 38 deletions

View File

@@ -158,35 +158,35 @@ func parseTemplateValue(rsrFlds utils.RSRFields, acnt *Account, action *Action)
var parsedValue string // Template values
for _, rsrFld := range rsrFlds {
switch rsrFld.Id {
case "account_id":
case "AccountID":
parsedValue += rsrFld.ParseValue(acnt.Id)
case "direction":
case "Directions":
parsedValue += rsrFld.ParseValue(action.Balance.Directions.String())
case "tenant":
case utils.TENANT:
parsedValue += rsrFld.ParseValue(dta.Tenant)
case "account":
case utils.ACCOUNT:
parsedValue += rsrFld.ParseValue(dta.Account)
case "action_id":
case "ActionID":
parsedValue += rsrFld.ParseValue(action.Id)
case "action_type":
case "ActionType":
parsedValue += rsrFld.ParseValue(action.ActionType)
case "balance_type":
case "BalanceType":
parsedValue += rsrFld.ParseValue(action.BalanceType)
case "balance_uuid":
case "BalanceUUID":
parsedValue += rsrFld.ParseValue(action.Balance.Uuid)
case "balance_id":
case "BalanceID":
parsedValue += rsrFld.ParseValue(action.Balance.Id)
case "balance_value":
case "BalanceValue":
parsedValue += rsrFld.ParseValue(strconv.FormatFloat(action.Balance.GetValue(), 'f', -1, 64))
case "destination_id":
case "DestinationIDs":
parsedValue += rsrFld.ParseValue(action.Balance.DestinationIds.String())
case "extra_params":
case "ExtraParameters":
parsedValue += rsrFld.ParseValue(action.ExtraParameters)
case "rating_subject":
case "RatingSubject":
parsedValue += rsrFld.ParseValue(action.Balance.RatingSubject)
case "category":
case utils.CATEGORY:
parsedValue += rsrFld.ParseValue(action.Balance.Categories.String())
case "shared_group":
case "SharedGroups":
parsedValue += rsrFld.ParseValue(action.Balance.SharedGroups.String())
default:
parsedValue += rsrFld.ParseValue("") // Mostly for static values
@@ -197,15 +197,14 @@ func parseTemplateValue(rsrFlds utils.RSRFields, acnt *Account, action *Action)
func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions) (err error) {
defaultTemplate := map[string]utils.RSRFields{
utils.TOR: utils.ParseRSRFieldsMustCompile("balance_type", utils.INFIELD_SEP),
utils.CDRHOST: utils.ParseRSRFieldsMustCompile("^127.0.0.1", utils.INFIELD_SEP),
utils.DIRECTION: utils.ParseRSRFieldsMustCompile("direction", utils.INFIELD_SEP),
utils.REQTYPE: utils.ParseRSRFieldsMustCompile("^"+utils.META_PREPAID, utils.INFIELD_SEP),
utils.TENANT: utils.ParseRSRFieldsMustCompile("tenant", utils.INFIELD_SEP),
utils.ACCOUNT: utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP),
utils.SUBJECT: utils.ParseRSRFieldsMustCompile("account", utils.INFIELD_SEP),
utils.COST: utils.ParseRSRFieldsMustCompile("balance_value", utils.INFIELD_SEP),
utils.MEDI_RUNID: utils.ParseRSRFieldsMustCompile("^"+utils.META_DEFAULT, utils.INFIELD_SEP),
utils.TOR: utils.ParseRSRFieldsMustCompile("BalanceType", utils.INFIELD_SEP),
utils.CDRHOST: utils.ParseRSRFieldsMustCompile("^127.0.0.1", utils.INFIELD_SEP),
utils.DIRECTION: utils.ParseRSRFieldsMustCompile("Directions", utils.INFIELD_SEP),
utils.REQTYPE: utils.ParseRSRFieldsMustCompile("^"+utils.META_PREPAID, utils.INFIELD_SEP),
utils.TENANT: utils.ParseRSRFieldsMustCompile(utils.TENANT, utils.INFIELD_SEP),
utils.ACCOUNT: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP),
utils.SUBJECT: utils.ParseRSRFieldsMustCompile(utils.ACCOUNT, utils.INFIELD_SEP),
utils.COST: utils.ParseRSRFieldsMustCompile("BalanceValue", utils.INFIELD_SEP),
}
template := make(map[string]string)
@@ -225,10 +224,10 @@ func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions)
// set stored cdr values
var cdrs []*CDR
for _, action := range acs {
if !utils.IsSliceMember([]string{DEBIT, DEBIT_RESET}, action.ActionType) || action.Balance == nil {
if !utils.IsSliceMember([]string{DEBIT, DEBIT_RESET, TOPUP, TOPUP_RESET}, action.ActionType) || action.Balance == nil {
continue // Only log specific actions
}
cdr := &CDR{Source: CDRLOG, SetupTime: time.Now(), AnswerTime: time.Now(), OriginID: utils.GenUUID(), ExtraFields: make(map[string]string)}
cdr := &CDR{RunID: action.ActionType, Source: CDRLOG, SetupTime: time.Now(), AnswerTime: time.Now(), OriginID: utils.GenUUID(), ExtraFields: make(map[string]string)}
cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.String())
cdr.Usage = time.Duration(1) * time.Second
elem := reflect.ValueOf(cdr).Elem()
@@ -250,7 +249,6 @@ func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions)
cdr.ExtraFields[key] = parsedValue
}
}
//utils.Logger.Debug(fmt.Sprintf("account: %+v, action: %+v, balance: %+v", acc, action, action.Balance))
cdrs = append(cdrs, cdr)
if cdrStorage == nil { // Only save if the cdrStorage is defined
continue
@@ -258,11 +256,6 @@ func cdrLogAction(acc *Account, sq *StatsQueueTriggered, a *Action, acs Actions)
if err := cdrStorage.SetCDR(cdr, true); err != nil {
return err
}
// FixMe
//if err := cdrStorage.LogCallCost(); err != nil {
// return err
//}
}
b, _ := json.Marshal(cdrs)

View File

@@ -82,7 +82,7 @@ func TestActionsLocalRpcConn(t *testing.T) {
}
}
func TestActionsLocalSetCdrlogActions(t *testing.T) {
func TestActionsLocalSetCdrlogDebit(t *testing.T) {
if !*testLocal {
return
}
@@ -109,7 +109,7 @@ func TestActionsLocalSetCdrlogActions(t *testing.T) {
t.Errorf("Calling ApierV1.ExecuteAction received: %s", reply)
}
var rcvedCdrs []*ExternalCDR
if err := actsLclRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{Sources: []string{CDRLOG}}, &rcvedCdrs); err != nil {
if err := actsLclRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{Sources: []string{CDRLOG}, Accounts: []string{attrsSetAccount.Account}}, &rcvedCdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(rcvedCdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(rcvedCdrs))
@@ -121,11 +121,55 @@ func TestActionsLocalSetCdrlogActions(t *testing.T) {
rcvedCdrs[0].Account != "dan2904" ||
rcvedCdrs[0].Subject != "dan2904" ||
rcvedCdrs[0].Usage != "1" ||
rcvedCdrs[0].RunID != utils.META_DEFAULT ||
rcvedCdrs[0].RunID != DEBIT ||
rcvedCdrs[0].Cost != attrsAA.Actions[0].Units {
t.Errorf("Received: %+v", rcvedCdrs[0])
}
}
func TestActionsLocalSetCdrlogTopup(t *testing.T) {
if !*testLocal {
return
}
var reply string
attrsSetAccount := &utils.AttrSetAccount{Tenant: "cgrates.org", Account: "dan2905"}
if err := actsLclRpc.Call("ApierV1.SetAccount", attrsSetAccount, &reply); err != nil {
t.Error("Got error on ApierV1.SetAccount: ", err.Error())
} else if reply != utils.OK {
t.Errorf("Calling ApierV1.SetAccount received: %s", reply)
}
attrsAA := &utils.AttrSetActions{ActionsId: "ACTS_2", Actions: []*utils.TPAction{
&utils.TPAction{Identifier: TOPUP, BalanceType: utils.MONETARY, Units: 5.0, ExpiryTime: UNLIMITED, Weight: 20.0},
&utils.TPAction{Identifier: CDRLOG},
}}
if err := actsLclRpc.Call("ApierV1.SetActions", attrsAA, &reply); err != nil && err.Error() != utils.ErrExists.Error() {
t.Error("Got error on ApierV1.SetActions: ", err.Error())
} else if reply != utils.OK {
t.Errorf("Calling ApierV1.SetActions received: %s", reply)
}
attrsEA := &utils.AttrExecuteAction{Tenant: attrsSetAccount.Tenant, Account: attrsSetAccount.Account, ActionsId: attrsAA.ActionsId}
if err := actsLclRpc.Call("ApierV1.ExecuteAction", attrsEA, &reply); err != nil {
t.Error("Got error on ApierV1.ExecuteAction: ", err.Error())
} else if reply != utils.OK {
t.Errorf("Calling ApierV1.ExecuteAction received: %s", reply)
}
var rcvedCdrs []*ExternalCDR
if err := actsLclRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{Sources: []string{CDRLOG}, Accounts: []string{attrsSetAccount.Account}}, &rcvedCdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(rcvedCdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(rcvedCdrs))
} else if rcvedCdrs[0].ToR != utils.MONETARY ||
rcvedCdrs[0].OriginHost != "127.0.0.1" ||
rcvedCdrs[0].Source != CDRLOG ||
rcvedCdrs[0].RequestType != utils.META_PREPAID ||
rcvedCdrs[0].Tenant != "cgrates.org" ||
rcvedCdrs[0].Account != "dan2905" ||
rcvedCdrs[0].Subject != "dan2905" ||
rcvedCdrs[0].Usage != "1" ||
rcvedCdrs[0].RunID != TOPUP ||
rcvedCdrs[0].Cost != attrsAA.Actions[0].Units {
t.Errorf("Received: %+v", rcvedCdrs[0])
}
}
func TestActionsLocalStopCgrEngine(t *testing.T) {

View File

@@ -1212,7 +1212,7 @@ func TestActionCdrLogParamsWithOverload(t *testing.T) {
acnt := &Account{Id: "cgrates.org:dan2904"}
cdrlog := &Action{
ActionType: CDRLOG,
ExtraParameters: `{"Subject":"^rif","Destination":"^1234","ToR":"~action_tag:s/^at(.)$/0$1/","AccountId":"~account_id:s/^\\*(.*)$/$1/"}`,
ExtraParameters: `{"Subject":"^rif","Destination":"^1234","ToR":"~ActionTag:s/^at(.)$/0$1/","AccountID":"~AccountID:s/^\\*(.*)$/$1/"}`,
}
err := cdrLogAction(acnt, nil, cdrlog, Actions{
&Action{
@@ -1230,14 +1230,14 @@ func TestActionCdrLogParamsWithOverload(t *testing.T) {
cdrs := make([]*CDR, 0)
json.Unmarshal([]byte(cdrlog.ExpirationString), &cdrs)
expectedExtraFields := map[string]string{
"AccountId": "cgrates.org:dan2904",
"AccountID": "cgrates.org:dan2904",
}
if len(cdrs) != 2 ||
cdrs[0].Subject != "rif" {
t.Errorf("Wrong cdrlogs: %+v", cdrs[0])
}
if !reflect.DeepEqual(cdrs[0].ExtraFields, expectedExtraFields) {
t.Errorf("Received extra_fields: %+v %+v", cdrs[0].ExtraFields, expectedExtraFields)
t.Errorf("Expecting extra fields: %+v, received: %+v", expectedExtraFields, cdrs[0].ExtraFields)
}
}