From 73809633bf667854b7d1ae1a67c0f1f67cf0f5fd Mon Sep 17 00:00:00 2001 From: TeoV Date: Thu, 25 Jun 2020 12:22:05 +0300 Subject: [PATCH 1/3] [LoaderS] Add *req as mandatory prefix --- config/config_defaults.go | 222 +++++++++--------- config/config_json_test.go | 222 +++++++++--------- config/config_test.go | 222 +++++++++--------- config/generalcfg.go | 2 +- .../samples/loaders/tutmongo/cgrates.json | 22 +- .../samples/loaders/tutmysql/cgrates.json | 22 +- loaders/libloader.go | 50 ++-- loaders/libloader_test.go | 48 ++-- loaders/loader_test.go | 196 ++++++++-------- packages/debian/changelog | 1 + 10 files changed, 514 insertions(+), 493 deletions(-) diff --git a/config/config_defaults.go b/config/config_defaults.go index 7819643a8..6c05cada1 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -660,171 +660,171 @@ const CGRATES_CFG_JSON = ` "type": "*attributes", // data source type "file_name": "Attributes.csv", // file name in the tp_in_dir "fields": [ - {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~2"}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~3"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~4"}, - {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~5"}, - {"tag": "Path", "path": "Path", "type": "*variable", "value": "~6"}, - {"tag": "Type", "path": "Type", "type": "*variable", "value": "~7"}, - {"tag": "Value", "path": "Value", "type": "*variable", "value": "~8"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~9"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~10"}, + {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~*req.2"}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.3"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.4"}, + {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~*req.5"}, + {"tag": "Path", "path": "Path", "type": "*variable", "value": "~*req.6"}, + {"tag": "Type", "path": "Type", "type": "*variable", "value": "~*req.7"}, + {"tag": "Value", "path": "Value", "type": "*variable", "value": "~*req.8"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.9"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.10"}, ], }, { "type": "*filters", // data source type "file_name": "Filters.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Type", "path": "Type", "type": "*variable", "value": "~2"}, - {"tag": "Element", "path": "Element", "type": "*variable", "value": "~3"}, - {"tag": "Values", "path": "Values", "type": "*variable", "value": "~4"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~5"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Type", "path": "Type", "type": "*variable", "value": "~*req.2"}, + {"tag": "Element", "path": "Element", "type": "*variable", "value": "~*req.3"}, + {"tag": "Values", "path": "Values", "type": "*variable", "value": "~*req.4"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.5"}, ], }, { "type": "*resources", // data source type "file_name": "Resources.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "TTL", "path": "UsageTTL", "type": "*variable", "value": "~4"}, - {"tag": "Limit", "path": "Limit", "type": "*variable", "value": "~5"}, - {"tag": "AllocationMessage", "path": "AllocationMessage", "type": "*variable", "value": "~6"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~7"}, - {"tag": "Stored", "path": "Stored", "type": "*variable", "value": "~8"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~9"}, - {"tag": "ThresholdIDs", "path": "ThresholdIDs", "type": "*variable", "value": "~10"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "TTL", "path": "UsageTTL", "type": "*variable", "value": "~*req.4"}, + {"tag": "Limit", "path": "Limit", "type": "*variable", "value": "~*req.5"}, + {"tag": "AllocationMessage", "path": "AllocationMessage", "type": "*variable", "value": "~*req.6"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.7"}, + {"tag": "Stored", "path": "Stored", "type": "*variable", "value": "~*req.8"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.9"}, + {"tag": "ThresholdIDs", "path": "ThresholdIDs", "type": "*variable", "value": "~*req.10"}, ], }, { "type": "*stats", // data source type "file_name": "Stats.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "QueueLength", "path": "QueueLength", "type": "*variable", "value": "~4"}, - {"tag": "TTL", "path": "TTL", "type": "*variable", "value": "~5"}, - {"tag": "MinItems", "path": "MinItems", "type": "*variable", "value": "~6"}, - {"tag": "MetricIDs", "path": "MetricIDs", "type": "*variable", "value": "~7"}, - {"tag": "MetricFilterIDs", "path": "MetricFilterIDs", "type": "*variable", "value": "~8"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~9"}, - {"tag": "Stored", "path": "Stored", "type": "*variable", "value": "~10"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~11"}, - {"tag": "ThresholdIDs", "path": "ThresholdIDs", "type": "*variable", "value": "~12"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "QueueLength", "path": "QueueLength", "type": "*variable", "value": "~*req.4"}, + {"tag": "TTL", "path": "TTL", "type": "*variable", "value": "~*req.5"}, + {"tag": "MinItems", "path": "MinItems", "type": "*variable", "value": "~*req.6"}, + {"tag": "MetricIDs", "path": "MetricIDs", "type": "*variable", "value": "~*req.7"}, + {"tag": "MetricFilterIDs", "path": "MetricFilterIDs", "type": "*variable", "value": "~*req.8"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.9"}, + {"tag": "Stored", "path": "Stored", "type": "*variable", "value": "~*req.10"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.11"}, + {"tag": "ThresholdIDs", "path": "ThresholdIDs", "type": "*variable", "value": "~*req.12"}, ], }, { "type": "*thresholds", // data source type "file_name": "Thresholds.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "MaxHits", "path": "MaxHits", "type": "*variable", "value": "~4"}, - {"tag": "MinHits", "path": "MinHits", "type": "*variable", "value": "~5"}, - {"tag": "MinSleep", "path": "MinSleep", "type": "*variable", "value": "~6"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~7"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~8"}, - {"tag": "ActionIDs", "path": "ActionIDs", "type": "*variable", "value": "~9"}, - {"tag": "Async", "path": "Async", "type": "*variable", "value": "~10"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "MaxHits", "path": "MaxHits", "type": "*variable", "value": "~*req.4"}, + {"tag": "MinHits", "path": "MinHits", "type": "*variable", "value": "~*req.5"}, + {"tag": "MinSleep", "path": "MinSleep", "type": "*variable", "value": "~*req.6"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.7"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.8"}, + {"tag": "ActionIDs", "path": "ActionIDs", "type": "*variable", "value": "~*req.9"}, + {"tag": "Async", "path": "Async", "type": "*variable", "value": "~*req.10"}, ], }, { "type": "*routes", // data source type "file_name": "Routes.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "Sorting", "path": "Sorting", "type": "*variable", "value": "~4"}, - {"tag": "SortingParameters", "path": "SortingParameters", "type": "*variable", "value": "~5"}, - {"tag": "RouteID", "path": "RouteID", "type": "*variable", "value": "~6"}, - {"tag": "RouteFilterIDs", "path": "RouteFilterIDs", "type": "*variable", "value": "~7"}, - {"tag": "RouteAccountIDs", "path": "RouteAccountIDs", "type": "*variable", "value": "~8"}, - {"tag": "RouteRatingPlanIDs", "path": "RouteRatingPlanIDs", "type": "*variable", "value": "~9"}, - {"tag": "RouteResourceIDs", "path": "RouteResourceIDs", "type": "*variable", "value": "~10"}, - {"tag": "RouteStatIDs", "path": "RouteStatIDs", "type": "*variable", "value": "~11"}, - {"tag": "RouteWeight", "path": "RouteWeight", "type": "*variable", "value": "~12"}, - {"tag": "RouteBlocker", "path": "RouteBlocker", "type": "*variable", "value": "~13"}, - {"tag": "RouteParameters", "path": "RouteParameters", "type": "*variable", "value": "~14"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~15"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "Sorting", "path": "Sorting", "type": "*variable", "value": "~*req.4"}, + {"tag": "SortingParameters", "path": "SortingParameters", "type": "*variable", "value": "~*req.5"}, + {"tag": "RouteID", "path": "RouteID", "type": "*variable", "value": "~*req.6"}, + {"tag": "RouteFilterIDs", "path": "RouteFilterIDs", "type": "*variable", "value": "~*req.7"}, + {"tag": "RouteAccountIDs", "path": "RouteAccountIDs", "type": "*variable", "value": "~*req.8"}, + {"tag": "RouteRatingPlanIDs", "path": "RouteRatingPlanIDs", "type": "*variable", "value": "~*req.9"}, + {"tag": "RouteResourceIDs", "path": "RouteResourceIDs", "type": "*variable", "value": "~*req.10"}, + {"tag": "RouteStatIDs", "path": "RouteStatIDs", "type": "*variable", "value": "~*req.11"}, + {"tag": "RouteWeight", "path": "RouteWeight", "type": "*variable", "value": "~*req.12"}, + {"tag": "RouteBlocker", "path": "RouteBlocker", "type": "*variable", "value": "~*req.13"}, + {"tag": "RouteParameters", "path": "RouteParameters", "type": "*variable", "value": "~*req.14"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.15"}, ], }, { "type": "*chargers", // data source type "file_name": "Chargers.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "RunID", "path": "RunID", "type": "*variable", "value": "~4"}, - {"tag": "AttributeIDs", "path": "AttributeIDs", "type": "*variable", "value": "~5"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~6"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "RunID", "path": "RunID", "type": "*variable", "value": "~*req.4"}, + {"tag": "AttributeIDs", "path": "AttributeIDs", "type": "*variable", "value": "~*req.5"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.6"}, ], }, { "type": "*dispatchers", // data source type "file_name": "DispatcherProfiles.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~2"}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~3"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~4"}, - {"tag": "Strategy", "path": "Strategy", "type": "*variable", "value": "~5"}, - {"tag": "StrategyParameters", "path": "StrategyParameters", "type": "*variable", "value": "~6"}, - {"tag": "ConnID", "path": "ConnID", "type": "*variable", "value": "~7"}, - {"tag": "ConnFilterIDs", "path": "ConnFilterIDs", "type": "*variable", "value": "~8"}, - {"tag": "ConnWeight", "path": "ConnWeight", "type": "*variable", "value": "~9"}, - {"tag": "ConnBlocker", "path": "ConnBlocker", "type": "*variable", "value": "~10"}, - {"tag": "ConnParameters", "path": "ConnParameters", "type": "*variable", "value": "~11"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~12"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~*req.2"}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.3"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.4"}, + {"tag": "Strategy", "path": "Strategy", "type": "*variable", "value": "~*req.5"}, + {"tag": "StrategyParameters", "path": "StrategyParameters", "type": "*variable", "value": "~*req.6"}, + {"tag": "ConnID", "path": "ConnID", "type": "*variable", "value": "~*req.7"}, + {"tag": "ConnFilterIDs", "path": "ConnFilterIDs", "type": "*variable", "value": "~*req.8"}, + {"tag": "ConnWeight", "path": "ConnWeight", "type": "*variable", "value": "~*req.9"}, + {"tag": "ConnBlocker", "path": "ConnBlocker", "type": "*variable", "value": "~*req.10"}, + {"tag": "ConnParameters", "path": "ConnParameters", "type": "*variable", "value": "~*req.11"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.12"}, ], }, { "type": "*dispatcher_hosts", // data source type "file_name": "DispatcherHosts.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Address", "path": "Address", "type": "*variable", "value": "~2"}, - {"tag": "Transport", "path": "Transport", "type": "*variable", "value": "~3"}, - {"tag": "TLS", "path": "TLS", "type": "*variable", "value": "~4"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Address", "path": "Address", "type": "*variable", "value": "~*req.2"}, + {"tag": "Transport", "path": "Transport", "type": "*variable", "value": "~*req.3"}, + {"tag": "TLS", "path": "TLS", "type": "*variable", "value": "~*req.4"}, ], }, { "type": "*rate_profiles", // data source type "file_name": "RateProfiles.csv", // file name in the tp_in_dir "fields": [ - {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~2"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~3"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~4"}, - {"tag": "ConnectFee", "path": "ConnectFee", "type": "*variable", "value": "~5"}, - {"tag": "RoundingMethod", "path": "RoundingMethod", "type": "*variable", "value": "~6"}, - {"tag": "RoundingDecimals", "path": "RoundingDecimals", "type": "*variable", "value": "~7"}, - {"tag": "MinCost", "path": "MinCost", "type": "*variable", "value": "~8"}, - {"tag": "MaxCost", "path": "MaxCost", "type": "*variable", "value": "~9"}, - {"tag": "MaxCostStrategy", "path": "MaxCostStrategy", "type": "*variable", "value": "~10"}, - {"tag": "RateID", "path": "RateID", "type": "*variable", "value": "~11"}, - {"tag": "RateFilterIDs", "path": "RateFilterIDs", "type": "*variable", "value": "~12"}, - {"tag": "RateWeight", "path": "RateWeight", "type": "*variable", "value": "~13"}, - {"tag": "RateValue", "path": "RateValue", "type": "*variable", "value": "~14"}, - {"tag": "RateUnit", "path": "RateUnit", "type": "*variable", "value": "~15"}, - {"tag": "RateIncrement", "path": "RateIncrement", "type": "*variable", "value": "~16"}, - {"tag": "RateBlocker", "path": "RateBlocker", "type": "*variable", "value": "~17"}, + {"tag": "Tenant", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.2"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.3"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.4"}, + {"tag": "ConnectFee", "path": "ConnectFee", "type": "*variable", "value": "~*req.5"}, + {"tag": "RoundingMethod", "path": "RoundingMethod", "type": "*variable", "value": "~*req.6"}, + {"tag": "RoundingDecimals", "path": "RoundingDecimals", "type": "*variable", "value": "~*req.7"}, + {"tag": "MinCost", "path": "MinCost", "type": "*variable", "value": "~*req.8"}, + {"tag": "MaxCost", "path": "MaxCost", "type": "*variable", "value": "~*req.9"}, + {"tag": "MaxCostStrategy", "path": "MaxCostStrategy", "type": "*variable", "value": "~*req.10"}, + {"tag": "RateID", "path": "RateID", "type": "*variable", "value": "~*req.11"}, + {"tag": "RateFilterIDs", "path": "RateFilterIDs", "type": "*variable", "value": "~*req.12"}, + {"tag": "RateWeight", "path": "RateWeight", "type": "*variable", "value": "~*req.13"}, + {"tag": "RateValue", "path": "RateValue", "type": "*variable", "value": "~*req.14"}, + {"tag": "RateUnit", "path": "RateUnit", "type": "*variable", "value": "~*req.15"}, + {"tag": "RateIncrement", "path": "RateIncrement", "type": "*variable", "value": "~*req.16"}, + {"tag": "RateBlocker", "path": "RateBlocker", "type": "*variable", "value": "~*req.17"}, ], }, ], diff --git a/config/config_json_test.go b/config/config_json_test.go index 69fc530b7..701053982 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -1162,49 +1162,49 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer("TenantID"), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("ProfileID"), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("Contexts"), Path: utils.StringPointer(utils.Contexts), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer(utils.FilterIDs), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("AttributeFilterIDs"), Path: utils.StringPointer("AttributeFilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("Path"), Path: utils.StringPointer(utils.Path), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("Type"), Path: utils.StringPointer("Type"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("Value"), Path: utils.StringPointer("Value"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("Blocker"), Path: utils.StringPointer("Blocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer(utils.Weight), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, }, }, { @@ -1214,29 +1214,29 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("Type"), Path: utils.StringPointer("Type"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("Element"), Path: utils.StringPointer("Element"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("Values"), Path: utils.StringPointer("Values"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, }, }, { @@ -1246,49 +1246,49 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("TTL"), Path: utils.StringPointer("UsageTTL"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("Limit"), Path: utils.StringPointer("Limit"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("AllocationMessage"), Path: utils.StringPointer("AllocationMessage"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("Blocker"), Path: utils.StringPointer("Blocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("Stored"), Path: utils.StringPointer("Stored"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("ThresholdIDs"), Path: utils.StringPointer("ThresholdIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, }, }, { @@ -1298,58 +1298,58 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("QueueLength"), Path: utils.StringPointer("QueueLength"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("TTL"), Path: utils.StringPointer("TTL"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("MinItems"), Path: utils.StringPointer("MinItems"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("MetricIDs"), Path: utils.StringPointer("MetricIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("MetricFilterIDs"), Path: utils.StringPointer("MetricFilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("Blocker"), Path: utils.StringPointer("Blocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("Stored"), Path: utils.StringPointer("Stored"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~11")}, + Value: utils.StringPointer("~*req.11")}, {Tag: utils.StringPointer("ThresholdIDs"), Path: utils.StringPointer("ThresholdIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~12")}, + Value: utils.StringPointer("~*req.12")}, }, }, { @@ -1359,49 +1359,49 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("MaxHits"), Path: utils.StringPointer("MaxHits"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("MinHits"), Path: utils.StringPointer("MinHits"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("MinSleep"), Path: utils.StringPointer("MinSleep"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("Blocker"), Path: utils.StringPointer("Blocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("ActionIDs"), Path: utils.StringPointer("ActionIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("Async"), Path: utils.StringPointer("Async"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, }, }, { @@ -1411,69 +1411,69 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("Sorting"), Path: utils.StringPointer("Sorting"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("SortingParameters"), Path: utils.StringPointer("SortingParameters"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("RouteID"), Path: utils.StringPointer("RouteID"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("RouteFilterIDs"), Path: utils.StringPointer("RouteFilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("RouteAccountIDs"), Path: utils.StringPointer("RouteAccountIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("RouteRatingPlanIDs"), Path: utils.StringPointer("RouteRatingPlanIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("RouteResourceIDs"), Path: utils.StringPointer("RouteResourceIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, {Tag: utils.StringPointer("RouteStatIDs"), Path: utils.StringPointer("RouteStatIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~11")}, + Value: utils.StringPointer("~*req.11")}, {Tag: utils.StringPointer("RouteWeight"), Path: utils.StringPointer("RouteWeight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~12")}, + Value: utils.StringPointer("~*req.12")}, {Tag: utils.StringPointer("RouteBlocker"), Path: utils.StringPointer("RouteBlocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~13")}, + Value: utils.StringPointer("~*req.13")}, {Tag: utils.StringPointer("RouteParameters"), Path: utils.StringPointer("RouteParameters"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~14")}, + Value: utils.StringPointer("~*req.14")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~15")}, + Value: utils.StringPointer("~*req.15")}, }, }, { @@ -1483,33 +1483,33 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("RunID"), Path: utils.StringPointer("RunID"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("AttributeIDs"), Path: utils.StringPointer("AttributeIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, }, }, { @@ -1519,57 +1519,57 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("Contexts"), Path: utils.StringPointer("Contexts"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("Strategy"), Path: utils.StringPointer("Strategy"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("StrategyParameters"), Path: utils.StringPointer("StrategyParameters"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("ConnID"), Path: utils.StringPointer("ConnID"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("ConnFilterIDs"), Path: utils.StringPointer("ConnFilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("ConnWeight"), Path: utils.StringPointer("ConnWeight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("ConnBlocker"), Path: utils.StringPointer("ConnBlocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, {Tag: utils.StringPointer("ConnParameters"), Path: utils.StringPointer("ConnParameters"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~11")}, + Value: utils.StringPointer("~*req.11")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~12")}, + Value: utils.StringPointer("~*req.12")}, }, }, { @@ -1579,25 +1579,25 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("Address"), Path: utils.StringPointer("Address"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("Transport"), Path: utils.StringPointer("Transport"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("TLS"), Path: utils.StringPointer("TLS"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, }, }, { @@ -1607,77 +1607,77 @@ func TestDfLoaderJsonCfg(t *testing.T) { {Tag: utils.StringPointer(utils.Tenant), Path: utils.StringPointer(utils.Tenant), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~0"), + Value: utils.StringPointer("~*req.0"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer(utils.ID), Path: utils.StringPointer(utils.ID), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~1"), + Value: utils.StringPointer("~*req.1"), Mandatory: utils.BoolPointer(true)}, {Tag: utils.StringPointer("FilterIDs"), Path: utils.StringPointer("FilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~2")}, + Value: utils.StringPointer("~*req.2")}, {Tag: utils.StringPointer("ActivationInterval"), Path: utils.StringPointer("ActivationInterval"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~3")}, + Value: utils.StringPointer("~*req.3")}, {Tag: utils.StringPointer("Weight"), Path: utils.StringPointer("Weight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~4")}, + Value: utils.StringPointer("~*req.4")}, {Tag: utils.StringPointer("ConnectFee"), Path: utils.StringPointer("ConnectFee"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~5")}, + Value: utils.StringPointer("~*req.5")}, {Tag: utils.StringPointer("RoundingMethod"), Path: utils.StringPointer("RoundingMethod"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~6")}, + Value: utils.StringPointer("~*req.6")}, {Tag: utils.StringPointer("RoundingDecimals"), Path: utils.StringPointer("RoundingDecimals"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~7")}, + Value: utils.StringPointer("~*req.7")}, {Tag: utils.StringPointer("MinCost"), Path: utils.StringPointer("MinCost"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~8")}, + Value: utils.StringPointer("~*req.8")}, {Tag: utils.StringPointer("MaxCost"), Path: utils.StringPointer("MaxCost"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~9")}, + Value: utils.StringPointer("~*req.9")}, {Tag: utils.StringPointer("MaxCostStrategy"), Path: utils.StringPointer("MaxCostStrategy"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~10")}, + Value: utils.StringPointer("~*req.10")}, {Tag: utils.StringPointer("RateID"), Path: utils.StringPointer("RateID"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~11")}, + Value: utils.StringPointer("~*req.11")}, {Tag: utils.StringPointer("RateFilterIDs"), Path: utils.StringPointer("RateFilterIDs"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~12")}, + Value: utils.StringPointer("~*req.12")}, {Tag: utils.StringPointer("RateWeight"), Path: utils.StringPointer("RateWeight"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~13")}, + Value: utils.StringPointer("~*req.13")}, {Tag: utils.StringPointer("RateValue"), Path: utils.StringPointer("RateValue"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~14")}, + Value: utils.StringPointer("~*req.14")}, {Tag: utils.StringPointer("RateUnit"), Path: utils.StringPointer("RateUnit"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~15")}, + Value: utils.StringPointer("~*req.15")}, {Tag: utils.StringPointer("RateIncrement"), Path: utils.StringPointer("RateIncrement"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~16")}, + Value: utils.StringPointer("~*req.16")}, {Tag: utils.StringPointer("RateBlocker"), Path: utils.StringPointer("RateBlocker"), Type: utils.StringPointer(utils.MetaVariable), - Value: utils.StringPointer("~17")}, + Value: utils.StringPointer("~*req.17")}, }, }, }, diff --git a/config/config_test.go b/config/config_test.go index a2f560328..2413d9c24 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -1048,7 +1048,7 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "TenantID", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339, }, @@ -1056,7 +1056,7 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { Tag: "ProfileID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339, }, @@ -1064,57 +1064,57 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { Tag: "Contexts", Path: "Contexts", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, { Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, { Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, { Tag: "AttributeFilterIDs", Path: "AttributeFilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, { Tag: "Path", Path: "Path", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Type", Path: "Type", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Value", Path: "Value", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Blocker", Path: "Blocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, }, @@ -1126,34 +1126,34 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "Type", Path: "Type", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Element", Path: "Element", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Values", Path: "Values", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1164,59 +1164,59 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "TTL", Path: "UsageTTL", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Limit", Path: "Limit", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "AllocationMessage", Path: "AllocationMessage", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Blocker", Path: "Blocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Stored", Path: "Stored", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ThresholdIDs", Path: "ThresholdIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1227,70 +1227,70 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "QueueLength", Path: "QueueLength", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "TTL", Path: "TTL", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MinItems", Path: "MinItems", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MetricIDs", Path: "MetricIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MetricFilterIDs", Path: "MetricFilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Blocker", Path: "Blocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Stored", Path: "Stored", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ThresholdIDs", Path: "ThresholdIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1301,59 +1301,59 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MaxHits", Path: "MaxHits", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MinHits", Path: "MinHits", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "MinSleep", Path: "MinSleep", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Blocker", Path: "Blocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActionIDs", Path: "ActionIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Async", Path: "Async", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1364,84 +1364,84 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Sorting", Path: "Sorting", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "SortingParameters", Path: "SortingParameters", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteID", Path: "RouteID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteFilterIDs", Path: "RouteFilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteAccountIDs", Path: "RouteAccountIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteRatingPlanIDs", Path: "RouteRatingPlanIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteResourceIDs", Path: "RouteResourceIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteStatIDs", Path: "RouteStatIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteWeight", Path: "RouteWeight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteBlocker", Path: "RouteBlocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~13", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RouteParameters", Path: "RouteParameters", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~14", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.14", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~15", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.15", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1452,39 +1452,39 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "RunID", Path: "RunID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "AttributeIDs", Path: "AttributeIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339}, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339}, }, }, @@ -1495,79 +1495,79 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "Contexts", Path: "Contexts", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Strategy", Path: "Strategy", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "StrategyParameters", Path: "StrategyParameters", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnID", Path: "ConnID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnFilterIDs", Path: "ConnFilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnWeight", Path: "ConnWeight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnBlocker", Path: "ConnBlocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnParameters", Path: "ConnParameters", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, }, @@ -1579,31 +1579,31 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "Address", Path: "Address", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Transport", Path: "Transport", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "TLS", Path: "TLS", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, }, @@ -1615,109 +1615,109 @@ func TestCgrLoaderCfgITDefaults(t *testing.T) { {Tag: "Tenant", Path: "Tenant", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "ID", Path: "ID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, Layout: time.RFC3339}, {Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "ConnectFee", Path: "ConnectFee", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RoundingMethod", Path: "RoundingMethod", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RoundingDecimals", Path: "RoundingDecimals", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "MinCost", Path: "MinCost", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "MaxCost", Path: "MaxCost", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "MaxCostStrategy", Path: "MaxCostStrategy", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateID", Path: "RateID", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateFilterIDs", Path: "RateFilterIDs", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateWeight", Path: "RateWeight", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~13", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateValue", Path: "RateValue", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~14", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.14", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateUnit", Path: "RateUnit", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~15", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.15", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateIncrement", Path: "RateIncrement", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~16", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.16", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, {Tag: "RateBlocker", Path: "RateBlocker", Type: utils.MetaVariable, - Value: NewRSRParsersMustCompile("~17", true, utils.INFIELD_SEP), + Value: NewRSRParsersMustCompile("~*req.17", true, utils.INFIELD_SEP), Layout: time.RFC3339, }, }, diff --git a/config/generalcfg.go b/config/generalcfg.go index 80b49a38d..be80a19b7 100644 --- a/config/generalcfg.go +++ b/config/generalcfg.go @@ -49,7 +49,7 @@ type GeneralCfg struct { LockingTimeout time.Duration // locking mechanism timeout to avoid deadlocks DigestSeparator string // DigestEqual string // - RSRSep string // separator used to split RSRParser (by degault is used ";") + RSRSep string // separator used to split RSRParser (by default is used ";") MaxParralelConns int // the maximum number of connection used by the *parallel strategy } diff --git a/data/conf/samples/loaders/tutmongo/cgrates.json b/data/conf/samples/loaders/tutmongo/cgrates.json index e15e906c4..00c7fe56a 100644 --- a/data/conf/samples/loaders/tutmongo/cgrates.json +++ b/data/conf/samples/loaders/tutmongo/cgrates.json @@ -120,17 +120,17 @@ "type": "*attributes", // data source type "file_name": "Attributes.csv", // file name in the tp_in_dir "fields": [ - {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~2"}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~3"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~4"}, - {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~5"}, - {"tag": "Path", "path": "Path", "type": "*variable", "value": "~6"}, - {"tag": "Type", "path": "Type", "type": "*variable", "value": "~7"}, - {"tag": "Value", "path": "Value", "type": "*variable", "value": "~8"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~9"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~10"}, + {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~*req.2"}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.3"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.4"}, + {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~*req.5"}, + {"tag": "Path", "path": "Path", "type": "*variable", "value": "~*req.6"}, + {"tag": "Type", "path": "Type", "type": "*variable", "value": "~*req.7"}, + {"tag": "Value", "path": "Value", "type": "*variable", "value": "~*req.8"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.9"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.10"}, ], }, ], diff --git a/data/conf/samples/loaders/tutmysql/cgrates.json b/data/conf/samples/loaders/tutmysql/cgrates.json index c74ce0a3b..1d4c9674d 100644 --- a/data/conf/samples/loaders/tutmysql/cgrates.json +++ b/data/conf/samples/loaders/tutmysql/cgrates.json @@ -80,17 +80,17 @@ "type": "*attributes", // data source type "file_name": "Attributes.csv", // file name in the tp_in_dir "fields": [ - {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~0", "mandatory": true}, - {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~1", "mandatory": true}, - {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~2"}, - {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~3"}, - {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~4"}, - {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~5"}, - {"tag": "Path", "path": "Path", "type": "*variable", "value": "~6"}, - {"tag": "Type", "path": "Type", "type": "*variable", "value": "~7"}, - {"tag": "Value", "path": "Value", "type": "*variable", "value": "~8"}, - {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~9"}, - {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~10"}, + {"tag": "TenantID", "path": "Tenant", "type": "*variable", "value": "~*req.0", "mandatory": true}, + {"tag": "ProfileID", "path": "ID", "type": "*variable", "value": "~*req.1", "mandatory": true}, + {"tag": "Contexts", "path": "Contexts", "type": "*variable", "value": "~*req.2"}, + {"tag": "FilterIDs", "path": "FilterIDs", "type": "*variable", "value": "~*req.3"}, + {"tag": "ActivationInterval", "path": "ActivationInterval", "type": "*variable", "value": "~*req.4"}, + {"tag": "AttributeFilterIDs", "path": "AttributeFilterIDs", "type": "*variable", "value": "~*req.5"}, + {"tag": "Path", "path": "Path", "type": "*variable", "value": "~*req.6"}, + {"tag": "Type", "path": "Type", "type": "*variable", "value": "~*req.7"}, + {"tag": "Value", "path": "Value", "type": "*variable", "value": "~*req.8"}, + {"tag": "Blocker", "path": "Blocker", "type": "*variable", "value": "~*req.9"}, + {"tag": "Weight", "path": "Weight", "type": "*variable", "value": "~*req.10"}, ], }, ], diff --git a/loaders/libloader.go b/loaders/libloader.go index 550f023d6..b0995ec0e 100644 --- a/loaders/libloader.go +++ b/loaders/libloader.go @@ -22,6 +22,7 @@ import ( "fmt" "net" "strconv" + "strings" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" @@ -48,13 +49,13 @@ func (ld LoaderData) TenantIDStruct() utils.TenantID { func (ld LoaderData) UpdateFromCSV(fileName string, record []string, cfgTpl []*config.FCTemplate, tnt config.RSRParsers, filterS *engine.FilterS) (err error) { csvProvider := newCsvProvider(record, fileName) + tenant, err := tnt.ParseValue("") + if err != nil { + return err + } for _, cfgFld := range cfgTpl { // Make sure filters are matching if len(cfgFld.Filters) != 0 { - tenant, err := tnt.ParseValue("") - if err != nil { - return err - } if pass, err := filterS.Pass(tenant, cfgFld.Filters, csvProvider); err != nil { return err @@ -62,7 +63,7 @@ func (ld LoaderData) UpdateFromCSV(fileName string, record []string, continue // Not passes filters, ignore this CDR } } - out, err := cfgFld.Value.ParseDataProvider(csvProvider, utils.InInFieldSep) + out, err := cfgFld.Value.ParseDataProvider(csvProvider, utils.NestingSep) if err != nil { return err } @@ -111,17 +112,36 @@ func (cP *csvProvider) FieldAsInterface(fldPath []string) (data interface{}, err return } err = nil // cancel previous err - idx := fldPath[0] - var fileName string - if len(fldPath) == 2 { - fileName = fldPath[0] - idx = fldPath[1] + + if splt := strings.Split(fldPath[0], utils.MatchLessThan); len(splt) != 1 { + var fileName string + // check for *req prefix + if splt[0] != utils.MetaReq { + return nil, fmt.Errorf("invalid prefix for : %s", fldPath) + } + fileName = splt[1] + // find the last > and compute the name of the file + hasGrThan := false + for _, val := range fldPath[1:] { + if grSplt := strings.Split(val, utils.MatchGreaterThan); len(grSplt) == 1 { + fileName = fileName + utils.NestingSep + val + } else { + fileName = fileName + utils.NestingSep + grSplt[0] + hasGrThan = true + break + } + } + if !hasGrThan { + return nil, fmt.Errorf("filter rule <%s> needs to end in >", fldPath) + } + if cP.fileName != fileName { + cP.cache.Set(fldPath, nil) + return + } + } else if fldPath[0] != utils.MetaReq { + return nil, fmt.Errorf("invalid prefix for : %s", fldPath) } - if fileName != "" && cP.fileName != fileName { - cP.cache.Set(fldPath, nil) - return - } - if cfgFieldIdx, err := strconv.Atoi(idx); err != nil || len(cP.req) <= cfgFieldIdx { + if cfgFieldIdx, err := strconv.Atoi(fldPath[len(fldPath)-1]); err != nil || len(cP.req) <= cfgFieldIdx { return nil, fmt.Errorf("Ignoring record: %v with error : %+v", cP.req, err) } else { data = cP.req[cfgFieldIdx] diff --git a/loaders/libloader_test.go b/loaders/libloader_test.go index 0546825d4..c0d5d5223 100644 --- a/loaders/libloader_test.go +++ b/loaders/libloader_test.go @@ -31,45 +31,45 @@ func TestDataUpdateFromCSVOneFile(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Contexts", Path: "Contexts", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Path", Path: "Path", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Initial", Path: "Initial", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Substitute", Path: "Substitute", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Append", Path: "Append", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, } rows := [][]string{ @@ -121,45 +121,45 @@ func TestDataUpdateFromCSVOneFile2(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Contexts", Path: "Contexts", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Path", Path: "Path", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Initial", Path: "Initial", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Substitute", Path: "Substitute", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Append", Path: "Append", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.MetaVariable, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, } rows := [][]string{ @@ -216,7 +216,7 @@ func TestDataUpdateFromCSVMultiFiles(t *testing.T) { &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File2.csv:1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Contexts", Path: "Contexts", @@ -225,15 +225,15 @@ func TestDataUpdateFromCSVMultiFiles(t *testing.T) { &config.FCTemplate{Tag: "Path", Path: "Path", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File1.csv:5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Initial", Path: "Initial", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File1.csv:6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Substitute", Path: "Substitute", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File1.csv:7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Append", Path: "Append", Type: utils.MetaString, diff --git a/loaders/loader_test.go b/loaders/loader_test.go index 46a082286..2b6f09545 100644 --- a/loaders/loader_test.go +++ b/loaders/loader_test.go @@ -45,49 +45,49 @@ func TestLoaderProcessContentSingleFile(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Contexts", Path: "Contexts", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "AttributeFilterIDs", Path: "AttributeFilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Path", Path: "Path", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Type", Path: "Type", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Value", Path: "Value", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Blocker", Path: "Blocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.AttributesCSVContent)) @@ -156,7 +156,7 @@ func TestLoaderProcessContentMultiFiles(t *testing.T) { &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File2.csv:1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Contexts", Path: "Contexts", @@ -165,11 +165,11 @@ func TestLoaderProcessContentMultiFiles(t *testing.T) { &config.FCTemplate{Tag: "Path", Path: "Path", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File1.csv:6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Value", Path: "Value", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~File1.csv:7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.MetaString, @@ -229,49 +229,49 @@ func TestLoaderProcessResource(t *testing.T) { &config.FCTemplate{Tag: "Tenant", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "TTL", Path: "UsageTTL", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Limit", Path: "Limit", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "AllocationMessage", Path: "AllocationMessage", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Blocker", Path: "Blocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Stored", Path: "Stored", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Thresholds", Path: "Thresholds", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.ResourcesCSVContent)) @@ -347,29 +347,29 @@ func TestLoaderProcessFilters(t *testing.T) { &config.FCTemplate{Tag: "Tenant", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "Type", Path: "Type", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Element", Path: "Element", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Values", Path: "Values", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.FiltersCSVContent)) @@ -458,49 +458,49 @@ func TestLoaderProcessThresholds(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MaxHits", Path: "MaxHits", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MinHits", Path: "MinHits", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MinSleep", Path: "MinSleep", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Blocker", Path: "Blocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActionIDs", Path: "ActionIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Async", Path: "Async", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.ThresholdsCSVContent)) @@ -556,58 +556,58 @@ func TestLoaderProcessStats(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "QueueLength", Path: "QueueLength", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "TTL", Path: "TTL", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MinItems", Path: "MinItems", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MetricIDs", Path: "MetricIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "MetricFilterIDs", Path: "MetricFilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Blocker", Path: "Blocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Stored", Path: "Stored", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ThresholdIDs", Path: "ThresholdIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.StatsCSVContent)) @@ -678,69 +678,69 @@ func TestLoaderProcessRoutes(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Sorting", Path: "Sorting", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "SortingParameters", Path: "SortingParameters", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteID", Path: "RouteID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteFilterIDs", Path: "RouteFilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteAccountIDs", Path: "RouteAccountIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteRatingPlanIDs", Path: "RouteRatingplanIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteResourceIDs", Path: "RouteResourceIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteStatIDs", Path: "RouteStatIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteWeight", Path: "RouteWeight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteBlocker", Path: "RouteBlocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~13", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.13", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RouteParameters", Path: "RouteParameters", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~14", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.14", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~15", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.15", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.RoutesCSVContent)) @@ -835,33 +835,33 @@ func TestLoaderProcessChargers(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "RunID", Path: "RunID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "AttributeIDs", Path: "AttributeIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP)}, &config.FCTemplate{Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP)}, + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP)}, }, } rdr := ioutil.NopCloser(strings.NewReader(engine.ChargersCSVContent)) @@ -914,81 +914,81 @@ func TestLoaderProcessDispatches(t *testing.T) { Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, }, &config.FCTemplate{ Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, }, &config.FCTemplate{ Tag: "Subsystems", Path: "Subsystems", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "FilterIDs", Path: "FilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ActivationInterval", Path: "ActivationInterval", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "Strategy", Path: "Strategy", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~5", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.5", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "StrategyParameters", Path: "StrategyParameters", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~6", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.6", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ConnID", Path: "ConnID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~7", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.7", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ConnFilterIDs", Path: "ConnFilterIDs", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~8", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.8", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ConnWeight", Path: "ConnWeight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~9", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.9", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ConnBlocker", Path: "ConnBlocker", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~10", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.10", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "ConnParameters", Path: "ConnParameters", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~11", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.11", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "Weight", Path: "Weight", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~12", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.12", true, utils.INFIELD_SEP), }, }, } @@ -1066,33 +1066,33 @@ func TestLoaderProcessDispatcheHosts(t *testing.T) { Tag: "Tenant", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true, }, &config.FCTemplate{ Tag: "ID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true, }, &config.FCTemplate{ Tag: "Address", Path: "Address", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~2", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.2", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "Transport", Path: "Transport", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~3", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.3", true, utils.INFIELD_SEP), }, &config.FCTemplate{ Tag: "TLS", Path: "TLS", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~4", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.4", true, utils.INFIELD_SEP), }, }, } @@ -1153,12 +1153,12 @@ func TestLoaderRemoveContentSingleFile(t *testing.T) { &config.FCTemplate{Tag: "TenantID", Path: "Tenant", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~0", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.0", true, utils.INFIELD_SEP), Mandatory: true}, &config.FCTemplate{Tag: "ProfileID", Path: "ID", Type: utils.META_COMPOSED, - Value: config.NewRSRParsersMustCompile("~1", true, utils.INFIELD_SEP), + Value: config.NewRSRParsersMustCompile("~*req.1", true, utils.INFIELD_SEP), Mandatory: true}, }, } diff --git a/packages/debian/changelog b/packages/debian/changelog index 0be0f4e2d..682f044ea 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -70,6 +70,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [General] Added *mo+extraDuration time support (e.g. *mo+1h will be time.Now() + 1 month + 1 hour) * [SessionS] Use correctly SessionTTLUsage when calculate end usage in case of terminate session from ttl mechanism * [SessionS] Add SessionTLLLastUsage as option for an extra debit in case of ttl mechanism + * [LoaderS] Add *req as mandatory prefix -- DanB Wed, 19 Feb 2020 13:25:52 +0200 From 6c07c4294938349bf3c030d951cfc4d02a25168d Mon Sep 17 00:00:00 2001 From: TeoV Date: Thu, 25 Jun 2020 16:53:19 +0300 Subject: [PATCH 2/3] Add integration test for masked_destination for EEs --- data/conf/samples/ees/cgrates.json | 30 ++++++++++++- ees/eereq.go | 7 ++-- ees/filecsv_it_test.go | 67 ++++++++++++++++++++++++++++++ ees/lib_test.go | 2 +- 4 files changed, 100 insertions(+), 6 deletions(-) diff --git a/data/conf/samples/ees/cgrates.json b/data/conf/samples/ees/cgrates.json index f9204d666..960fa7070 100644 --- a/data/conf/samples/ees/cgrates.json +++ b/data/conf/samples/ees/cgrates.json @@ -269,7 +269,35 @@ {"tag": "Usage", "path": "*exp.Usage", "type": "*variable", "value": "~*req.Usage"}, {"tag": "Cost", "path": "*exp.Cost", "type": "*variable", "value": "~*req.Cost{*round:4}"}, ], - } + }, + { + "id": "CSVMaskedDestination", + "type": "*file_csv", + "export_path": "/tmp/testCSVMasked", + "tenant": "cgrates.org", + "flags": ["*attributes"], + "attribute_context": "customContext", + "attempts": 1, + "field_separator": ",", + "filters": ["*string:~*req.ExporterUsed:CSVMaskedDestination"], + "fields":[ + {"tag": "CGRID", "path": "*exp.CGRID", "type": "*variable", "value": "~*req.CGRID"}, + {"tag": "RunID", "path": "*exp.RunID", "type": "*variable", "value": "~*req.RunID"}, + {"tag": "ToR", "path": "*exp.ToR", "type": "*variable", "value": "~*req.ToR"}, + {"tag": "OriginID", "path": "*exp.OriginID", "type": "*variable", "value": "~*req.OriginID"}, + {"tag": "RequestType", "path": "*exp.RequestType", "type": "*variable", "value": "~*req.RequestType"}, + {"tag": "Tenant", "path": "*exp.Tenant", "type": "*variable", "value": "~*req.Tenant"}, + {"tag": "Category", "path": "*exp.Category", "type": "*variable", "value": "~*req.Category"}, + {"tag": "Account", "path": "*exp.Account", "type": "*variable", "value": "~*req.Account"}, + {"tag": "Subject", "path": "*exp.Subject", "type": "*variable", "value": "~*req.Subject"}, + {"tag": "Destination", "path": "*exp.Destination", "type": "*masked_destination", + "value": "~*req.Destination", "mask_destinationd_id": "MASKED_DESTINATIONS", "mask_length": 3}, + {"tag": "SetupTime", "path": "*exp.SetupTime", "type": "*variable", "value": "~*req.SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag": "AnswerTime", "path": "*exp.AnswerTime", "type": "*variable", "value": "~*req.AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag": "Usage", "path": "*exp.Usage", "type": "*variable", "value": "~*req.Usage"}, + {"tag": "Cost", "path": "*exp.Cost", "type": "*variable", "value": "~*req.Cost{*round:4}"}, + ], + }, ] }, diff --git a/ees/eereq.go b/ees/eereq.go index 3004740e3..3a92aa4aa 100644 --- a/ees/eereq.go +++ b/ees/eereq.go @@ -363,10 +363,9 @@ func (eeR *EventExporterRequest) ParseField( if dst, err := eeR.req.FieldAsString([]string{utils.Destination}); err != nil { return nil, fmt.Errorf("error <%s> getting destination for %s", err, utils.ToJSON(cfgFld)) - } else if len(cfgFld.MaskDestID) != 0 && engine.CachedDestHasPrefix(cfgFld.MaskDestID, dst) { - out = "1" - } else { - out = "0" + } else if cfgFld.MaskLen != -1 && len(cfgFld.MaskDestID) != 0 && + engine.CachedDestHasPrefix(cfgFld.MaskDestID, dst) { + out = utils.MaskSuffix(dst, cfgFld.MaskLen) } } diff --git a/ees/filecsv_it_test.go b/ees/filecsv_it_test.go index 9c5169a66..4598f1523 100644 --- a/ees/filecsv_it_test.go +++ b/ees/filecsv_it_test.go @@ -54,6 +54,8 @@ var ( testCsvVerifyExports, testCsvExportComposedEvent, testCsvVerifyComposedExports, + testCsvExportMaskedDestination, + testCsvVerifyMaskedDestination, testStopCgrEngine, testCleanDirectory, } @@ -326,3 +328,68 @@ func testCsvVerifyComposedExports(t *testing.T) { t.Errorf("Expecting: \n<%q>, \nreceived: \n<%q>", eCnt, string(outContent1)) } } + +func testCsvExportMaskedDestination(t *testing.T) { + + attrs := utils.AttrSetDestination{Id: "MASKED_DESTINATIONS", Prefixes: []string{"+4986517174963"}} + var reply string + if err := csvRpc.Call(utils.APIerSv1SetDestination, &attrs, &reply); err != nil { + t.Error("Unexpected error", err.Error()) + } else if reply != utils.OK { + t.Error("Unexpected reply returned", reply) + } + + eventVoice := &utils.CGREventWithOpts{ + CGREvent: &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "voiceEvent", + Time: utils.TimePointer(time.Now()), + Event: map[string]interface{}{ + utils.CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), + utils.ToR: utils.VOICE, + utils.OriginID: "dsafdsaf", + utils.OriginHost: "192.168.1.1", + utils.RequestType: utils.META_RATED, + utils.Tenant: "cgrates.org", + utils.Category: "call", + utils.Account: "1001", + utils.Subject: "1001", + utils.Destination: "+4986517174963", + utils.SetupTime: time.Unix(1383813745, 0).UTC(), + utils.AnswerTime: time.Unix(1383813746, 0).UTC(), + utils.Usage: time.Duration(10) * time.Second, + utils.RunID: utils.MetaDefault, + utils.Cost: 1.01, + "ExporterUsed": "CSVMaskedDestination", + }, + }, + } + if err := csvRpc.Call(utils.EventExporterSv1ProcessEvent, eventVoice, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Expected %+v, received: %+v", utils.OK, reply) + } + time.Sleep(1 * time.Second) +} + +func testCsvVerifyMaskedDestination(t *testing.T) { + var files []string + err := filepath.Walk("/tmp/testCSVMasked/", func(path string, info os.FileInfo, err error) error { + if strings.HasSuffix(path, utils.CSVSuffix) { + files = append(files, path) + } + return nil + }) + if err != nil { + t.Error(err) + } + if len(files) != 1 { + t.Errorf("Expected %+v, received: %+v", 1, len(files)) + } + eCnt := "dbafe9c8614c785a65aabd116dd3959c3c56f7f6,*default,*voice,dsafdsaf,*rated,cgrates.org,call,1001,1001,+4986517174***,2013-11-07T08:42:25Z,2013-11-07T08:42:26Z,10000000000,1.01\n" + if outContent1, err := ioutil.ReadFile(files[0]); err != nil { + t.Error(err) + } else if eCnt != string(outContent1) { + t.Errorf("Expecting: \n<%q>, \nreceived: \n<%q>", eCnt, string(outContent1)) + } +} diff --git a/ees/lib_test.go b/ees/lib_test.go index f4a06c2ae..52dddd657 100644 --- a/ees/lib_test.go +++ b/ees/lib_test.go @@ -49,7 +49,7 @@ func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) { } } -var exportPath = []string{"/tmp/testCSV", "/tmp/testComposedCSV", "/tmp/testFWV"} +var exportPath = []string{"/tmp/testCSV", "/tmp/testComposedCSV", "/tmp/testFWV", "/tmp/testCSVMasked"} func testCreateDirectory(t *testing.T) { for _, dir := range exportPath { From 7a2817929fd902c736ac77e0cd683449bc1d370a Mon Sep 17 00:00:00 2001 From: TeoV Date: Fri, 26 Jun 2020 17:48:44 +0300 Subject: [PATCH 3/3] Add support for *virt export type in EEs --- config/config.go | 2 +- config/eescfg.go | 3 + data/conf/samples/ees/cgrates.json | 40 ++++++ ees/ee.go | 2 + ees/eereq.go | 4 +- ees/lib_test.go | 2 +- ees/virtualEe.go | 118 ++++++++++++++++++ ees/virtual_ee_it_test.go | 192 +++++++++++++++++++++++++++++ engine/filters.go | 2 +- utils/consts.go | 1 + utils/dynamicdataprovider.go | 60 +-------- utils/dynamicdataprovider_test.go | 66 +++------- 12 files changed, 379 insertions(+), 113 deletions(-) create mode 100644 ees/virtualEe.go create mode 100644 ees/virtual_ee_it_test.go diff --git a/config/config.go b/config/config.go index 8a77c8252..5f4554762 100755 --- a/config/config.go +++ b/config/config.go @@ -320,7 +320,7 @@ var possibleReaderTypes = utils.NewStringSet([]string{utils.MetaFileCSV, var possibleExporterTypes = utils.NewStringSet([]string{utils.MetaFileCSV, utils.META_NONE, utils.MetaFileFWV, utils.MetaHTTPPost, utils.MetaHTTPjsonMap, utils.MetaAMQPjsonMap, utils.MetaAMQPV1jsonMap, utils.MetaSQSjsonMap, - utils.MetaKafkajsonMap, utils.MetaS3jsonMap}) + utils.MetaKafkajsonMap, utils.MetaS3jsonMap, utils.MetaVirt}) func (cfg *CGRConfig) LazySanityCheck() { for _, cdrePrfl := range cfg.cdrsCfg.OnlineCDRExports { diff --git a/config/eescfg.go b/config/eescfg.go index bea954fe0..794aaefce 100644 --- a/config/eescfg.go +++ b/config/eescfg.go @@ -205,6 +205,9 @@ func (eeC *EventExporterCfg) loadFromJsonCfg(jsnEec *EventExporterJsonCfg, separ case utils.MetaTrl: eeC.trailerFields = append(eeC.trailerFields, field) } + if strings.HasPrefix(field.GetPathSlice()[0], utils.MetaCache) { // special cache when loading fields that contains *cache in path + eeC.contentFields = append(eeC.contentFields, field) + } } } return diff --git a/data/conf/samples/ees/cgrates.json b/data/conf/samples/ees/cgrates.json index 960fa7070..8826234ae 100644 --- a/data/conf/samples/ees/cgrates.json +++ b/data/conf/samples/ees/cgrates.json @@ -298,6 +298,46 @@ {"tag": "Cost", "path": "*exp.Cost", "type": "*variable", "value": "~*req.Cost{*round:4}"}, ], }, + { + "id": "RouteExporter", // this exporter will set the Cost Account and RunID in cache so we can use it in other exports + "type": "*virt", + "tenant": "cgrates.org", + "attempts": 1, + "filters": ["*string:~*req.ExporterUsed:RouteExporter"], + "fields":[ + {"tag": "Cost", "path": "*cache[~*req.CGRID|~*req.RunID|-Cost]", "type": "*variable", + "value": "~*req.Cost", "rounding_decimals": 4}, + {"tag": "Account", "path": "*cache[~*req.CGRID|~*req.RunID|-Account]", "type": "*variable", "value": "~*req.Account"}, + {"tag": "RunID", "path": "*cache[~*req.CGRID|~*req.RunID|-RunID]", "type": "*variable", "value": "~*req.RunID"}, + {"tag": "CustomVariable", "path": "*cache[~*req.CGRID|~*req.RunID|-CustomVariable]", + "type": "*variable", "value": "CustomValue"} + ], + }, + { + "id": "CSVExporterFromVirt", + "type": "*file_csv", + "export_path": "/tmp/testCSVfromVirt", + "tenant": "cgrates.org", + "flags": ["*attributes"], + "attribute_context": "customContext", + "attempts": 1, + "field_separator": ",", + "filters": ["*string:~*req.ExporterUsed:CSVExporterFromVirt"], + "fields":[ + {"tag": "CGRID", "path": "*exp.CGRID", "type": "*variable", "value": "~*req.CGRID"}, + {"tag": "RunID", "path": "*exp.RunID", "type": "*variable", "value": "~*req.RunID"}, + {"tag": "OriginID", "path": "*exp.OriginID", "type": "*variable", "value": "~*req.OriginID"}, + {"tag": "Tenant", "path": "*exp.Tenant", "type": "*variable", "value": "~*req.Tenant"}, + {"tag": "Account", "path": "*exp.Account", "type": "*variable", "value": "~*req.Account"}, + {"tag": "Cost", "path": "*exp.Cost", "type": "*variable", "value": "~*req.Cost", "rounding_decimals": 4}, + {"tag": "SupplierCustomVariable","filters": ["*exists:*cache[~*req.CGRID|~*req.RunID|-CustomVariable]:"], + "path": "*exp.SupplierCustomVariable", "type": "*variable", "value": "~*cache[~*req.CGRID|~*req.RunID|-CustomVariable]"}, + {"tag": "SupplierCost","filters": ["*exists:*cache[~*req.CGRID|~*req.RunID|-Cost]:"], + "path": "*exp.SupplierCost", "type": "*variable", "value": "~*cache[~*req.CGRID|~*req.RunID|-Cost]"}, + {"tag": "SupplierRun","filters": ["*exists:*cache[~*req.CGRID|~*req.RunID|-RunID]:"], + "path": "*exp.SupplierRun", "type": "*variable", "value": "~*cache[~*req.CGRID|~*req.RunID|-RunID]"}, + ], + } ] }, diff --git a/ees/ee.go b/ees/ee.go index aa3599ec0..9413ea0a1 100644 --- a/ees/ee.go +++ b/ees/ee.go @@ -43,6 +43,8 @@ func NewEventExporter(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.Filt return NewHTTPPostEe(cgrCfg, cfgIdx, filterS, dc) case utils.MetaHTTPjsonMap, utils.MetaAMQPjsonMap, utils.MetaAMQPV1jsonMap, utils.MetaSQSjsonMap, utils.MetaKafkajsonMap, utils.MetaS3jsonMap: return NewHTTPJsonMapEe(cgrCfg, cfgIdx, filterS, dc) + case utils.MetaVirt: + return NewVirtualExporter(cgrCfg, cfgIdx, filterS, dc) default: return nil, fmt.Errorf("unsupported exporter type: <%s>", cgrCfg.EEsCfg().Exporters[cfgIdx].Type) } diff --git a/ees/eereq.go b/ees/eereq.go index 3a92aa4aa..8c60f1ff0 100644 --- a/ees/eereq.go +++ b/ees/eereq.go @@ -127,11 +127,12 @@ func (eeR *EventExporterRequest) FieldAsString(fldPath []string) (val string, er func (eeR *EventExporterRequest) SetFields(tplFlds []*config.FCTemplate) (err error) { for _, tplFld := range tplFlds { if pass, err := eeR.filterS.Pass(eeR.tnt, - tplFld.Filters, eeR); err != nil { + tplFld.Filters, eeR.dynamicProvider); err != nil { return err } else if !pass { continue } + var out interface{} out, err = eeR.ParseField(tplFld) if err != nil { @@ -157,7 +158,6 @@ func (eeR *EventExporterRequest) SetFields(tplFlds []*config.FCTemplate) (err er } else { itmPath = fullPath.PathItems.Slice()[1:] } - nMItm := &config.NMItem{Data: out, Path: itmPath, Config: tplFld} switch tplFld.Type { case utils.META_COMPOSED: diff --git a/ees/lib_test.go b/ees/lib_test.go index 52dddd657..a78730eea 100644 --- a/ees/lib_test.go +++ b/ees/lib_test.go @@ -49,7 +49,7 @@ func newRPCClient(cfg *config.ListenCfg) (c *rpc.Client, err error) { } } -var exportPath = []string{"/tmp/testCSV", "/tmp/testComposedCSV", "/tmp/testFWV", "/tmp/testCSVMasked"} +var exportPath = []string{"/tmp/testCSV", "/tmp/testComposedCSV", "/tmp/testFWV", "/tmp/testCSVMasked", "/tmp/testCSVfromVirt"} func testCreateDirectory(t *testing.T) { for _, dir := range exportPath { diff --git a/ees/virtualEe.go b/ees/virtualEe.go new file mode 100644 index 000000000..fb3cf2dee --- /dev/null +++ b/ees/virtualEe.go @@ -0,0 +1,118 @@ +/* +Real-time Online/Offline Charging System (OerS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package ees + +import ( + "sync" + "time" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +func NewVirtualExporter(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, + dc utils.MapStorage) (vEe *VirtualEe, err error) { + dc[utils.ExportID] = cgrCfg.EEsCfg().Exporters[cfgIdx].ID + vEe = &VirtualEe{id: cgrCfg.EEsCfg().Exporters[cfgIdx].ID, + cgrCfg: cgrCfg, cfgIdx: cfgIdx, filterS: filterS, dc: dc} + err = vEe.init() + return +} + +// VirtualEe implements EventExporter interface for .csv files +type VirtualEe struct { + id string + cgrCfg *config.CGRConfig + cfgIdx int // index of config instance within ERsCfg.Readers + filterS *engine.FilterS + sync.RWMutex + dc utils.MapStorage +} + +// init will create all the necessary dependencies, including opening the file +func (vEe *VirtualEe) init() (err error) { + return +} + +// ID returns the identificator of this exporter +func (vEe *VirtualEe) ID() string { + return vEe.id +} + +// OnEvicted implements EventExporter, doing the cleanup before exit +func (vEe *VirtualEe) OnEvicted(_ string, _ interface{}) { + return +} + +// ExportEvent implements EventExporter +func (vEe *VirtualEe) ExportEvent(cgrEv *utils.CGREvent) (err error) { + vEe.Lock() + defer vEe.Unlock() + + vEe.dc[utils.NumberOfEvents] = vEe.dc[utils.NumberOfEvents].(int) + 1 + + req := utils.MapStorage{} + for k, v := range cgrEv.Event { + req[k] = v + } + eeReq := NewEventExporterRequest(req, vEe.dc, cgrEv.Tenant, vEe.cgrCfg.GeneralCfg().DefaultTimezone, + vEe.filterS) + if err = eeReq.SetFields(vEe.cgrCfg.EEsCfg().Exporters[vEe.cfgIdx].ContentFields()); err != nil { + vEe.dc[utils.NegativeExports].(utils.StringSet).Add(cgrEv.ID) + return + } + if aTime, err := cgrEv.FieldAsTime(utils.AnswerTime, vEe.cgrCfg.GeneralCfg().DefaultTimezone); err == nil { + if vEe.dc[utils.FirstEventATime].(time.Time).IsZero() || vEe.dc[utils.FirstEventATime].(time.Time).Before(aTime) { + vEe.dc[utils.FirstEventATime] = aTime + } + if aTime.After(vEe.dc[utils.LastEventATime].(time.Time)) { + vEe.dc[utils.LastEventATime] = aTime + } + } + if oID, err := cgrEv.FieldAsInt64(utils.OrderID); err == nil { + if vEe.dc[utils.FirstExpOrderID].(int64) > oID || vEe.dc[utils.FirstExpOrderID].(int64) == 0 { + vEe.dc[utils.FirstExpOrderID] = oID + } + if vEe.dc[utils.LastExpOrderID].(int64) < oID { + vEe.dc[utils.LastExpOrderID] = oID + } + } + if cost, err := cgrEv.FieldAsFloat64(utils.Cost); err == nil { + vEe.dc[utils.TotalCost] = vEe.dc[utils.TotalCost].(float64) + cost + } + if tor, err := cgrEv.FieldAsString(utils.ToR); err == nil { + if usage, err := cgrEv.FieldAsDuration(utils.Usage); err == nil { + switch tor { + case utils.VOICE: + vEe.dc[utils.TotalDuration] = vEe.dc[utils.TotalDuration].(time.Duration) + usage + case utils.SMS: + vEe.dc[utils.TotalSMSUsage] = vEe.dc[utils.TotalSMSUsage].(time.Duration) + usage + case utils.MMS: + vEe.dc[utils.TotalMMSUsage] = vEe.dc[utils.TotalMMSUsage].(time.Duration) + usage + case utils.GENERIC: + vEe.dc[utils.TotalGenericUsage] = vEe.dc[utils.TotalGenericUsage].(time.Duration) + usage + case utils.DATA: + vEe.dc[utils.TotalDataUsage] = vEe.dc[utils.TotalDataUsage].(time.Duration) + usage + } + } + } + vEe.dc[utils.PositiveExports].(utils.StringSet).Add(cgrEv.ID) + return +} diff --git a/ees/virtual_ee_it_test.go b/ees/virtual_ee_it_test.go new file mode 100644 index 000000000..c8d27200b --- /dev/null +++ b/ees/virtual_ee_it_test.go @@ -0,0 +1,192 @@ +// +build integration + +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package ees + +import ( + "io/ioutil" + "net/rpc" + "os" + "path" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/cgrates/cgrates/utils" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" +) + +var ( + virtConfigDir string + virtCfgPath string + virtCfg *config.CGRConfig + virtRpc *rpc.Client + + sTestsVirt = []func(t *testing.T){ + testCreateDirectory, + testVirtLoadConfig, + testVirtResetDataDB, + testVirtResetStorDb, + testVirtStartEngine, + testVirtRPCConn, + testVirtExportSupplierEvent, + testVirtExportEvents, + testVirtVerifyExports, + testStopCgrEngine, + testCleanDirectory, + } +) + +func TestVirtualExport(t *testing.T) { + virtConfigDir = "ees" + for _, stest := range sTestsVirt { + t.Run(virtConfigDir, stest) + } +} + +func testVirtLoadConfig(t *testing.T) { + var err error + virtCfgPath = path.Join(*dataDir, "conf", "samples", virtConfigDir) + if virtCfg, err = config.NewCGRConfigFromPath(virtCfgPath); err != nil { + t.Error(err) + } +} + +func testVirtResetDataDB(t *testing.T) { + if err := engine.InitDataDb(virtCfg); err != nil { + t.Fatal(err) + } +} + +func testVirtResetStorDb(t *testing.T) { + if err := engine.InitStorDb(virtCfg); err != nil { + t.Fatal(err) + } +} + +func testVirtStartEngine(t *testing.T) { + if _, err := engine.StopStartEngine(virtCfgPath, *waitRater); err != nil { + t.Fatal(err) + } +} + +func testVirtRPCConn(t *testing.T) { + var err error + virtRpc, err = newRPCClient(virtCfg.ListenCfg()) + if err != nil { + t.Fatal(err) + } +} + +func testVirtExportSupplierEvent(t *testing.T) { + supplierEvent := &utils.CGREventWithOpts{ + CGREvent: &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "supplierEvent", + Time: utils.TimePointer(time.Now()), + Event: map[string]interface{}{ + utils.CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), + utils.ToR: utils.VOICE, + utils.OriginID: "dsafdsaf", + utils.OriginHost: "192.168.1.1", + utils.RequestType: utils.META_RATED, + utils.Tenant: "cgrates.org", + utils.Category: "call", + utils.Account: "1001", + utils.Subject: "1001", + utils.Destination: "1002", + utils.SetupTime: time.Unix(1383813745, 0).UTC(), + utils.AnswerTime: time.Unix(1383813746, 0).UTC(), + utils.Usage: time.Duration(10) * time.Second, + utils.RunID: "SupplierRun", + utils.Cost: 1.23, + "ExporterUsed": "RouteExporter", + }, + }, + } + + var reply string + if err := virtRpc.Call(utils.EventExporterSv1ProcessEvent, supplierEvent, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Expected %+v, received: %+v", utils.OK, reply) + } + time.Sleep(10 * time.Millisecond) +} + +func testVirtExportEvents(t *testing.T) { + eventVoice := &utils.CGREventWithOpts{ + CGREvent: &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "voiceEvent", + Time: utils.TimePointer(time.Now()), + Event: map[string]interface{}{ + utils.CGRID: utils.Sha1("dsafdsaf", time.Unix(1383813745, 0).UTC().String()), + utils.ToR: utils.VOICE, + utils.OriginID: "dsafdsaf", + utils.OriginHost: "192.168.1.1", + utils.RequestType: utils.META_RATED, + utils.Tenant: "cgrates.org", + utils.Category: "call", + utils.Account: "1001", + utils.Subject: "1001", + utils.Destination: "1002", + utils.SetupTime: time.Unix(1383813745, 0).UTC(), + utils.AnswerTime: time.Unix(1383813746, 0).UTC(), + utils.Usage: time.Duration(10) * time.Second, + utils.RunID: "SupplierRun", + utils.Cost: 1.01, + "ExporterUsed": "CSVExporterFromVirt", + }, + }, + } + var reply string + if err := virtRpc.Call(utils.EventExporterSv1ProcessEvent, eventVoice, &reply); err != nil { + t.Error(err) + } else if reply != utils.OK { + t.Errorf("Expected %+v, received: %+v", utils.OK, reply) + } + time.Sleep(1 * time.Second) +} + +func testVirtVerifyExports(t *testing.T) { + var files []string + err := filepath.Walk("/tmp/testCSVfromVirt/", func(path string, info os.FileInfo, err error) error { + if strings.HasSuffix(path, utils.CSVSuffix) { + files = append(files, path) + } + return nil + }) + if err != nil { + t.Error(err) + } + if len(files) != 1 { + t.Errorf("Expected %+v, received: %+v", 1, len(files)) + } + eCnt := "dbafe9c8614c785a65aabd116dd3959c3c56f7f6,SupplierRun,dsafdsaf,cgrates.org,1001,1.01,CustomValue,1.23,SupplierRun\n" + if outContent1, err := ioutil.ReadFile(files[0]); err != nil { + t.Error(err) + } else if eCnt != string(outContent1) { + t.Errorf("Expecting: \n<%q>, \nreceived: \n<%q>", eCnt, string(outContent1)) + } +} diff --git a/engine/filters.go b/engine/filters.go index 0bdb404c4..fd0b167d2 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -549,7 +549,7 @@ func (dDP *dynamicDP) RemoteHost() net.Addr { var initialDPPrefixes = utils.NewStringSet([]string{utils.MetaReq, utils.MetaVars, utils.MetaCgreq, utils.MetaCgrep, utils.MetaRep, utils.MetaCGRAReq, - utils.MetaAct, utils.MetaEC}) + utils.MetaAct, utils.MetaEC, utils.MetaCache}) func (dDP *dynamicDP) FieldAsInterface(fldPath []string) (val interface{}, err error) { if len(fldPath) == 0 { diff --git a/utils/consts.go b/utils/consts.go index 174776325..f46688ecd 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -396,6 +396,7 @@ const ( ActionsPoster = "act" CDRPoster = "cdr" MetaFileCSV = "*file_csv" + MetaVirt = "*virt" MetaFileFWV = "*file_fwv" MetaFScsv = "*freeswitch_csv" Accounts = "Accounts" diff --git a/utils/dynamicdataprovider.go b/utils/dynamicdataprovider.go index 877100c54..f5cea2d43 100644 --- a/utils/dynamicdataprovider.go +++ b/utils/dynamicdataprovider.go @@ -43,7 +43,7 @@ func (ddp *DynamicDataProvider) FieldAsInterface(fldPath []string) (out interfac return val, nil } var newPath string - if newPath, err = ddp.proccesFieldPath(path); err != nil { // proccess the path + if newPath, err = ddp.processFieldPathForSet(path); err != nil { // proccess the path return } if newPath == EmptyString { // no new path means no dynamic path so just take the value from the data provider @@ -58,64 +58,10 @@ func (ddp *DynamicDataProvider) FieldAsInterface(fldPath []string) (out interfac return } -func (ddp *DynamicDataProvider) proccesFieldPath(fldPath string) (newPath string, err error) { - idx := strings.Index(fldPath, IdxStart) - if idx == -1 { - return // no proccessing requred - } - newPath = fldPath[:idx+1] // add the first path of the path with the "[" included - for idx != -1 { // stop when we do not find any "[" - fldPath = fldPath[idx+1:] // move the path to the begining of the index - nextBeginIdx := strings.Index(fldPath, IdxStart) // get the next "[" if any - nextEndIdx := strings.Index(fldPath, IdxEnd) // get the next "]" if any - if nextEndIdx == -1 { // no end index found so return error - err = ErrWrongPath - newPath = EmptyString - return - } - - // parse the rest of the field path until we match the [ ] - bIdx, eIdx := nextBeginIdx, nextEndIdx - for nextBeginIdx != -1 && nextBeginIdx < nextEndIdx { // do this until no new [ is found or the next begining [ is after the end ] - nextBeginIdx = strings.Index(fldPath[bIdx+1:], IdxStart) // get the next "[" if any - nextEndIdx = strings.Index(fldPath[eIdx+1:], IdxEnd) // get the next "]" if any - if nextEndIdx == -1 { // no end index found so return error - err = ErrWrongPath - newPath = EmptyString - return - } - if nextBeginIdx == -1 { // if no index found do not increment but replace it - bIdx = -1 - } else { - bIdx += nextBeginIdx + 1 - } - // increment the indexes - eIdx += nextEndIdx + 1 - } - var val string - for _, path := range strings.Split(fldPath[:eIdx], PipeSep) { // proccess the found path - var iface interface{} - if iface, err = DPDynamicInterface(path, ddp); err != nil { - newPath = EmptyString - return - } - val += IfaceAsString(iface) // compose the value - } - if bIdx == -1 { // if is the last ocurence add the rest of the path and exit - newPath += val + fldPath[eIdx:] - } else { - // else just add until the next [ - newPath += val + fldPath[eIdx:bIdx+1] - } - idx = bIdx - } - return -} - // GetFullFieldPath returns the full path for the func (ddp *DynamicDataProvider) GetFullFieldPath(fldPath string) (fpath *FullPath, err error) { var newPath string - if newPath, err = ddp.proccesFieldPathForSet(fldPath); err != nil || newPath == EmptyString { + if newPath, err = ddp.processFieldPathForSet(fldPath); err != nil || newPath == EmptyString { return } fpath = &FullPath{ @@ -136,7 +82,7 @@ func (ddp DynamicDataProvider) FieldAsString(fldPath []string) (str string, err } // does the same thing as ... but replaces [ with . if the value between [] is dynamic -func (ddp *DynamicDataProvider) proccesFieldPathForSet(fldPath string) (newPath string, err error) { +func (ddp *DynamicDataProvider) processFieldPathForSet(fldPath string) (newPath string, err error) { idx := strings.Index(fldPath, IdxStart) if idx == -1 { return // no proccessing requred diff --git a/utils/dynamicdataprovider_test.go b/utils/dynamicdataprovider_test.go index aa8d37ca0..c79f50a1d 100644 --- a/utils/dynamicdataprovider_test.go +++ b/utils/dynamicdataprovider_test.go @@ -18,56 +18,11 @@ along with this program. If not, see package utils import ( + "fmt" "strings" "testing" ) -func TestDynamicDataProviderProccesFieldPath(t *testing.T) { - dp := MapStorage{ - MetaCgrep: MapStorage{ - "Stir": MapStorage{ - "CHRG_ROUTE1_END": "Identity1", - "CHRG_ROUTE2_END": "Identity2", - "CHRG_ROUTE3_END": "Identity3", - "CHRG_ROUTE4_END": "Identity4", - }, - "Routes": MapStorage{ - "SortedRoutes": []MapStorage{ - {"ID": "ROUTE1"}, - {"ID": "ROUTE2"}, - {"ID": "ROUTE3"}, - {"ID": "ROUTE4"}, - }, - }, - "BestRoute": 0, - }, - } - ddp := NewDynamicDataProvider(dp) - newpath, err := ddp.proccesFieldPath("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END]") - if err != nil { - t.Fatal(err) - } - expectedPath := "~*cgrep.Stir[CHRG_ROUTE2_END].Something[CHRG_ROUTE1_END]" - if newpath != expectedPath { - t.Errorf("Expected: %q,received %q", expectedPath, newpath) - } - _, err = ddp.proccesFieldPath("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END") - if err != ErrWrongPath { - t.Errorf("Expected error %s received %v", ErrWrongPath, err) - } - - _, err = ddp.proccesFieldPath("~*cgrep.Stir[CHRG_") - if err != ErrWrongPath { - t.Errorf("Expected error %s received %v", ErrWrongPath, err) - } - - _, err = ddp.proccesFieldPath("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID2|_END]") - if err != ErrNotFound { - t.Errorf("Expected error %s received %v", ErrNotFound, err) - } - -} - func TestDynamicDataProviderFieldAsInterface(t *testing.T) { dp := MapStorage{ MetaCgrep: MapStorage{ @@ -163,7 +118,7 @@ func TestDynamicDataProviderProccesFieldPath2(t *testing.T) { }, } ddp := NewDynamicDataProvider(dp) - newpath, err := ddp.proccesFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END]") + newpath, err := ddp.processFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END]") if err != nil { t.Fatal(err) } @@ -171,21 +126,21 @@ func TestDynamicDataProviderProccesFieldPath2(t *testing.T) { if newpath != expectedPath { t.Errorf("Expected: %q,received %q", expectedPath, newpath) } - _, err = ddp.proccesFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END") + _, err = ddp.processFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID|_END].Something[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END") if err != ErrWrongPath { t.Errorf("Expected error %s received %v", ErrWrongPath, err) } - _, err = ddp.proccesFieldPathForSet("~*cgrep.Stir[CHRG_") + _, err = ddp.processFieldPathForSet("~*cgrep.Stir[CHRG_") if err != ErrWrongPath { t.Errorf("Expected error %s received %v", ErrWrongPath, err) } - _, err = ddp.proccesFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID2|_END]") + _, err = ddp.processFieldPathForSet("~*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[1].ID2|_END]") if err != ErrNotFound { t.Errorf("Expected error %s received %v", ErrNotFound, err) } - newpath, err = ddp.proccesFieldPathForSet("~*cgrep.Stir[1]") + newpath, err = ddp.processFieldPathForSet("~*cgrep.Stir[1]") if err != nil { t.Fatal(err) } @@ -289,4 +244,13 @@ func TestDynamicDataProviderGetFullFieldPath(t *testing.T) { if newpath != nil { t.Errorf("Expected: %v,received %q", nil, newpath) } + + newpath, err = ddp.GetFullFieldPath("*cgrep.Stir[CHRG_|~*cgrep.Routes.SortedRoutes[~*cgrep.BestRoute].ID|_END]") + if err != nil { + t.Fatal(err) + } + if newpath == nil { + t.Errorf("Expected: %v,received %q", nil, newpath) + } + fmt.Println(*newpath) }