Format time into RFC3339 for more compact representation, GetCdrs returning now CgrExtCdr with SetupTime, AnswerTime and Usage set as string for more interoperability with other languages

This commit is contained in:
DanB
2015-03-15 14:18:30 +01:00
parent ab946cd637
commit 77d9d2ec30
9 changed files with 44 additions and 41 deletions

View File

@@ -1441,7 +1441,7 @@ func TestLocalGetCdrs(t *testing.T) {
if !*testLocal {
return
}
var reply []*utils.StoredCdr
var reply []*utils.CgrExtCdr
req := utils.AttrGetCdrs{}
if err := rater.Call("ApierV1.GetCdrs", req, &reply); err != nil {
t.Error("Unexpected error: ", err.Error())
@@ -1465,7 +1465,7 @@ func TestLocalProcessCdr(t *testing.T) {
} else if reply != utils.OK {
t.Error("Unexpected reply received: ", reply)
}
var cdrs []*utils.StoredCdr
var cdrs []*utils.CgrExtCdr
req := utils.AttrGetCdrs{}
if err := rater.Call("ApierV1.GetCdrs", req, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())

View File

@@ -46,7 +46,7 @@ func (apier *ApierV1) GetCallCostLog(attrs AttrGetCallCost, reply *engine.CallCo
}
// Retrieves CDRs based on the filters
func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrCdrOut) error {
func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrExtCdr) error {
cdrsFltr, err := attrs.AsCdrsFilter()
if err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
@@ -54,10 +54,10 @@ func (apier *ApierV1) GetCdrs(attrs utils.AttrGetCdrs, reply *[]*utils.CgrCdrOut
if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else if len(cdrs) == 0 {
*reply = make([]*utils.CgrCdrOut, 0)
*reply = make([]*utils.CgrExtCdr, 0)
} else {
for _, cdr := range cdrs {
*reply = append(*reply, cdr.AsCgrCdrOut())
*reply = append(*reply, cdr.AsCgrExtCdr())
}
}
return nil

View File

@@ -26,7 +26,7 @@ import (
)
// Retrieves CDRs based on the filters
func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrCdrOut) error {
func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrExtCdr) error {
cdrsFltr, err := attrs.AsCdrsFilter()
if err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
@@ -34,10 +34,10 @@ func (apier *ApierV2) GetCdrs(attrs utils.RpcCdrsFilter, reply *[]*utils.CgrCdrO
if cdrs, _, err := apier.CdrDb.GetStoredCdrs(cdrsFltr); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
} else if len(cdrs) == 0 {
*reply = make([]*utils.CgrCdrOut, 0)
*reply = make([]*utils.CgrExtCdr, 0)
} else {
for _, cdr := range cdrs {
*reply = append(*reply, cdr.AsCgrCdrOut())
*reply = append(*reply, cdr.AsCgrExtCdr())
}
}
return nil

View File

@@ -155,7 +155,7 @@ func TestV2CdrsMysqlGetCdrs(t *testing.T) {
if !*testLocal {
return
}
var reply []*utils.StoredCdr
var reply []*utils.CgrExtCdr
req := utils.RpcCdrsFilter{}
if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
t.Error("Unexpected error: ", err.Error())

View File

@@ -149,7 +149,7 @@ func TestV2CdrsPsqlGetCdrs(t *testing.T) {
if !*testLocal {
return
}
var reply []*utils.StoredCdr
var reply []*utils.CgrExtCdr
req := utils.RpcCdrsFilter{}
if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
t.Error("Unexpected error: ", err.Error())

View File

@@ -163,7 +163,7 @@ func TestTutFsCallsCdrs1001(t *testing.T) {
if !*testCalls {
return
}
var reply []*utils.CgrCdrOut
var reply []*utils.CgrExtCdr
req := utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{utils.META_DEFAULT}}
if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
t.Error("Unexpected error: ", err.Error())
@@ -176,7 +176,7 @@ func TestTutFsCallsCdrs1001(t *testing.T) {
if reply[0].ReqType != utils.PREPAID {
t.Errorf("Unexpected ReqType for CDR: %+v", reply[0])
}
if reply[0].Usage != 67.0 { // Usage as seconds
if reply[0].Usage != "67" { // Usage as seconds
t.Errorf("Unexpected Usage for CDR: %+v", reply[0])
}
if reply[0].Cost != 0.0159 {
@@ -192,6 +192,9 @@ func TestTutFsCallsCdrs1001(t *testing.T) {
if reply[0].ReqType != utils.RATED {
t.Errorf("Unexpected ReqType for CDR: %+v", reply[0])
}
if reply[0].Subject != "1002" {
t.Errorf("Unexpected Subject for CDR: %+v", reply[0])
}
if reply[0].Cost != 0.3059 {
t.Errorf("Unexpected Cost for CDR: %+v", reply[0])
}

View File

@@ -115,9 +115,9 @@ func (storedCdr *StoredCdr) FieldAsString(rsrFld *RSRField) string {
case DESTINATION:
return rsrFld.ParseValue(storedCdr.Destination)
case SETUP_TIME:
return rsrFld.ParseValue(storedCdr.SetupTime.String())
return rsrFld.ParseValue(storedCdr.SetupTime.Format(time.RFC3339))
case ANSWER_TIME:
return rsrFld.ParseValue(storedCdr.AnswerTime.String())
return rsrFld.ParseValue(storedCdr.AnswerTime.Format(time.RFC3339))
case USAGE:
return strconv.FormatFloat(Round(storedCdr.Usage.Seconds(), 0, ROUNDING_MIDDLE), 'f', -1, 64)
case MEDI_RUNID:
@@ -174,8 +174,8 @@ func (storedCdr *StoredCdr) AsHttpForm() url.Values {
v.Set(ACCOUNT, storedCdr.Account)
v.Set(SUBJECT, storedCdr.Subject)
v.Set(DESTINATION, storedCdr.Destination)
v.Set(SETUP_TIME, storedCdr.SetupTime.String())
v.Set(ANSWER_TIME, storedCdr.AnswerTime.String())
v.Set(SETUP_TIME, storedCdr.SetupTime.Format(time.RFC3339))
v.Set(ANSWER_TIME, storedCdr.AnswerTime.Format(time.RFC3339))
v.Set(USAGE, storedCdr.FormatUsage(SECONDS))
return v
}
@@ -305,8 +305,8 @@ func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tena
return frkStorCdr, nil
}
func (storedCdr *StoredCdr) AsCgrCdrOut() *CgrCdrOut {
return &CgrCdrOut{CgrId: storedCdr.CgrId,
func (storedCdr *StoredCdr) AsCgrExtCdr() *CgrExtCdr {
return &CgrExtCdr{CgrId: storedCdr.CgrId,
OrderId: storedCdr.OrderId,
TOR: storedCdr.TOR,
AccId: storedCdr.AccId,
@@ -319,9 +319,9 @@ func (storedCdr *StoredCdr) AsCgrCdrOut() *CgrCdrOut {
Account: storedCdr.Account,
Subject: storedCdr.Subject,
Destination: storedCdr.Destination,
SetupTime: storedCdr.SetupTime,
AnswerTime: storedCdr.AnswerTime,
Usage: storedCdr.Usage.Seconds(),
SetupTime: storedCdr.SetupTime.Format(time.RFC3339),
AnswerTime: storedCdr.AnswerTime.Format(time.RFC3339),
Usage: storedCdr.FormatUsage(SECONDS),
ExtraFields: storedCdr.ExtraFields,
MediationRunId: storedCdr.MediationRunId,
RatedAccount: storedCdr.RatedAccount,
@@ -481,7 +481,7 @@ func (storedCdr *StoredCdr) String() string {
return string(mrsh)
}
type CgrCdrOut struct {
type CgrExtCdr struct {
CgrId string
OrderId int64
TOR string
@@ -495,9 +495,9 @@ type CgrCdrOut struct {
Account string
Subject string
Destination string
SetupTime time.Time
AnswerTime time.Time
Usage float64
SetupTime string
AnswerTime string
Usage string
ExtraFields map[string]string
MediationRunId string
RatedAccount string

View File

@@ -47,8 +47,8 @@ func TestFieldAsString(t *testing.T) {
cdr.FieldAsString(&RSRField{Id: ACCOUNT}) != cdr.Account ||
cdr.FieldAsString(&RSRField{Id: SUBJECT}) != cdr.Subject ||
cdr.FieldAsString(&RSRField{Id: DESTINATION}) != cdr.Destination ||
cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.String() ||
cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.String() ||
cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.Format(time.RFC3339) ||
cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.Format(time.RFC3339) ||
cdr.FieldAsString(&RSRField{Id: USAGE}) != "10" ||
cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId ||
cdr.FieldAsString(&RSRField{Id: COST}) != "1.01" ||
@@ -70,8 +70,8 @@ func TestFieldAsString(t *testing.T) {
cdr.FieldAsString(&RSRField{Id: ACCOUNT}) != cdr.Account,
cdr.FieldAsString(&RSRField{Id: SUBJECT}) != cdr.Subject,
cdr.FieldAsString(&RSRField{Id: DESTINATION}) != cdr.Destination,
cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.String(),
cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.String(),
cdr.FieldAsString(&RSRField{Id: SETUP_TIME}) != cdr.SetupTime.Format(time.RFC3339),
cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.Format(time.RFC3339),
cdr.FieldAsString(&RSRField{Id: USAGE}) != "10",
cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId,
cdr.FieldAsString(&RSRField{Id: RATED_ACCOUNT}) != "dan",
@@ -283,11 +283,11 @@ func TestStoredCdrAsHttpForm(t *testing.T) {
if cdrForm.Get(DESTINATION) != "1002" {
t.Errorf("Expected: %s, received: %s", "1002", cdrForm.Get(DESTINATION))
}
if cdrForm.Get(SETUP_TIME) != "2013-11-07 08:42:20 +0000 UTC" {
t.Errorf("Expected: %s, received: %s", "2013-11-07 08:42:20 +0000 UTC", cdrForm.Get(SETUP_TIME))
if cdrForm.Get(SETUP_TIME) != "2013-11-07T08:42:20Z" {
t.Errorf("Expected: %s, received: %s", "2013-11-07T08:42:20Z", cdrForm.Get(SETUP_TIME))
}
if cdrForm.Get(ANSWER_TIME) != "2013-11-07 08:42:26 +0000 UTC" {
t.Errorf("Expected: %s, received: %s", "2013-11-07 08:42:26 +0000 UTC", cdrForm.Get(ANSWER_TIME))
if cdrForm.Get(ANSWER_TIME) != "2013-11-07T08:42:26Z" {
t.Errorf("Expected: %s, received: %s", "2013-11-07T08:42:26Z", cdrForm.Get(ANSWER_TIME))
}
if cdrForm.Get(USAGE) != "10" {
t.Errorf("Expected: %s, received: %s", "10", cdrForm.Get(USAGE))
@@ -388,18 +388,18 @@ func TestStoredCdrForkCdrFromMetaDefaults(t *testing.T) {
}
}
func TestStoredCdrAsCgrCdrOut(t *testing.T) {
func TestStoredCdrAsCgrExtCdr(t *testing.T) {
storCdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1",
CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID,
Usage: time.Duration(10), ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans",
}
expectOutCdr := &CgrCdrOut{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1",
expectOutCdr := &CgrExtCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1",
CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID,
Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans",
SetupTime: "2013-11-07T08:42:20Z", AnswerTime: "2013-11-07T08:42:26Z", MediationRunId: DEFAULT_RUNID,
Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans",
}
if cdrOut := storCdr.AsCgrCdrOut(); !reflect.DeepEqual(expectOutCdr, cdrOut) {
if cdrOut := storCdr.AsCgrExtCdr(); !reflect.DeepEqual(expectOutCdr, cdrOut) {
t.Errorf("Expected: %+v, received: %+v", expectOutCdr, cdrOut)
}
}

View File

@@ -31,10 +31,10 @@ func TestHttpJsonPost(t *testing.T) {
if !*testLocal {
return
}
cdrOut := &CgrCdrOut{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1",
cdrOut := &CgrExtCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1",
CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "account1", Subject: "tgooiscs0014", Destination: "1002",
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID,
Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01,
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String(), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String(), MediationRunId: DEFAULT_RUNID,
Usage: "0.00000001", ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01,
}
if _, err := HttpJsonPost("http://localhost:8000", false, cdrOut); err == nil || err.Error() != "Post http://localhost:8000: dial tcp 127.0.0.1:8000: connection refused" {
t.Error(err)