diff --git a/apier/v1/core.go b/apier/v1/core.go new file mode 100644 index 000000000..2beb44060 --- /dev/null +++ b/apier/v1/core.go @@ -0,0 +1,43 @@ +/* +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 v1 + +import ( + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +func NewCoreSv1(cS *engine.CoreService) *CoreSv1 { + return &CoreSv1{cS: cS} +} + +// Exports RPC from RLs +type CoreSv1 struct { + cS *engine.CoreService +} + +// Call implements rpcclient.RpcClientConnection interface for internal RPC +func (cS *CoreSv1) Call(serviceMethod string, + args interface{}, reply interface{}) error { + return utils.APIerRPCCall(cS, serviceMethod, args, reply) +} + +func (cS *CoreSv1) Status(arg *utils.TenantWithArgDispatcher, reply *map[string]interface{}) error { + return cS.cS.Status(arg, reply) +} diff --git a/apier/v1/dispatcher.go b/apier/v1/dispatcher.go index 0065270bc..2561d7a84 100755 --- a/apier/v1/dispatcher.go +++ b/apier/v1/dispatcher.go @@ -501,10 +501,6 @@ type DispatcherResponder struct { dS *dispatchers.DispatcherService } -func (dS *DispatcherResponder) Status(args *utils.TenantWithArgDispatcher, reply *map[string]interface{}) error { - return dS.dS.ResponderStatus(args, reply) -} - func (dS *DispatcherResponder) GetCost(args *engine.CallDescriptorWithArgDispatcher, reply *engine.CallCost) error { return dS.dS.ResponderGetCost(args, reply) } @@ -769,3 +765,16 @@ type DispatcherConfigSv1 struct { func (dS *DispatcherConfigSv1) GetJSONSection(args *config.StringWithArgDispatcher, reply *map[string]interface{}) (err error) { return dS.dS.ConfigSv1GetJSONSection(args, reply) } + +func NewDispatcherCoreSv1(dps *dispatchers.DispatcherService) *DispatcherCoreSv1 { + return &DispatcherCoreSv1{dS: dps} +} + +// Exports RPC from RLs +type DispatcherCoreSv1 struct { + dS *dispatchers.DispatcherService +} + +func (dS *DispatcherCoreSv1) Status(args *utils.TenantWithArgDispatcher, reply *map[string]interface{}) error { + return dS.dS.CoreSv1Status(args, reply) +} diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index ae8b1d089..2daa06702 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -1247,6 +1247,9 @@ func startDispatcherService(internalDispatcherSChan, internalAttributeSChan chan server.RpcRegisterName(utils.ConfigSv1, v1.NewDispatcherConfigSv1(dspS)) + server.RpcRegisterName(utils.CoreSv1, + v1.NewDispatcherCoreSv1(dspS)) + internalDispatcherSChan <- dspS } @@ -1301,6 +1304,14 @@ func initGuardianSv1(internalGuardianSChan chan rpcclient.RpcClientConnection, s internalGuardianSChan <- grdSv1 } +func initCoreSv1(internalCoreSv1Chan chan rpcclient.RpcClientConnection, server *utils.Server) { + cSv1 := v1.NewCoreSv1(engine.NewCoreService()) + if !cfg.DispatcherSCfg().Enabled { + server.RpcRegister(cSv1) + } + internalCoreSv1Chan <- cSv1 +} + func initSchedulerS(internalSchedSChan chan rpcclient.RpcClientConnection, srvMngr *servmanager.ServiceManager, server *utils.Server) { schdS := servmanager.NewSchedulerS(srvMngr) @@ -1663,6 +1674,7 @@ func main() { internalApierV2Chan := make(chan rpcclient.RpcClientConnection, 1) internalServeManagerChan := make(chan rpcclient.RpcClientConnection, 1) internalConfigChan := make(chan rpcclient.RpcClientConnection, 1) + internalCoreSv1Chan := make(chan rpcclient.RpcClientConnection, 1) // init internalRPCSet engine.IntRPC = engine.NewRPCClientSet() @@ -1686,6 +1698,7 @@ func main() { engine.IntRPC.AddInternalRPCClient(utils.ThresholdSv1, internalThresholdSChan) engine.IntRPC.AddInternalRPCClient(utils.ServiceManagerV1, internalServeManagerChan) engine.IntRPC.AddInternalRPCClient(utils.ConfigSv1, internalConfigChan) + engine.IntRPC.AddInternalRPCClient(utils.CoreSv1, internalCoreSv1Chan) } // init CacheS @@ -1694,6 +1707,9 @@ func main() { // init GuardianSv1 initGuardianSv1(internalGuardianSChan, server) + // init CoreSv1 + initCoreSv1(internalCoreSv1Chan, server) + // Start ServiceManager srvManager := servmanager.NewServiceManager(cfg, dm, cacheS, exitChan) initServiceManagerV1(internalServeManagerChan, srvManager, server) diff --git a/console/status.go b/console/status.go index cbea58204..f90fa574d 100644 --- a/console/status.go +++ b/console/status.go @@ -23,7 +23,7 @@ import "github.com/cgrates/cgrates/utils" func init() { c := &CmdStatus{ name: "status", - rpcMethod: utils.ResponderStatus, + rpcMethod: utils.CoreSv1Status, } commands[c.Name()] = c c.CommandExecuter = &CommandExecuter{c} diff --git a/data/tariffplans/dispatchers/Attributes.csv b/data/tariffplans/dispatchers/Attributes.csv index 92ba4d49d..35c184cb5 100644 --- a/data/tariffplans/dispatchers/Attributes.csv +++ b/data/tariffplans/dispatchers/Attributes.csv @@ -10,7 +10,7 @@ cgrates.org,ATTR_API_SUP_AUTH,*auth,*string:~APIKey:sup12345,,,APIMethods,*const cgrates.org,ATTR_API_STAT_AUTH,*auth,*string:~APIKey:stat12345,,,APIMethods,*constant,StatSv1.Ping&StatSv1.GetStatQueuesForEvent&StatSv1.GetQueueStringMetrics&StatSv1.ProcessEvent&StatSv1.GetQueueIDs&StatSv1.GetQueueFloatMetrics,false,20 cgrates.org,ATTR_API_RES_AUTH,*auth,*string:~APIKey:res12345,,,APIMethods,*constant,ResourceSv1.Ping&ResourceSv1.GetResourcesForEvent&ResourceSv1.AuthorizeResources&ResourceSv1.AllocateResources&ResourceSv1.ReleaseResources,false,20 cgrates.org,ATTR_API_SES_AUTH,*auth,*string:~APIKey:ses12345,,,APIMethods,*constant,SessionSv1.Ping&SessionSv1.AuthorizeEvent&SessionSv1.AuthorizeEventWithDigest&SessionSv1.InitiateSession&SessionSv1.InitiateSessionWithDigest&SessionSv1.UpdateSession&SessionSv1.SyncSessions&SessionSv1.TerminateSession&SessionSv1.ProcessCDR&SessionSv1.ProcessEvent&SessionSv1.GetActiveSessions&SessionSv1.GetActiveSessionsCount&SessionSv1.ForceDisconnect&SessionSv1.GetPassiveSessions&SessionSv1.GetPassiveSessionsCount&SessionSv1.ReplicateSessions&SessionSv1.SetPassiveSession,false,20 -cgrates.org,ATTR_API_RSP_AUTH,*auth,*string:~APIKey:rsp12345,,,APIMethods,*constant,Responder.Status&Responder.GetTimeout&Responder.Shutdown&Responder.Ping,false,20 +cgrates.org,ATTR_API_RSP_AUTH,*auth,*string:~APIKey:rsp12345,,,APIMethods,*constant,Responder.GetTimeout&Responder.Shutdown&Responder.Ping,false,20 cgrates.org,ATTR_API_CHC_AUTH,*auth,*string:~APIKey:chc12345,,,APIMethods,*constant,CacheSv1.Ping&CacheSv1.GetCacheStats&CacheSv1.LoadCache&CacheSv1.PrecacheStatus&CacheSv1.GetItemIDs&CacheSv1.HasItem&CacheSv1.GetItemExpiryTime&CacheSv1.ReloadCache&CacheSv1.RemoveItem&CacheSv1.FlushCache&CacheSv1.Clear,false,20 cgrates.org,ATTR_API_GRD_AUTH,*auth,*string:~APIKey:grd12345,,,APIMethods,*constant,GuardianSv1.Ping&GuardianSv1.RemoteLock&GuardianSv1.RemoteUnlock,false,20 cgrates.org,ATTR_API_SCHD_AUTH,*auth,*string:~APIKey:sched12345,,,APIMethods,*constant,SchedulerSv1.Ping,false,20 diff --git a/dispatchers/core.go b/dispatchers/core.go new file mode 100644 index 000000000..9ebc592e9 --- /dev/null +++ b/dispatchers/core.go @@ -0,0 +1,45 @@ +/* +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 dispatchers + +import ( + "time" + + "github.com/cgrates/cgrates/utils" +) + +func (dS *DispatcherService) CoreSv1Status(args *utils.TenantWithArgDispatcher, + reply *map[string]interface{}) (err error) { + tnt := utils.FirstNonEmpty(args.Tenant, dS.cfg.GeneralCfg().DefaultTenant) + if dS.attrS != nil { + if args.ArgDispatcher == nil { + return utils.NewErrMandatoryIeMissing(utils.ArgDispatcherField) + } + if err = dS.authorize(utils.CoreSv1Status, tnt, + args.APIKey, utils.TimePointer(time.Now())); err != nil { + return + } + } + var routeID *string + if args.ArgDispatcher != nil { + routeID = args.ArgDispatcher.RouteID + } + return dS.Dispatch(&utils.CGREvent{Tenant: tnt}, utils.MetaCore, + routeID, utils.CoreSv1Status, args, reply) +} diff --git a/dispatchers/responder.go b/dispatchers/responder.go index 0451f8480..eb5fe968f 100644 --- a/dispatchers/responder.go +++ b/dispatchers/responder.go @@ -46,26 +46,6 @@ func (dS *DispatcherService) ResponderPing(args *utils.CGREventWithArgDispatcher routeID, utils.ResponderPing, args, reply) } -func (dS *DispatcherService) ResponderStatus(args *utils.TenantWithArgDispatcher, - reply *map[string]interface{}) (err error) { - tnt := utils.FirstNonEmpty(args.Tenant, dS.cfg.GeneralCfg().DefaultTenant) - if dS.attrS != nil { - if args.ArgDispatcher == nil { - return utils.NewErrMandatoryIeMissing(utils.ArgDispatcherField) - } - if err = dS.authorize(utils.ResponderStatus, tnt, - args.APIKey, utils.TimePointer(time.Now())); err != nil { - return - } - } - var routeID *string - if args.ArgDispatcher != nil { - routeID = args.ArgDispatcher.RouteID - } - return dS.Dispatch(&utils.CGREvent{Tenant: tnt}, utils.MetaResponder, - routeID, utils.ResponderStatus, args, reply) -} - func (dS *DispatcherService) ResponderGetCost(args *engine.CallDescriptorWithArgDispatcher, reply *engine.CallCost) (err error) { if dS.attrS != nil { diff --git a/engine/core.go b/engine/core.go new file mode 100644 index 000000000..da1554569 --- /dev/null +++ b/engine/core.go @@ -0,0 +1,64 @@ +/* +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 engine + +import ( + "fmt" + "runtime" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" +) + +func NewCoreService() *CoreService { + return &CoreService{} +} + +type CoreService struct { +} + +// ListenAndServe will initialize the service +func (cS *CoreService) ListenAndServe(exitChan chan bool) (err error) { + utils.Logger.Info("Starting Core service") + e := <-exitChan + exitChan <- e // put back for the others listening for shutdown request + return +} + +// Shutdown is called to shutdown the service +func (cS *CoreService) Shutdown() (err error) { + utils.Logger.Info(fmt.Sprintf("<%s> shutdown initialized", utils.CoreS)) + utils.Logger.Info(fmt.Sprintf("<%s> shutdown complete", utils.CoreS)) + return +} + +func (cS *CoreService) Status(arg *utils.TenantWithArgDispatcher, reply *map[string]interface{}) (err error) { + memstats := new(runtime.MemStats) + runtime.ReadMemStats(memstats) + response := make(map[string]interface{}) + response[utils.NodeID] = config.CgrConfig().GeneralCfg().NodeID + response[utils.MemoryUsage] = utils.SizeFmt(float64(memstats.HeapAlloc), "") + response[utils.ActiveGoroutines] = runtime.NumGoroutine() + response[utils.Footprint] = utils.SizeFmt(float64(memstats.Sys), "") + response[utils.Version] = utils.GetCGRVersion() + response[utils.RunningSince] = utils.GetStartTime() + response[utils.GoVersion] = runtime.Version() + *reply = response + return +} diff --git a/engine/responder.go b/engine/responder.go index d3b4cb139..b17200da5 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -20,7 +20,6 @@ package engine import ( "reflect" - "runtime" "strings" "time" @@ -241,26 +240,6 @@ func (rs *Responder) GetMaxSessionTime(arg *CallDescriptorWithArgDispatcher, rep return } -func (rs *Responder) Status(arg *utils.TenantWithArgDispatcher, reply *map[string]interface{}) (err error) { - // if arg != "" { // Introduce delay in answer, used in some automated tests - // if delay, err := utils.ParseDurationWithNanosecs(arg); err == nil { - // time.Sleep(delay) - // } - // } - memstats := new(runtime.MemStats) - runtime.ReadMemStats(memstats) - response := make(map[string]interface{}) - response[utils.NodeID] = config.CgrConfig().GeneralCfg().NodeID - response[utils.MemoryUsage] = utils.SizeFmt(float64(memstats.HeapAlloc), "") - response[utils.ActiveGoroutines] = runtime.NumGoroutine() - response[utils.Footprint] = utils.SizeFmt(float64(memstats.Sys), "") - response[utils.Version] = utils.GetCGRVersion() - response[utils.RunningSince] = utils.GetStartTime() - response[utils.GoVersion] = runtime.Version() - *reply = response - return -} - func (rs *Responder) Shutdown(arg *utils.TenantWithArgDispatcher, reply *string) (err error) { dm.DataDB().Close() cdrStorage.Close() diff --git a/general_tests/rpcclient_it_test.go b/general_tests/rpcclient_it_test.go index bc8bf28e9..917ae080d 100644 --- a/general_tests/rpcclient_it_test.go +++ b/general_tests/rpcclient_it_test.go @@ -95,12 +95,12 @@ func TestRPCITLclRpcConnPoolFirst(t *testing.T) { // Connect rpc client to rater func TestRPCITLclStatusSecondEngine(t *testing.T) { var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance t.Error(err) } else if status[utils.NodeID].(string) != node2 { t.Errorf("Expecting:\n%s\nReceived:\n%s", node2, status[utils.NodeID].(string)) @@ -117,14 +117,14 @@ func TestRPCITLclStartFirstEngine(t *testing.T) { // Connect rpc client to rater func TestRPCITLclStatusFirstInitial(t *testing.T) { var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } else if status[utils.NodeID].(string) == node2 { t.Fatalf("Should receive ralID different than second one, got: %s", status[utils.NodeID].(string)) } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance t.Error(err) } else if status[utils.NodeID].(string) != node1 { t.Errorf("Expecting:\n%s\nReceived:\n%s", node1, status[utils.NodeID].(string)) @@ -138,14 +138,14 @@ func TestRPCITLclStatusFirstFailover(t *testing.T) { } time.Sleep(time.Duration(*waitRater) * time.Millisecond) var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } else if status[utils.NodeID].(string) == node1 { t.Fatalf("Should receive ralID different than first one, got: %s", status[utils.NodeID].(string)) } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance t.Error(err) } else if status[utils.NodeID].(string) != node2 { t.Errorf("Expecting:\n%s\nReceived:\n%s", node2, status[utils.NodeID].(string)) @@ -157,12 +157,12 @@ func TestRPCITLclStatusFirstFailback(t *testing.T) { t.Fatal(err) } var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == node2 { t.Error("Should receive new ID") } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance t.Error(err) } else if status[utils.NodeID].(string) != node1 { t.Errorf("Expecting:\n%s\nReceived:\n%s", node2, status[utils.NodeID].(string)) @@ -179,7 +179,7 @@ func TestRPCITLclTDirectedRPC(t *testing.T) { // func TestRPCITLclTimeout(t *testing.T) { // var status map[string]interface{} -// if err := rpcPoolFirst.Call("Responder.Status", "10s", &status); err == nil { +// if err := rpcPoolFirst.Call(utils.CoreSv1Status, "10s", &status); err == nil { // t.Error("Expecting timeout") // } else if err.Error() != rpcclient.ErrReplyTimeout.Error() { // t.Error(err) @@ -195,12 +195,12 @@ func TestRPCITLclRpcConnPoolBcast(t *testing.T) { func TestRPCITLclBcastStatusInitial(t *testing.T) { var status map[string]interface{} - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") @@ -213,12 +213,12 @@ func TestRPCITLclBcastStatusNoRals1(t *testing.T) { } time.Sleep(time.Duration(*waitRater) * time.Millisecond) var status map[string]interface{} - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") @@ -231,7 +231,7 @@ func TestRPCITLclBcastStatusBcastNoRals(t *testing.T) { } time.Sleep(time.Duration(*waitRater) * time.Millisecond) var status map[string]interface{} - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err == nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err == nil { t.Error("Should get error") } } @@ -241,12 +241,12 @@ func TestRPCITLclBcastStatusRALs2Up(t *testing.T) { t.Fatal(err) } var status map[string]interface{} - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") @@ -258,12 +258,12 @@ func TestRPCITLclStatusBcastRALs1Up(t *testing.T) { t.Fatal(err) } var status map[string]interface{} - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty InstanceID received") } - if err := rpcPoolBroadcast.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolBroadcast.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty InstanceID received") @@ -331,12 +331,12 @@ func TestRPCITRmtStatusFirstInitial(t *testing.T) { return } var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // Make sure second time we land on the same instance t.Error(err) } else if status[utils.NodeID].(string) != node1 { t.Errorf("Expecting:\n%s\nReceived:\n%s", node1, status[utils.NodeID].(string)) @@ -355,14 +355,14 @@ func TestRPCITRmtStatusFirstFailover(t *testing.T) { } fmt.Println("\n\nExecuting query ...") var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } else if status[utils.NodeID].(string) == node1 { t.Fatal("Did not failover") } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") @@ -383,14 +383,14 @@ func TestRPCITRmtStatusFirstFailback(t *testing.T) { } fmt.Println("\n\nExecuting query ...") var status map[string]interface{} - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") } else if status[utils.NodeID].(string) == node2 { t.Fatal("Did not do failback") } - if err := rpcPoolFirst.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { + if err := rpcPoolFirst.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { t.Error(err) } else if status[utils.NodeID].(string) == "" { t.Error("Empty NodeID received") diff --git a/sessions/sessions_rpl_it_test.go b/sessions/sessions_rpl_it_test.go index b9e944072..8b35ee634 100644 --- a/sessions/sessions_rpl_it_test.go +++ b/sessions/sessions_rpl_it_test.go @@ -395,10 +395,10 @@ func TestSessionSRplManualReplicate(t *testing.T) { t.Errorf("Failed to kill process, error: %v", err.Error()) } var status map[string]interface{} - if err := smgRplcMstrRPC.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err == nil { // master should not longer be reachable + if err := smgRplcMstrRPC.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err == nil { // master should not longer be reachable t.Error(err, status) } - if err := smgRplcSlvRPC.Call("Responder.Status", utils.TenantWithArgDispatcher{}, &status); err != nil { // slave should be still operational + if err := smgRplcSlvRPC.Call(utils.CoreSv1Status, utils.TenantWithArgDispatcher{}, &status); err != nil { // slave should be still operational t.Error(err) } // start master diff --git a/utils/consts.go b/utils/consts.go index b577a6e8c..5467833e7 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -385,6 +385,7 @@ const ( MetaRALs = "*rals" MetaStats = "*stats" MetaResponder = "*responder" + MetaCore = "*core" MetaThresholds = "*thresholds" MetaSuppliers = "*suppliers" MetaAttributes = "*attributes" @@ -775,6 +776,12 @@ const ( ConfigSv1GetJSONSection = "ConfigSv1.GetJSONSection" ) +const ( + CoreS = "CoreS" + CoreSv1 = "CoreSv1" + CoreSv1Status = "CoreSv1.Status" +) + // SupplierS APIs const ( SupplierSv1GetSuppliers = "SupplierSv1.GetSuppliers" @@ -881,7 +888,6 @@ const ( ResponderDebit = "Responder.Debit" ResponderRefundIncrements = "Responder.RefundIncrements" ResponderGetMaxSessionTime = "Responder.GetMaxSessionTime" - ResponderStatus = "Responder.Status" ResponderMaxDebit = "Responder.MaxDebit" ResponderRefundRounding = "Responder.RefundRounding" ResponderGetCost = "Responder.GetCost"