Added *attributesProcessRuns option to control the process runs for AttributeS

This commit is contained in:
Trial97
2020-07-24 18:11:16 +03:00
committed by Dan Christian Bogos
parent 2ab5f1795c
commit 309d745d50
8 changed files with 108 additions and 4 deletions

View File

@@ -88,6 +88,7 @@ var (
testChargerSRemChargerProfile,
testChargerSPing,
testChargerSProcessWithNotFoundAttribute,
testChargerSProccessEventWithProcceSRunS,
testChargerSKillEngine,
}
)
@@ -432,6 +433,7 @@ func testChargerSProcessWithNotFoundAttribute(t *testing.T) {
}
processedEv := []*engine.ChrgSProcessEventReply{
{
Opts: map[string]interface{}{utils.Subsys: utils.MetaChargers},
ChargerSProfile: "ChargerWithoutAttribute",
AttributeSProfiles: []string{},
AlteredFields: []string{utils.MetaReqRunID},
@@ -450,7 +452,7 @@ func testChargerSProcessWithNotFoundAttribute(t *testing.T) {
if err := chargerRPC.Call(utils.ChargerSv1ProcessEvent, ev, &rply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(rply, processedEv) {
t.Errorf("Expecting : %+v, received: %+v", processedEv, rply)
t.Errorf("Expecting : %+v, received: %+v", utils.ToJSON(processedEv), utils.ToJSON(rply))
}
}
@@ -459,3 +461,69 @@ func testChargerSKillEngine(t *testing.T) {
t.Error(err)
}
}
func testChargerSProccessEventWithProcceSRunS(t *testing.T) {
chargerProfile = &ChargerWithCache{
ChargerProfile: &engine.ChargerProfile{
Tenant: "cgrates.org",
ID: "ApierTest",
FilterIDs: []string{"*string:~*req.Account:1010"},
ActivationInterval: &utils.ActivationInterval{
ActivationTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC),
ExpiryTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC),
},
RunID: utils.MetaDefault,
AttributeIDs: []string{"*constant:*req.Account:1002", "*constant:*req.Account:1003"},
Weight: 20,
},
}
var result string
if err := chargerRPC.Call(utils.APIerSv1SetChargerProfile, chargerProfile, &result); err != nil {
t.Error(err)
} else if result != utils.OK {
t.Error("Unexpected reply returned", result)
}
var reply *engine.ChargerProfile
if err := chargerRPC.Call(utils.APIerSv1GetChargerProfile,
&utils.TenantID{Tenant: "cgrates.org", ID: "ApierTest"}, &reply); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(chargerProfile.ChargerProfile, reply) {
t.Errorf("Expecting : %+v, received: %+v", chargerProfile.ChargerProfile, reply)
}
processedEv := []*engine.ChrgSProcessEventReply{
{
ChargerSProfile: "ApierTest",
AttributeSProfiles: []string{"*constant:*req.Account:1002"},
AlteredFields: []string{utils.MetaReqRunID, "*req.Account"},
Opts: map[string]interface{}{
utils.Subsys: utils.MetaChargers,
utils.OptsAttributesProcessRuns: 1.,
},
CGREvent: &utils.CGREvent{ // matching Charger1
Tenant: "cgrates.org",
ID: "event1",
Event: map[string]interface{}{
utils.Account: "1002",
utils.RunID: "*default",
},
},
},
}
cgrEv := &utils.CGREventWithOpts{
CGREvent: &utils.CGREvent{ // matching Charger1
Tenant: "cgrates.org",
ID: "event1",
Event: map[string]interface{}{
utils.Account: "1010",
},
},
Opts: map[string]interface{}{utils.OptsAttributesProcessRuns: 1},
}
var result2 []*engine.ChrgSProcessEventReply
if err := chargerRPC.Call(utils.ChargerSv1ProcessEvent, cgrEv, &result2); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(result2, processedEv) {
t.Errorf("Expecting : %s, received: %s", utils.ToJSON(processedEv), utils.ToJSON(result2))
}
}

View File

@@ -112,12 +112,19 @@ func (eeS *EventExporterS) attrSProcessEvent(cgrEv *utils.CGREventWithOpts, attr
cgrEv.Opts = make(map[string]interface{})
}
cgrEv.Opts[utils.Subsys] = utils.MetaEEs
var processRuns *int
if val, has := cgrEv.Opts[utils.OptsAttributesProcessRuns]; has {
if v, err := utils.IfaceAsTInt64(val); err == nil {
processRuns = utils.IntPointer(int(v))
}
}
attrArgs := &engine.AttrArgsProcessEvent{
AttributeIDs: attrIDs,
Context: utils.StringPointer(ctx),
Opts: cgrEv.Opts,
CGREvent: cgrEv.CGREvent,
ArgDispatcher: cgrEv.ArgDispatcher,
ProcessRuns: processRuns,
}
if err = eeS.connMgr.Call(
eeS.cfg.EEsNoLksCfg().AttributeSConns, nil,

View File

@@ -350,6 +350,12 @@ func (cdrS *CDRServer) attrSProcessEvent(cgrEv *utils.CGREventWithOpts) (err err
cgrEv.Opts = make(map[string]interface{})
}
cgrEv.Opts[utils.Subsys] = utils.MetaCDRs
var processRuns *int
if val, has := cgrEv.Opts[utils.OptsAttributesProcessRuns]; has {
if v, err := utils.IfaceAsTInt64(val); err == nil {
processRuns = utils.IntPointer(int(v))
}
}
attrArgs := &AttrArgsProcessEvent{
Context: utils.StringPointer(utils.FirstNonEmpty(
utils.IfaceAsString(cgrEv.Opts[utils.OptsContext]),
@@ -357,6 +363,7 @@ func (cdrS *CDRServer) attrSProcessEvent(cgrEv *utils.CGREventWithOpts) (err err
CGREvent: cgrEv.CGREvent,
ArgDispatcher: cgrEv.ArgDispatcher,
Opts: cgrEv.Opts,
ProcessRuns: processRuns,
}
if err = cdrS.connMgr.Call(cdrS.cgrCfg.CdrsCfg().AttributeSConns, nil,
utils.AttributeSv1ProcessEvent,

View File

@@ -117,6 +117,12 @@ func (cS *ChargerService) processEvent(cgrEv *utils.CGREventWithOpts) (rply []*C
cgrEv.Opts = make(map[string]interface{})
}
cgrEv.Opts[utils.Subsys] = utils.MetaChargers
var processRuns *int
if val, has := cgrEv.Opts[utils.OptsAttributesProcessRuns]; has {
if v, err := utils.IfaceAsTInt64(val); err == nil {
processRuns = utils.IntPointer(int(v))
}
}
if cPs, err = cS.matchingChargerProfilesForEvent(cgrEv); err != nil {
return nil, err
}
@@ -140,7 +146,7 @@ func (cS *ChargerService) processEvent(cgrEv *utils.CGREventWithOpts) (rply []*C
Context: utils.StringPointer(utils.FirstNonEmpty(
utils.IfaceAsString(opts[utils.OptsContext]),
utils.MetaChargers)),
ProcessRuns: nil,
ProcessRuns: processRuns,
CGREvent: clonedEv.CGREvent,
ArgDispatcher: clonedEv.ArgDispatcher,
Opts: opts,

View File

@@ -621,6 +621,12 @@ func (rpS *RouteService) V1GetRoutes(args *ArgsGetRoutes, reply *SortedRoutes) (
args.Opts = make(map[string]interface{})
}
args.Opts[utils.Subsys] = utils.MetaRoutes
var processRuns *int
if val, has := args.Opts[utils.OptsAttributesProcessRuns]; has {
if v, err := utils.IfaceAsTInt64(val); err == nil {
processRuns = utils.IntPointer(int(v))
}
}
attrArgs := &AttrArgsProcessEvent{
Context: utils.StringPointer(utils.FirstNonEmpty(
utils.IfaceAsString(args.CGREvent.Event[utils.OptsContext]),
@@ -628,6 +634,7 @@ func (rpS *RouteService) V1GetRoutes(args *ArgsGetRoutes, reply *SortedRoutes) (
CGREvent: args.CGREvent,
ArgDispatcher: args.ArgDispatcher,
Opts: args.Opts,
ProcessRuns: processRuns,
}
var rplyEv AttrSProcessEventReply
if err := rpS.connMgr.Call(rpS.cgrcfg.RouteSCfg().AttributeSConns, nil,

View File

@@ -85,6 +85,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium
* [Templates] Added new dataconverter: *string2hex
* [AttributeS] Updated AttributeProfile matching to match the second AttributeProfile with the same weight
* [AttributeS] Updated inline AttributeProfiles to unite all consecutive inline attributes in a single profile
* [SessionS] Added *attributesProcessRuns option to control the process runs for AttributeS
-- DanB <danb@cgrates.org> Wed, 19 Feb 2020 13:25:52 +0200

View File

@@ -3829,6 +3829,12 @@ func (sS *SessionS) processAttributes(cgrEv *utils.CGREvent, argDisp *utils.ArgD
opts = make(engine.MapEvent)
}
opts[utils.Subsys] = utils.MetaSessionS
var processRuns *int
if val, has := opts[utils.OptsAttributesProcessRuns]; has {
if v, err := utils.IfaceAsTInt64(val); err == nil {
processRuns = utils.IntPointer(int(v))
}
}
attrArgs := &engine.AttrArgsProcessEvent{
Context: utils.StringPointer(utils.FirstNonEmpty(
opts.GetStringIgnoreErrors(utils.OptsContext),
@@ -3837,6 +3843,7 @@ func (sS *SessionS) processAttributes(cgrEv *utils.CGREvent, argDisp *utils.ArgD
ArgDispatcher: argDisp,
Opts: opts,
AttributeIDs: attrIDs,
ProcessRuns: processRuns,
}
err = sS.connMgr.Call(sS.cgrCfg.SessionSCfg().AttrSConns, nil, utils.AttributeSv1ProcessEvent,
attrArgs, &rplyEv)

View File

@@ -2261,8 +2261,9 @@ const (
OptsAPIKey = "*dispatcherApiKey"
OptsRouteID = "*dispatcherRouteID"
// Others
OptsContext = "*context"
Subsys = "*subsys"
OptsContext = "*context"
Subsys = "*subsys"
OptsAttributesProcessRuns = "*attributesProcessRuns"
)
// Event Flags