From 7ad109d7bc7f408160654f3dc095b07e20d9d395 Mon Sep 17 00:00:00 2001 From: adragusin Date: Mon, 17 Feb 2020 15:08:53 +0200 Subject: [PATCH] Added ResourceSv1.GetResource to dispatcher --- apier/v1/api_interfaces.go | 4 ++++ apier/v1/dispatcher.go | 4 ++++ apier/v1/dm_remote_it_test.go | 2 +- apier/v1/resourcesv1.go | 2 +- console/resource.go | 6 +++--- dispatchers/resources.go | 23 +++++++++++++++++++++++ engine/filters.go | 7 ++++--- engine/resources.go | 2 +- engine/suppliers.go | 6 +++--- utils/consts.go | 1 + 10 files changed, 45 insertions(+), 12 deletions(-) diff --git a/apier/v1/api_interfaces.go b/apier/v1/api_interfaces.go index b0e78ed42..1faa972a6 100644 --- a/apier/v1/api_interfaces.go +++ b/apier/v1/api_interfaces.go @@ -51,6 +51,7 @@ type ResourceSv1Interface interface { AuthorizeResources(args utils.ArgRSv1ResourceUsage, reply *string) error AllocateResources(args utils.ArgRSv1ResourceUsage, reply *string) error ReleaseResources(args utils.ArgRSv1ResourceUsage, reply *string) error + GetResource(args *utils.TenantIDWithArgDispatcher, reply *engine.Resource) error Ping(ign *utils.CGREventWithArgDispatcher, reply *string) error } @@ -138,6 +139,9 @@ type CDRsV1Interface interface { ProcessExternalCDR(cdr *engine.ExternalCDRWithArgDispatcher, reply *string) error RateCDRs(arg *engine.ArgRateCDRs, reply *string) error StoreSessionCost(attr *engine.AttrCDRSStoreSMCost, reply *string) error + GetCDRsCount(args *utils.RPCCDRsFilterWithArgDispatcher, reply *int64) error + GetCDRs(args utils.RPCCDRsFilterWithArgDispatcher, reply *[]*engine.CDR) error + Ping(ign *utils.CGREventWithArgDispatcher, reply *string) error } type ServiceManagerV1Interface interface { diff --git a/apier/v1/dispatcher.go b/apier/v1/dispatcher.go index b07ca7581..070e9fc1f 100755 --- a/apier/v1/dispatcher.go +++ b/apier/v1/dispatcher.go @@ -303,6 +303,10 @@ func (dRs *DispatcherResourceSv1) GetResourcesForEvent(args utils.ArgRSv1Resourc return dRs.dRs.ResourceSv1GetResourcesForEvent(args, reply) } +func (dRs *DispatcherResourceSv1) GetResource(args *utils.TenantIDWithArgDispatcher, reply *engine.Resource) error { + return dRs.dRs.ResourceSv1GetResource(args, reply) +} + func (dRs *DispatcherResourceSv1) AuthorizeResources(args utils.ArgRSv1ResourceUsage, reply *string) error { return dRs.dRs.ResourceSv1AuthorizeResources(args, reply) diff --git a/apier/v1/dm_remote_it_test.go b/apier/v1/dm_remote_it_test.go index f3837e602..5d6e8214c 100644 --- a/apier/v1/dm_remote_it_test.go +++ b/apier/v1/dm_remote_it_test.go @@ -308,7 +308,7 @@ func testInternalRemoteITGetResource(t *testing.T) { Usages: map[string]*engine.ResourceUsage{}, } if err := internalRPC.Call(utils.ResourceSv1GetResource, - &utils.TenantID{Tenant: "cgrates.org", ID: "ResGroup1"}, &reply); err != nil { + &utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{Tenant: "cgrates.org", ID: "ResGroup1"}}, &reply); err != nil { t.Error(err) } else if !reflect.DeepEqual(reply, expectedResources) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expectedResources), utils.ToJSON(reply)) diff --git a/apier/v1/resourcesv1.go b/apier/v1/resourcesv1.go index ae7e2bd4b..f1e1f363b 100644 --- a/apier/v1/resourcesv1.go +++ b/apier/v1/resourcesv1.go @@ -60,7 +60,7 @@ func (rsv1 *ResourceSv1) ReleaseResources(args utils.ArgRSv1ResourceUsage, reply } // GetResource returns a resource configuration -func (rsv1 *ResourceSv1) GetResource(args *utils.TenantID, reply *engine.Resource) error { +func (rsv1 *ResourceSv1) GetResource(args *utils.TenantIDWithArgDispatcher, reply *engine.Resource) error { return rsv1.rls.V1GetResource(args, reply) } diff --git a/console/resource.go b/console/resource.go index 392d6cbee..4e9b1f864 100644 --- a/console/resource.go +++ b/console/resource.go @@ -27,7 +27,7 @@ func init() { c := &CmdGetResource{ name: "resource", rpcMethod: utils.ResourceSv1GetResource, - rpcParams: &utils.TenantID{}, + rpcParams: &utils.TenantIDWithArgDispatcher{}, } commands[c.Name()] = c c.CommandExecuter = &CommandExecuter{c} @@ -37,7 +37,7 @@ func init() { type CmdGetResource struct { name string rpcMethod string - rpcParams *utils.TenantID + rpcParams *utils.TenantIDWithArgDispatcher *CommandExecuter } @@ -51,7 +51,7 @@ func (self *CmdGetResource) RpcMethod() string { func (self *CmdGetResource) RpcParams(reset bool) interface{} { if reset || self.rpcParams == nil { - self.rpcParams = &utils.TenantID{} + self.rpcParams = &utils.TenantIDWithArgDispatcher{} } return self.rpcParams } diff --git a/dispatchers/resources.go b/dispatchers/resources.go index 57a887809..20551df72 100755 --- a/dispatchers/resources.go +++ b/dispatchers/resources.go @@ -19,6 +19,8 @@ along with this program. If not, see package dispatchers import ( + "time" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) @@ -140,3 +142,24 @@ func (dS *DispatcherService) ResourceSv1ReleaseResources(args utils.ArgRSv1Resou return dS.Dispatch(args.CGREvent, utils.MetaResources, routeID, utils.ResourceSv1ReleaseResources, args, reply) } + +func (dS *DispatcherService) ResourceSv1GetResource(args *utils.TenantIDWithArgDispatcher, reply *engine.Resource) (err error) { + tnt := dS.cfg.GeneralCfg().DefaultTenant + if args.TenantID != nil && args.TenantID.Tenant != utils.EmptyString { + tnt = args.TenantID.Tenant + } + if args.ArgDispatcher == nil { + return utils.NewErrMandatoryIeMissing(utils.ArgDispatcherField) + } + if len(dS.cfg.DispatcherSCfg().AttributeSConns) != 0 { + if err = dS.authorize(utils.ResourceSv1GetResources, tnt, + args.APIKey, utils.TimePointer(time.Now())); err != nil { + return + } + } + routeID := args.ArgDispatcher.RouteID + return dS.Dispatch(&utils.CGREvent{ + Tenant: tnt, + ID: args.ID, + }, utils.MetaResources, routeID, utils.ResourceSv1GetResources, args, reply) +} diff --git a/engine/filters.go b/engine/filters.go index 3eced14df..3dc2b10b9 100644 --- a/engine/filters.go +++ b/engine/filters.go @@ -458,8 +458,8 @@ func (fS *FilterS) getFieldNameDataProvider(initialDP config.DataProvider, return nil, fmt.Errorf("invalid fieldname <%s>", fieldName) } var reply *Resource - if err := fS.connMgr.Call(fS.cfg.FilterSCfg().ResourceSConns, nil, utils.ResourceSv1GetResource, - &utils.TenantID{Tenant: tenant, ID: splitFldName[1]}, &reply); err != nil { + if err := fS.connMgr.Call(fS.cfg.FilterSCfg().ResourceSConns, nil, utils.ResourceSv1GetResource, &utils.TenantIDWithArgDispatcher{ + TenantID: &utils.TenantID{Tenant: tenant, ID: splitFldName[1]}}, &reply); err != nil { return nil, err } dp = config.NewObjectDP(reply, []string{utils.MetaResources, reply.ID}) @@ -535,7 +535,8 @@ func (fS *FilterS) getFieldValueDataProvider(initialDP config.DataProvider, } var reply *Resource if err := fS.connMgr.Call(fS.cfg.FilterSCfg().ResourceSConns, nil, utils.ResourceSv1GetResource, - &utils.TenantID{Tenant: tenant, ID: splitFldName[1]}, &reply); err != nil { + &utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{ + Tenant: tenant, ID: splitFldName[1]}}, &reply); err != nil { return nil, err } dp = config.NewObjectDP(reply, []string{utils.MetaResources, reply.ID}) diff --git a/engine/resources.go b/engine/resources.go index c6ffb9d47..1dd17a40c 100644 --- a/engine/resources.go +++ b/engine/resources.go @@ -749,7 +749,7 @@ func (rS *ResourceService) V1ReleaseResource(args utils.ArgRSv1ResourceUsage, re } // GetResource returns a resource configuration -func (rS *ResourceService) V1GetResource(arg *utils.TenantID, reply *Resource) error { +func (rS *ResourceService) V1GetResource(arg *utils.TenantIDWithArgDispatcher, reply *Resource) error { if missing := utils.MissingStructFields(arg, []string{"Tenant", "ID"}); len(missing) != 0 { //Params missing return utils.NewErrMandatoryIeMissing(missing...) } diff --git a/engine/suppliers.go b/engine/suppliers.go index 2116a6c2e..3aca525a7 100644 --- a/engine/suppliers.go +++ b/engine/suppliers.go @@ -368,9 +368,9 @@ func (spS *SupplierService) resourceUsage(resIDs []string, tenant string) (tUsag for _, resID := range resIDs { var res Resource if err = spS.connMgr.Call(spS.cgrcfg.SupplierSCfg().ResourceSConns, nil, utils.ResourceSv1GetResource, - &utils.TenantID{Tenant: tenant, ID: resID}, &res); err != nil && - err.Error() != utils.ErrNotFound.Error() { - utils.Logger.Warning( + &utils.TenantIDWithArgDispatcher{TenantID: &utils.TenantID{ Tenant: tenant, ID: resID}}, &res); + err != nil && err.Error() != utils.ErrNotFound.Error() { + utils.Logger.Warning( fmt.Sprintf(" error: %s getting resource for ID : %s", err.Error(), resID)) continue } diff --git a/utils/consts.go b/utils/consts.go index c95bfc6bc..ec8061304 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -1265,6 +1265,7 @@ const ( const ( ResourceSv1AuthorizeResources = "ResourceSv1.AuthorizeResources" ResourceSv1GetResourcesForEvent = "ResourceSv1.GetResourcesForEvent" + ResourceSv1GetResources = "ResourceSv1.GetResources" ResourceSv1AllocateResources = "ResourceSv1.AllocateResources" ResourceSv1ReleaseResources = "ResourceSv1.ReleaseResources" ResourceSv1Ping = "ResourceSv1.Ping"