From 74d510aeb51abb153cd0b6b4d9d4eb079d4e7a04 Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 3 Jan 2016 13:24:07 +0100 Subject: [PATCH] CDRLOG for TOPUP and TOPUP_RESET actions, fixes #313, fixes #214 --- engine/action.go | 57 ++++++++++++++++-------------------- engine/actions_local_test.go | 50 +++++++++++++++++++++++++++++-- engine/actions_test.go | 6 ++-- 3 files changed, 75 insertions(+), 38 deletions(-) diff --git a/engine/action.go b/engine/action.go index e7e265cb9..b3ae9bcff 100644 --- a/engine/action.go +++ b/engine/action.go @@ -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) diff --git a/engine/actions_local_test.go b/engine/actions_local_test.go index c5d30e126..177fe19b0 100644 --- a/engine/actions_local_test.go +++ b/engine/actions_local_test.go @@ -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) { diff --git a/engine/actions_test.go b/engine/actions_test.go index 2b3f7614c..a3904b150 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -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) } }