mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
more refactorings and cdr test
This commit is contained in:
38
cdrs/cdrs.go
38
cdrs/cdrs.go
@@ -19,41 +19,37 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package cdrs
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
utils "github.com/cgrates/cgrates/cgrcoreutils"
|
||||
"github.com/cgrates/cgrates/mediator"
|
||||
"github.com/cgrates/cgrates/rater"
|
||||
"io/ioutil"
|
||||
"log/syslog"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
var (
|
||||
Logger utils.LoggerInterface
|
||||
Logger = rater.Logger
|
||||
)
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
Logger, err = syslog.New(syslog.LOG_INFO, "CGRateS")
|
||||
if err != nil {
|
||||
Logger = new(utils.StdLogger)
|
||||
}
|
||||
type CDRS struct {
|
||||
loggerDb rater.DataStorage
|
||||
medi *mediator.Mediator
|
||||
}
|
||||
|
||||
type CDRVars struct {
|
||||
FSCdr map[string]string
|
||||
}
|
||||
|
||||
func cdrHandler(w http.ResponseWriter, r *http.Request) {
|
||||
func (cdrs *CDRS) cdrHandler(w http.ResponseWriter, r *http.Request) {
|
||||
body, _ := ioutil.ReadAll(r.Body)
|
||||
cdr := CDRVars{}
|
||||
if err := json.Unmarshal(body, &cdr); err == nil {
|
||||
new(FSCdr).New(body)
|
||||
if fsCdr, err := new(FSCdr).New(body); err == nil {
|
||||
cdrs.loggerDb.SetCdr(fsCdr)
|
||||
cdrs.medi.MediateCdrFromDB(fsCdr.GetAccount(), cdrs.loggerDb)
|
||||
} else {
|
||||
Logger.Err(fmt.Sprintf("CDRCAPTOR: Could not unmarshal cdr: %v", err))
|
||||
Logger.Err(fmt.Sprintf("Could not create CDR entry: %v", err))
|
||||
}
|
||||
}
|
||||
|
||||
func startCaptiuringCDRs() {
|
||||
http.HandleFunc("/cdr", cdrHandler)
|
||||
func New(storage rater.DataStorage, mediator *mediator.Mediator) *CDRS {
|
||||
return &CDRS{storage, mediator}
|
||||
}
|
||||
|
||||
func (cdrs *CDRS) StartCaptiuringCDRs() {
|
||||
http.HandleFunc("/cdr", cdrs.cdrHandler)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
}
|
||||
|
||||
@@ -19,8 +19,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package cdrs
|
||||
|
||||
import (
|
||||
utils "github.com/cgrates/cgrates/cgrcoreutils"
|
||||
"encoding/json"
|
||||
"github.com/cgrates/cgrates/config"
|
||||
"github.com/cgrates/cgrates/rater"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
@@ -29,6 +31,7 @@ var cfg *config.CGRConfig // Share the configuration with the rest of the packag
|
||||
|
||||
const (
|
||||
// Freswitch event proprities names
|
||||
CDR_MAP = "variables"
|
||||
DIRECTION = "Call-Direction"
|
||||
ORIG_ID = "variable_sip_call_id" //- originator_id - match cdrs
|
||||
SUBJECT = "variable_cgr_subject"
|
||||
@@ -48,64 +51,76 @@ const (
|
||||
|
||||
type FSCdr map[string]string
|
||||
|
||||
func (fsev FSCdr) New(body []byte) CDR {
|
||||
//fsev = fsock.FSCdrStrToMap(body, nil)
|
||||
return fsev
|
||||
func (fsCdr FSCdr) New(body []byte) (rater.CDR, error) {
|
||||
fsCdr = make(map[string]string)
|
||||
var tmp map[string]interface{}
|
||||
var err error
|
||||
if err = json.Unmarshal(body, &tmp); err == nil {
|
||||
if variables, ok := tmp[CDR_MAP]; ok {
|
||||
if variables, ok := variables.(map[string]interface{}); ok {
|
||||
for k, v := range variables {
|
||||
fsCdr[k] = v.(string)
|
||||
}
|
||||
}
|
||||
return fsCdr, nil
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (fsev FSCdr) GetName() string {
|
||||
return fsev[NAME]
|
||||
func (fsCdr FSCdr) GetName() string {
|
||||
return fsCdr[NAME]
|
||||
}
|
||||
func (fsev FSCdr) GetDirection() string {
|
||||
func (fsCdr FSCdr) GetDirection() string {
|
||||
//TODO: implement direction
|
||||
return "OUT"
|
||||
//return fsev[DIRECTION]
|
||||
//return fsCdr[DIRECTION]
|
||||
}
|
||||
func (fsev FSCdr) GetOrigId() string {
|
||||
return fsev[ORIG_ID]
|
||||
func (fsCdr FSCdr) GetOrigId() string {
|
||||
return fsCdr[ORIG_ID]
|
||||
}
|
||||
func (fsev FSCdr) GetSubject() string {
|
||||
return utils.FirstNonEmpty(fsev[SUBJECT], fsev[USERNAME])
|
||||
func (fsCdr FSCdr) GetSubject() string {
|
||||
return utils.FirstNonEmpty(fsCdr[SUBJECT], fsCdr[USERNAME])
|
||||
}
|
||||
func (fsev FSCdr) GetAccount() string {
|
||||
return utils.FirstNonEmpty(fsev[ACCOUNT], fsev[USERNAME])
|
||||
func (fsCdr FSCdr) GetAccount() string {
|
||||
return utils.FirstNonEmpty(fsCdr[ACCOUNT], fsCdr[USERNAME])
|
||||
}
|
||||
|
||||
// Charging destination number
|
||||
func (fsev FSCdr) GetDestination() string {
|
||||
return utils.FirstNonEmpty(fsev[DESTINATION], fsev[CALL_DEST_NR])
|
||||
func (fsCdr FSCdr) GetDestination() string {
|
||||
return utils.FirstNonEmpty(fsCdr[DESTINATION], fsCdr[CALL_DEST_NR])
|
||||
}
|
||||
|
||||
// Original dialed destination number, useful in case of unpark
|
||||
func (fsev FSCdr) GetCallDestNr() string {
|
||||
return fsev[CALL_DEST_NR]
|
||||
func (fsCdr FSCdr) GetCallDestNr() string {
|
||||
return fsCdr[CALL_DEST_NR]
|
||||
}
|
||||
func (fsev FSCdr) GetTOR() string {
|
||||
return utils.FirstNonEmpty(fsev[TOR], cfg.SMDefaultTOR)
|
||||
func (fsCdr FSCdr) GetTOR() string {
|
||||
return utils.FirstNonEmpty(fsCdr[TOR], cfg.SMDefaultTOR)
|
||||
}
|
||||
func (fsev FSCdr) GetUUID() string {
|
||||
return fsev[UUID]
|
||||
func (fsCdr FSCdr) GetUUID() string {
|
||||
return fsCdr[UUID]
|
||||
}
|
||||
func (fsev FSCdr) GetTenant() string {
|
||||
return utils.FirstNonEmpty(fsev[CSTMID], cfg.SMDefaultTenant)
|
||||
func (fsCdr FSCdr) GetTenant() string {
|
||||
return utils.FirstNonEmpty(fsCdr[CSTMID], cfg.SMDefaultTenant)
|
||||
}
|
||||
func (fsev FSCdr) GetReqType() string {
|
||||
return utils.FirstNonEmpty(fsev[REQTYPE], cfg.SMDefaultReqType)
|
||||
func (fsCdr FSCdr) GetReqType() string {
|
||||
return utils.FirstNonEmpty(fsCdr[REQTYPE], cfg.SMDefaultReqType)
|
||||
}
|
||||
func (fsev FSCdr) GetExtraParameters() string {
|
||||
func (fsCdr FSCdr) GetExtraParameters() string {
|
||||
return ""
|
||||
}
|
||||
func (fsev FSCdr) GetFallbackSubj() string {
|
||||
func (fsCdr FSCdr) GetFallbackSubj() string {
|
||||
return cfg.SMDefaultSubject
|
||||
}
|
||||
func (fsev FSCdr) GetStartTime(field string) (t time.Time, err error) {
|
||||
st, err := strconv.ParseInt(fsev[field], 0, 64)
|
||||
func (fsCdr FSCdr) GetStartTime(field string) (t time.Time, err error) {
|
||||
st, err := strconv.ParseInt(fsCdr[field], 0, 64)
|
||||
t = time.Unix(0, st*1000)
|
||||
return
|
||||
}
|
||||
|
||||
func (fsev FSCdr) GetEndTime() (t time.Time, err error) {
|
||||
st, err := strconv.ParseInt(fsev[END_TIME], 0, 64)
|
||||
func (fsCdr FSCdr) GetEndTime() (t time.Time, err error) {
|
||||
st, err := strconv.ParseInt(fsCdr[END_TIME], 0, 64)
|
||||
t = time.Unix(0, st*1000)
|
||||
return
|
||||
}
|
||||
|
||||
36
cdrs/fscdr_test.go
Normal file
36
cdrs/fscdr_test.go
Normal file
File diff suppressed because one or more lines are too long
@@ -224,3 +224,7 @@ func (m *Mediator) getCostsFromRater(record []string, runIdx int) (cc *rater.Cal
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (m *Mediator) MediateCdrFromDB(cdrID string, db rater.DataStorage) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -748,7 +748,6 @@ func TestUUID(t *testing.T) {
|
||||
if len(uuid) == 0 {
|
||||
t.Fatalf("GenUUID error %s", uuid)
|
||||
}
|
||||
t.Logf("uuid[%s]\n", uuid)
|
||||
}
|
||||
|
||||
func TestActionTriggerLogging(t *testing.T) {
|
||||
@@ -770,7 +769,8 @@ func TestActionTriggerLogging(t *testing.T) {
|
||||
var key string
|
||||
atMap, _ := storageGetter.GetAllActionTimings()
|
||||
for k, v := range atMap {
|
||||
t.Logf("%v %v", k, v)
|
||||
_ = k
|
||||
_ = v
|
||||
/*if strings.Contains(k, LOG_ACTION_TRIGGER_PREFIX) && strings.Contains(v, expected) {
|
||||
key = k
|
||||
break
|
||||
@@ -811,7 +811,6 @@ func TestActionTimingLogging(t *testing.T) {
|
||||
var key string
|
||||
atMap, _ := storageGetter.GetAllActionTimings()
|
||||
for k, v := range atMap {
|
||||
t.Logf("OOOOOOOOOO: %v %v", k, v)
|
||||
/*if strings.Contains(k, LOG_ACTION_TIMMING_PREFIX) && strings.Contains(string(v), expected) {
|
||||
key = k
|
||||
}*/
|
||||
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cache2go"
|
||||
utils "github.com/cgrates/cgrates/cgrcoreutils"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
"log/syslog"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
@@ -16,14 +16,14 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package cdrs
|
||||
package rater
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type CDR interface {
|
||||
New([]byte) CDR
|
||||
New([]byte) (CDR, error)
|
||||
GetName() string
|
||||
GetDirection() string
|
||||
GetOrigId() string
|
||||
BIN
rater/rater.test
Executable file
BIN
rater/rater.test
Executable file
Binary file not shown.
@@ -20,7 +20,6 @@ package rater
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
"menteslibres.net/gosexy/redis"
|
||||
//"log"
|
||||
"strconv"
|
||||
@@ -219,9 +218,9 @@ func (rs *GosexyStorage) LogError(uuid, source, errstr string) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (rs *GosexyStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (rs *GosexyStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (rs *GosexyStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (rs *GosexyStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
"encoding/json"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
gmsgpack "github.com/ugorji/go-msgpack"
|
||||
"github.com/vmihailenco/msgpack"
|
||||
"strings"
|
||||
@@ -62,8 +61,8 @@ type DataStorage interface {
|
||||
GetActionTimings(string) ([]*ActionTiming, error)
|
||||
SetActionTimings(string, []*ActionTiming) error
|
||||
GetAllActionTimings() (map[string][]*ActionTiming, error)
|
||||
GetCdr(string) (cdrs.CDR, error)
|
||||
SetCdr(string, cdrs.CDR) error
|
||||
GetCdr(string) (CDR, error)
|
||||
SetCdr(CDR) error
|
||||
//GetAllActionTimingsLogs() (map[string][]*ActionTiming, error)
|
||||
LogCallCost(uuid, source string, cc *CallCost) error
|
||||
LogError(uuid, source, errstr string) error
|
||||
|
||||
@@ -21,7 +21,6 @@ package rater
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@@ -184,9 +183,9 @@ func (ms *MapStorage) LogError(uuid, source, errstr string) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ms *MapStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (ms *MapStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (ms *MapStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (ms *MapStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ package rater
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
"labix.org/v2/mgo"
|
||||
"labix.org/v2/mgo/bson"
|
||||
"log"
|
||||
@@ -209,9 +208,9 @@ func (ms *MongoStorage) LogError(uuid, source, errstr string) (err error) {
|
||||
return ms.db.C("errlog").Insert(&LogErrEntry{uuid, errstr, source})
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (ms *MongoStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (ms *MongoStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (ms *MongoStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
@@ -222,9 +221,9 @@ func (mys *MySQLStorage) LogActionTiming(source string, at *ActionTiming, as []*
|
||||
}
|
||||
func (mys *MySQLStorage) LogError(uuid, source, errstr string) (err error) { return }
|
||||
|
||||
func (mys *MySQLStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (mys *MySQLStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (mys *MySQLStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (mys *MySQLStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
_ "github.com/bmizerany/pq"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
)
|
||||
|
||||
type PostgresStorage struct {
|
||||
@@ -222,9 +221,9 @@ func (psl *PostgresStorage) LogActionTiming(source string, at *ActionTiming, as
|
||||
}
|
||||
func (psl *PostgresStorage) LogError(uuid, source, errstr string) (err error) { return }
|
||||
|
||||
func (psl *PostgresStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (psl *PostgresStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (psl *PostgresStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (psl *PostgresStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ package rater
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
"github.com/garyburd/redigo/redis"
|
||||
//"log"
|
||||
"time"
|
||||
@@ -216,9 +215,9 @@ func (rs *RedigoStorage) LogError(uuid, source, errstr string) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (rs *RedigoStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (rs *RedigoStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (rs *RedigoStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (rs *RedigoStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ package rater
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/cdrs"
|
||||
"github.com/fzzy/radix/redis"
|
||||
//"log"
|
||||
"time"
|
||||
@@ -242,9 +241,9 @@ func (rs *RedisStorage) LogError(uuid, source, errstr string) (err error) {
|
||||
}
|
||||
return
|
||||
}
|
||||
func (rs *RedisStorage) GetCdr(string) (cdrs.CDR, error) {
|
||||
func (rs *RedisStorage) GetCdr(string) (CDR, error) {
|
||||
return nil, nil
|
||||
}
|
||||
func (rs *RedisStorage) SetCdr(string, cdrs.CDR) error {
|
||||
func (rs *RedisStorage) SetCdr(CDR) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ package sessionmanager
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
utils "github.com/cgrates/cgrates/cgrcoreutils"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
"github.com/cgrates/fsock"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
11
test.sh
11
test.sh
@@ -7,7 +7,8 @@ go test -i github.com/cgrates/cgrates/cmd/cgr-rater
|
||||
go test -i github.com/cgrates/cgrates/inotify
|
||||
go test -i github.com/cgrates/cgrates/mediator
|
||||
go test -i github.com/cgrates/fsock
|
||||
|
||||
go test -i github.com/cgrates/cgrates/cdrs
|
||||
go test -i github.com/cgrates/cgrates/utils
|
||||
|
||||
go test github.com/cgrates/cgrates/rater
|
||||
ts=$?
|
||||
@@ -21,7 +22,11 @@ go test github.com/cgrates/cgrates/inotify
|
||||
it=$?
|
||||
go test github.com/cgrates/cgrates/mediator
|
||||
md=$?
|
||||
go test github.com/cgrates/fsock
|
||||
go test github.com/cgrates/cgrates/cdrs
|
||||
cdr=$?
|
||||
go test github.com/cgrates/cgrates/utils
|
||||
ut=$?
|
||||
go test github.com/cgrates//fsock
|
||||
fs=$?
|
||||
|
||||
exit $ts && $sm && $cfg && $bl && $cr && $it && $md && $fs
|
||||
exit $ts && $sm && $cfg && $bl && $cr && $it && $md && $cdr && $fs && $ut
|
||||
|
||||
@@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package cgrcoreutils
|
||||
package utils
|
||||
|
||||
// Returns first non empty string out of vals. Useful to extract defaults
|
||||
func FirstNonEmpty(vals ...string) string {
|
||||
@@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package cgrcoreutils
|
||||
package utils
|
||||
|
||||
import (
|
||||
"log"
|
||||
@@ -16,10 +16,9 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package sessionmanager
|
||||
package utils
|
||||
|
||||
import (
|
||||
utils "github.com/cgrates/cgrates/cgrcoreutils"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -28,7 +27,7 @@ func TestFirstNonEmpty(t *testing.T) {
|
||||
sampleMap := make(map[string]string)
|
||||
sampleMap["Third"] = "third"
|
||||
fourthElmnt := "fourth"
|
||||
winnerElmnt := utils.FirstNonEmpty(firstElmnt, sampleMap["second"], sampleMap["Third"], fourthElmnt)
|
||||
winnerElmnt := FirstNonEmpty(firstElmnt, sampleMap["second"], sampleMap["Third"], fourthElmnt)
|
||||
if winnerElmnt != sampleMap["Third"] {
|
||||
t.Error("Wrong elemnt returned: ", winnerElmnt)
|
||||
}
|
||||
Reference in New Issue
Block a user