diff --git a/agents/agentreq.go b/agents/agentreq.go index 7d28c7880..dce40c099 100644 --- a/agents/agentreq.go +++ b/agents/agentreq.go @@ -84,6 +84,7 @@ type AgentRequest struct { Header config.DataProvider Trailer config.DataProvider diamreq *config.NavigableMap // used in case of building requests (ie. DisconnectSession) + tmp *config.NavigableMap // used in case you want to store temporary items and access them later } // String implements engine.DataProvider @@ -117,6 +118,8 @@ func (ar *AgentRequest) FieldAsInterface(fldPath []string) (val interface{}, err val, err = ar.Header.FieldAsInterface(fldPath[1:]) case utils.MetaTrl: val, err = ar.Trailer.FieldAsInterface(fldPath[1:]) + case utils.MetaTmp: + val, err = ar.tmp.FieldAsInterface(fldPath[1:]) } return } @@ -141,6 +144,7 @@ func (ar *AgentRequest) AsNavigableMap(tplFlds []*config.FCTemplate) ( //SetFields will populate fields of AgentRequest out of templates func (ar *AgentRequest) SetFields(tplFlds []*config.FCTemplate) (err error) { + ar.tmp = config.NewNavigableMap(nil) for _, tplFld := range tplFlds { if pass, err := ar.filterS.Pass(ar.Tenant, tplFld.Filters, ar); err != nil { @@ -195,6 +199,8 @@ func (ar *AgentRequest) SetFields(tplFlds []*config.FCTemplate) (err error) { ar.Reply.Set(fldPath[1:], valSet, false, true) case utils.MetaDiamreq: ar.diamreq.Set(fldPath[1:], valSet, false, true) + case utils.MetaTmp: + ar.tmp.Set(fldPath[1:], valSet, false, true) } } if tplFld.Blocker { // useful in case of processing errors first diff --git a/agents/agentreq_test.go b/agents/agentreq_test.go index 4499c1b0e..90b4d783c 100644 --- a/agents/agentreq_test.go +++ b/agents/agentreq_test.go @@ -1572,3 +1572,34 @@ func TestAgReqGroupType(t *testing.T) { t.Errorf("expecting: %+v, \n received: %+v ", "test", sls[0].Data) } } + +func TestAgReqSetFieldsInTmp(t *testing.T) { + cfg, _ := config.NewDefaultCGRConfig() + data := engine.NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := engine.NewDataManager(data, config.CgrConfig().CacheCfg(), nil) + filterS := engine.NewFilterS(cfg, nil, dm) + agReq := NewAgentRequest(nil, nil, nil, nil, nil, "cgrates.org", "", filterS, nil, nil) + agReq.CGRRequest.Set([]string{utils.Account}, "1001", false, false) + + tplFlds := []*config.FCTemplate{ + &config.FCTemplate{Tag: "Tenant", + Path: utils.MetaTmp + utils.NestingSep + utils.Tenant, Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("cgrates.org", true, utils.INFIELD_SEP)}, + &config.FCTemplate{Tag: "Account", + Path: utils.MetaTmp + utils.NestingSep + utils.Account, Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("~*cgreq.Account", true, utils.INFIELD_SEP)}, + } + eMp := config.NewNavigableMap(nil) + eMp.Set([]string{utils.Tenant}, []*config.NMItem{ + &config.NMItem{Data: "cgrates.org", Path: []string{utils.Tenant}, + Config: tplFlds[0]}}, false, true) + eMp.Set([]string{utils.Account}, []*config.NMItem{ + &config.NMItem{Data: "1001", Path: []string{utils.Account}, + Config: tplFlds[1]}}, false, true) + + if err := agReq.SetFields(tplFlds); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(agReq.tmp, eMp) { + t.Errorf("expecting: %+v,\n received: %+v", eMp, agReq.tmp) + } +} diff --git a/utils/consts.go b/utils/consts.go index 55fa3e48c..66a077a34 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -552,6 +552,7 @@ const ( MetaExp = "*exp" MetaHdr = "*hdr" MetaTrl = "*trl" + MetaTmp = "*tmp" CGROriginHost = "cgr_originhost" MetaInitiate = "*initiate" MetaUpdate = "*update"