From 96b58cf90dea19891e740ab3f30074462963c30c Mon Sep 17 00:00:00 2001 From: rinor Date: Wed, 20 Jul 2016 15:17:33 +0200 Subject: [PATCH 1/4] docs/tariff_plans.rst - add ResourceLimits --- docs/tariff_plans.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/tariff_plans.rst b/docs/tariff_plans.rst index ef7c5bd63..cba9279e2 100644 --- a/docs/tariff_plans.rst +++ b/docs/tariff_plans.rst @@ -755,10 +755,10 @@ TBD :: - "" - csv - "" - stor_db + "ResourceLimits.csv" - csv + "tp_resource_limits" - stor_db .. csv-table:: - :file: + :file: ../data/tariffplans/tutorial/ResourceLimits.csv :header-rows: 1 From 95e32426fa3fd12103978876284956a10718d9f7 Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 20 Jul 2016 17:51:53 +0200 Subject: [PATCH 2/4] Adding Partial field to CDR, ExportedCDR->CDR checks before parsing duration and time --- engine/cdr.go | 29 +++++++++++++++++++++-------- utils/consts.go | 3 ++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/engine/cdr.go b/engine/cdr.go index 69fc2df32..9941db358 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -37,20 +37,28 @@ func NewCDRFromExternalCDR(extCdr *ExternalCDR, timezone string) (*CDR, error) { Source: extCdr.Source, RequestType: extCdr.RequestType, Direction: extCdr.Direction, Tenant: extCdr.Tenant, Category: extCdr.Category, Account: extCdr.Account, Subject: extCdr.Subject, Destination: extCdr.Destination, Supplier: extCdr.Supplier, DisconnectCause: extCdr.DisconnectCause, CostSource: extCdr.CostSource, Cost: extCdr.Cost, Rated: extCdr.Rated} - if cdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil { - return nil, err + if extCdr.SetupTime != "" { + if cdr.SetupTime, err = utils.ParseTimeDetectLayout(extCdr.SetupTime, timezone); err != nil { + return nil, err + } } if len(cdr.CGRID) == 0 { // Populate CGRID if not present cdr.CGRID = utils.Sha1(cdr.OriginID, cdr.SetupTime.UTC().String()) } - if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil { - return nil, err + if extCdr.AnswerTime != "" { + if cdr.AnswerTime, err = utils.ParseTimeDetectLayout(extCdr.AnswerTime, timezone); err != nil { + return nil, err + } } - if cdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil { - return nil, err + if extCdr.Usage != "" { + if cdr.Usage, err = utils.ParseDurationWithSecs(extCdr.Usage); err != nil { + return nil, err + } } - if cdr.PDD, err = utils.ParseDurationWithSecs(extCdr.PDD); err != nil { - return nil, err + if extCdr.PDD != "" { + if cdr.PDD, err = utils.ParseDurationWithSecs(extCdr.PDD); err != nil { + return nil, err + } } if len(extCdr.CostDetails) != 0 { if err = json.Unmarshal([]byte(extCdr.CostDetails), cdr.CostDetails); err != nil { @@ -98,6 +106,7 @@ type CDR struct { CostDetails *CallCost // Attach the cost details to CDR when possible ExtraInfo string // Container for extra information related to this CDR, eg: populated with error reason in case of error on calculation Rated bool // Mark the CDR as rated so we do not process it during rating + Partial bool // Used for partial record processing by CDRC } func (cdr *CDR) CostDetailsJson() string { @@ -187,6 +196,8 @@ func (cdr *CDR) FieldAsString(rsrFld *utils.RSRField) string { return rsrFld.ParseValue(strconv.FormatFloat(cdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost case utils.COST_DETAILS: return rsrFld.ParseValue(cdr.CostDetailsJson()) + case utils.PartialField: + return rsrFld.ParseValue(strconv.FormatBool(cdr.Partial)) default: return rsrFld.ParseValue(cdr.ExtraFields[rsrFld.Id]) } @@ -240,6 +251,8 @@ func (cdr *CDR) ParseFieldValue(fieldId, fieldVal, timezone string) error { if cdr.Cost, err = strconv.ParseFloat(fieldVal, 64); err != nil { return fmt.Errorf("Cannot parse cost field with value: %s, err: %s", fieldVal, err.Error()) } + case utils.PartialField: + cdr.Partial, _ = strconv.ParseBool(fieldVal) default: // Extra fields will not match predefined so they all show up here cdr.ExtraFields[fieldId] += fieldVal } diff --git a/utils/consts.go b/utils/consts.go index ca59d20ba..4ce4acb1c 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -35,7 +35,7 @@ var ( CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH} PrimaryCdrFields = []string{CGRID, CDRSOURCE, CDRHOST, ACCID, TOR, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE, - SUPPLIER, DISCONNECT_CAUSE, COST, RATED} + SUPPLIER, DISCONNECT_CAUSE, COST, RATED, PartialField} ) const ( @@ -142,6 +142,7 @@ const ( COST_DETAILS = "CostDetails" RATED = "rated" RATED_FLD = "Rated" + PartialField = "Partial" DEFAULT_RUNID = "*default" META_DEFAULT = "*default" STATIC_VALUE_PREFIX = "^" From 05f58e061d3961003c58c85275675a95d9fad144 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Fri, 22 Jul 2016 10:17:53 +0300 Subject: [PATCH 3/4] updated docker go version --- data/docker/devel/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/docker/devel/Dockerfile b/data/docker/devel/Dockerfile index 3b073a0af..71fd345d6 100644 --- a/data/docker/devel/Dockerfile +++ b/data/docker/devel/Dockerfile @@ -26,7 +26,7 @@ COPY mongod.conf /etc/mongod.conf RUN useradd -c CGRateS -d /var/run/cgrates -s /bin/false -r cgrates # install golang -RUN wget -qO- https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz | tar xzf - -C /root/ +RUN wget -qO- https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz | tar xzf - -C /root/ #install glide RUN GOROOT=/root/go GOPATH=/root/code /root/go/bin/go get github.com/Masterminds/glide From c35a260003b50cb81abd8ac49fedaed292674954 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Fri, 22 Jul 2016 17:59:56 +0300 Subject: [PATCH 4/4] fix for start hang --- engine/cache_store.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engine/cache_store.go b/engine/cache_store.go index 352f3ce36..c7d752d24 100644 --- a/engine/cache_store.go +++ b/engine/cache_store.go @@ -40,9 +40,9 @@ func (cs cacheDoubleStore) Put(key string, value interface{}) { cs[prefix] = mp } mp[key] = value - if err := dumper.put(prefix, key, value); err != nil { + /*if err := dumper.put(prefix, key, value); err != nil { utils.Logger.Info(" put error: " + err.Error()) - } + }*/ } func (cs cacheDoubleStore) Get(key string) (interface{}, error) { @@ -84,18 +84,18 @@ func (cs cacheDoubleStore) Delete(key string) { prefix, key := key[:PREFIX_LEN], key[PREFIX_LEN:] if keyMap, ok := cs[prefix]; ok { delete(keyMap, key) - if err := dumper.delete(prefix, key); err != nil { + /*if err := dumper.delete(prefix, key); err != nil { utils.Logger.Info(" delete error: " + err.Error()) - } + }*/ } } func (cs cacheDoubleStore) DeletePrefix(prefix string) { delete(cs, prefix) - if err := dumper.deleteAll(prefix); err != nil { + /*if err := dumper.deleteAll(prefix); err != nil { utils.Logger.Info(" delete all error: " + err.Error()) - } + }*/ } func (cs cacheDoubleStore) CountEntriesForPrefix(prefix string) int {