diff --git a/agents/fsevent.go b/agents/fsevent.go index e49c8c430..5b7fe739a 100644 --- a/agents/fsevent.go +++ b/agents/fsevent.go @@ -408,30 +408,16 @@ func (fsev FSEvent) V1AuthorizeArgs() (args *sessions.V1AuthorizeArgs) { if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.GetMaxUsage = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.AuthorizeResources = true - } - if strings.Index(subsystems, utils.MetaSuppliers) != -1 { - args.GetSuppliers = true - if strings.Index(subsystems, utils.MetaSuppliersEventCost) != -1 { - args.SuppliersMaxCost = utils.MetaEventCost - } - if strings.Index(subsystems, utils.MetaSuppliersIgnoreErrors) != -1 { - args.SuppliersIgnoreErrors = true - } - } - if strings.Index(subsystems, utils.MetaAttributes) != -1 { - args.GetAttributes = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) + args.GetMaxUsage = strings.Index(subsystems, utils.MetaAccounts) != -1 + args.AuthorizeResources = strings.Index(subsystems, utils.MetaResources) != -1 + args.GetSuppliers = strings.Index(subsystems, utils.MetaSuppliers) != -1 + args.SuppliersIgnoreErrors = strings.Index(subsystems, utils.MetaSuppliersIgnoreErrors) != -1 + if strings.Index(subsystems, utils.MetaSuppliersEventCost) != -1 { + args.SuppliersMaxCost = utils.MetaEventCost } + args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 + args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 + args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 return } @@ -449,21 +435,11 @@ func (fsev FSEvent) V1InitSessionArgs() (args *sessions.V1InitSessionArgs) { if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.InitSession = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.AllocateResources = true - } - if strings.Index(subsystems, utils.MetaAttributes) != -1 { - args.GetAttributes = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) - } + args.InitSession = strings.Index(subsystems, utils.MetaAccounts) != -1 + args.AllocateResources = strings.Index(subsystems, utils.MetaResources) != -1 + args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 + args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 + args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 return } @@ -481,18 +457,10 @@ func (fsev FSEvent) V1TerminateSessionArgs() (args *sessions.V1TerminateSessionA if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.TerminateSession = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.ReleaseResources = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) - } + 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 return } diff --git a/agents/httpagent.go b/agents/httpagent.go index 536f68a0b..43516765e 100644 --- a/agents/httpagent.go +++ b/agents/httpagent.go @@ -19,12 +19,14 @@ along with this program. If not, see package agents import ( + "errors" "fmt" "net/http" "time" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/sessions" "github.com/cgrates/cgrates/utils" "github.com/cgrates/rpcclient" ) @@ -117,23 +119,111 @@ func (ha *HTTPAgent) processRequest(reqProcessor *config.HttpAgntProcCfg, Time: utils.TimePointer(time.Now()), Event: reqEv.AsMapStringInterface(), } - if reqProcessor.DryRun { + var reqType string + for _, typ := range []string{ + utils.MetaDryRun, utils.MetaAuth, + utils.MetaInitiate, utils.MetaUpdate, + utils.MetaTerminate, utils.MetaEvent} { + if reqProcessor.Flags.HasKey(typ) { // request type is identified through flags + reqType = typ + } + } + switch reqType { + default: + return false, errors.New("unknown request type") + case utils.MetaDryRun: utils.Logger.Info( fmt.Sprintf("<%s> DRY_RUN, processorID: %s, HTTP request: %s", utils.HTTPAgent, reqProcessor.Id, utils.ToJSON(agReq.Request))) utils.Logger.Info( fmt.Sprintf("<%s> DRY_RUN, processorID: %s, CGREvent: %s", - utils.HTTPAgent, reqProcessor.Id, agReq)) + utils.HTTPAgent, reqProcessor.Id, utils.ToJSON(cgrEv))) + case utils.MetaAuth: + authArgs := sessions.NewV1AuthorizeArgs( + reqProcessor.Flags.HasKey(utils.MetaAttributes), + reqProcessor.Flags.HasKey(utils.MetaResources), + reqProcessor.Flags.HasKey(utils.MetaAccounts), + reqProcessor.Flags.HasKey(utils.MetaThresholds), + reqProcessor.Flags.HasKey(utils.MetaStats), + reqProcessor.Flags.HasKey(utils.MetaSuppliers), + reqProcessor.Flags.HasKey(utils.MetaSuppliersIgnoreErrors), + reqProcessor.Flags.HasKey(utils.MetaSuppliersEventCost), + *cgrEv) + var authReply sessions.V1AuthorizeReply + err = ha.sessionS.Call(utils.SessionSv1AuthorizeEvent, + authArgs, &authReply) + if agReq.CGRReply, err = NewCGRReply(&authReply, err); err != nil { + return + } + case utils.MetaInitiate: + initArgs := sessions.NewV1InitSessionArgs( + reqProcessor.Flags.HasKey(utils.MetaAttributes), + reqProcessor.Flags.HasKey(utils.MetaResources), + reqProcessor.Flags.HasKey(utils.MetaAccounts), + reqProcessor.Flags.HasKey(utils.MetaThresholds), + reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + var initReply sessions.V1InitSessionReply + err = ha.sessionS.Call(utils.SessionSv1InitiateSession, + initArgs, &initReply) + if agReq.CGRReply, err = NewCGRReply(&initReply, err); err != nil { + return + } + case utils.MetaUpdate: + updateArgs := sessions.NewV1UpdateSessionArgs( + reqProcessor.Flags.HasKey(utils.MetaAttributes), + reqProcessor.Flags.HasKey(utils.MetaAccounts), *cgrEv) + var updateReply sessions.V1UpdateSessionReply + err = ha.sessionS.Call(utils.SessionSv1UpdateSession, + updateArgs, &updateReply) + if agReq.CGRReply, err = NewCGRReply(&updateReply, err); err != nil { + return + } + case utils.MetaTerminate: + terminateArgs := sessions.NewV1TerminateSessionArgs( + reqProcessor.Flags.HasKey(utils.MetaAccounts), + reqProcessor.Flags.HasKey(utils.MetaResources), + reqProcessor.Flags.HasKey(utils.MetaThresholds), + reqProcessor.Flags.HasKey(utils.MetaStats), *cgrEv) + var tRply string + err = ha.sessionS.Call(utils.SessionSv1TerminateSession, + terminateArgs, &tRply) + if agReq.CGRReply, err = NewCGRReply(nil, err); err != nil { + return + } + case utils.MetaEvent: + evArgs := sessions.NewV1ProcessEventArgs( + reqProcessor.Flags.HasKey(utils.MetaResources), + reqProcessor.Flags.HasKey(utils.MetaAccounts), + reqProcessor.Flags.HasKey(utils.MetaAttributes), *cgrEv) + var eventRply sessions.V1ProcessEventReply + err = ha.sessionS.Call(utils.SessionSv1ProcessEvent, + evArgs, &eventRply) + if utils.ErrHasPrefix(err, utils.RalsErrorPrfx) { + cgrEv.Event[utils.Usage] = 0 // avoid further debits + } else if eventRply.MaxUsage != nil { + cgrEv.Event[utils.Usage] = *eventRply.MaxUsage // make sure the CDR reflects the debit + } + if agReq.CGRReply, err = NewCGRReply(&eventRply, err); err != nil { + return + } } - fmt.Printf("cgrEv: %+v", cgrEv) - /* - ev, err := radReqAsCGREvent(req, procVars, reqProcessor.Flags, reqProcessor.RequestFields) - if err != nil { - return false, err + if reqProcessor.Flags.HasKey(utils.MetaCDRs) && + utils.IsSliceMember([]string{utils.MetaTerminate, utils.MetaEvent}, reqType) { + var rplyCDRs string + if err = ha.sessionS.Call(utils.SessionSv1ProcessCDR, + *cgrEv, &rplyCDRs); err != nil { + agReq.CGRReply.Set([]string{utils.Error}, err.Error(), false) } - if reqProcessor.DryRun { - utils.Logger.Info(fmt.Sprintf("<%s> DRY_RUN, CGREvent: %s", utils.RadiusAgent, utils.ToJSON(cgrEv))) - } - */ + } + if nM, err := agReq.AsNavigableMap(reqProcessor.ReplyFields); err != nil { + return false, err + } else { + agReq.Reply.Merge(nM) + } + if reqType == utils.MetaDryRun { + utils.Logger.Info( + fmt.Sprintf("<%s> DRY_RUN, HTTP reply: %s", + utils.HTTPAgent, agReq.Reply)) + } return } diff --git a/agents/kamevent.go b/agents/kamevent.go index c783cb898..b4ed1b08c 100644 --- a/agents/kamevent.go +++ b/agents/kamevent.go @@ -211,30 +211,16 @@ func (kev KamEvent) V1AuthorizeArgs() (args *sessions.V1AuthorizeArgs) { if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.GetMaxUsage = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.AuthorizeResources = true - } - if strings.Index(subsystems, utils.MetaSuppliers) != -1 { - args.GetSuppliers = true - if strings.Index(subsystems, utils.MetaSuppliersEventCost) != -1 { - args.SuppliersMaxCost = utils.MetaEventCost - } - if strings.Index(subsystems, utils.MetaSuppliersIgnoreErrors) != -1 { - args.SuppliersIgnoreErrors = true - } - } - if strings.Index(subsystems, utils.MetaAttributes) != -1 { - args.GetAttributes = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) + args.GetMaxUsage = strings.Index(subsystems, utils.MetaAccounts) != -1 + args.AuthorizeResources = strings.Index(subsystems, utils.MetaResources) != -1 + args.GetSuppliers = strings.Index(subsystems, utils.MetaSuppliers) != -1 + args.SuppliersIgnoreErrors = strings.Index(subsystems, utils.MetaSuppliersIgnoreErrors) != -1 + if strings.Index(subsystems, utils.MetaSuppliersEventCost) != -1 { + args.SuppliersMaxCost = utils.MetaEventCost } + args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 + args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 + args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 return } @@ -270,10 +256,10 @@ func (kev KamEvent) AsKamAuthReply(authArgs *sessions.V1AuthorizeArgs, kar.Suppliers = authReply.Suppliers.Digest() } - if authArgs.ProcessThresholds != nil && *authArgs.ProcessThresholds { + if authArgs.ProcessThresholds { kar.Thresholds = strings.Join(*authReply.ThresholdIDs, utils.FIELDS_SEP) } - if authArgs.ProcessStatQueues != nil && *authArgs.ProcessStatQueues { + if authArgs.ProcessStats { kar.StatQueues = strings.Join(*authReply.StatQueueIDs, utils.FIELDS_SEP) } return @@ -293,21 +279,11 @@ func (kev KamEvent) V1InitSessionArgs() (args *sessions.V1InitSessionArgs) { if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.InitSession = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.AllocateResources = true - } - if strings.Index(subsystems, utils.MetaAttributes) != -1 { - args.GetAttributes = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) - } + args.InitSession = strings.Index(subsystems, utils.MetaAccounts) != -1 + args.AllocateResources = strings.Index(subsystems, utils.MetaResources) != -1 + args.GetAttributes = strings.Index(subsystems, utils.MetaAttributes) != -1 + args.ProcessThresholds = strings.Index(subsystems, utils.MetaThresholds) != -1 + args.ProcessStats = strings.Index(subsystems, utils.MetaStats) != -1 return } @@ -325,18 +301,10 @@ func (kev KamEvent) V1TerminateSessionArgs() (args *sessions.V1TerminateSessionA if !has { return } - if strings.Index(subsystems, utils.MetaAccounts) == -1 { - args.TerminateSession = false - } - if strings.Index(subsystems, utils.MetaResources) != -1 { - args.ReleaseResources = true - } - if strings.Index(subsystems, utils.MetaThresholds) != -1 { - args.ProcessThresholds = utils.BoolPointer(true) - } - if strings.Index(subsystems, utils.MetaStats) != -1 { - args.ProcessStatQueues = utils.BoolPointer(true) - } + 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 return } diff --git a/agents/librad.go b/agents/librad.go index b1e23ff6c..0cf2f9d4e 100644 --- a/agents/librad.go +++ b/agents/librad.go @@ -402,16 +402,15 @@ func radReplyAppendAttributes(reply *radigo.Packet, procVars map[string]interfac // NewCGRReply is specific to replies coming from CGRateS func NewCGRReply(rply engine.NavigableMapper, - errRply error) (mp map[string]interface{}, err error) { + errRply error) (mp *engine.NavigableMap, err error) { if errRply != nil { - return map[string]interface{}{ - utils.Error: errRply.Error()}, nil + return engine.NewNavigableMap(map[string]interface{}{ + utils.Error: errRply.Error()}), nil } - nM, err := rply.AsNavigableMap(nil) + mp, err = rply.AsNavigableMap(nil) if err != nil { return nil, err } - mp = nM.AsMapStringInterface() - mp[utils.Error] = "" // enforce empty error + mp.Set([]string{utils.Error}, "", false) // enforce empty error return mp, nil } diff --git a/agents/librad_test.go b/agents/librad_test.go index 850ce2456..89d0b7ed3 100644 --- a/agents/librad_test.go +++ b/agents/librad_test.go @@ -433,9 +433,9 @@ func (ev myEv) AsNavigableMap(tpl []*config.CfgCdrField) (*engine.NavigableMap, } func TestNewCGRReply(t *testing.T) { - eCgrRply := map[string]interface{}{ + eCgrRply := engine.NewNavigableMap(map[string]interface{}{ utils.Error: "some", - } + }) if rpl, err := NewCGRReply(nil, errors.New("some")); err != nil { t.Error(err) } else if !reflect.DeepEqual(eCgrRply, rpl) { @@ -449,8 +449,8 @@ func TestNewCGRReply(t *testing.T) { }, }, } - eCgrRply = ev - eCgrRply[utils.Error] = "" + eCgrRply = engine.NewNavigableMap(ev) + eCgrRply.Set([]string{utils.Error}, "", false) if rpl, err := NewCGRReply(engine.NavigableMapper(ev), nil); err != nil { t.Error(err) } else if !reflect.DeepEqual(eCgrRply, rpl) { diff --git a/config/httpagntcfg.go b/config/httpagntcfg.go index cec7d5520..4dccecb57 100644 --- a/config/httpagntcfg.go +++ b/config/httpagntcfg.go @@ -85,7 +85,6 @@ func (ca *HttpAgentCfg) loadFromJsonCfg(jsnCfg *HttpAgentJsonCfg) (err error) { type HttpAgntProcCfg struct { Id string - DryRun bool Filters []string Flags utils.StringMap ContinueOnSuccess bool @@ -100,9 +99,6 @@ func (ha *HttpAgntProcCfg) loadFromJsonCfg(jsnCfg *HttpAgentProcessorJsnCfg) (er if jsnCfg.Id != nil { ha.Id = *jsnCfg.Id } - if jsnCfg.Dry_run != nil { - ha.DryRun = *jsnCfg.Dry_run - } if jsnCfg.Filters != nil { ha.Filters = make([]string, len(*jsnCfg.Filters)) for i, fltr := range *jsnCfg.Filters { diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 42c7db629..efd79a892 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -386,7 +386,6 @@ type HttpAgentJsonCfg struct { type HttpAgentProcessorJsnCfg struct { Id *string - Dry_run *bool Filters *[]string Flags *[]string Continue_on_success *bool diff --git a/engine/navigablemap.go b/engine/navigablemap.go index 08831f046..2c6b8c562 100644 --- a/engine/navigablemap.go +++ b/engine/navigablemap.go @@ -48,20 +48,21 @@ type NavigableMap struct { } // Add will add items into NavigableMap populating also order -func (nM *NavigableMap) Add(path []string, data interface{}) { - nM.order = append(nM.order) +func (nM *NavigableMap) Set(path []string, data interface{}, ordered bool) { mp := nM.data for i, spath := range path { - _, has := mp[spath] - if !has { - if i == len(path)-1 { // last path - mp[spath] = data - return - } + if i == len(path)-1 { // last path + mp[spath] = data + return + } + if _, has := mp[spath]; !has { mp[spath] = make(map[string]interface{}) } mp = mp[spath].(map[string]interface{}) // so we can check further down } + if ordered { + nM.order = append(nM.order) + } } // FieldAsInterface returns the field value as interface{} for the path specified @@ -162,3 +163,15 @@ func (nM *NavigableMap) Items() (itms []*NMItem) { func (nM *NavigableMap) AsNavigableMap(tpl []*config.CfgCdrField) (oNM *NavigableMap, err error) { return nil, utils.ErrNotImplemented } + +func (nM *NavigableMap) Merge(nM2 *NavigableMap) { + if nM2 == nil { + return + } + for k, v := range nM2.data { + nM.data[k] = v + } + if len(nM2.order) != 0 { + nM.order = append(nM.order, nM2.order...) + } +} diff --git a/engine/navigablemap_test.go b/engine/navigablemap_test.go index a6f064f6e..698782f83 100644 --- a/engine/navigablemap_test.go +++ b/engine/navigablemap_test.go @@ -148,16 +148,16 @@ func TestNavMapAdd(t *testing.T) { nM := NewNavigableMap(nil) path := []string{"FistLever2", "SecondLevel2", "Field2"} data := "Value2" - nM.Add(path, data) + nM.Set(path, data, true) path = []string{"FirstLevel", "SecondLevel", "ThirdLevel", "Fld1"} data = "Val1" - nM.Add(path, data) + nM.Set(path, data, true) path = []string{"FistLever2", "Field3"} data = "Value3" - nM.Add(path, data) + nM.Set(path, data, true) path = []string{"Field4"} data = "Val4" - nM.Add(path, data) + nM.Set(path, data, true) eNavMap := NavigableMap{ data: map[string]interface{}{ "FirstLevel": map[string]interface{}{ @@ -190,19 +190,19 @@ func TestNavMapAdd2(t *testing.T) { nM := NewNavigableMap(nil) path := []string{"FistLever2", "SecondLevel2", "Field2"} data := 123 - nM.Add(path, data) + nM.Set(path, data, true) path = []string{"FirstLevel", "SecondLevel", "ThirdLevel", "Fld1"} data1 := 123.123 - nM.Add(path, data1) + nM.Set(path, data1, true) path = []string{"FistLever2", "Field3"} data2 := "Value3" - nM.Add(path, data2) + nM.Set(path, data2, true) path = []string{"Field4"} data3 := &testStruct{ Item1: "Ten", Item2: 10, } - nM.Add(path, data3) + nM.Set(path, data3, true) eNavMap := NavigableMap{ data: map[string]interface{}{ "FirstLevel": map[string]interface{}{ diff --git a/sessions/sessions.go b/sessions/sessions.go index f0d7aa7d6..f54ddd960 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1327,15 +1327,35 @@ func (smg *SMGeneric) BiRPCV1ReplicatePassiveSessions(clnt rpcclient.RpcClientCo return } +// NewV1AuthorizeArgs is a constructor for V1AuthorizeArgs +func NewV1AuthorizeArgs(attrs, res, maxUsage, thrslds, + statQueues, suppls, supplsIgnoreErrs, supplsEventCost bool, + cgrEv utils.CGREvent) (args *V1AuthorizeArgs) { + args = &V1AuthorizeArgs{ + GetAttributes: attrs, + AuthorizeResources: res, + GetMaxUsage: maxUsage, + ProcessThresholds: thrslds, + ProcessStats: statQueues, + SuppliersIgnoreErrors: supplsIgnoreErrs, + GetSuppliers: suppls, + CGREvent: cgrEv, + } + if supplsEventCost { + args.SuppliersMaxCost = utils.MetaSuppliersEventCost + } + return +} + type V1AuthorizeArgs struct { GetAttributes bool AuthorizeResources bool GetMaxUsage bool + ProcessThresholds bool + ProcessStats bool GetSuppliers bool SuppliersMaxCost string SuppliersIgnoreErrors bool - ProcessThresholds *bool - ProcessStatQueues *bool utils.CGREvent utils.Paginator } @@ -1462,11 +1482,7 @@ func (smg *SMGeneric) BiRPCv1AuthorizeEvent(clnt rpcclient.RpcClientConnection, authReply.Suppliers = &splsReply } } - checkThresholds := smg.thdS != nil - if args.ProcessThresholds != nil { - checkThresholds = *args.ProcessThresholds - } - if checkThresholds { + if smg.thdS != nil && args.ProcessThresholds { if smg.thdS == nil { return utils.NewErrNotConnected(utils.ThresholdS) } @@ -1481,11 +1497,7 @@ func (smg *SMGeneric) BiRPCv1AuthorizeEvent(clnt rpcclient.RpcClientConnection, } authReply.ThresholdIDs = &tIDs } - checkStatQueues := smg.statS != nil - if args.ProcessStatQueues != nil { - checkStatQueues = *args.ProcessStatQueues - } - if checkStatQueues { + if smg.statS != nil && args.ProcessStats { if smg.statS == nil { return utils.NewErrNotConnected(utils.StatService) } @@ -1536,23 +1548,35 @@ func (smg *SMGeneric) BiRPCv1AuthorizeEventWithDigest(clnt rpcclient.RpcClientCo if args.GetSuppliers { authReply.SuppliersDigest = utils.StringPointer(initAuthRply.Suppliers.Digest()) } - if args.ProcessThresholds != nil && *args.ProcessThresholds { + if args.ProcessThresholds { authReply.Thresholds = utils.StringPointer( strings.Join(*initAuthRply.ThresholdIDs, utils.FIELDS_SEP)) } - if args.ProcessStatQueues != nil && *args.ProcessStatQueues { + if args.ProcessStats { authReply.StatQueues = utils.StringPointer( strings.Join(*initAuthRply.StatQueueIDs, utils.FIELDS_SEP)) } return nil } +func NewV1InitSessionArgs(attrs, resrc, acnt, thrslds, stats bool, + cgrEv utils.CGREvent) *V1InitSessionArgs { + return &V1InitSessionArgs{ + GetAttributes: attrs, + AllocateResources: resrc, + InitSession: acnt, + ProcessThresholds: thrslds, + ProcessStats: stats, + CGREvent: cgrEv, + } +} + type V1InitSessionArgs struct { GetAttributes bool AllocateResources bool InitSession bool - ProcessThresholds *bool - ProcessStatQueues *bool + ProcessThresholds bool + ProcessStats bool utils.CGREvent } @@ -1650,11 +1674,7 @@ func (smg *SMGeneric) BiRPCv1InitiateSession(clnt rpcclient.RpcClientConnection, rply.MaxUsage = &maxUsage } } - checkThresholds := smg.thdS != nil - if args.ProcessThresholds != nil { - checkThresholds = *args.ProcessThresholds - } - if checkThresholds { + if smg.thdS != nil && args.ProcessThresholds { if smg.thdS == nil { return utils.NewErrNotConnected(utils.ThresholdS) } @@ -1669,11 +1689,7 @@ func (smg *SMGeneric) BiRPCv1InitiateSession(clnt rpcclient.RpcClientConnection, } rply.ThresholdIDs = &tIDs } - checkStatQueues := smg.statS != nil - if args.ProcessStatQueues != nil { - checkStatQueues = *args.ProcessStatQueues - } - if checkStatQueues { + if smg.statS != nil && args.ProcessStats { if smg.statS == nil { return utils.NewErrNotConnected(utils.StatService) } @@ -1722,17 +1738,23 @@ func (smg *SMGeneric) BiRPCv1InitiateSessionWithDigest(clnt rpcclient.RpcClientC } } - if args.ProcessThresholds != nil && *args.ProcessThresholds { + if args.ProcessThresholds { initReply.Thresholds = utils.StringPointer( strings.Join(*initSessionRply.ThresholdIDs, utils.FIELDS_SEP)) } - if args.ProcessStatQueues != nil && *args.ProcessStatQueues { + if args.ProcessStats { initReply.StatQueues = utils.StringPointer( strings.Join(*initSessionRply.StatQueueIDs, utils.FIELDS_SEP)) } return nil } +func NewV1UpdateSessionArgs(attrs, acnts bool, + cgrEv utils.CGREvent) *V1UpdateSessionArgs { + return &V1UpdateSessionArgs{GetAttributes: attrs, + UpdateSession: acnts, CGREvent: cgrEv} +} + type V1UpdateSessionArgs struct { GetAttributes bool UpdateSession bool @@ -1804,11 +1826,21 @@ func (smg *SMGeneric) BiRPCv1UpdateSession(clnt rpcclient.RpcClientConnection, return } +func NewV1TerminateSessionArgs(acnts, resrc, thrds, stats bool, + cgrEv utils.CGREvent) *V1TerminateSessionArgs { + return &V1TerminateSessionArgs{ + TerminateSession: acnts, + ReleaseResources: resrc, + ProcessThresholds: thrds, + ProcessStats: stats, + CGREvent: cgrEv} +} + type V1TerminateSessionArgs struct { TerminateSession bool ReleaseResources bool - ProcessThresholds *bool - ProcessStatQueues *bool + ProcessThresholds bool + ProcessStats bool utils.CGREvent } @@ -1851,11 +1883,7 @@ func (smg *SMGeneric) BiRPCv1TerminateSession(clnt rpcclient.RpcClientConnection return utils.NewErrResourceS(err) } } - checkThresholds := smg.thdS != nil - if args.ProcessThresholds != nil { - checkThresholds = *args.ProcessThresholds - } - if checkThresholds { + if smg.thdS != nil && args.ProcessThresholds { if smg.thdS == nil { return utils.NewErrNotConnected(utils.ThresholdS) } @@ -1869,14 +1897,7 @@ func (smg *SMGeneric) BiRPCv1TerminateSession(clnt rpcclient.RpcClientConnection fmt.Sprintf(" error: %s processing event %+v with ThresholdS.", err.Error(), thEv)) } } - checkStatQueues := smg.statS != nil - if args.ProcessStatQueues != nil { - checkStatQueues = *args.ProcessStatQueues - } - if checkStatQueues { - if smg.statS == nil { - return utils.NewErrNotConnected(utils.StatService) - } + if smg.statS != nil && args.ProcessStats { var statReply []string if err := smg.statS.Call(utils.StatSv1ProcessEvent, &args.CGREvent, &statReply); err != nil && err.Error() != utils.ErrNotFound.Error() { @@ -1898,6 +1919,16 @@ func (smg *SMGeneric) BiRPCv1ProcessCDR(clnt rpcclient.RpcClientConnection, return nil } +func NewV1ProcessEventArgs(resrc, acnts, attrs bool, + cgrEv utils.CGREvent) *V1ProcessEventArgs { + return &V1ProcessEventArgs{ + AllocateResources: resrc, + Debit: acnts, + GetAttributes: attrs, + CGREvent: cgrEv, + } +} + type V1ProcessEventArgs struct { AllocateResources bool Debit bool diff --git a/utils/consts.go b/utils/consts.go index e60bbd99e..8b7a8db6e 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -547,6 +547,11 @@ const ( MetaVars = "*vars" MetaReply = "*reply" CGROriginHost = "cgr_originhost" + MetaInitiate = "*initiate" + MetaUpdate = "*update" + MetaTerminate = "*terminate" + MetaEvent = "*event" + MetaDryRun = "*dryrun" ) // Migrator Action