From 3a3996b896bf363d3cc4a5cae72fdcc5c058a2f2 Mon Sep 17 00:00:00 2001 From: Tripon Alexandru-Ionut Date: Sun, 14 Apr 2019 14:44:36 +0300 Subject: [PATCH] Added ArgDispatcher to all Calls to SessionS --- agents/astagent.go | 30 ++++++---- agents/asterisk_event.go | 74 ++++-------------------- agents/asterisk_event_test.go | 8 +-- agents/diamagent.go | 38 ++++-------- agents/fsagent.go | 2 +- agents/fsevent.go | 57 +----------------- agents/httpagent.go | 16 +++-- agents/kamagent.go | 2 +- agents/kamevent.go | 57 +----------------- agents/radagent.go | 16 +++-- sessions/sessions.go | 106 ++++------------------------------ sessions/sessions_test.go | 30 +++++----- utils/cgrevent.go | 23 ++++---- 13 files changed, 110 insertions(+), 349 deletions(-) diff --git a/agents/astagent.go b/agents/astagent.go index e475079fc..a701478cd 100644 --- a/agents/astagent.go +++ b/agents/astagent.go @@ -57,8 +57,11 @@ const ( func NewAsteriskAgent(cgrCfg *config.CGRConfig, astConnIdx int, smgConn *utils.BiRPCInternalClient) (*AsteriskAgent, error) { - sma := &AsteriskAgent{cgrCfg: cgrCfg, smg: smgConn, - eventsCache: make(map[string]*utils.CGREvent)} + sma := &AsteriskAgent{ + cgrCfg: cgrCfg, + smg: smgConn, + eventsCache: make(map[string]*utils.CGREventWithArgDispatcher), + } sma.smg.SetClientConn(sma) // pass the connection to SMA back into smg so we can receive the disconnects return sma, nil } @@ -70,8 +73,8 @@ type AsteriskAgent struct { astConn *aringo.ARInGO astEvChan chan map[string]interface{} astErrChan chan error - eventsCache map[string]*utils.CGREvent // used to gather information about events during various phases - evCacheMux sync.RWMutex // Protect eventsCache + eventsCache map[string]*utils.CGREventWithArgDispatcher // used to gather information about events during various phases + evCacheMux sync.RWMutex // Protect eventsCache } func (sma *AsteriskAgent) connectAsterisk() (err error) { @@ -226,7 +229,10 @@ func (sma *AsteriskAgent) handleStasisStart(ev *SMAsteriskEvent) { } // Done with processing event, cache it for later use sma.evCacheMux.Lock() - sma.eventsCache[ev.ChannelID()] = &authArgs.CGREvent + sma.eventsCache[ev.ChannelID()] = &utils.CGREventWithArgDispatcher{ + CGREvent: &authArgs.CGREvent, + ArgDispatcher: authArgs.ArgDispatcher, + } sma.evCacheMux.Unlock() } @@ -236,13 +242,13 @@ func (sma *AsteriskAgent) handleChannelStateChange(ev *SMAsteriskEvent) { return } sma.evCacheMux.RLock() - cgrEv, hasIt := sma.eventsCache[ev.ChannelID()] + cgrEvDisp, hasIt := sma.eventsCache[ev.ChannelID()] sma.evCacheMux.RUnlock() if !hasIt { // Not handled by us return } sma.evCacheMux.Lock() - err := ev.UpdateCGREvent(cgrEv) // Updates the event directly in the cache + err := ev.UpdateCGREvent(cgrEvDisp.CGREvent) // Updates the event directly in the cache sma.evCacheMux.Unlock() if err != nil { sma.hangupChannel(ev.ChannelID(), @@ -251,7 +257,7 @@ func (sma *AsteriskAgent) handleChannelStateChange(ev *SMAsteriskEvent) { return } // populate init session args - initSessionArgs := ev.V1InitSessionArgs(*cgrEv) + initSessionArgs := ev.V1InitSessionArgs(*cgrEvDisp) if initSessionArgs == nil { utils.Logger.Err(fmt.Sprintf("<%s> event: %s cannot generate init session arguments", utils.AsteriskAgent, ev.ChannelID())) @@ -275,13 +281,13 @@ func (sma *AsteriskAgent) handleChannelStateChange(ev *SMAsteriskEvent) { // Channel disconnect func (sma *AsteriskAgent) handleChannelDestroyed(ev *SMAsteriskEvent) { sma.evCacheMux.RLock() - cgrEv, hasIt := sma.eventsCache[ev.ChannelID()] + cgrEvDisp, hasIt := sma.eventsCache[ev.ChannelID()] sma.evCacheMux.RUnlock() if !hasIt { // Not handled by us return } sma.evCacheMux.Lock() - err := ev.UpdateCGREvent(cgrEv) // Updates the event directly in the cache + err := ev.UpdateCGREvent(cgrEvDisp.CGREvent) // Updates the event directly in the cache sma.evCacheMux.Unlock() if err != nil { utils.Logger.Warning( @@ -290,7 +296,7 @@ func (sma *AsteriskAgent) handleChannelDestroyed(ev *SMAsteriskEvent) { return } // populate terminate session args - tsArgs := ev.V1TerminateSessionArgs(*cgrEv) + tsArgs := ev.V1TerminateSessionArgs(*cgrEvDisp) if tsArgs == nil { utils.Logger.Err(fmt.Sprintf("<%s> event: %s cannot generate terminate session arguments", utils.AsteriskAgent, ev.ChannelID())) @@ -305,7 +311,7 @@ func (sma *AsteriskAgent) handleChannelDestroyed(ev *SMAsteriskEvent) { } if sma.cgrCfg.AsteriskAgentCfg().CreateCDR { if err := sma.smg.Call(utils.SessionSv1ProcessCDR, - &utils.CGREventWithArgDispatcher{CGREvent: cgrEv}, &reply); err != nil { + cgrEvDisp, &reply); err != nil { utils.Logger.Err(fmt.Sprintf("<%s> Error: %s when attempting to process CDR for channelID: %s", utils.AsteriskAgent, err.Error(), ev.ChannelID())) } diff --git a/agents/asterisk_event.go b/agents/asterisk_event.go index 90c134bbf..047c5e815 100644 --- a/agents/asterisk_event.go +++ b/agents/asterisk_event.go @@ -290,36 +290,20 @@ func (smaEv *SMAsteriskEvent) V1AuthorizeArgs() (args *sessions.V1AuthorizeArgs) args.GetAttributes = strings.Index(smaEv.Subsystems(), utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(smaEv.Subsystems(), utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(smaEv.Subsystems(), utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } -func (smaEv *SMAsteriskEvent) V1InitSessionArgs(cgrEv utils.CGREvent) (args *sessions.V1InitSessionArgs) { +func (smaEv *SMAsteriskEvent) V1InitSessionArgs(cgrEvDisp utils.CGREventWithArgDispatcher) (args *sessions.V1InitSessionArgs) { args = &sessions.V1InitSessionArgs{ // defaults InitSession: true, - CGREvent: cgrEv, + CGREvent: *cgrEvDisp.CGREvent, } - subsystems, err := cgrEv.FieldAsString(utils.CGRSubsystems) + subsystems, err := cgrEvDisp.CGREvent.FieldAsString(utils.CGRSubsystems) if err != nil { utils.Logger.Err(fmt.Sprintf("<%s> event: %s don't have cgr_subsystems variable", - utils.AsteriskAgent, utils.ToJSON(cgrEv))) + utils.AsteriskAgent, utils.ToJSON(cgrEvDisp.CGREvent))) return } args.InitSession = strings.Index(subsystems, utils.MetaAccounts) != -1 @@ -327,59 +311,25 @@ func (smaEv *SMAsteriskEvent) V1InitSessionArgs(cgrEv utils.CGREvent) (args *ses args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEvDisp.ArgDispatcher return } -func (smaEv *SMAsteriskEvent) V1TerminateSessionArgs(cgrEv utils.CGREvent) (args *sessions.V1TerminateSessionArgs) { +func (smaEv *SMAsteriskEvent) V1TerminateSessionArgs(cgrEvDisp utils.CGREventWithArgDispatcher) (args *sessions.V1TerminateSessionArgs) { args = &sessions.V1TerminateSessionArgs{ // defaults TerminateSession: true, - CGREvent: cgrEv, + CGREvent: *cgrEvDisp.CGREvent, } - subsystems, err := cgrEv.FieldAsString(utils.CGRSubsystems) + subsystems, err := cgrEvDisp.CGREvent.FieldAsString(utils.CGRSubsystems) if err != nil { utils.Logger.Err(fmt.Sprintf("<%s> event: %s don't have cgr_subsystems variable", - utils.AsteriskAgent, utils.ToJSON(cgrEv))) + utils.AsteriskAgent, utils.ToJSON(cgrEvDisp.CGREvent))) return } args.TerminateSession = strings.Index(subsystems, utils.MetaAccounts) != -1 args.ReleaseResources = strings.Index(subsystems, utils.MetaResources) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEvDisp.ArgDispatcher return } diff --git a/agents/asterisk_event_test.go b/agents/asterisk_event_test.go index 329dabf4b..4e1b5c60a 100644 --- a/agents/asterisk_event_test.go +++ b/agents/asterisk_event_test.go @@ -400,7 +400,7 @@ func TestSMAEventV1InitSessionArgs(t *testing.T) { t.Error(err) } smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") - if rcv := smaEv.V1InitSessionArgs(cgrEv); !reflect.DeepEqual(exp, rcv) { + if rcv := smaEv.V1InitSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: &cgrEv}); !reflect.DeepEqual(exp, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) } @@ -411,7 +411,7 @@ func TestSMAEventV1InitSessionArgs(t *testing.T) { CGREvent: cgrEv, } cgrEv.Event[utils.CGRSubsystems] = "*resources*accounts*attributes" - if rcv := smaEv.V1InitSessionArgs(cgrEv); !reflect.DeepEqual(exp2, rcv) { + if rcv := smaEv.V1InitSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: &cgrEv}); !reflect.DeepEqual(exp2, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp2), utils.ToJSON(rcv)) } } @@ -433,7 +433,7 @@ func TestSMAEventV1TerminateSessionArgs(t *testing.T) { t.Error(err) } smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") - if rcv := smaEv.V1TerminateSessionArgs(cgrEv); !reflect.DeepEqual(exp, rcv) { + if rcv := smaEv.V1TerminateSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: &cgrEv}); !reflect.DeepEqual(exp, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) } @@ -444,7 +444,7 @@ func TestSMAEventV1TerminateSessionArgs(t *testing.T) { CGREvent: cgrEv, } cgrEv.Event[utils.CGRSubsystems] = "*resources*accounts*stats" - if rcv := smaEv.V1TerminateSessionArgs(cgrEv); !reflect.DeepEqual(exp2, rcv) { + if rcv := smaEv.V1TerminateSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: &cgrEv}); !reflect.DeepEqual(exp2, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp2), utils.ToJSON(rcv)) } } diff --git a/agents/diamagent.go b/agents/diamagent.go index 7105b44bb..c3e98993e 100644 --- a/agents/diamagent.go +++ b/agents/diamagent.go @@ -255,6 +255,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.tenant, utils.NestingSep) + argDisp := cgrEv.ConsumeArgDispatcher() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuth, @@ -289,7 +290,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliers), reqProcessor.Flags.HasKey(utils.MetaSuppliersIgnoreErrors), reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), - *cgrEv) + *cgrEv, argDisp) var authReply sessions.V1AuthorizeReply err = da.sS.Call(utils.SessionSv1AuthorizeEvent, authArgs, &authReply) @@ -302,7 +303,8 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var initReply sessions.V1InitSessionReply err = da.sS.Call(utils.SessionSv1InitiateSession, initArgs, &initReply) @@ -312,7 +314,8 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, case utils.MetaUpdate: updateArgs := sessions.NewV1UpdateSessionArgs( reqProcessor.Flags.HasKey(utils.MetaAttributes), - reqProcessor.Flags.HasKey(utils.MetaAccounts), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaAccounts), + *cgrEv, argDisp) var updateReply sessions.V1UpdateSessionReply err = da.sS.Call(utils.SessionSv1UpdateSession, updateArgs, &updateReply) @@ -324,7 +327,8 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var tRply string err = da.sS.Call(utils.SessionSv1TerminateSession, terminateArgs, &tRply) @@ -338,7 +342,7 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAttributes), reqProcessor.Flags.HasKey(utils.MetaThresholds), reqProcessor.Flags.HasKey(utils.MetaStats), - *cgrEv) + *cgrEv, argDisp) var eventRply sessions.V1ProcessEventReply err = da.sS.Call(utils.SessionSv1ProcessEvent, evArgs, &eventRply) @@ -356,30 +360,8 @@ func (da *DiameterAgent) processRequest(reqProcessor *config.DARequestProcessor, if reqProcessor.Flags.HasKey(utils.MetaCDRs) && !reqProcessor.Flags.HasKey(utils.MetaDryRun) { var rplyCDRs string - //compose the arguments for SessionSv1ProcessCDR - argProcessCDR := &utils.CGREventWithArgDispatcher{ - CGREvent: cgrEv, - } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - argProcessCDR.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - argProcessCDR.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - argProcessCDR.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } if err = da.sS.Call(utils.SessionSv1ProcessCDR, - argProcessCDR, &rplyCDRs); err != nil { + utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: argDisp}, &rplyCDRs); err != nil { agReq.CGRReply.Set([]string{utils.Error}, err.Error(), false, false) } } diff --git a/agents/fsagent.go b/agents/fsagent.go index aa3c3e9ef..83e114007 100644 --- a/agents/fsagent.go +++ b/agents/fsagent.go @@ -266,7 +266,7 @@ func (sm *FSsessions) onChannelHangupComplete(fsev FSEvent, connId string) { return } if err := sm.sS.Call(utils.SessionSv1ProcessCDR, - &utils.CGREventWithArgDispatcher{CGREvent: cgrEv}, &reply); err != nil { + &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: cgrEv.ConsumeArgDispatcher()}, &reply); err != nil { utils.Logger.Err(fmt.Sprintf("<%s> Failed processing CGREvent: %s, error: <%s>", utils.FreeSWITCHAgent, utils.ToJSON(cgrEv), err.Error())) } diff --git a/agents/fsevent.go b/agents/fsevent.go index 8038ee7e7..57f573739 100644 --- a/agents/fsevent.go +++ b/agents/fsevent.go @@ -424,24 +424,7 @@ func (fsev FSEvent) V1AuthorizeArgs() (args *sessions.V1AuthorizeArgs) { args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } @@ -464,24 +447,7 @@ func (fsev FSEvent) V1InitSessionArgs() (args *sessions.V1InitSessionArgs) { args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } @@ -503,24 +469,7 @@ func (fsev FSEvent) V1TerminateSessionArgs() (args *sessions.V1TerminateSessionA args.ReleaseResources = strings.Index(subsystems, utils.MetaResources) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } diff --git a/agents/httpagent.go b/agents/httpagent.go index 05202f5f8..85cf80b09 100644 --- a/agents/httpagent.go +++ b/agents/httpagent.go @@ -104,6 +104,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.tenant, utils.NestingSep) + argDisp := cgrEv.ConsumeArgDispatcher() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuth, @@ -137,7 +138,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, reqProcessor.Flags.HasKey(utils.MetaSuppliers), reqProcessor.Flags.HasKey(utils.MetaSuppliersIgnoreErrors), reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), - *cgrEv) + *cgrEv, argDisp) var authReply sessions.V1AuthorizeReply err = ha.sessionS.Call(utils.SessionSv1AuthorizeEvent, authArgs, &authReply) @@ -150,7 +151,8 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var initReply sessions.V1InitSessionReply err = ha.sessionS.Call(utils.SessionSv1InitiateSession, initArgs, &initReply) @@ -160,7 +162,8 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, case utils.MetaUpdate: updateArgs := sessions.NewV1UpdateSessionArgs( reqProcessor.Flags.HasKey(utils.MetaAttributes), - reqProcessor.Flags.HasKey(utils.MetaAccounts), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaAccounts), + *cgrEv, argDisp) var updateReply sessions.V1UpdateSessionReply err = ha.sessionS.Call(utils.SessionSv1UpdateSession, updateArgs, &updateReply) @@ -172,7 +175,8 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var tRply string err = ha.sessionS.Call(utils.SessionSv1TerminateSession, terminateArgs, &tRply) @@ -186,7 +190,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, reqProcessor.Flags.HasKey(utils.MetaAttributes), reqProcessor.Flags.HasKey(utils.MetaThresholds), reqProcessor.Flags.HasKey(utils.MetaStats), - *cgrEv) + *cgrEv, argDisp) var eventRply sessions.V1ProcessEventReply err = ha.sessionS.Call(utils.SessionSv1ProcessEvent, evArgs, &eventRply) @@ -205,7 +209,7 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, !reqProcessor.Flags.HasKey(utils.MetaDryRun) { var rplyCDRs string if err = ha.sessionS.Call(utils.SessionSv1ProcessCDR, - &utils.CGREventWithArgDispatcher{CGREvent: cgrEv}, &rplyCDRs); err != nil { + &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: argDisp}, &rplyCDRs); err != nil { agReq.CGRReply.Set([]string{utils.Error}, err.Error(), false, false) } } diff --git a/agents/kamagent.go b/agents/kamagent.go index e9f170f76..220d63407 100644 --- a/agents/kamagent.go +++ b/agents/kamagent.go @@ -201,7 +201,7 @@ func (ka *KamailioAgent) onCallEnd(evData []byte, connID string) { } cgrEv.Event[utils.OriginHost] = ka.conns[connID].RemoteAddr().String() if err := ka.sessionS.Call(utils.SessionSv1ProcessCDR, - &utils.CGREventWithArgDispatcher{CGREvent: cgrEv}, &reply); err != nil { + &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: cgrEv.ConsumeArgDispatcher()}, &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 9612b580e..1f97f67ec 100644 --- a/agents/kamevent.go +++ b/agents/kamevent.go @@ -191,24 +191,7 @@ func (kev KamEvent) V1AuthorizeArgs() (args *sessions.V1AuthorizeArgs) { args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } @@ -272,24 +255,7 @@ func (kev KamEvent) V1InitSessionArgs() (args *sessions.V1InitSessionArgs) { args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := args.CGREvent.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } @@ -311,24 +277,7 @@ func (kev KamEvent) V1TerminateSessionArgs() (args *sessions.V1TerminateSessionA args.ReleaseResources = strings.Index(subsystems, utils.MetaResources) != -1 args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = cgrEv.ConsumeArgDispatcher() return } diff --git a/agents/radagent.go b/agents/radagent.go index 18d8b37af..3d5950683 100644 --- a/agents/radagent.go +++ b/agents/radagent.go @@ -148,6 +148,7 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, return } cgrEv := agReq.CGRRequest.AsCGREvent(agReq.tenant, utils.NestingSep) + argDisp := cgrEv.ConsumeArgDispatcher() var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuth, @@ -181,7 +182,7 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaSuppliers), reqProcessor.Flags.HasKey(utils.MetaSuppliersIgnoreErrors), reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), - *cgrEv) + *cgrEv, argDisp) var authReply sessions.V1AuthorizeReply err = ra.sessionS.Call(utils.SessionSv1AuthorizeEvent, authArgs, &authReply) @@ -194,7 +195,8 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var initReply sessions.V1InitSessionReply err = ra.sessionS.Call(utils.SessionSv1InitiateSession, initArgs, &initReply) @@ -204,7 +206,8 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, case utils.MetaUpdate: updateArgs := sessions.NewV1UpdateSessionArgs( reqProcessor.Flags.HasKey(utils.MetaAttributes), - reqProcessor.Flags.HasKey(utils.MetaAccounts), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaAccounts), + *cgrEv, argDisp) var updateReply sessions.V1UpdateSessionReply err = ra.sessionS.Call(utils.SessionSv1UpdateSession, updateArgs, &updateReply) @@ -216,7 +219,8 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAccounts), reqProcessor.Flags.HasKey(utils.MetaResources), reqProcessor.Flags.HasKey(utils.MetaThresholds), - reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + reqProcessor.Flags.HasKey(utils.MetaStats), + *cgrEv, argDisp) var tRply string err = ra.sessionS.Call(utils.SessionSv1TerminateSession, terminateArgs, &tRply) @@ -230,7 +234,7 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, reqProcessor.Flags.HasKey(utils.MetaAttributes), reqProcessor.Flags.HasKey(utils.MetaThresholds), reqProcessor.Flags.HasKey(utils.MetaStats), - *cgrEv) + *cgrEv, argDisp) var eventRply sessions.V1ProcessEventReply err = ra.sessionS.Call(utils.SessionSv1ProcessEvent, evArgs, &eventRply) @@ -248,7 +252,7 @@ func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, if reqProcessor.Flags.HasKey(utils.MetaCDRs) { var rplyCDRs string if err = ra.sessionS.Call(utils.SessionSv1ProcessCDR, - cgrEv.AsCGREventWithArgDispatcher(), &rplyCDRs); err != nil { + &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: argDisp}, &rplyCDRs); err != nil { agReq.CGRReply.Set([]string{utils.Error}, err.Error(), false, false) } } diff --git a/sessions/sessions.go b/sessions/sessions.go index 968c48a08..cc49f59f0 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1563,7 +1563,7 @@ func (sS *SessionS) BiRPCv1ReplicateSessions(clnt rpcclient.RpcClientConnection, // NewV1AuthorizeArgs is a constructor for V1AuthorizeArgs func NewV1AuthorizeArgs(attrs, res, maxUsage, thrslds, statQueues, suppls, supplsIgnoreErrs, supplsEventCost bool, - cgrEv utils.CGREvent) (args *V1AuthorizeArgs) { + cgrEv utils.CGREvent, argDisp *utils.ArgDispatcher) (args *V1AuthorizeArgs) { args = &V1AuthorizeArgs{ GetAttributes: attrs, AuthorizeResources: res, @@ -1577,24 +1577,7 @@ func NewV1AuthorizeArgs(attrs, res, maxUsage, thrslds, if supplsEventCost { args.SuppliersMaxCost = utils.MetaSuppliersEventCost } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } - } + args.ArgDispatcher = argDisp return } @@ -1849,7 +1832,7 @@ func (sS *SessionS) BiRPCv1AuthorizeEventWithDigest(clnt rpcclient.RpcClientConn // NewV1InitSessionArgs is a constructor for V1InitSessionArgs func NewV1InitSessionArgs(attrs, resrc, acnt, thrslds, stats bool, - cgrEv utils.CGREvent) (args *V1InitSessionArgs) { + cgrEv utils.CGREvent, argDisp *utils.ArgDispatcher) (args *V1InitSessionArgs) { args = &V1InitSessionArgs{ GetAttributes: attrs, AllocateResources: resrc, @@ -1857,24 +1840,7 @@ func NewV1InitSessionArgs(attrs, resrc, acnt, thrslds, stats bool, ProcessThresholds: thrslds, ProcessStats: stats, CGREvent: cgrEv, - } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } + ArgDispatcher: argDisp, } return } @@ -2113,29 +2079,12 @@ func (sS *SessionS) BiRPCv1InitiateSessionWithDigest(clnt rpcclient.RpcClientCon // NewV1UpdateSessionArgs is a constructor for update session arguments func NewV1UpdateSessionArgs(attrs, acnts bool, - cgrEv utils.CGREvent) (args *V1UpdateSessionArgs) { + cgrEv utils.CGREvent, argDisp *utils.ArgDispatcher) (args *V1UpdateSessionArgs) { args = &V1UpdateSessionArgs{ GetAttributes: attrs, UpdateSession: acnts, CGREvent: cgrEv, - } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } + ArgDispatcher: argDisp, } return } @@ -2265,30 +2214,14 @@ func (sS *SessionS) BiRPCv1UpdateSession(clnt rpcclient.RpcClientConnection, } func NewV1TerminateSessionArgs(acnts, resrc, thrds, stats bool, - cgrEv utils.CGREvent) (args *V1TerminateSessionArgs) { + cgrEv utils.CGREvent, argDisp *utils.ArgDispatcher) (args *V1TerminateSessionArgs) { args = &V1TerminateSessionArgs{ TerminateSession: acnts, ReleaseResources: resrc, ProcessThresholds: thrds, ProcessStats: stats, - CGREvent: cgrEv} - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } + CGREvent: cgrEv, + ArgDispatcher: argDisp, } return } @@ -2518,7 +2451,7 @@ func (sS *SessionS) BiRPCv1ProcessCDR(clnt rpcclient.RpcClientConnection, // NewV1ProcessEventArgs is a constructor for EventArgs used by ProcessEvent func NewV1ProcessEventArgs(resrc, acnts, attrs, thds, stats bool, - cgrEv utils.CGREvent) (args *V1ProcessEventArgs) { + cgrEv utils.CGREvent, argDisp *utils.ArgDispatcher) (args *V1ProcessEventArgs) { args = &V1ProcessEventArgs{ AllocateResources: resrc, Debit: acnts, @@ -2526,24 +2459,7 @@ func NewV1ProcessEventArgs(resrc, acnts, attrs, thds, stats bool, ProcessThresholds: thds, ProcessStats: stats, CGREvent: cgrEv, - } - //check if we have APIKey in event and in case it has add it in ArgDispatcher - apiKeyIface, hasApiKey := cgrEv.Event[utils.MetaApiKey] - if hasApiKey { - args.ArgDispatcher = &utils.ArgDispatcher{ - APIKey: utils.StringPointer(apiKeyIface.(string)), - } - } - //check if we have RouteID in event and in case it has add it in ArgDispatcher - routeIDIface, hasRouteID := cgrEv.Event[utils.MetaRouteID] - if hasRouteID { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - args.ArgDispatcher = &utils.ArgDispatcher{ - RouteID: utils.StringPointer(routeIDIface.(string)), - } - } else { - args.ArgDispatcher.RouteID = utils.StringPointer(routeIDIface.(string)) - } + ArgDispatcher: argDisp, } return } diff --git a/sessions/sessions_test.go b/sessions/sessions_test.go index 1deb6eac1..61d877612 100644 --- a/sessions/sessions_test.go +++ b/sessions/sessions_test.go @@ -747,7 +747,7 @@ func TestSessionSNewV1AuthorizeArgs(t *testing.T) { GetAttributes: true, CGREvent: cgrEv, } - rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv) + rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -762,7 +762,7 @@ func TestSessionSNewV1AuthorizeArgs(t *testing.T) { SuppliersMaxCost: utils.MetaSuppliersEventCost, CGREvent: cgrEv, } - rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv) + rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v,\n received: %+v", expected, rply) } @@ -782,7 +782,7 @@ func TestSessionSNewV1UpdateSessionArgs(t *testing.T) { UpdateSession: true, CGREvent: cgrEv, } - rply := NewV1UpdateSessionArgs(true, true, cgrEv) + rply := NewV1UpdateSessionArgs(true, true, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -791,7 +791,7 @@ func TestSessionSNewV1UpdateSessionArgs(t *testing.T) { UpdateSession: true, CGREvent: cgrEv, } - rply = NewV1UpdateSessionArgs(false, true, cgrEv) + rply = NewV1UpdateSessionArgs(false, true, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -811,14 +811,14 @@ func TestSessionSNewV1TerminateSessionArgs(t *testing.T) { ProcessThresholds: true, CGREvent: cgrEv, } - rply := NewV1TerminateSessionArgs(true, false, true, false, cgrEv) + rply := NewV1TerminateSessionArgs(true, false, true, false, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } expected = &V1TerminateSessionArgs{ CGREvent: cgrEv, } - rply = NewV1TerminateSessionArgs(false, false, false, false, cgrEv) + rply = NewV1TerminateSessionArgs(false, false, false, false, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -839,7 +839,7 @@ func TestSessionSNewV1ProcessEventArgs(t *testing.T) { GetAttributes: true, CGREvent: cgrEv, } - rply := NewV1ProcessEventArgs(true, true, true, false, false, cgrEv) + rply := NewV1ProcessEventArgs(true, true, true, false, false, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -848,7 +848,7 @@ func TestSessionSNewV1ProcessEventArgs(t *testing.T) { GetAttributes: true, CGREvent: cgrEv, } - rply = NewV1ProcessEventArgs(true, false, true, false, false, cgrEv) + rply = NewV1ProcessEventArgs(true, false, true, false, false, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -871,7 +871,7 @@ func TestSessionSNewV1InitSessionArgs(t *testing.T) { ProcessStats: true, CGREvent: cgrEv, } - rply := NewV1InitSessionArgs(true, true, true, true, true, cgrEv) + rply := NewV1InitSessionArgs(true, true, true, true, true, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -883,7 +883,7 @@ func TestSessionSNewV1InitSessionArgs(t *testing.T) { ProcessStats: true, CGREvent: cgrEv, } - rply = NewV1InitSessionArgs(true, false, true, false, true, cgrEv) + rply = NewV1InitSessionArgs(true, false, true, false, true, cgrEv, nil) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", expected, rply) } @@ -1281,7 +1281,8 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, } - rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv) + argDisp := cgrEv.ConsumeArgDispatcher() + rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv, argDisp) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1300,7 +1301,7 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, } - rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv) + rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv, argDisp) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1324,7 +1325,8 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher2(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, } - rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv) + argDisp := cgrEv.ConsumeArgDispatcher() + rply := NewV1AuthorizeArgs(true, true, false, false, false, false, false, false, cgrEv, argDisp) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } @@ -1342,7 +1344,7 @@ func TestSessionSNewV1AuthorizeArgsWithArgDispatcher2(t *testing.T) { RouteID: utils.StringPointer("testrouteid"), }, } - rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv) + rply = NewV1AuthorizeArgs(true, false, true, false, true, false, true, true, cgrEv, argDisp) if !reflect.DeepEqual(expected, rply) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rply)) } diff --git a/utils/cgrevent.go b/utils/cgrevent.go index b468a6fbe..c2ab1ee2b 100644 --- a/utils/cgrevent.go +++ b/utils/cgrevent.go @@ -173,28 +173,27 @@ func (ev *CGREvent) RemFldsWithPrefix(prfx string) { } // RemFldsWithPrefix will remove fields starting with prefix from event -func (ev *CGREvent) AsCGREventWithArgDispatcher() (arg *CGREventWithArgDispatcher) { - arg = &CGREventWithArgDispatcher{ - CGREvent: ev, - } +func (ev *CGREvent) ConsumeArgDispatcher() (arg *ArgDispatcher) { //check if we have APIKey in event and in case it has add it in ArgDispatcher apiKeyIface, hasApiKey := ev.Event[MetaApiKey] if hasApiKey { - arg.ArgDispatcher = &ArgDispatcher{ + 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 { - if !hasApiKey { //in case we don't have APIKey, but we have RouteID we need to initialize the struct - arg.ArgDispatcher = &ArgDispatcher{ - RouteID: StringPointer(routeIDIface.(string)), - } - } else { - arg.ArgDispatcher.RouteID = StringPointer(routeIDIface.(string)) + 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 }