From c363286b56279ec327c518c9be45ea86e1845004 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 20 Jul 2020 12:52:48 +0300 Subject: [PATCH] Added *derived_reply sub flag for SessionSv1.ProcessEvent --- apier/v1/sessions_process_event_it_test.go | 6 +++-- .../samples/sipagent_internal/redirect.json | 2 +- .../conf/samples/sipagent_mongo/redirect.json | 2 +- .../conf/samples/sipagent_mysql/redirect.json | 2 +- packages/debian/changelog | 3 ++- sessions/libsessions.go | 10 +++++++++ sessions/libsessions_test.go | 16 ++++++++++++++ sessions/sessions.go | 22 ++++++++++--------- utils/consts.go | 2 +- utils/map.go | 2 +- utils/map_test.go | 6 ++--- 11 files changed, 52 insertions(+), 21 deletions(-) diff --git a/apier/v1/sessions_process_event_it_test.go b/apier/v1/sessions_process_event_it_test.go index 8e8f7eccd..f4da6737f 100644 --- a/apier/v1/sessions_process_event_it_test.go +++ b/apier/v1/sessions_process_event_it_test.go @@ -157,6 +157,7 @@ func testSSv1ItProcessEventAuth(t *testing.T) { authUsage := 5 * time.Minute args := &sessions.V1ProcessEventArgs{ Flags: []string{utils.ConcatenatedKey(utils.MetaResources, utils.MetaAuthorize), + utils.ConcatenatedKey(utils.MetaResources, utils.MetaDerivedReply), utils.ConcatenatedKey(utils.MetaRALs, utils.MetaAuthorize), utils.MetaRoutes, utils.MetaAttributes, utils.MetaChargers}, CGREvent: &utils.CGREvent{ @@ -237,8 +238,9 @@ func testSSv1ItProcessEventInitiateSession(t *testing.T) { initUsage := 5 * time.Minute args := &sessions.V1ProcessEventArgs{ Flags: []string{utils.ConcatenatedKey(utils.MetaRALs, utils.MetaInitiate), - utils.ConcatenatedKey(utils.MetaResources, utils.MetaAllocate), utils.MetaAttributes, - utils.MetaChargers}, + utils.ConcatenatedKey(utils.MetaResources, utils.MetaAllocate), + utils.ConcatenatedKey(utils.MetaResources, utils.MetaDerivedReply), + utils.MetaAttributes, utils.MetaChargers}, CGREvent: &utils.CGREvent{ Tenant: "cgrates.org", ID: "testSSv1ItProcessEventInitiateSession", diff --git a/data/conf/samples/sipagent_internal/redirect.json b/data/conf/samples/sipagent_internal/redirect.json index 6b8580623..1907f1c82 100644 --- a/data/conf/samples/sipagent_internal/redirect.json +++ b/data/conf/samples/sipagent_internal/redirect.json @@ -15,7 +15,7 @@ { "id": "RoutesQuery", "filters": ["*string:~*vars.Method:INVITE"], - "flags": ["*event","*chargers", "*routes", "*attributes","*continue"], + "flags": ["*event","*chargers", "*routes", "*attributes:*derived_reply","*continue"], "request_fields":[ {"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.From{*sipuri_user}", "mandatory": true}, diff --git a/data/conf/samples/sipagent_mongo/redirect.json b/data/conf/samples/sipagent_mongo/redirect.json index 6b8580623..1907f1c82 100644 --- a/data/conf/samples/sipagent_mongo/redirect.json +++ b/data/conf/samples/sipagent_mongo/redirect.json @@ -15,7 +15,7 @@ { "id": "RoutesQuery", "filters": ["*string:~*vars.Method:INVITE"], - "flags": ["*event","*chargers", "*routes", "*attributes","*continue"], + "flags": ["*event","*chargers", "*routes", "*attributes:*derived_reply","*continue"], "request_fields":[ {"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.From{*sipuri_user}", "mandatory": true}, diff --git a/data/conf/samples/sipagent_mysql/redirect.json b/data/conf/samples/sipagent_mysql/redirect.json index 6b8580623..1907f1c82 100644 --- a/data/conf/samples/sipagent_mysql/redirect.json +++ b/data/conf/samples/sipagent_mysql/redirect.json @@ -15,7 +15,7 @@ { "id": "RoutesQuery", "filters": ["*string:~*vars.Method:INVITE"], - "flags": ["*event","*chargers", "*routes", "*attributes","*continue"], + "flags": ["*event","*chargers", "*routes", "*attributes:*derived_reply","*continue"], "request_fields":[ {"tag": "Account", "path": "*cgreq.Account", "type": "*variable", "value": "~*req.From{*sipuri_user}", "mandatory": true}, diff --git a/packages/debian/changelog b/packages/debian/changelog index d6bf33d4c..6cd59c55d 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -80,7 +80,8 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [SessionS] Rename from ResourceMessage to ResourceAllocation * [LoaderS] Updated file selector from *req to *file(FileName) * [SessionS] Added *chargers flag to ProcessEvent to proccess the events from ChargerS with other subsystems - * [SessionS] Updated the ids handling in flags by ading *ids as a new flag + * [SessionS] Updated the ids handling in flags by adding *ids as a new flag + * [SessionS] Added *derived_reply sub flag to ProcessEvent to specify if a subsystem needs to process the events from ChargerS -- DanB Wed, 19 Feb 2020 13:25:52 +0200 diff --git a/sessions/libsessions.go b/sessions/libsessions.go index c1d8d18c4..a6d8d2ef4 100644 --- a/sessions/libsessions.go +++ b/sessions/libsessions.go @@ -263,3 +263,13 @@ type V1STIRIdentityArgs struct { OverwriteIAT bool // if true the IAT from payload is overwrited with the present unix timestamp *utils.ArgDispatcher } + +// getDerivedEvents returns only the *raw event if derivedReply flag is not specified +func getDerivedEvents(events map[string]*utils.CGREventWithOpts, derivedReply bool) map[string]*utils.CGREventWithOpts { + if derivedReply { + return events + } + return map[string]*utils.CGREventWithOpts{ + utils.MetaRaw: events[utils.MetaRaw], + } +} diff --git a/sessions/libsessions_test.go b/sessions/libsessions_test.go index 780d58e19..168bdea81 100644 --- a/sessions/libsessions_test.go +++ b/sessions/libsessions_test.go @@ -295,3 +295,19 @@ aa+jqv4dwkr/FLEcN1zC76Y/IniI65fId55hVJvN3ORuzUqYEtzD3irmsw== t.Fatal(err) } } + +func TestGetDerivedEvents(t *testing.T) { + events := map[string]*utils.CGREventWithOpts{ + utils.MetaRaw: {}, + "DEFAULT": {}, + } + if rply := getDerivedEvents(events, true); !reflect.DeepEqual(events, rply) { + t.Errorf("Expected %s received %s", utils.ToJSON(events), utils.ToJSON(rply)) + } + exp := map[string]*utils.CGREventWithOpts{ + utils.MetaRaw: events[utils.MetaRaw], + } + if rply := getDerivedEvents(events, false); !reflect.DeepEqual(exp, rply) { + t.Errorf("Expected %s received %s", utils.ToJSON(exp), utils.ToJSON(rply)) + } +} diff --git a/sessions/sessions.go b/sessions/sessions.go index 9b25fff20..aa91d5a4e 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -3179,7 +3179,8 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, if argsFlagsWithParams.GetBool(utils.MetaAttributes) { attrIDs := argsFlagsWithParams.ParamsSlice(utils.MetaAttributes, utils.MetaIDs) rply.Attributes = make(map[string]*engine.AttrSProcessEventReply) - for runID, cgrEv := range events { + + for runID, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaAttributes].Has(utils.MetaDerivedReply)) { rplyAttr, err := sS.processAttributes(cgrEv.CGREvent, cgrEv.ArgDispatcher, attrIDs, cgrEv.Opts) if err != nil { @@ -3207,7 +3208,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, if flags.Has(utils.MetaEventCost) { maxCost = utils.MetaRoutesEventCost } - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, flags.Has(utils.MetaDerivedReply)) { routesReply, err := sS.getRoutes(cgrEv.CGREvent.Clone(), cgrEv.ArgDispatcher, args.Paginator, ignoreErrors, maxCost, cgrEv.Opts) if err != nil { @@ -3223,7 +3224,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, if argsFlagsWithParams.GetBool(utils.MetaThresholds) { rply.ThresholdIDs = make(map[string][]string) thIDs := argsFlagsWithParams.ParamsSlice(utils.MetaThresholds, utils.MetaIDs) - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaThresholds].Has(utils.MetaDerivedReply)) { tIDs, err := sS.processThreshold(cgrEv.CGREvent, cgrEv.ArgDispatcher, thIDs) if err != nil && err.Error() != utils.ErrNotFound.Error() { utils.Logger.Warning( @@ -3239,7 +3240,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, if argsFlagsWithParams.GetBool(utils.MetaStats) { rply.StatQueueIDs = make(map[string][]string) stIDs := argsFlagsWithParams.ParamsSlice(utils.MetaStats, utils.MetaIDs) - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaStats].Has(utils.MetaDerivedReply)) { sIDs, err := sS.processStats(cgrEv.CGREvent, cgrEv.ArgDispatcher, stIDs) if err != nil && err.Error() != utils.ErrNotFound.Error() { @@ -3253,7 +3254,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, } if argsFlagsWithParams.GetBool(utils.MetaSTIRAuthenticate) { - for _, cgrEv := range events { + for _, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaSTIRAuthenticate].Has(utils.MetaDerivedReply)) { ev := engine.MapEvent(cgrEv.CGREvent.Event) opts := engine.MapEvent(cgrEv.Opts) attest := sS.cgrCfg.SessionSCfg().STIRCfg.AllowedAttest @@ -3275,7 +3276,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, } } else if argsFlagsWithParams.GetBool(utils.MetaSTIRInitiate) { rply.STIRIdentity = make(map[string]string) - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaSTIRInitiate].Has(utils.MetaDerivedReply)) { ev := engine.MapEvent(cgrEv.CGREvent.Event) opts := engine.MapEvent(cgrEv.Opts) attest := sS.cgrCfg.SessionSCfg().STIRCfg.DefaultAttest @@ -3315,7 +3316,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, } rply.ResourceAllocation = make(map[string]string) if resOpt := argsFlagsWithParams[utils.MetaResources]; len(resOpt) != 0 { - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, resOpt.Has(utils.MetaDerivedReply)) { originID := engine.MapEvent(cgrEv.CGREvent.Event).GetStringIgnoreErrors(utils.OriginID) if originID == "" { return utils.NewErrMandatoryIeMissing(utils.OriginID) @@ -3362,7 +3363,7 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, // check for *cost if ralsOpts.Has(utils.MetaCost) { rply.Cost = make(map[string]float64) - for runID, cgrEv := range events { + for runID, cgrEv := range getDerivedEvents(events, ralsOpts.Has(utils.MetaDerivedReply)) { ev := engine.MapEvent(cgrEv.CGREvent.Event) //compose the CallDescriptor with Args startTime := ev.GetTimeIgnoreErrors(utils.AnswerTime, @@ -3497,10 +3498,11 @@ func (sS *SessionS) BiRPCv1ProcessEvent(clnt rpcclient.ClientConnector, if argsFlagsWithParams.GetBool(utils.MetaCDRs) { var cdrRply string - for _, cgrEv := range events { + flgs := argsFlagsWithParams[utils.MetaCDRs].SliceFlags() + for _, cgrEv := range getDerivedEvents(events, argsFlagsWithParams[utils.MetaCDRs].Has(utils.MetaDerivedReply)) { if err := sS.connMgr.Call(sS.cgrCfg.SessionSCfg().CDRsConns, nil, utils.CDRsV1ProcessEvent, &engine.ArgV1ProcessEvent{ - Flags: argsFlagsWithParams[utils.MetaCDRs].SliceFlags(), + Flags: flgs, CGREvent: *cgrEv.CGREvent, ArgDispatcher: cgrEv.ArgDispatcher, }, &cdrRply); err != nil { diff --git a/utils/consts.go b/utils/consts.go index bc5e035bf..83c892f96 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -2264,7 +2264,7 @@ const ( // Event Flags const ( - MetaDerivedReply = "*derivedreply" + MetaDerivedReply = "*derived_reply" MetaIDs = "*ids" diff --git a/utils/map.go b/utils/map.go index b7763d213..01f5f1074 100644 --- a/utils/map.go +++ b/utils/map.go @@ -298,7 +298,7 @@ func (fWp FlagsWithParams) SliceFlags() (sls []string) { continue } for opt, values := range sub { - if len(values) == 0 { // it's an option without values(e.g *derivedreply) + if len(values) == 0 { // it's an option without values(e.g *derived_reply) sls = append(sls, ConcatenatedKey(key, opt)) continue } diff --git a/utils/map_test.go b/utils/map_test.go index e58d82359..a79e9cade 100644 --- a/utils/map_test.go +++ b/utils/map_test.go @@ -197,7 +197,7 @@ func TestMapHasKey(t *testing.T) { } func TestMapSubsystemIDsFromSlice(t *testing.T) { - sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*thresholds:*derivedreply", "*attributes:*disabled", "*stats:*ids:ID"} + sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*thresholds:*derived_reply", "*attributes:*disabled", "*stats:*ids:ID"} eMp := FlagsWithParams{ "*event": map[string][]string{}, "*thresholds": map[string][]string{MetaIDs: {"ID1", "ID2", "ID3"}, MetaDerivedReply: {}}, @@ -258,7 +258,7 @@ func TestMapSubsystemIDsGetIDs(t *testing.T) { } func TestFlagsToSlice(t *testing.T) { - sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*attributes", "*stats:*ids:ID", "*routes:*derivedreply"} + sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*attributes", "*stats:*ids:ID", "*routes:*derived_reply"} eMp := FlagsWithParams{ "*event": map[string][]string{}, "*thresholds": map[string][]string{MetaIDs: {"ID1", "ID2", "ID3"}}, @@ -319,7 +319,7 @@ func TestFlagParamsAdd(t *testing.T) { } func TestFlagsToSlice2(t *testing.T) { - sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*attributes", "*stats:*ids:ID", "*routes:*derivedreply", "*cdrs:*attributes", "*cdrs:*stats:ID"} + sls := []string{"*event", "*thresholds:*ids:ID1;ID2;ID3", "*attributes", "*stats:*ids:ID", "*routes:*derived_reply", "*cdrs:*attributes", "*cdrs:*stats:ID"} eMp := FlagsWithParams{ "*event": map[string][]string{}, "*thresholds": map[string][]string{MetaIDs: {"ID1", "ID2", "ID3"}},