more refactorings and cdr test

This commit is contained in:
Radu Ioan Fericean
2013-05-19 20:06:08 +03:00
parent cdfea5aba4
commit d7f666e323
21 changed files with 138 additions and 92 deletions

View File

@@ -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)
}

View File

@@ -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

File diff suppressed because one or more lines are too long

View File

@@ -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
}

View File

@@ -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
}*/

View File

@@ -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"

View File

@@ -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

Binary file not shown.

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
View File

@@ -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

View File

@@ -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 {

View File

@@ -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"

View File

@@ -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)
}