From 9c7aeb78d6929cc8caa08cba0734a77ef43651a2 Mon Sep 17 00:00:00 2001 From: TeoV Date: Thu, 27 Sep 2018 07:52:06 -0400 Subject: [PATCH] Add timezone in agentRequest --- agents/agentreq.go | 19 +++++++++++-------- agents/agentreq_test.go | 2 +- agents/httpagent.go | 8 +++++--- agents/librad_test.go | 6 +++--- agents/radagent.go | 12 ++++++++---- config/httpagntcfg.go | 4 ++++ config/libconfig_json.go | 1 + 7 files changed, 33 insertions(+), 19 deletions(-) diff --git a/agents/agentreq.go b/agents/agentreq.go index 4a709dd17..a83d1030c 100644 --- a/agents/agentreq.go +++ b/agents/agentreq.go @@ -28,36 +28,39 @@ import ( ) func newAgentRequest(req config.DataProvider, tntTpl config.RSRParsers, - dfltTenant string, filterS *engine.FilterS) (ar *AgentRequest) { + dfltTenant, timezone string, filterS *engine.FilterS) (ar *AgentRequest) { ar = &AgentRequest{ Request: req, Vars: config.NewNavigableMap(nil), CGRRequest: config.NewNavigableMap(nil), CGRReply: config.NewNavigableMap(nil), Reply: config.NewNavigableMap(nil), + timezone: timezone, filterS: filterS, } // populate tenant if tntIf, err := ar.ParseField( &config.FCTemplate{Type: utils.META_COMPOSED, Value: tntTpl}); err == nil && tntIf.(string) != "" { - ar.Tenant = tntIf.(string) + ar.tenant = tntIf.(string) } else { - ar.Tenant = dfltTenant + ar.tenant = dfltTenant } + return } // AgentRequest represents data related to one request towards agent // implements engine.DataProvider so we can pass it to filters type AgentRequest struct { - Tenant string Request config.DataProvider // request Vars *config.NavigableMap // shared data CGRRequest *config.NavigableMap CGRReply *config.NavigableMap Reply *config.NavigableMap - filterS *engine.FilterS + tenant, + timezone string + filterS *engine.FilterS } // String implements engine.DataProvider @@ -106,7 +109,7 @@ func (ar *AgentRequest) AsNavigableMap(tplFlds []*config.FCTemplate) ( nM *config.NavigableMap, err error) { nM = config.NewNavigableMap(nil) for _, tplFld := range tplFlds { - if pass, err := ar.filterS.Pass(ar.Tenant, + if pass, err := ar.filterS.Pass(ar.tenant, tplFld.Filters, ar); err != nil { return nil, err } else if !pass { @@ -163,11 +166,11 @@ func (aReq *AgentRequest) ParseField( if err != nil { return "", err } - tEnd, err := utils.ParseTimeDetectLayout(strVal1, cfgFld.Timezone) + tEnd, err := utils.ParseTimeDetectLayout(strVal1, aReq.timezone) if err != nil { return "", err } - tStart, err := utils.ParseTimeDetectLayout(strVal2, cfgFld.Timezone) + tStart, err := utils.ParseTimeDetectLayout(strVal2, aReq.timezone) if err != nil { return "", err } diff --git a/agents/agentreq_test.go b/agents/agentreq_test.go index 2dbaf3b91..2081dcf18 100644 --- a/agents/agentreq_test.go +++ b/agents/agentreq_test.go @@ -34,7 +34,7 @@ func TestAgReqAsNavigableMap(t *testing.T) { cfg, _ := config.NewDefaultCGRConfig() filterS := engine.NewFilterS(cfg, nil, dm) agReq := newAgentRequest(nil, nil, - "cgrates.org", filterS) + "cgrates.org", "", filterS) // populate request, emulating the way will be done in HTTPAgent agReq.CGRRequest.Set([]string{utils.CGRID}, utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), false) diff --git a/agents/httpagent.go b/agents/httpagent.go index e1d916859..8144329eb 100644 --- a/agents/httpagent.go +++ b/agents/httpagent.go @@ -60,7 +60,9 @@ func (ha *HTTPAgent) ServeHTTP(w http.ResponseWriter, req *http.Request) { } for _, reqProcessor := range ha.reqProcessors { - agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ha.dfltTenant, ha.filterS) + agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ha.dfltTenant, + utils.FirstNonEmpty(reqProcessor.Timezone, config.CgrConfig().DefaultTimezone), + ha.filterS) lclProcessed, err := ha.processRequest(reqProcessor, agReq) if err != nil { utils.Logger.Warning( @@ -93,14 +95,14 @@ func (ha *HTTPAgent) ServeHTTP(w http.ResponseWriter, req *http.Request) { // processRequest represents one processor processing the request func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, agReq *AgentRequest) (processed bool, err error) { - if pass, err := ha.filterS.Pass(agReq.Tenant, + if pass, err := ha.filterS.Pass(agReq.tenant, reqProcessor.Filters, agReq); err != nil || !pass { return pass, err } if agReq.CGRRequest, err = agReq.AsNavigableMap(reqProcessor.RequestFields); err != nil { return } - cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + cgrEv := agReq.CGRRequest.AsCGREvent(agReq.tenant, utils.NestingSep) var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuth, diff --git a/agents/librad_test.go b/agents/librad_test.go index ccf49a128..3fa557357 100644 --- a/agents/librad_test.go +++ b/agents/librad_test.go @@ -97,7 +97,7 @@ func TestRadComposedFieldValue(t *testing.T) { if err := pkt.AddAVPWithName("Cisco-NAS-Port", "CGR1", "Cisco"); err != nil { t.Error(err) } - agReq := newAgentRequest(nil, nil, "cgrates.org", nil) + agReq := newAgentRequest(nil, nil, "cgrates.org", "", nil) agReq.Vars.Set([]string{MetaRadReqType}, MetaRadAcctStart, false) agReq.Vars.Set([]string{"Cisco"}, "CGR1", false) agReq.Vars.Set([]string{"User-Name"}, "flopsy", false) @@ -117,7 +117,7 @@ func TestRadFieldOutVal(t *testing.T) { t.Error(err) } eOut := fmt.Sprintf("%s|flopsy|CGR1", MetaRadAcctStart) - agReq := newAgentRequest(nil, nil, "cgrates.org", nil) + agReq := newAgentRequest(nil, nil, "cgrates.org", "", nil) agReq.Vars.Set([]string{MetaRadReqType}, MetaRadAcctStart, false) agReq.Vars.Set([]string{"Cisco"}, "CGR1", false) agReq.Vars.Set([]string{"User-Name"}, "flopsy", false) @@ -139,7 +139,7 @@ func TestRadReplyAppendAttributes(t *testing.T) { &config.FCTemplate{Tag: "Acct-Session-Time", FieldId: "Acct-Session-Time", Type: utils.META_COMPOSED, Value: config.NewRSRParsersMustCompile("~*cgrep.MaxUsage{*duration_seconds}", true)}, } - agReq := newAgentRequest(nil, nil, "cgrates.org", nil) + agReq := newAgentRequest(nil, nil, "cgrates.org", "", nil) agReq.CGRReply.Set([]string{utils.CapMaxUsage}, time.Duration(time.Hour), false) agReq.CGRReply.Set([]string{utils.CapAttributes, "RadReply"}, "AccessAccept", false) agReq.CGRReply.Set([]string{utils.CapAttributes, utils.Account}, "1001", false) diff --git a/agents/radagent.go b/agents/radagent.go index c009e9949..ffd40eb41 100644 --- a/agents/radagent.go +++ b/agents/radagent.go @@ -83,7 +83,9 @@ func (ra *RadiusAgent) handleAuth(req *radigo.Packet) (rpl *radigo.Packet, err e rpl.Code = radigo.AccessAccept var processed bool for _, reqProcessor := range ra.cgrCfg.RadiusAgentCfg().RequestProcessors { - agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ra.cgrCfg.DefaultTenant, ra.filterS) + agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ra.cgrCfg.DefaultTenant, + utils.FirstNonEmpty(reqProcessor.Timezone, config.CgrConfig().DefaultTimezone), + ra.filterS) agReq.Vars.Set([]string{MetaRadReqType}, utils.StringToInterface(MetaRadAuth), true) var lclProcessed bool if lclProcessed, err = ra.processRequest(reqProcessor, agReq, rpl); lclProcessed { @@ -121,7 +123,9 @@ func (ra *RadiusAgent) handleAcct(req *radigo.Packet) (rpl *radigo.Packet, err e rpl.Code = radigo.AccountingResponse var processed bool for _, reqProcessor := range ra.cgrCfg.RadiusAgentCfg().RequestProcessors { - agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ra.cgrCfg.DefaultTenant, ra.filterS) + agReq := newAgentRequest(dcdr, reqProcessor.Tenant, ra.cgrCfg.DefaultTenant, + utils.FirstNonEmpty(reqProcessor.Timezone, config.CgrConfig().DefaultTimezone), + ra.filterS) var lclProcessed bool if lclProcessed, err = ra.processRequest(reqProcessor, agReq, rpl); lclProcessed { processed = lclProcessed @@ -145,14 +149,14 @@ func (ra *RadiusAgent) handleAcct(req *radigo.Packet) (rpl *radigo.Packet, err e // processRequest represents one processor processing the request func (ra *RadiusAgent) processRequest(reqProcessor *config.RARequestProcessor, agReq *AgentRequest, rply *radigo.Packet) (processed bool, err error) { - if pass, err := ra.filterS.Pass(agReq.Tenant, + if pass, err := ra.filterS.Pass(agReq.tenant, reqProcessor.Filters, agReq); err != nil || !pass { return pass, err } if agReq.CGRRequest, err = agReq.AsNavigableMap(reqProcessor.RequestFields); err != nil { return } - cgrEv := agReq.CGRRequest.AsCGREvent(agReq.Tenant, utils.NestingSep) + cgrEv := agReq.CGRRequest.AsCGREvent(agReq.tenant, utils.NestingSep) var reqType string for _, typ := range []string{ utils.MetaDryRun, utils.MetaAuth, diff --git a/config/httpagntcfg.go b/config/httpagntcfg.go index 96045f33b..29f00f71a 100644 --- a/config/httpagntcfg.go +++ b/config/httpagntcfg.go @@ -80,6 +80,7 @@ type HttpAgntProcCfg struct { Id string Filters []string Tenant RSRParsers + Timezone string Flags utils.StringMap ContinueOnSuccess bool RequestFields []*FCTemplate @@ -104,6 +105,9 @@ func (ha *HttpAgntProcCfg) loadFromJsonCfg(jsnCfg *HttpAgentProcessorJsnCfg) (er return err } } + if jsnCfg.Timezone != nil { + ha.Timezone = *jsnCfg.Timezone + } if jsnCfg.Flags != nil { ha.Flags = utils.StringMapFromSlice(*jsnCfg.Flags) } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index e2113fbe4..d659b3209 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -396,6 +396,7 @@ type HttpAgentProcessorJsnCfg struct { Id *string Filters *[]string Tenant *string + Timezone *string Flags *[]string Continue_on_success *bool Request_fields *[]*FcTemplateJsonCfg