diff --git a/agents/diam_it_test.go b/agents/diam_it_test.go index 4f3e98435..c6a929d07 100644 --- a/agents/diam_it_test.go +++ b/agents/diam_it_test.go @@ -59,7 +59,6 @@ var ( testDiamItTPFromFolder, testDiamItDryRun, testDiamItCCRInit, - testDiamItCCRInitWithForceDuration, testDiamItCCRUpdate, testDiamItRAR, @@ -69,6 +68,7 @@ var ( testDiamItCCRMMS, testDiamItTemplateErr, + testDiamItCCRInitWithForceDuration, testDiamItDRR, testDiamItKillEngine, diff --git a/agents/diamagent.go b/agents/diamagent.go index 2dd7eebe4..d5e5ece06 100644 --- a/agents/diamagent.go +++ b/agents/diamagent.go @@ -287,6 +287,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + opts := agReq.Opts.GetData() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuthorize, @@ -298,8 +299,14 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, break } } - cgrArgs := cgrEv.ExtractArgs(reqProcessor.Flags.HasKey(utils.MetaDispatchers), - reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent) + var cgrArgs utils.ExtractedArgs + if cgrArgs, err = utils.ExtractArgsFromOpts(opts, reqProcessor.Flags.HasKey(utils.MetaDispatchers), + reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent); err != nil { + utils.Logger.Warning(fmt.Sprintf("<%s> args extraction failed because <%s>", + utils.DiameterAgent, err.Error())) + err = nil // reset the error and continue the processing + } + if reqProcessor.Flags.HasKey(utils.MetaLog) { utils.Logger.Info( fmt.Sprintf("<%s> LOG, processorID: %s, diameter message: %s", @@ -328,7 +335,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData(), + opts, ) rply := new(sessions.V1AuthorizeReply) err = da.connMgr.Call(da.cgrCfg.DiameterAgentCfg().SessionSConns, da, utils.SessionSv1AuthorizeEvent, @@ -348,7 +355,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1InitSessionReply) err = da.connMgr.Call(da.cgrCfg.DiameterAgentCfg().SessionSConns, da, utils.SessionSv1InitiateSession, initArgs, rply) @@ -362,7 +369,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1UpdateSessionReply) err = da.connMgr.Call(da.cgrCfg.DiameterAgentCfg().SessionSConns, da, utils.SessionSv1UpdateSession, updateArgs, rply) @@ -379,7 +386,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.ParamsSlice(utils.MetaStats), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := utils.StringPointer("") err = da.connMgr.Call(da.cgrCfg.DiameterAgentCfg().SessionSConns, da, utils.SessionSv1TerminateSession, terminateArgs, rply) @@ -401,7 +408,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1ProcessMessageReply) err = da.connMgr.Call(da.cgrCfg.DiameterAgentCfg().SessionSConns, da, utils.SessionSv1ProcessMessage, msgArgs, rply) @@ -419,7 +426,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.RequestProcessor, CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher, Paginator: *cgrArgs.SupplierPaginator, - Opts: agReq.Opts.GetData(), + Opts: opts, } needMaxUsage := reqProcessor.Flags.HasKey(utils.MetaAuth) || reqProcessor.Flags.HasKey(utils.MetaInit) || @@ -654,9 +661,9 @@ func (da *DiameterAgent) handleDPA(c diam.Conn, m *diam.Message) { meta, _ := smpeer.FromContext(c.Context()) key := string(meta.OriginHost + utils.CONCATENATED_KEY_SEP + meta.OriginRealm) - da.raaLck.Lock() + da.dpaLck.Lock() ch, has := da.dpa[key] - da.raaLck.Unlock() + da.dpaLck.Unlock() if !has { return } diff --git a/agents/dnsagent.go b/agents/dnsagent.go index a1b4709a6..274e0f94d 100644 --- a/agents/dnsagent.go +++ b/agents/dnsagent.go @@ -178,6 +178,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + opts := agReq.Opts.GetData() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuthorize, @@ -189,8 +190,13 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, break } } - cgrArgs := cgrEv.ExtractArgs(reqProcessor.Flags.HasKey(utils.MetaDispatchers), - reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent) + var cgrArgs utils.ExtractedArgs + if cgrArgs, err = utils.ExtractArgsFromOpts(opts, reqProcessor.Flags.HasKey(utils.MetaDispatchers), + reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent); err != nil { + utils.Logger.Warning(fmt.Sprintf("<%s> args extraction failed because <%s>", + utils.DNSAgent, err.Error())) + err = nil // reset the error and continue the processing + } if reqProcessor.Flags.HasKey(utils.MetaLog) { utils.Logger.Info( fmt.Sprintf("<%s> LOG, processorID: <%s>, message: %s", @@ -219,7 +225,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData(), + opts, ) rply := new(sessions.V1AuthorizeReply) err = da.connMgr.Call(da.cgrCfg.DNSAgentCfg().SessionSConns, nil, @@ -240,7 +246,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1InitSessionReply) err = da.connMgr.Call(da.cgrCfg.DNSAgentCfg().SessionSConns, nil, utils.SessionSv1InitiateSession, @@ -255,7 +261,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1UpdateSessionReply) err = da.connMgr.Call(da.cgrCfg.DNSAgentCfg().SessionSConns, nil, utils.SessionSv1UpdateSession, @@ -273,7 +279,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.ParamsSlice(utils.MetaStats), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := utils.StringPointer("") err = da.connMgr.Call(da.cgrCfg.DNSAgentCfg().SessionSConns, nil, utils.SessionSv1TerminateSession, @@ -296,7 +302,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1ProcessMessageReply) // need it so rpcclient can clone err = da.connMgr.Call(da.cgrCfg.DNSAgentCfg().SessionSConns, nil, utils.SessionSv1ProcessMessage, @@ -315,7 +321,7 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor, CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher, Paginator: *cgrArgs.SupplierPaginator, - Opts: agReq.Opts.GetData(), + Opts: opts, } needMaxUsage := reqProcessor.Flags.HasKey(utils.MetaAuth) || reqProcessor.Flags.HasKey(utils.MetaInit) || diff --git a/agents/fsagent.go b/agents/fsagent.go index acc5d5a78..64106e232 100644 --- a/agents/fsagent.go +++ b/agents/fsagent.go @@ -272,7 +272,7 @@ func (fsa *FSsessions) onChannelHangupComplete(fsev FSEvent, connIdx int) { if err != nil { return } - cgrArgs := cgrEv.ExtractArgs(strings.Index(fsev[VarCGRFlags], utils.MetaDispatchers) != -1, false) + cgrArgs, _ := utils.ExtractArgsFromOpts(fsev.GetOptions(), strings.Index(fsev[VarCGRFlags], utils.MetaDispatchers) != -1, false) if err := fsa.connMgr.Call(fsa.cfg.SessionSConns, fsa, utils.SessionSv1ProcessCDR, &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher}, &reply); err != nil { utils.Logger.Err(fmt.Sprintf("<%s> Failed processing CGREvent: %s, error: <%s>", diff --git a/agents/fsevent.go b/agents/fsevent.go index 0261c5c08..d82f61b53 100644 --- a/agents/fsevent.go +++ b/agents/fsevent.go @@ -33,15 +33,16 @@ import ( // ToDo: Introduce support for RSRFields const ( + varPrefix = "variable_" // Freswitch event proprities names - SUBJECT = "variable_" + utils.CGR_SUBJECT - ACCOUNT = "variable_" + utils.CGR_ACCOUNT - DESTINATION = "variable_" + utils.CGR_DESTINATION - REQTYPE = "variable_" + utils.CGR_REQTYPE //prepaid or postpaid - CATEGORY = "variable_" + utils.CGR_CATEGORY - VAR_CGR_SUPPLIER = "variable_" + utils.CGR_SUPPLIER + SUBJECT = varPrefix + utils.CGR_SUBJECT + ACCOUNT = varPrefix + utils.CGR_ACCOUNT + DESTINATION = varPrefix + utils.CGR_DESTINATION + REQTYPE = varPrefix + utils.CGR_REQTYPE //prepaid or postpaid + CATEGORY = varPrefix + utils.CGR_CATEGORY + VAR_CGR_SUPPLIER = varPrefix + utils.CGR_SUPPLIER UUID = "Unique-ID" // -Unique ID for this call leg - CSTMID = "variable_" + utils.CGR_TENANT + CSTMID = varPrefix + utils.CGR_TENANT CALL_DEST_NR = "Caller-Destination-Number" SIP_REQ_USER = "variable_sip_req_user" PARK_TIME = "Caller-Profile-Created-Time" @@ -64,14 +65,15 @@ const ( PDD_NOMEDIA_MS = "variable_progressmsec" IGNOREPARK = "variable_cgr_ignorepark" FS_VARPREFIX = "variable_" - VarCGRFlags = "variable_" + utils.CGRFlags + VarCGRFlags = varPrefix + utils.CGRFlags + VarCGROpts = varPrefix + utils.CGROpts CGRResourceAllocation = "cgr_resource_allocation" - VAR_CGR_DISCONNECT_CAUSE = "variable_" + utils.CGR_DISCONNECT_CAUSE - VAR_CGR_CMPUTELCR = "variable_" + utils.CGR_COMPUTELCR + VAR_CGR_DISCONNECT_CAUSE = varPrefix + utils.CGR_DISCONNECT_CAUSE + VAR_CGR_CMPUTELCR = varPrefix + utils.CGR_COMPUTELCR FsConnID = "FsConnID" // used to share connID info in event for remote disconnects VarAnswerEpoch = "variable_answer_epoch" - VarCGRACD = "variable_" + utils.CGR_ACD - VarCGROriginHost = "variable_" + utils.CGROriginHost + VarCGRACD = varPrefix + utils.CGR_ACD + VarCGROriginHost = varPrefix + utils.CGROriginHost ) func NewFSEvent(strEv string) (fsev FSEvent) { @@ -462,10 +464,16 @@ func SliceAsFsArray(slc []string) (arry string) { // GetOptions returns the posible options func (fsev FSEvent) GetOptions() (mp map[string]interface{}) { mp = make(map[string]interface{}) - for k := range utils.CGROptionsSet.Data() { - if val, has := fsev[k]; has { - mp[k] = val + opts, has := fsev[VarCGROpts] + if !has { + return + } + for _, opt := range strings.Split(opts, utils.FIELDS_SEP) { + spltOpt := strings.SplitN(opt, utils.InInFieldSep, 2) + if len(spltOpt) != 2 { + continue } + mp[spltOpt[0]] = spltOpt[1] } return } diff --git a/agents/httpagent.go b/agents/httpagent.go index 8344e4cfe..4cd3b0855 100644 --- a/agents/httpagent.go +++ b/agents/httpagent.go @@ -114,6 +114,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + opts := agReq.Opts.GetData() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuthorize, @@ -125,8 +126,13 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, break } } - cgrArgs := cgrEv.ExtractArgs(reqProcessor.Flags.HasKey(utils.MetaDispatchers), - reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent) + var cgrArgs utils.ExtractedArgs + if cgrArgs, err = utils.ExtractArgsFromOpts(opts, reqProcessor.Flags.HasKey(utils.MetaDispatchers), + reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent); err != nil { + utils.Logger.Warning(fmt.Sprintf("<%s> args extraction failed because <%s>", + utils.HTTPAgent, err.Error())) + err = nil // reset the error and continue the processing + } if reqProcessor.Flags.HasKey(utils.MetaLog) { utils.Logger.Info( fmt.Sprintf("<%s> LOG, processorID: %s, http message: %s", @@ -155,7 +161,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData(), + opts, ) rply := new(sessions.V1AuthorizeReply) err = ha.connMgr.Call(ha.sessionConns, nil, utils.SessionSv1AuthorizeEvent, @@ -175,7 +181,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1InitSessionReply) err = ha.connMgr.Call(ha.sessionConns, nil, utils.SessionSv1InitiateSession, initArgs, rply) @@ -189,7 +195,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1UpdateSessionReply) err = ha.connMgr.Call(ha.sessionConns, nil, utils.SessionSv1UpdateSession, updateArgs, rply) @@ -206,7 +212,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.ParamsSlice(utils.MetaStats), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := utils.StringPointer("") err = ha.connMgr.Call(ha.sessionConns, nil, utils.SessionSv1TerminateSession, terminateArgs, rply) @@ -228,7 +234,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1ProcessMessageReply) err = ha.connMgr.Call(ha.sessionConns, nil, utils.SessionSv1ProcessMessage, evArgs, rply) @@ -246,7 +252,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.RequestProcessor, CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher, Paginator: *cgrArgs.SupplierPaginator, - Opts: agReq.Opts.GetData(), + Opts: opts, } needMaxUsage := reqProcessor.Flags.HasKey(utils.MetaAuth) || reqProcessor.Flags.HasKey(utils.MetaInit) || diff --git a/agents/kamagent.go b/agents/kamagent.go index 6e5712142..5b6d83235 100644 --- a/agents/kamagent.go +++ b/agents/kamagent.go @@ -233,9 +233,8 @@ func (ka *KamailioAgent) onCallEnd(evData []byte, connIdx int) { if err != nil { return } - cgrArgs := cgrEv.ExtractArgs(strings.Index(kev[utils.CGRFlags], utils.MetaDispatchers) != -1, false) if err := ka.connMgr.Call(ka.cfg.SessionSConns, ka, utils.SessionSv1ProcessCDR, - &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher}, &reply); err != nil { + &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: tsArgs.ArgDispatcher}, &reply); err != nil { utils.Logger.Err(fmt.Sprintf("%s> failed processing CGREvent: %s, error: %s", utils.KamailioAgent, utils.ToJSON(cgrEv), err.Error())) } diff --git a/agents/kamevent.go b/agents/kamevent.go index 94291e653..1ce85d623 100644 --- a/agents/kamevent.go +++ b/agents/kamevent.go @@ -139,7 +139,8 @@ func (kev KamEvent) AsMapStringInterface() (mp map[string]interface{}) { if k == utils.Usage { v += "s" // mark the Usage as seconds } - if !kamReservedEventFields.Has(k) { // reserved attributes not getting into event + if !kamReservedEventFields.Has(k) && // reserved attributes not getting into event + !utils.CGROptionsSet.Has(k) { // also omit the options mp[k] = v } } @@ -194,8 +195,7 @@ func (kev KamEvent) AsCGREvent(timezone string) (cgrEv *utils.CGREvent, err erro // String is used for pretty printing event in logs func (kev KamEvent) String() string { - mrsh, _ := json.Marshal(kev) - return string(mrsh) + return utils.ToJSON(kev) } // V1AuthorizeArgs returns the arguments used in SessionSv1.AuthorizeEvent @@ -304,7 +304,8 @@ func (kev KamEvent) V1ProcessCDRArgs() (args *utils.CGREventWithArgDispatcher) { if !has { return } - cgrArgs := cgrEv.ExtractArgs(strings.Index(subsystems, utils.MetaDispatchers) != -1, true) + opts := kev.GetOptions() + cgrArgs, _ := utils.ExtractArgsFromOpts(opts, strings.Index(subsystems, utils.MetaDispatchers) != -1, false) args.ArgDispatcher = cgrArgs.ArgDispatcher return } diff --git a/agents/radagent.go b/agents/radagent.go index a34c496bd..b75e2c951 100644 --- a/agents/radagent.go +++ b/agents/radagent.go @@ -173,6 +173,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + opts := agReq.Opts.GetData() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuthorize, @@ -184,8 +185,13 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R break } } - cgrArgs := cgrEv.ExtractArgs(reqProcessor.Flags.HasKey(utils.MetaDispatchers), - reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent) + var cgrArgs utils.ExtractedArgs + if cgrArgs, err = utils.ExtractArgsFromOpts(opts, reqProcessor.Flags.HasKey(utils.MetaDispatchers), + reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || reqType == utils.MetaEvent); err != nil { + utils.Logger.Warning(fmt.Sprintf("<%s> args extraction failed because <%s>", + utils.RadiusAgent, err.Error())) + err = nil // reset the error and continue the processing + } if reqProcessor.Flags.HasKey(utils.MetaLog) { utils.Logger.Info( fmt.Sprintf("<%s> LOG, processorID: %s, radius message: %s", @@ -214,7 +220,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData(), + opts, ) rply := new(sessions.V1AuthorizeReply) err = ra.connMgr.Call(ra.cgrCfg.RadiusAgentCfg().SessionSConns, nil, utils.SessionSv1AuthorizeEvent, @@ -234,7 +240,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1InitSessionReply) err = ra.connMgr.Call(ra.cgrCfg.RadiusAgentCfg().SessionSConns, nil, utils.SessionSv1InitiateSession, initArgs, rply) @@ -248,7 +254,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R reqProcessor.Flags.HasKey(utils.MetaAccounts), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1UpdateSessionReply) err = ra.connMgr.Call(ra.cgrCfg.RadiusAgentCfg().SessionSConns, nil, utils.SessionSv1UpdateSession, updateArgs, rply) @@ -265,7 +271,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R reqProcessor.Flags.ParamsSlice(utils.MetaStats), cgrEv, cgrArgs.ArgDispatcher, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := utils.StringPointer("") err = ra.connMgr.Call(ra.cgrCfg.RadiusAgentCfg().SessionSConns, nil, utils.SessionSv1TerminateSession, terminateArgs, rply) @@ -287,7 +293,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, reqProcessor.Flags.HasKey(utils.MetaFD), - agReq.Opts.GetData()) + opts) rply := new(sessions.V1ProcessMessageReply) err = ra.connMgr.Call(ra.cgrCfg.RadiusAgentCfg().SessionSConns, nil, utils.SessionSv1ProcessMessage, evArgs, rply) if utils.ErrHasPrefix(err, utils.RalsErrorPrfx) { @@ -304,7 +310,7 @@ func (ra *RadiusAgent) processRequest(req *radigo.Packet, reqProcessor *config.R CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher, Paginator: *cgrArgs.SupplierPaginator, - Opts: agReq.Opts.GetData(), + Opts: opts, } needMaxUsage := reqProcessor.Flags.HasKey(utils.MetaAuth) || reqProcessor.Flags.HasKey(utils.MetaInit) || diff --git a/apier/v1/config_it_test.go b/apier/v1/config_it_test.go index 0ab1b3e25..3bb0e9d4d 100644 --- a/apier/v1/config_it_test.go +++ b/apier/v1/config_it_test.go @@ -161,6 +161,7 @@ func testConfigSReloadConfigFromJSONSessionS(t *testing.T) { "PrivateKeyPath": "", "PublicKeyPath": "", }, + "SchedulerConns": []interface{}{}, } var rpl map[string]interface{} diff --git a/apier/v1/precache_it_test.go b/apier/v1/precache_it_test.go index 916e08c7a..667bdf1ec 100644 --- a/apier/v1/precache_it_test.go +++ b/apier/v1/precache_it_test.go @@ -270,10 +270,6 @@ func testPrecacheGetCacheStatsAfterRestart(t *testing.T) { Items: 1, Groups: 0, }, - utils.CacheSTIR: { - Items: 0, - Groups: 0, - }, utils.CacheSupplierFilterIndexes: { Items: 6, Groups: 0, diff --git a/apier/v1/replicate_it_test.go b/apier/v1/replicate_it_test.go index 51f2cef10..24dc4e0da 100644 --- a/apier/v1/replicate_it_test.go +++ b/apier/v1/replicate_it_test.go @@ -844,13 +844,12 @@ func testInternalReplicateITActions(t *testing.T) { // set attrs1 := &V1AttrSetActions{ ActionsId: "ACTS_1", - Actions: []*V1TPAction{ - &V1TPAction{ - Identifier: utils.TOPUP_RESET, - BalanceType: utils.MONETARY, - Units: 75.0, - ExpiryTime: utils.UNLIMITED, - Weight: 20.0}}} + Actions: []*V1TPAction{{ + Identifier: utils.TOPUP_RESET, + BalanceType: utils.MONETARY, + Units: 75.0, + ExpiryTime: utils.UNLIMITED, + Weight: 20.0}}} var reply string if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err != nil { t.Error(err) @@ -858,20 +857,19 @@ func testInternalReplicateITActions(t *testing.T) { t.Errorf("Unexpected reply returned: %s", reply) } if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err == nil || err.Error() != "EXISTS" { - t.Error("Unexpected result on duplication: ", err.Error()) + t.Error("Unexpected result on duplication: ", err) } // check - eOut := []*utils.TPAction{ - &utils.TPAction{ - Identifier: utils.TOPUP_RESET, - BalanceType: utils.MONETARY, - Units: "75", - BalanceWeight: "0", - BalanceBlocker: "false", - BalanceDisabled: "false", - ExpiryTime: utils.UNLIMITED, - Weight: 20.0, - }} + eOut := []*utils.TPAction{{ + Identifier: utils.TOPUP_RESET, + BalanceType: utils.MONETARY, + Units: "75", + BalanceWeight: "0", + BalanceBlocker: "false", + BalanceDisabled: "false", + ExpiryTime: utils.UNLIMITED, + Weight: 20.0, + }} if err := internalRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil { t.Error("Got error on APIerSv1.GetActions: ", err.Error()) } else if !reflect.DeepEqual(eOut, reply1) { diff --git a/config/config_it_test.go b/config/config_it_test.go index a273969ef..417cb9f06 100644 --- a/config/config_it_test.go +++ b/config/config_it_test.go @@ -324,6 +324,7 @@ func testCGRConfigReloadCDRs(t *testing.T) { StatSConns: []string{}, SMCostRetries: 5, StoreCdrs: true, + SchedulerConns: []string{}, } if !reflect.DeepEqual(expAttr, cfg.CdrsCfg()) { t.Errorf("Expected %s , received: %s ", utils.ToJSON(expAttr), utils.ToJSON(cfg.CdrsCfg())) @@ -356,6 +357,7 @@ func testCGRConfigReloadRALs(t *testing.T) { ThresholdSConns: []string{utils.MetaLocalHost}, StatSConns: []string{utils.MetaLocalHost}, MaxIncrements: 1000000, + DynaprepaidActionPlans: []string{}, } if !reflect.DeepEqual(expAttr, cfg.RalsCfg()) { t.Errorf("Expected %s , received: %s ", utils.ToJSON(expAttr), utils.ToJSON(cfg.RalsCfg())) @@ -402,6 +404,7 @@ func testCGRConfigReloadSessionS(t *testing.T) { PayloadMaxduration: -1, DefaultAttest: "A", }, + SchedulerConns: []string{}, } if !reflect.DeepEqual(expAttr, cfg.SessionSCfg()) { t.Errorf("Expected %s , received: %s ", utils.ToJSON(expAttr), utils.ToJSON(cfg.SessionSCfg())) @@ -961,6 +964,7 @@ func testCGRConfigReloadConfigFromJSONSessionS(t *testing.T) { PayloadMaxduration: -1, DefaultAttest: "A", }, + SchedulerConns: []string{}, } if !reflect.DeepEqual(expAttr, cfg.SessionSCfg()) { t.Errorf("Expected %s , received: %s ", utils.ToJSON(expAttr), utils.ToJSON(cfg.SessionSCfg())) @@ -1007,6 +1011,7 @@ func testCGRConfigReloadAll(t *testing.T) { PayloadMaxduration: -1, DefaultAttest: "A", }, + SchedulerConns: []string{}, } if !reflect.DeepEqual(expAttr, cfg.SessionSCfg()) { t.Errorf("Expected %s , received: %s ", utils.ToJSON(expAttr), utils.ToJSON(cfg.SessionSCfg())) diff --git a/data/conf/samples/dispatchers/diamagent/data.json b/data/conf/samples/dispatchers/diamagent/data.json index 098bf796c..35f92df17 100644 --- a/data/conf/samples/dispatchers/diamagent/data.json +++ b/data/conf/samples/dispatchers/diamagent/data.json @@ -10,7 +10,7 @@ "flags": ["*initiate", "*accounts"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*data"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIkey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*prepaid"}, @@ -38,7 +38,7 @@ "flags": ["*update", "*accounts","*continue"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*data"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIkey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "InitialOriginID", "path": "*cgreq.InitialOriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*composed", @@ -71,7 +71,7 @@ "flags": ["*update", "*accounts"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*data"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIkey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "InitialOriginID", "path": "*cgreq.InitialOriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*composed", @@ -104,7 +104,7 @@ "flags": ["*terminate", "*accounts"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*data"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIkey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginIDPrefix", "path": "*cgreq.OriginIDPrefix", "type": "*variable", diff --git a/data/conf/samples/dispatchers/diamagent/dryrun.json b/data/conf/samples/dispatchers/diamagent/dryrun.json index 26f5c2a30..86f6a6764 100644 --- a/data/conf/samples/dispatchers/diamagent/dryrun.json +++ b/data/conf/samples/dispatchers/diamagent/dryrun.json @@ -8,7 +8,7 @@ "flags": ["*dryrun","*continue"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*sms"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "Val1", "path": "*cgreq.Val1", "type": "*constant", "value": "1"}, {"tag": "Val2", "path": "*cgreq.Val2", "type": "*constant", "value": "2"}, {"tag": "Val3", "path": "*cgreq.Val3", "type": "*constant", "value": "3"}, @@ -43,7 +43,7 @@ "flags": ["*dryrun"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*sms"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "Val1", "path": "*cgreq.Val1", "type": "*constant", "value": "1"}, {"tag": "Val2", "path": "*cgreq.Val2", "type": "*constant", "value": "2"}, {"tag": "Val3", "path": "*cgreq.Val3", "type": "*constant", "value": "3"}, diff --git a/data/conf/samples/dispatchers/diamagent/message.json b/data/conf/samples/dispatchers/diamagent/message.json index 1814848d5..d4c954001 100644 --- a/data/conf/samples/dispatchers/diamagent/message.json +++ b/data/conf/samples/dispatchers/diamagent/message.json @@ -10,7 +10,7 @@ "flags": ["*message", "*accounts", "*cdrs","*attributes"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*sms"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "Category", "path": "*cgreq.Category", "type": "*constant", "value": "sms"}, diff --git a/data/conf/samples/dispatchers/diamagent/mms.json b/data/conf/samples/dispatchers/diamagent/mms.json index 16e5d5bc2..c78caf338 100644 --- a/data/conf/samples/dispatchers/diamagent/mms.json +++ b/data/conf/samples/dispatchers/diamagent/mms.json @@ -18,8 +18,8 @@ "type": "*constant", "value": "*mms" }, - { "tag": "*api_key", - "path": "*cgreq.*api_key", + { "tag": "APIKey", + "path": "*opts.APIKey", "type": "*constant", "value": "ses12345" }, diff --git a/data/conf/samples/dispatchers/diamagent/simpa.json b/data/conf/samples/dispatchers/diamagent/simpa.json index 3131f3771..0856fd257 100644 --- a/data/conf/samples/dispatchers/diamagent/simpa.json +++ b/data/conf/samples/dispatchers/diamagent/simpa.json @@ -10,7 +10,7 @@ "flags": ["*message", "*accounts", "*log"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*generic"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "RequestType", "path": "*cgreq.RequestType", "type": "*constant", "value": "*prepaid"}, diff --git a/data/conf/samples/dispatchers/diamagent/tests.json b/data/conf/samples/dispatchers/diamagent/tests.json index 927cc2869..fe6d8f26a 100644 --- a/data/conf/samples/dispatchers/diamagent/tests.json +++ b/data/conf/samples/dispatchers/diamagent/tests.json @@ -10,7 +10,7 @@ "flags": ["*initiate", "*accounts","*attributes"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*variable", diff --git a/data/conf/samples/dispatchers/diamagent/voice.json b/data/conf/samples/dispatchers/diamagent/voice.json index a849499ad..334d904ad 100644 --- a/data/conf/samples/dispatchers/diamagent/voice.json +++ b/data/conf/samples/dispatchers/diamagent/voice.json @@ -109,7 +109,7 @@ "flags": ["*initiate", "*accounts", "*attributes"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host", @@ -141,7 +141,7 @@ "flags": ["*update", "*accounts", "*attributes"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host", @@ -175,7 +175,7 @@ "flags": ["*terminate", "*accounts", "*attributes", "*cdrs"], "request_fields":[ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*constant", "value": "*voice"}, - {"tag": "*api_key", "path": "*cgreq.*api_key", "type": "*constant", "value": "ses12345"}, + {"tag": "APIKey", "path": "*opts.APIKey", "type": "*constant", "value": "ses12345"}, {"tag": "OriginID", "path": "*cgreq.OriginID", "type": "*variable", "value": "~*req.Session-Id", "mandatory": true}, {"tag": "OriginHost", "path": "*cgreq.OriginHost", "type": "*remote_host", diff --git a/engine/libtest.go b/engine/libtest.go index 75ce8b32f..ab67ab9d5 100644 --- a/engine/libtest.go +++ b/engine/libtest.go @@ -581,10 +581,6 @@ func GetDefaultEmptyCacheStats() map[string]*ltcache.CacheStats { Items: 0, Groups: 0, }, - utils.CacheSTIR: { - Items: 0, - Groups: 0, - }, utils.CacheSupplierFilterIndexes: { Items: 0, Groups: 0, diff --git a/ers/ers.go b/ers/ers.go index b75a16469..383f156e2 100644 --- a/ers/ers.go +++ b/ers/ers.go @@ -165,12 +165,17 @@ func (erS *ERService) processEvent(cgrEv *utils.CGREvent, break } } - // execute the action based on reqType - cgrArgs := cgrEv.ExtractArgs( + var cgrArgs utils.ExtractedArgs + if cgrArgs, err = utils.ExtractArgsFromOpts(opts, rdrCfg.Flags.HasKey(utils.MetaDispatchers), reqType == utils.MetaAuthorize || reqType == utils.MetaMessage || - reqType == utils.MetaEvent) + reqType == utils.MetaEvent); err != nil { + utils.Logger.Warning(fmt.Sprintf("<%s> args extraction for reader <%s> failed because <%s>", + utils.ERs, rdrCfg.ID, err.Error())) + err = nil // reset the error and continue the processing + } + // execute the action based on reqType switch reqType { default: return fmt.Errorf("unsupported reqType: <%s>", reqType) diff --git a/sessions/sessions.go b/sessions/sessions.go index 9e316f856..710cf943a 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1780,9 +1780,10 @@ func (args *V1AuthorizeArgs) ParseFlags(flags string) { args.ForceDuration = true } } - cgrArgs := args.CGREvent.ExtractArgs(dispatcherFlag, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(args.Opts, dispatcherFlag, true) args.ArgDispatcher = cgrArgs.ArgDispatcher args.Paginator = *cgrArgs.SupplierPaginator + return } // V1AuthorizeReply are options available in auth reply @@ -2056,7 +2057,7 @@ func (args *V1InitSessionArgs) ParseFlags(flags string) { args.ForceDuration = true } } - cgrArgs := args.CGREvent.ExtractArgs(dispatcherFlag, false) + cgrArgs, _ := utils.ExtractArgsFromOpts(args.Opts, dispatcherFlag, false) args.ArgDispatcher = cgrArgs.ArgDispatcher } @@ -2460,7 +2461,7 @@ func (args *V1TerminateSessionArgs) ParseFlags(flags string) { args.ForceDuration = true } } - cgrArgs := args.CGREvent.ExtractArgs(dispatcherFlag, false) + cgrArgs, _ := utils.ExtractArgsFromOpts(args.Opts, dispatcherFlag, false) args.ArgDispatcher = cgrArgs.ArgDispatcher } @@ -2762,9 +2763,11 @@ func (args *V1ProcessMessageArgs) ParseFlags(flags string) { args.ForceDuration = true } } - cgrArgs := args.CGREvent.ExtractArgs(dispatcherFlag, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(args.Opts, dispatcherFlag, true) + args.ArgDispatcher = cgrArgs.ArgDispatcher args.Paginator = *cgrArgs.SupplierPaginator + return } // V1ProcessMessageReply is the reply for the ProcessMessage API diff --git a/sessions/sessions_test.go b/sessions/sessions_test.go index a0a667fd1..33ea760df 100644 --- a/sessions/sessions_test.go +++ b/sessions/sessions_test.go @@ -913,7 +913,7 @@ func TestV1AuthorizeArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v", eOut, v1authArgs) } //normal check -> without *dispatchers - cgrArgs := v1authArgs.CGREvent.ExtractArgs(false, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(v1authArgs.Opts, false, true) eOut = &V1AuthorizeArgs{ GetMaxUsage: true, AuthorizeResources: true, @@ -937,7 +937,7 @@ func TestV1AuthorizeArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v\n", utils.ToJSON(eOut), utils.ToJSON(v1authArgs)) } // //normal check -> with *dispatchers - cgrArgs = v1authArgs.CGREvent.ExtractArgs(true, true) + cgrArgs, _ = utils.ExtractArgsFromOpts(v1authArgs.Opts, true, true) eOut = &V1AuthorizeArgs{ GetMaxUsage: true, AuthorizeResources: true, @@ -1486,14 +1486,16 @@ func TestSessionSrelocateSessionS(t *testing.T) { } func TestSessionSNewV1AuthorizeArgsWithArgDispatcher(t *testing.T) { + opts := map[string]interface{}{ + utils.APIKey: "testkey", + utils.RouteID: "testrouteid", + } cgrEv := &utils.CGREvent{ Tenant: "cgrates.org", ID: "Event", Event: map[string]interface{}{ utils.Account: "1001", utils.Destination: "1002", - utils.MetaApiKey: "testkey", - utils.MetaRouteID: "testrouteid", }, } expected := &V1AuthorizeArgs{ @@ -1505,10 +1507,11 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, ForceDuration: true, + Opts: opts, } - cgrArgs := cgrEv.ExtractArgs(true, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(opts, true, true) rply := NewV1AuthorizeArgs(true, nil, false, nil, false, nil, true, false, - false, false, false, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, nil) + false, false, false, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, opts) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1527,22 +1530,25 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, ForceDuration: true, + Opts: opts, } rply = NewV1AuthorizeArgs(true, nil, false, nil, true, nil, false, true, - false, true, true, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, nil) + false, true, true, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, opts) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } } func TestSessionSNewV1AuthorizeArgsWithArgDispatcher2(t *testing.T) { + opts := map[string]interface{}{ + utils.RouteID: "testrouteid", + } cgrEv := &utils.CGREvent{ Tenant: "cgrates.org", ID: "Event", Event: map[string]interface{}{ utils.Account: "1001", utils.Destination: "1002", - utils.MetaRouteID: "testrouteid", }, } expected := &V1AuthorizeArgs{ @@ -1553,10 +1559,11 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher2(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, ForceDuration: true, + Opts: opts, } - cgrArgs := cgrEv.ExtractArgs(true, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(opts, true, true) rply := NewV1AuthorizeArgs(true, nil, false, nil, false, nil, true, false, false, - false, false, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, nil) + false, false, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, opts) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1574,9 +1581,10 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher2(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, ForceDuration: true, + Opts: opts, } rply = NewV1AuthorizeArgs(true, nil, false, nil, true, nil, false, true, false, - true, true, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, nil) + true, true, cgrEv, cgrArgs.ArgDispatcher, *cgrArgs.SupplierPaginator, true, opts) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1776,7 +1784,7 @@ func TestV1InitSessionArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v", eOut, v1InitSsArgs) } //normal check -> without *dispatchers - cgrArgs := v1InitSsArgs.CGREvent.ExtractArgs(false, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(v1InitSsArgs.Opts, false, true) eOut = &V1InitSessionArgs{ InitSession: true, AllocateResources: true, @@ -1795,7 +1803,7 @@ func TestV1InitSessionArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v\n", utils.ToJSON(eOut), utils.ToJSON(v1InitSsArgs)) } // //normal check -> with *dispatchers - cgrArgs = v1InitSsArgs.CGREvent.ExtractArgs(true, true) + cgrArgs, _ = utils.ExtractArgsFromOpts(v1InitSsArgs.Opts, true, true) eOut = &V1InitSessionArgs{ InitSession: true, AllocateResources: true, @@ -1826,7 +1834,7 @@ func TestV1TerminateSessionArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v", eOut, v1TerminateSsArgs) } //normal check -> without *dispatchers - cgrArgs := v1TerminateSsArgs.CGREvent.ExtractArgs(false, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(v1TerminateSsArgs.Opts, false, true) eOut = &V1TerminateSessionArgs{ TerminateSession: true, ReleaseResources: true, @@ -1843,7 +1851,7 @@ func TestV1TerminateSessionArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v\n", utils.ToJSON(eOut), utils.ToJSON(v1TerminateSsArgs)) } // //normal check -> with *dispatchers - cgrArgs = v1TerminateSsArgs.CGREvent.ExtractArgs(true, true) + cgrArgs, _ = utils.ExtractArgsFromOpts(v1TerminateSsArgs.Opts, true, true) eOut = &V1TerminateSessionArgs{ TerminateSession: true, ReleaseResources: true, @@ -1872,7 +1880,7 @@ func TestV1ProcessMessageArgsParseFlags(t *testing.T) { t.Errorf("Expecting %+v,\n received: %+v", eOut, v1ProcessMsgArgs) } //normal check -> without *dispatchers - cgrArgs := v1ProcessMsgArgs.CGREvent.ExtractArgs(false, true) + cgrArgs, _ := utils.ExtractArgsFromOpts(v1ProcessMsgArgs.Opts, false, true) eOut = &V1ProcessMessageArgs{ Debit: true, AllocateResources: true, @@ -1895,7 +1903,7 @@ func TestV1ProcessMessageArgsParseFlags(t *testing.T) { } //normal check -> with *dispatchers - cgrArgs = v1ProcessMsgArgs.CGREvent.ExtractArgs(true, true) + cgrArgs, _ = utils.ExtractArgsFromOpts(v1ProcessMsgArgs.Opts, true, true) eOut = &V1ProcessMessageArgs{ Debit: true, AllocateResources: true, diff --git a/utils/cgrevent.go b/utils/cgrevent.go index 7a17c9b6c..0b76fb73e 100644 --- a/utils/cgrevent.go +++ b/utils/cgrevent.go @@ -128,92 +128,12 @@ func (ev *CGREvent) Clone() (clned *CGREvent) { return } -func (ev *CGREvent) consumeArgDispatcher() (arg *ArgDispatcher) { - if ev == nil { - return - } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := ev.Event[MetaApiKey] - if hasApiKey { - delete(ev.Event, MetaApiKey) - arg = &ArgDispatcher{ - APIKey: StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := ev.Event[MetaRouteID] - if !hasRouteID { - return - } - delete(ev.Event, MetaRouteID) - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - return &ArgDispatcher{ - RouteID: StringPointer(routeIDIface.(string)), - } - } - arg.RouteID = StringPointer(routeIDIface.(string)) - return -} - -// ConsumeSupplierPaginator will consume supplierPaginator if presented -func (ev *CGREvent) consumeSupplierPaginator() (args *Paginator) { - args = new(Paginator) - if ev == nil { - return - } - //check if we have suppliersLimit in event and in case it has add it in args - limitIface, hasSuppliersLimit := ev.Event[MetaSuppliersLimit] - if hasSuppliersLimit { - delete(ev.Event, MetaSuppliersLimit) - limit, err := IfaceAsInt64(limitIface) - if err != nil { - Logger.Err(err.Error()) - return - } - args = &Paginator{ - Limit: IntPointer(int(limit)), - } - } - //check if we have offset in event and in case it has add it in args - offsetIface, hasSuppliersOffset := ev.Event[MetaSuppliersOffset] - if hasSuppliersOffset { - delete(ev.Event, MetaSuppliersOffset) - offset, err := IfaceAsInt64(offsetIface) - if err != nil { - Logger.Err(err.Error()) - return - } - if !hasSuppliersLimit { //in case we don't have limit, but we have offset we need to initialize the struct - args = &Paginator{ - Offset: IntPointer(int(offset)), - } - } else { - args.Offset = IntPointer(int(offset)) - } - } - return -} - // ExtractedArgs stores the extracted arguments from CGREvent type ExtractedArgs struct { ArgDispatcher *ArgDispatcher SupplierPaginator *Paginator } -// ExtractArgs extracts the ArgDispatcher and SupplierPaginator from the received event -func (ev *CGREvent) ExtractArgs(dispatcherFlag, consumeSupplierPaginator bool) (ca ExtractedArgs) { - ca = ExtractedArgs{ - ArgDispatcher: ev.consumeArgDispatcher(), - } - if dispatcherFlag && ca.ArgDispatcher == nil { - ca.ArgDispatcher = new(ArgDispatcher) - } - if consumeSupplierPaginator { - ca.SupplierPaginator = ev.consumeSupplierPaginator() - } - return -} - // CGREvents is a group of generic events processed by CGR services // ie: derived CDRs type CGREvents struct { @@ -253,7 +173,87 @@ type EventWithFlags struct { Event map[string]interface{} } +// CGREventWithOpts is the event with Opts needed for ChargerSv1.ProccesEvent type CGREventWithOpts struct { Opts map[string]interface{} *CGREventWithArgDispatcher } + +func getArgDispatcherFromOpts(ev map[string]interface{}) (arg *ArgDispatcher) { + if ev == nil { + return + } + //check if we have APIKey in event and in case it has add it in ArgDispatcher + apiKeyIface, hasAPIKey := ev[APIKey] + if hasAPIKey { + delete(ev, APIKey) + arg = &ArgDispatcher{ + APIKey: StringPointer(apiKeyIface.(string)), + } + } + //check if we have RouteID in event and in case it has add it in ArgDispatcher + routeIDIface, hasRouteID := ev[RouteID] + if !hasRouteID { + return + } + delete(ev, RouteID) + if !hasAPIKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct + return &ArgDispatcher{ + RouteID: StringPointer(routeIDIface.(string)), + } + } + arg.RouteID = StringPointer(routeIDIface.(string)) + return +} + +// getSupplierPaginatorFromOpts will consume supplierPaginator if present +func getSupplierPaginatorFromOpts(ev map[string]interface{}) (args *Paginator, err error) { + args = new(Paginator) + if ev == nil { + return + } + //check if we have suppliersLimit in event and in case it has add it in args + limitIface, hasSuppliersLimit := ev[SuppliersLimit] + if hasSuppliersLimit { + delete(ev, SuppliersLimit) + var limit int64 + if limit, err = IfaceAsInt64(limitIface); err != nil { + return + } + args = &Paginator{ + Limit: IntPointer(int(limit)), + } + } + //check if we have offset in event and in case it has add it in args + offsetIface, hasSuppliersOffset := ev[SuppliersOffset] + if !hasSuppliersOffset { + return + } + delete(ev, SuppliersOffset) + var offset int64 + if offset, err = IfaceAsInt64(offsetIface); err != nil { + return + } + if !hasSuppliersLimit { //in case we don't have limit, but we have offset we need to initialize the struct + args = &Paginator{ + Offset: IntPointer(int(offset)), + } + return + } + args.Offset = IntPointer(int(offset)) + return +} + +// ExtractArgsFromOpts extracts the posible arguments(ArgDispatcher and SupplierPaginator) from options +func ExtractArgsFromOpts(ev map[string]interface{}, dispatcherFlag, consumeSupplierPaginator bool) (ca ExtractedArgs, err error) { + ca = ExtractedArgs{ + ArgDispatcher: getArgDispatcherFromOpts(ev), + } + if dispatcherFlag && ca.ArgDispatcher == nil { + ca.ArgDispatcher = new(ArgDispatcher) + } + if consumeSupplierPaginator { + ca.SupplierPaginator, err = getSupplierPaginatorFromOpts(ev) + } + return +} diff --git a/utils/cgrevent_test.go b/utils/cgrevent_test.go index 598db4ac6..ef663f6c9 100644 --- a/utils/cgrevent_test.go +++ b/utils/cgrevent_test.go @@ -284,125 +284,134 @@ func TestCGREventClone(t *testing.T) { func TestCGREventconsumeArgDispatcher(t *testing.T) { //empty check - cgrEvent := new(CGREvent) - rcv := cgrEvent.consumeArgDispatcher() + var opts map[string]interface{} + rcv := getArgDispatcherFromOpts(opts) if rcv != nil { t.Errorf("Expecting: nil, received: %+v", rcv) } //nil check - cgrEvent = nil - rcv = cgrEvent.consumeArgDispatcher() + opts = nil + rcv = getArgDispatcherFromOpts(opts) if rcv != nil { t.Errorf("Expecting: nil, received: %+v", rcv) } //normal check without APIkey routeID := "route" - cgrEvent = &CGREvent{ - Event: map[string]interface{}{ - MetaRouteID: routeID, - }, + opts = map[string]interface{}{ + RouteID: routeID, } eOut := &ArgDispatcher{ RouteID: &routeID, } - rcv = cgrEvent.consumeArgDispatcher() + rcv = getArgDispatcherFromOpts(opts) if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //check if *route_id was deleted - if _, has := cgrEvent.Event[MetaRouteID]; has { + if _, has := opts[RouteID]; has { t.Errorf("*route_id wasn't deleted") } //normal check with routeID and APIKey apiKey := "key" - cgrEvent.Event = map[string]interface{}{MetaRouteID: routeID, MetaApiKey: apiKey} + opts = map[string]interface{}{RouteID: routeID, APIKey: apiKey} eOut.APIKey = &apiKey - rcv = cgrEvent.consumeArgDispatcher() + rcv = getArgDispatcherFromOpts(opts) //check if *api_key and *route_id was deleted - if _, has := cgrEvent.Event[MetaApiKey]; has { + if _, has := opts[APIKey]; has { t.Errorf("*api_key wasn't deleted") - } else if _, has := cgrEvent.Event[MetaRouteID]; has { + } else if _, has := opts[RouteID]; has { t.Errorf("*route_id wasn't deleted") } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } - } func TestCGREventconsumeSupplierPaginator(t *testing.T) { //empty check - cgrEvent := new(CGREvent) - rcv := cgrEvent.consumeSupplierPaginator() + var opts map[string]interface{} + rcv, err := getSupplierPaginatorFromOpts(opts) + if err != nil { + t.Error(err) + } eOut := new(Paginator) if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } - cgrEvent = nil - rcv = cgrEvent.consumeSupplierPaginator() + opts = nil + rcv, err = getSupplierPaginatorFromOpts(opts) + if err != nil { + t.Error(err) + } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //normal check - cgrEvent = &CGREvent{ - Event: map[string]interface{}{ - MetaSuppliersLimit: 18, - MetaSuppliersOffset: 20, - }, + opts = map[string]interface{}{ + SuppliersLimit: 18, + SuppliersOffset: 20, } eOut = &Paginator{ Limit: IntPointer(18), Offset: IntPointer(20), } - rcv = cgrEvent.consumeSupplierPaginator() + rcv, err = getSupplierPaginatorFromOpts(opts) + if err != nil { + t.Error(err) + } //check if *suppliers_limit and *suppliers_offset was deleted - if _, has := cgrEvent.Event[MetaSuppliersLimit]; has { + if _, has := opts[SuppliersLimit]; has { t.Errorf("*suppliers_limit wasn't deleted") - } else if _, has := cgrEvent.Event[MetaSuppliersOffset]; has { + } else if _, has := opts[SuppliersOffset]; has { t.Errorf("*suppliers_offset wasn't deleted") } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //check without *suppliers_limit, but with *suppliers_offset - cgrEvent = &CGREvent{ - Event: map[string]interface{}{ - MetaSuppliersOffset: 20, - }, + opts = map[string]interface{}{ + SuppliersOffset: 20, } eOut = &Paginator{ Offset: IntPointer(20), } - rcv = cgrEvent.consumeSupplierPaginator() + rcv, err = getSupplierPaginatorFromOpts(opts) + if err != nil { + t.Error(err) + } //check if *suppliers_limit and *suppliers_offset was deleted - if _, has := cgrEvent.Event[MetaSuppliersLimit]; has { + if _, has := opts[SuppliersLimit]; has { t.Errorf("*suppliers_limit wasn't deleted") - } else if _, has := cgrEvent.Event[MetaSuppliersOffset]; has { + } else if _, has := opts[SuppliersOffset]; has { t.Errorf("*suppliers_offset wasn't deleted") } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //check with notAnInt at *suppliers_limit - cgrEvent = &CGREvent{Event: map[string]interface{}{ - MetaSuppliersLimit: "Not an int", - }, + opts = map[string]interface{}{ + SuppliersLimit: "Not an int", } eOut = new(Paginator) - rcv = cgrEvent.consumeSupplierPaginator() + rcv, err = getSupplierPaginatorFromOpts(opts) + if err == nil { + t.Error("Expected error") + } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //check with notAnInt at and *suppliers_offset - cgrEvent = &CGREvent{Event: map[string]interface{}{ - MetaSuppliersOffset: "Not an int", - }, + opts = map[string]interface{}{ + SuppliersOffset: "Not an int", } eOut = new(Paginator) - rcv = cgrEvent.consumeSupplierPaginator() + rcv, err = getSupplierPaginatorFromOpts(opts) + if err == nil { + t.Error("Expected error") + } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } @@ -410,18 +419,22 @@ func TestCGREventconsumeSupplierPaginator(t *testing.T) { func TestCGREventConsumeArgs(t *testing.T) { //empty check - ev := new(CGREvent) - eOut := ExtractedArgs{ - ArgDispatcher: ev.consumeArgDispatcher(), - } + opts := map[string]interface{}{} + eOut := ExtractedArgs{} // false false - rcv := ev.ExtractArgs(false, false) + rcv, err := ExtractArgsFromOpts(opts, false, false) + if err != nil { + t.Error(err) + } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } // false true - rcv = ev.ExtractArgs(false, true) - eOut.SupplierPaginator = ev.consumeSupplierPaginator() + rcv, err = ExtractArgsFromOpts(opts, false, true) + if err != nil { + t.Error(err) + } + eOut.SupplierPaginator = new(Paginator) if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } @@ -430,14 +443,20 @@ func TestCGREventConsumeArgs(t *testing.T) { ArgDispatcher: new(ArgDispatcher), SupplierPaginator: nil, } - rcv = ev.ExtractArgs(true, false) + rcv, err = ExtractArgsFromOpts(opts, true, false) + if err != nil { + t.Error(err) + } if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %+v, received: %+v", eOut, rcv) } //true true - rcv = ev.ExtractArgs(true, true) + rcv, err = ExtractArgsFromOpts(opts, true, true) + if err != nil { + t.Error(err) + } eOut = ExtractedArgs{ - SupplierPaginator: ev.consumeSupplierPaginator(), + SupplierPaginator: new(Paginator), ArgDispatcher: new(ArgDispatcher), } if !reflect.DeepEqual(eOut, rcv) { diff --git a/utils/consts.go b/utils/consts.go index dc3f00060..221512684 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -643,8 +643,6 @@ const ( LoadIDs = "load_ids" DNSAgent = "DNSAgent" TLSNoCaps = "tls" - MetaRouteID = "*route_id" - MetaApiKey = "*api_key" UsageID = "UsageID" Rcode = "Rcode" Replacement = "Replacement" @@ -653,8 +651,6 @@ const ( Preference = "Preference" Flags = "Flags" Service = "Service" - MetaSuppliersLimit = "*suppliers_limit" - MetaSuppliersOffset = "*suppliers_offset" ApierV = "ApierV" MetaApier = "*apier" MetaAnalyzer = "*analyzer" @@ -907,8 +903,6 @@ const ( SessionSv1 = "SessionSv1" ChargerSv1 = "ChargerSv1" MetaAuth = "*auth" - APIKey = "APIKey" - RouteID = "RouteID" APIMethods = "APIMethods" NestingSep = "." ArgDispatcherField = "ArgDispatcher" @@ -1477,6 +1471,7 @@ const ( CGR_COMPUTELCR = "cgr_computelcr" CGR_SUPPLIERS = "cgr_suppliers" CGRFlags = "cgr_flags" + CGROpts = "cgr_opts" ) //CSV file name @@ -2075,7 +2070,7 @@ var CGROptionsSet = NewStringSet([]string{STIRATest, STIRPayloadMaxDuration, STIRIdentity, STIROriginatorTn, STIROriginatorURI, STIRDestinationTn, STIRDestinationURI, STIRPublicKeyPath, STIRPrivateKeyPath, DebitInterval, Context, SessionTTL, SessionTTLMaxDelay, - SessionTTLLastUsed, SessionTTLUsage}) + SessionTTLLastUsed, SessionTTLUsage, APIKey, RouteID}) // SessionS ProccessEvent posible options const ( @@ -2093,11 +2088,19 @@ const ( DebitInterval = "DebitInterval" Context = "Context" - // terminator + // SessionS terminator SessionTTL = "SessionTTL" SessionTTLMaxDelay = "SessionTTLMaxDelay" SessionTTLLastUsed = "SessionTTLLastUsed" SessionTTLUsage = "SessionTTLUsage" + + // DispatcherS + APIKey = "APIKey" + RouteID = "RouteID" + + // SupplierS + SuppliersLimit = "SuppliersLimit" + SuppliersOffset = "SuppliersOffset" ) func buildCacheInstRevPrefixes() {