Updated tests in apier and general_tests

This commit is contained in:
adragusin
2020-03-03 19:20:50 +02:00
committed by Dan Christian Bogos
parent f21ed245ca
commit 1e6b59c7ee
12 changed files with 555 additions and 133 deletions

View File

@@ -226,7 +226,6 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor,
if err = agReq.setCGRReply(rply, err); err != nil {
return
}
fmt.Println(utils.ToJSON(rply))
case utils.MetaInitiate:
initArgs := sessions.NewV1InitSessionArgs(
reqProcessor.Flags.HasKey(utils.MetaAttributes),

View File

@@ -579,14 +579,6 @@ func (apiv1 *APIerSv1) SetActions(attrs V1AttrSetActions, reply *string) (err er
if err := apiv1.DataManager.SetActions(attrs.ActionsId, storeActions, utils.NonTransactional); err != nil {
return utils.NewErrServerError(err)
}
if err := apiv1.ConnMgr.Call(apiv1.Config.ApierCfg().CachesConns, nil,
utils.CacheSv1ReloadCache, utils.AttrReloadCacheWithArgDispatcher{
AttrReloadCache: utils.AttrReloadCache{
ArgsCache: utils.ArgsCache{ActionIDs: &[]string{attrs.ActionsId}},
},
}, reply); err != nil {
return err
}
//generate a loadID for CacheActions and store it in database
if err := apiv1.DataManager.SetLoadIDs(map[string]int64{utils.CacheActions: time.Now().UnixNano()}); err != nil {
return utils.APIErrorHandler(err)
@@ -676,7 +668,6 @@ func (apiv1 *APIerSv1) SetActionPlan(attrs AttrSetActionPlan, reply *string) (er
if exists, err := apiv1.DataManager.HasData(utils.ACTION_PREFIX, apiAtm.ActionsId, ""); err != nil {
return 0, utils.NewErrServerError(err)
} else if !exists {
utils.Logger.Debug("TEST IF EXIT HERE ??? ")
return 0, fmt.Errorf("%s:%s", utils.ErrBrokenReference.Error(), apiAtm.ActionsId)
}
timing := new(engine.RITiming)

View File

@@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package v1
import (
"fmt"
"path"
"reflect"
"testing"
@@ -37,21 +36,22 @@ var (
testInternalReplicateITDataFlush,
testInternalReplicateITStartEngine,
testInternalReplicateITRPCConn,
testInternalReplicateLoadDataInInternalEngine,
// // testInternalReplicateITDestination,was commetner
// testInternalReplicateITAttributeProfile,
// // testInternalReplicateITRatingProfile, was commetner
// testInternalReplicateITSupplierProfile,
// testInternalReplicateITStatQueueProfile,
// testInternalReplicateITDispatcherProfile,
// testInternalReplicateITChargerProfile,
// testInternalReplicateITDispatcherHost,
// testInternalReplicateITFilter,
// testInternalReplicateITResourceProfile,
testInternalReplicateITActions, //-> was commetner
testInternalReplicateITActionPlan,
// testInternalReplicateITThresholdProfile,
// testInternalReplicateITSetAccount,
testInternalReplicateITDestination,
testInternalReplicateITAttributeProfile,
testInternalReplicateITRatingProfile,
testInternalReplicateITSupplierProfile,
testInternalReplicateITStatQueueProfile,
testInternalReplicateITDispatcherProfile,
testInternalReplicateITChargerProfile,
testInternalReplicateITDispatcherHost,
testInternalReplicateITFilter,
testInternalReplicateITResourceProfile,
testInternalReplicateITActions,
// testInternalReplicateITActionPlan,
testInternalReplicateITThresholdProfile,
testInternalReplicateITSetAccount,
testInternalReplicateITKillEngine,
}
@@ -83,7 +83,7 @@ func TestInternalReplicateIT(t *testing.T) {
func testInternalReplicateITInitCfg(t *testing.T) {
var err error
internalCfgPath = path.Join(*dataDir, "conf", "samples", "remote_replication", internalCfgDirPath)
internalCfgPath = path.Join(*dataDir, "conf", "samples", "replication", internalCfgDirPath)
internalCfg, err = config.NewCGRConfigFromPath(internalCfgPath)
if err != nil {
t.Error(err)
@@ -92,8 +92,7 @@ func testInternalReplicateITInitCfg(t *testing.T) {
config.SetCgrConfig(internalCfg)
// prepare config for engine1
engineOneCfgPath = path.Join(*dataDir, "conf", "samples",
"remote_replication", engineOneCfgDirPath)
engineOneCfgPath = path.Join(*dataDir, "conf", "samples", "replication", engineOneCfgDirPath)
engineOneCfg, err = config.NewCGRConfigFromPath(engineOneCfgPath)
if err != nil {
t.Error(err)
@@ -101,8 +100,7 @@ func testInternalReplicateITInitCfg(t *testing.T) {
engineOneCfg.DataFolderPath = *dataDir // Share DataFolderPath through config towards StoreDb for Flush()
// prepare config for engine2
engineTwoCfgPath = path.Join(*dataDir, "conf", "samples",
"remote_replication", engineTwoCfgDirPath)
engineTwoCfgPath = path.Join(*dataDir, "conf", "samples", "replication", engineTwoCfgDirPath)
engineTwoCfg, err = config.NewCGRConfigFromPath(engineTwoCfgPath)
if err != nil {
t.Error(err)
@@ -152,9 +150,26 @@ func testInternalReplicateITRPCConn(t *testing.T) {
time.Sleep(200 * time.Millisecond)
}
func testInternalReplicateLoadDataInInternalEngine(t *testing.T) {
var reply string
attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*dataDir, "tariffplans", "tutorial")}
if err := internalRPC.Call(utils.APIerSv1LoadTariffPlanFromFolder, attrs, &reply); err != nil {
t.Error(err)
}
time.Sleep(500 * time.Millisecond)
}
func testInternalReplicateITDestination(t *testing.T) {
//check
rpl := &engine.Destination{}
if err := engineOneRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
if err := engineTwoRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
//set
attrs := utils.AttrSetDestination{Id: "TEST_SET_DESTINATION3", Prefixes: []string{"004", "005"}}
attrs := utils.AttrSetDestination{Id: "testDestination", Prefixes: []string{"004", "005"}}
var reply string
if err := internalRPC.Call(utils.APIerSv1SetDestination, attrs, &reply); err != nil {
t.Error("Unexpected error", err.Error())
@@ -162,34 +177,33 @@ func testInternalReplicateITDestination(t *testing.T) {
t.Error("Unexpected reply returned", reply)
}
eDst := &engine.Destination{
Id: "TEST_SET_DESTINATION3",
Id: "testDestination",
Prefixes: []string{"004", "005"},
}
// check
rpl := &engine.Destination{}
if err := engineOneRPC.Call(utils.APIerSv1GetDestination, "TEST_SET_DESTINATION3", &rpl); err != nil {
if err := engineOneRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eDst, rpl) {
t.Errorf("Expected: %v,\n received: %v", eDst, rpl)
}
if err := engineTwoRPC.Call(utils.APIerSv1GetDestination, "TEST_SET_DESTINATION3", &rpl); err != nil {
if err := engineTwoRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eDst, rpl) {
t.Errorf("Expected: %v,\n received: %v", eDst, rpl)
}
// remove
attr := &AttrRemoveDestination{DestinationIDs: []string{"TEST_SET_DESTINATION"}, Prefixes: []string{"004", "005"}}
attr := &AttrRemoveDestination{DestinationIDs: []string{"testDestination"}, Prefixes: []string{"004", "005"}}
if err := internalRPC.Call(utils.APIerSv1RemoveDestination, attr, &reply); err != nil {
t.Error("Unexpected error", err.Error())
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
t.Errorf("Unexpected reply returned: %+v", reply)
}
// check
if err := engineOneRPC.Call(utils.APIerSv1GetDestination, "TEST_SET_DESTINATION", &rpl); err == nil || err != utils.ErrNotFound {
if err := engineOneRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
if err := engineTwoRPC.Call(utils.APIerSv1GetDestination, "TEST_SET_DESTINATION", &rpl); err == nil || err != utils.ErrNotFound {
if err := engineTwoRPC.Call(utils.APIerSv1GetDestination, "testDestination", &rpl); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
}
@@ -264,6 +278,15 @@ func testInternalReplicateITAttributeProfile(t *testing.T) {
}
func testInternalReplicateITRatingProfile(t *testing.T) {
//check
var rpl engine.RatingProfile
attrGetRatingProfile := &utils.AttrGetRatingProfile{
Tenant: "cgrates.org",
Category: "call",
Subject: "Subject"}
if err := engineOneRPC.Call(utils.APIerSv1GetRatingProfile, attrGetRatingProfile, &rpl); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Expecting: %+v recived: %+v", utils.ErrNotFound, err)
}
// set
var reply string
attrSetRatingProfile := &utils.AttrSetRatingProfile{
@@ -273,7 +296,7 @@ func testInternalReplicateITRatingProfile(t *testing.T) {
RatingPlanActivations: []*utils.TPRatingActivation{
&utils.TPRatingActivation{
ActivationTime: "2012-01-01T00:00:00Z",
RatingPlanId: "RETAIL1",
RatingPlanId: "RP_1001",
FallbackSubjects: "FallbackSubjects"},
}}
if err := internalRPC.Call(utils.APIerSv1SetRatingProfile, attrSetRatingProfile, &reply); err != nil {
@@ -286,11 +309,6 @@ func testInternalReplicateITRatingProfile(t *testing.T) {
t.Error(err)
}
//check
var rpl engine.RatingProfile
attrGetRatingProfile := &utils.AttrGetRatingProfile{
Tenant: "cgrates.org",
Category: "call",
Subject: "Subject"}
actTime, err := utils.ParseTimeDetectLayout("2012-01-01T00:00:00Z", utils.EmptyString)
if err != nil {
t.Error(err)
@@ -300,7 +318,7 @@ func testInternalReplicateITRatingProfile(t *testing.T) {
RatingPlanActivations: engine.RatingPlanActivations{
{
ActivationTime: actTime,
RatingPlanId: "RETAIL1",
RatingPlanId: "RP_1001",
FallbackKeys: []string{"*out:cgrates.org:call:FallbackSubjects"},
},
},
@@ -310,11 +328,11 @@ func testInternalReplicateITRatingProfile(t *testing.T) {
} else if !reflect.DeepEqual(expected, rpl) {
t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rpl))
}
if err := engineTwoRPC.Call(utils.APIerSv1GetRatingProfile, attrGetRatingProfile, &rpl); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expected, rpl) {
t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rpl))
}
// if err := engineTwoRPC.Call(utils.APIerSv1GetRatingProfile, attrGetRatingProfile, &rpl); err != nil {
// t.Error(err)
// } else if !reflect.DeepEqual(expected, rpl) {
// t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(expected), utils.ToJSON(rpl))
// }
}
func testInternalReplicateITSupplierProfile(t *testing.T) {
@@ -816,10 +834,10 @@ func testInternalReplicateITResourceProfile(t *testing.T) {
func testInternalReplicateITActions(t *testing.T) {
// check
var reply1 []*utils.TPAction
if err := engineOneRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != utils.ErrNotFound.Error() {
if err := engineOneRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" {
t.Error(err)
}
if err := engineTwoRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != utils.ErrNotFound.Error() {
if err := engineTwoRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" {
t.Error(err)
}
// set
@@ -838,47 +856,74 @@ func testInternalReplicateITActions(t *testing.T) {
} else if reply != utils.OK {
t.Errorf("Unexpected reply returned: %s", reply)
}
// if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err == nil || err.Error() != "EXISTS" {
// t.Error("Unexpected result on duplication: ", err.Error())
// }
//check
if err := internalRPC.Call(utils.APIerSv1SetActions, attrs1, &reply); err == nil || err.Error() != "EXISTS" {
t.Error("Unexpected result on duplication: ", err.Error())
}
// check
eOut := []*utils.TPAction{
&utils.TPAction{
Identifier: utils.TOPUP_RESET,
BalanceType: utils.MONETARY,
Units: "75",
BalanceWeight: "0",
BalanceBlocker: "false",
BalanceDisabled: "false",
ExpiryTime: utils.UNLIMITED,
Weight: 20.0,
}}
if err := internalRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil {
t.Error("Got error on APIerSv1.GetActions: ", err.Error())
} else if !reflect.DeepEqual(attrs1.Actions, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1))
} else if !reflect.DeepEqual(eOut, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1))
}
if err := engineOneRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil {
t.Error("Got error on APIerSv1.GetActions: ", err.Error())
} else if !reflect.DeepEqual(attrs1.Actions, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1))
} else if !reflect.DeepEqual(eOut, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1))
}
if err := engineTwoRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil {
t.Error("Got error on APIerSv1.GetActions: ", err.Error())
} else if !reflect.DeepEqual(attrs1.Actions, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1))
} else if !reflect.DeepEqual(eOut, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1))
}
// remove
if err := internalRPC.Call(utils.APIerSv1RemoveActions,
&AttrRemoveActions{
ActionIDs: []string{"ACTS_1"}}, &reply); err != nil {
t.Error("Got error on APIerSv1.RemoveActions: ", err.Error())
} else if reply != utils.OK {
t.Error("Unexpected reply when calling APIerSv1.RemoveActions: ", err.Error())
}
// check again
if err := engineOneRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" {
t.Error(err)
}
if err := engineTwoRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err == nil || err.Error() != "SERVER_ERROR: NOT_FOUND" {
t.Error(err)
}
}
func testInternalReplicateITActionPlan(t *testing.T) {
//var reply string
// if err := internalRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{
// ActionsId: "ACTS_1",
// Actions: []*utils.TPAction{{Identifier: utils.LOG}},
// }, &reply); err != nil && err.Error() != utils.ErrExists.Error() {
// t.Error(err)
// } else if reply != utils.OK {
// t.Errorf("Calling APIerSv2.SetActions received: %s", reply)
// }
var reply string
if err := internalRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{
ActionsId: "ACTS_1",
Actions: []*utils.TPAction{{Identifier: utils.LOG}},
}, &reply); err != nil && err.Error() != utils.ErrExists.Error() {
t.Error(err)
} else if reply != utils.OK {
t.Errorf("Calling APIerSv2.SetActions received: %s", reply)
}
// check
var aps []*engine.ActionPlan
// if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan,
// AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
// t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
// }
// if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan,
// AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
// t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
// }
if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan,
AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
}
if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan,
AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
}
// set
atms1 := &AttrSetActionPlan{
Id: "ATMS_1",
@@ -896,19 +941,6 @@ func testInternalReplicateITActionPlan(t *testing.T) {
t.Errorf("Unexpected reply returned: %s", reply1)
}
// check
if err := internalRPC.Call(utils.APIerSv1GetActionPlan,
AttrGetActionPlan{ID: utils.EmptyString}, &aps); err != nil {
t.Error(err)
} else if len(aps) != 1 {
t.Errorf("Expected: %v,\n received: %v", 1, len(aps))
} else if aps[0].Id != "ATMS_1" {
t.Errorf("Expected: ATMS_1,\n received: %v", aps[0].Id)
} else if aps[0].ActionTimings[0].ActionsID != "ACTS_1" {
t.Errorf("Expected: ACTS_1,\n received: %v", aps[0].ActionTimings[0].ActionsID)
} else if aps[0].ActionTimings[0].Weight != 20.0 {
t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight)
}
// check
if err := engineOneRPC.Call(utils.APIerSv1GetActionPlan,
AttrGetActionPlan{ID: utils.EmptyString}, &aps); err != nil {
t.Error(err)
@@ -921,7 +953,6 @@ func testInternalReplicateITActionPlan(t *testing.T) {
} else if aps[0].ActionTimings[0].Weight != 20.0 {
t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight)
}
// check
if err := engineTwoRPC.Call(utils.APIerSv1GetActionPlan,
AttrGetActionPlan{ID: utils.EmptyString}, &aps); err != nil {
t.Error(err)
@@ -1095,7 +1126,6 @@ func testInternalReplicateITSetAccount(t *testing.T) {
err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
fmt.Println("PASSED")
}
func testInternalReplicateITKillEngine(t *testing.T) {

View File

@@ -101,7 +101,10 @@ func (dbcfg *DataDbCfg) loadFromJsonCfg(jsnDbCfg *DbJsonCfg) (err error) {
}
if jsnDbCfg.Items != nil {
for kJsn, vJsn := range *jsnDbCfg.Items {
val := new(ItemOpt)
val, has := dbcfg.Items[kJsn]
if val == nil || !has {
val = new(ItemOpt)
}
if err := val.loadFromJsonCfg(vJsn); err != nil {
return err
}

View File

@@ -0,0 +1,44 @@
{
"general": {
"log_level": 7,
"node_id" : "EngineMongo1",
},
"listen": {
"rpc_json": ":2022",
"rpc_gob": ":2023",
"http": ":2280",
},
"data_db": {
"db_type": "mongo",
"db_name": "10",
"db_port": 27017,
},
"stor_db": {
"db_type": "mongo",
"db_name": "cgrates",
"db_port": 27017,
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,41 @@
{
"general": {
"log_level": 7,
"node_id": "EngineRedis1"
},
"listen": {
"rpc_json": ":2022",
"rpc_gob": ":2023",
"http": ":2280",
},
"data_db": {
"db_type": "redis",
"db_port": 6379,
"db_name": "10",
},
"stor_db": {
"db_password": "CGRateS.org",
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,45 @@
{
"general": {
"log_level": 7,
"node_id" : "EngineMongo2",
},
"listen": {
"rpc_json": ":2032",
"rpc_gob": ":2033",
"http": ":2380",
},
"data_db": {
"db_type": "mongo",
"db_name": "11",
"db_port": 27017,
},
"stor_db": {
"db_type": "mongo",
"db_name": "cgrates",
"db_port": 27017,
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,40 @@
{
"general": {
"log_level": 7,
"node_id": "EngineRedis2"
},
"listen": {
"rpc_json": ":2032",
"rpc_gob": ":2033",
"http": ":2380",
},
"data_db": {
"db_type": "redis",
"db_port": 6379,
"db_name": "11",
},
"stor_db": {
"db_password": "CGRateS.org",
},
"rals": {
"enabled": true,
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
},
}

View File

@@ -0,0 +1,106 @@
{
"general": {
"log_level": 7,
"node_id": "InternalEngine",
},
"listen": {
"rpc_json": ":2012",
"rpc_gob": ":2013",
"http": ":2080",
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:2032", "transport":"*json"}],
},
"conn2": {
"strategy": "*broadcast_sync",
"conns": [
{"address": "127.0.0.1:2022", "transport":"*json"},
{"address": "127.0.0.1:2032", "transport":"*json"}
],
},
"connCache": {
"strategy": "*broadcast",
"conns": [
{"address": "127.0.0.1:2022", "transport":"*json"},
{"address": "127.0.0.1:2032", "transport":"*json"}
],
}
},
"data_db": {
"db_type": "*internal",
"remote_conns": ["conn1"],
"replication_conns": ["conn2"],
"items":{
"*accounts":{"remote":false,"replicate":true},
"*reverse_destinations": {"remote":false,"replicate":true},
"*destinations": {"remote":false,"replicate":true},
"*rating_plans": {"remote":false,"replicate":true},
"*rating_profiles":{"remote":false,"replicate":true},
"*actions":{"remote":false,"replicate":true},
"*action_plans": {"remote":false,"replicate":true},
"*account_action_plans":{"remote":false,"replicate":true},
"*action_triggers":{"remote":false,"replicate":true},
"*shared_groups":{"remote":false,"replicate":true},
"*timings": {"remote":false,"replicate":true},
"*resource_profiles":{"remote":false,"replicate":true},
"*resources":{"remote":false,"replicate":true},
"*statqueue_profiles": {"remote":false,"replicate":true},
"*statqueues": {"remote":false,"replicate":true},
"*threshold_profiles": {"remote":false,"replicate":true},
"*thresholds": {"remote":false,"replicate":true},
"*filters": {"remote":false,"replicate":true},
"*supplier_profiles":{"remote":false,"replicate":true},
"*attribute_profiles":{"remote":false,"replicate":true},
"*charger_profiles": {"remote":false,"replicate":true},
"*dispatcher_profiles":{"remote":false,"replicate":true},
"*dispatcher_hosts":{"remote":false,"replicate":true},
"*filter_indexes" :{"remote":false,"replicate":true},
"*load_ids":{"remote":false,"replicate":true},
},
},
"stor_db": {
"db_type": "*internal",
},
"rals": {
"enabled": true,
},
"thresholds": {
"enabled": true,
"store_interval": "-1",
},
"resources": {
"enabled": true,
"store_interval": "-1",
"thresholds_conns": ["*internal"],
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
"caches_conns":["connCache"],
},
}

View File

@@ -0,0 +1,104 @@
{
"general": {
"log_level": 7,
"node_id": "InternalEngine",
},
"listen": {
"rpc_json": ":2012",
"rpc_gob": ":2013",
"http": ":2080",
},
"rpc_conns": {
"conn1": {
"strategy": "*first",
"conns": [{"address": "127.0.0.1:2033", "transport":"*gob"}],
},
"conn2": {
"strategy": "*broadcast",
"conns": [
{"address": "127.0.0.1:2023", "transport":"*gob"},
{"address": "127.0.0.1:2033", "transport":"*gob"}
],
}
},
"data_db": {
"db_type": "*internal",
"remote_conns": ["conn1"],
"replication_conns": ["conn2"],
"items":{
"*accounts":{"remote":true,"replicate":true},
"*reverse_destinations": {"remote":true,"replicate":true},
"*destinations": {"remote":true,"replicate":true},
"*rating_plans": {"remote":true,"replicate":true},
"*rating_profiles":{"remote":true,"replicate":true},
"*actions":{"remote":true,"replicate":true},
"*action_plans": {"remote":true,"replicate":true},
"*account_action_plans":{"remote":true,"replicate":true},
"*action_triggers":{"remote":true,"replicate":true},
"*shared_groups":{"remote":true,"replicate":true},
"*timings": {"remote":true,"replicate":true},
"*resource_profiles":{"remote":true,"replicate":true},
"*resources":{"remote":true,"replicate":true},
"*statqueue_profiles": {"remote":true,"replicate":true},
"*statqueues": {"remote":true,"replicate":true},
"*threshold_profiles": {"remote":true,"replicate":true},
"*thresholds": {"remote":true,"replicate":true},
"*filters": {"remote":true,"replicate":true},
"*supplier_profiles":{"remote":true,"replicate":true},
"*attribute_profiles":{"remote":true,"replicate":true},
"*charger_profiles": {"remote":true,"replicate":true},
"*dispatcher_profiles":{"remote":true,"replicate":true},
"*dispatcher_hosts":{"remote":true,"replicate":true},
"*filter_indexes" :{"remote":true,"replicate":true},
"*load_ids":{"remote":true,"replicate":true},
},
},
"stor_db": {
"db_type": "*internal",
},
"rals": {
"enabled": true,
},
"thresholds": {
"enabled": true,
"store_interval": "-1",
},
"resources": {
"enabled": true,
"store_interval": "-1",
"thresholds_conns": ["*internal"],
},
"stats": {
"enabled": false,
"store_interval": "-1",
},
"schedulers": {
"enabled": true,
},
"apiers": {
"enabled": true,
"scheduler_conns": ["*internal"],
},
}

View File

@@ -738,15 +738,8 @@ func (iDB *InternalDB) GetActionsDrv(id string) (acts Actions, err error) {
}
func (iDB *InternalDB) SetActionsDrv(id string, acts Actions) (err error) {
utils.Logger.Debug("ENTER IN SET ACTIONS DRV ??? ")
iDB.db.Set(utils.CacheActions, id, acts, nil,
cacheCommit(utils.NonTransactional), utils.NonTransactional)
utils.Logger.Debug("Set With Success ")
x, ok := iDB.db.Get(utils.CacheActions, id)
if !ok || x == nil {
utils.Logger.Debug("NOT FOUND ")
}
utils.Logger.Debug(fmt.Sprintf("ACTIONS : %+v", utils.ToJSON(x.(Actions))))
return
}

View File

@@ -203,10 +203,21 @@ func testdoubleRemoveActions(t *testing.T) {
t.Error(err)
}
// check
eOut := []*utils.TPAction{
&utils.TPAction{
Identifier: utils.TOPUP_RESET,
BalanceType: utils.MONETARY,
Units: "75",
BalanceWeight: "0",
BalanceBlocker: "false",
BalanceDisabled: "false",
ExpiryTime: utils.UNLIMITED,
Weight: 20.0,
}}
if err := sesRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil {
t.Error("Got error on APIerSv1.GetActions: ", err.Error())
} else if !reflect.DeepEqual(attrs1.Actions, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1))
} else if !reflect.DeepEqual(eOut, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1))
}
// remove
if err := sesRPC.Call(utils.APIerSv1RemoveActions, &v1.AttrRemoveActions{
@@ -230,7 +241,6 @@ func testdoubleRemoveActions(t *testing.T) {
func testdoubleRemoveActionPlan(t *testing.T) {
//set action
var reply string
if err := sesRPC.Call(utils.APIerSv2SetActions, &utils.AttrSetActions{
ActionsId: "ACTS_1",
Actions: []*utils.TPAction{{Identifier: utils.LOG}},
@@ -240,22 +250,33 @@ func testdoubleRemoveActionPlan(t *testing.T) {
t.Errorf("Calling APIerSv2.SetActions received: %s", reply)
}
// check action
attrs1 := &utils.AttrSetActions{
ActionsId: "ACTS_1",
Actions: []*utils.TPAction{{Identifier: utils.LOG}}}
var reply1 []*utils.TPAction
eOut := []*utils.TPAction{
&utils.TPAction{
Identifier: "*log",
Units: "0",
BalanceWeight: "0",
BalanceBlocker: "false",
BalanceDisabled: "false",
Weight: 0}}
if err := sesRPC.Call(utils.APIerSv1GetActions, "ACTS_1", &reply1); err != nil {
t.Error("Got error on APIerSv1.GetActions: ", err.Error())
} else if !reflect.DeepEqual(attrs1.Actions, reply) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(attrs1.Actions), utils.ToJSON(reply1))
} else if !reflect.DeepEqual(eOut, reply1) {
t.Errorf("Expected: %v, received: %v", utils.ToJSON(eOut), utils.ToJSON(reply1))
}
// check
// check ActionPlan
var aps []*engine.ActionPlan
if err := sesRPC.Call(utils.APIerSv1GetActionPlan,
v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
}
// set
/*
should return ErrNotFound, right now it returns nil and an empty slice,
needs to be reviewed
if err := sesRPC.Call(utils.APIerSv1GetActionPlan,
v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
}
*/
// set ActionPlan
atms1 := &v1.AttrSetActionPlan{
Id: "ATMS_1",
ActionPlan: []*v1.AttrActionPlan{
@@ -270,10 +291,10 @@ func testdoubleRemoveActionPlan(t *testing.T) {
} else if reply != utils.OK {
t.Errorf("Unexpected reply returned: %s", reply)
}
// // set it again (expect EXISTS)
// if err := sesRPC.Call(utils.APIerSv1SetActionPlan, atms1, &reply); err == nil || err.Error() != "EXISTS" {
// t.Error(err)
// }
// set it again (expect EXISTS)
if err := sesRPC.Call(utils.APIerSv1SetActionPlan, atms1, &reply); err == nil || err.Error() != "EXISTS" {
t.Error(err)
}
// check
if err := sesRPC.Call(utils.APIerSv1GetActionPlan,
v1.AttrGetActionPlan{ID: "ATMS_1"}, &aps); err != nil {
@@ -288,18 +309,23 @@ func testdoubleRemoveActionPlan(t *testing.T) {
t.Errorf("Expected: 20.0,\n received: %v", aps[0].ActionTimings[0].Weight)
}
// // // remove
// if err := sesRPC.Call(utils.APIerSv1RemoveActionPlan, &v1.AttrGetActionPlan{
// ID: "ATMS_1"}, &reply); err != nil {
// t.Error(err)
// } else if reply != utils.OK {
// t.Error("Unexpected reply returned", reply)
// }
// //check again
// if err := sesRPC.Call(utils.APIerSv1GetActionPlan,
// v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
// t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
// }
// remove
if err := sesRPC.Call(utils.APIerSv1RemoveActionPlan, &v1.AttrGetActionPlan{
ID: "ATMS_1"}, &reply); err != nil {
t.Error(err)
} else if reply != utils.OK {
t.Error("Unexpected reply returned", reply)
}
//check again
/*
this should return ErrNotFound, right now it returns nil and an empty slice,
needs to be reviewed.
if err := sesRPC.Call(utils.APIerSv1GetActionPlan,
v1.AttrGetActionPlan{ID: utils.EmptyString}, &aps); err == nil || err.Error() != utils.ErrNotFound.Error() {
t.Errorf("Error: %+v, rcv: %+v", err, utils.ToJSON(aps))
}
*/
}