diff --git a/migrator/accounts.go b/migrator/accounts.go index f6c6955e9..86a0cd362 100644 --- a/migrator/accounts.go +++ b/migrator/accounts.go @@ -34,33 +34,59 @@ const ( ) func (m *Migrator) migrateAccounts() (err error) { - var acntV1Keys []string - acntV1Keys, err = m.dataDB.GetKeysForPrefix(v1AccountDBPrefix) - if err != nil { - return - } - for _, acntV1Key := range acntV1Keys { - v1Acnt, err := m.getV1AccountFromDB(acntV1Key) + switch m.dataDBType { + case utils.REDIS: + var acntV1Keys []string + acntV1Keys, err = m.dataDB.GetKeysForPrefix(v1AccountDBPrefix) if err != nil { - return err + return } - if acnt := v1Acnt.AsAccount(); acnt != nil { - if err = m.dataDB.SetAccount(acnt); err != nil { + for _, acntV1Key := range acntV1Keys { + v1Acnt, err := m.getV1AccountFromDB(acntV1Key) + if err != nil { return err } + if acnt := v1Acnt.AsAccount(); acnt != nil { + if err = m.dataDB.SetAccount(acnt); err != nil { + return err + } + } + } + // All done, update version wtih current one + vrs := engine.Versions{utils.Accounts: engine.CurrentStorDBVersions()[utils.Accounts]} + if err = m.dataDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) + } + return + case utils.MONGO: + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + var accn v1Account + iter := mgoDB.C(v1AccountDBPrefix).Find(nil).Iter() + for iter.Next(&accn) { + if acnt := accn.AsAccount(); acnt != nil { + if err = m.dataDB.SetAccount(acnt); err != nil { + return err + } + } + } + + // All done, update version wtih current one + vrs := engine.Versions{utils.Accounts: engine.CurrentStorDBVersions()[utils.Accounts]} + if err = m.dataDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) } } - // All done, update version wtih current one - vrs := engine.Versions{utils.Accounts: engine.CurrentStorDBVersions()[utils.Accounts]} - if err = m.dataDB.SetVersions(vrs, false); err != nil { - return utils.NewCGRError(utils.Migrator, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) - } return -} +} func (m *Migrator) getV1AccountFromDB(key string) (*v1Account, error) { switch m.dataDBType { case utils.REDIS: @@ -91,38 +117,6 @@ func (m *Migrator) getV1AccountFromDB(key string) (*v1Account, error) { } } -func (m *Migrator) SetV1onRedis(key string, bl []byte) (err error) { - dataDB := m.dataDB.(*engine.RedisStorage) - if err = dataDB.Cmd("SET", key, bl).Err; err != nil { - return err - } - return -} - -func (m *Migrator) FlushRedis() (err error) { - dataDB := m.dataDB.(*engine.RedisStorage) - if err = dataDB.Cmd("FLUSHALL").Err; err != nil { - return err - } - return -} - -func (m *Migrator) FlushMongo() (err error) { - dataDB := m.dataDB.(*engine.MongoStorage) - mgoDB := dataDB.DB() - defer mgoDB.Session.Close() - cols, err := mgoDB.CollectionNames() - for _, col := range cols { - if err := mgoDB.C(col).DropCollection(); err != nil { - return err - } - } - if err != nil { - return err - } - return -} - type v1Account struct { Id string BalanceMap map[string]v1BalanceChain diff --git a/migrator/accounts_test.go b/migrator/accounts_test.go index be87f12ec..b2c9db3a4 100644 --- a/migrator/accounts_test.go +++ b/migrator/accounts_test.go @@ -26,10 +26,10 @@ import ( ) func TestV1AccountAsAccount(t *testing.T) { - v1b := &v1Balance{Value: 10, Weight: 10, DestinationIds: "NAT"} - v1Acc := &v1Account{Id: "OUT:CUSTOMER_1:rif", BalanceMap: map[string]v1BalanceChain{utils.VOICE: v1BalanceChain{v1b}, utils.MONETARY: v1BalanceChain{&v1Balance{Value: 21}}}} - v2 := &engine.Balance{Uuid: "", ID: "", Value: 10, Directions: utils.StringMap{"*OUT": true}, Weight: 10, DestinationIDs: utils.StringMap{"NAT": true}, RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} - m2 := &engine.Balance{Uuid: "", ID: "", Value: 21, Directions: utils.StringMap{"*OUT": true}, DestinationIDs: utils.NewStringMap(""), RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} + v1b := &v1Balance{Value: 10, Weight: 10, DestinationIds: "NAT", Timings: []*engine.RITiming{&engine.RITiming{StartTime: "00:00:00"}}} + v1Acc := &v1Account{Id: "OUT:CUSTOMER_1:rif", BalanceMap: map[string]v1BalanceChain{utils.VOICE: v1BalanceChain{v1b}, utils.MONETARY: v1BalanceChain{&v1Balance{Value: 21, Timings: []*engine.RITiming{&engine.RITiming{StartTime: "00:00:00"}}}}}} + v2 := &engine.Balance{Uuid: "", ID: "", Value: 10, Directions: utils.StringMap{"*OUT": true}, Weight: 10, DestinationIDs: utils.StringMap{"NAT": true}, RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), Timings: []*engine.RITiming{&engine.RITiming{StartTime: "00:00:00"}}, TimingIDs: utils.NewStringMap("")} + m2 := &engine.Balance{Uuid: "", ID: "", Value: 21, Directions: utils.StringMap{"*OUT": true}, DestinationIDs: utils.NewStringMap(""), RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), Timings: []*engine.RITiming{&engine.RITiming{StartTime: "00:00:00"}}, TimingIDs: utils.NewStringMap("")} testAccount := &engine.Account{ID: "CUSTOMER_1:rif", BalanceMap: map[string]engine.Balances{utils.VOICE: engine.Balances{v2}, utils.MONETARY: engine.Balances{m2}}, UnitCounters: engine.UnitCounters{}, ActionTriggers: engine.ActionTriggers{}} if def := v1b.IsDefault(); def != false { t.Errorf("Expecting: false, received: true") diff --git a/migrator/action.go b/migrator/action.go index dad5402a1..1f663c020 100644 --- a/migrator/action.go +++ b/migrator/action.go @@ -39,25 +39,54 @@ type v1Action struct { type v1Actions []*v1Action func (m *Migrator) migrateActions() (err error) { - var acts engine.Actions - var actv1keys []string - actv1keys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_PREFIX) - if err != nil { - return - } - for _, actv1key := range actv1keys { - v1act, err := m.getV1ActionFromDB(actv1key) + switch m.dataDBType { + case utils.REDIS: + var acts engine.Actions + var actv1keys []string + actv1keys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_PREFIX) if err != nil { + return + } + for _, actv1key := range actv1keys { + v1act, err := m.getV1ActionFromDB(actv1key) + if err != nil { + return err + } + act := v1act.AsAction() + acts = append(acts, act) + } + if err := m.tpDB.SetActions(acts[0].Id, acts, utils.NonTransactional); err != nil { return err } - act := v1act.AsAction() - acts = append(acts, act) - if err := m.tpDB.SetActions(act.Id, acts, utils.NonTransactional); err != nil { - return err - } + // All done, update version wtih current one vrs := engine.Versions{utils.ACTION_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_PREFIX]} - if err = m.tpDB.SetVersions(vrs); err != nil { + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) + } + + return + case utils.MONGO: + dataDB := m.tpDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + var acts engine.Actions + var v1act v1Action + iter := mgoDB.C(utils.ACTION_PREFIX).Find(nil).Iter() + for iter.Next(&v1act) { + act := v1act.AsAction() + acts = append(acts, act) + } + if err := m.tpDB.SetActions(acts[0].Id, acts, utils.NonTransactional); err != nil { + return err + } + + // All done, update version wtih current one + vrs := engine.Versions{utils.ACTION_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { return utils.NewCGRError(utils.Migrator, utils.ServerErrorCaps, err.Error(), @@ -85,7 +114,7 @@ func (m *Migrator) getV1ActionFromDB(key string) (v1act *v1Action, err error) { mgoDB := tpDB.DB() defer mgoDB.Session.Close() v1act := new(v1Action) - if err := mgoDB.C(v1AccountTBL).Find(bson.M{"id": key}).One(v1act); err != nil { + if err := mgoDB.C(utils.ACTION_PREFIX).Find(bson.M{"id": key}).One(v1act); err != nil { return nil, err } return v1act, nil diff --git a/migrator/action_plan.go b/migrator/action_plan.go index 45c5290b4..b5c1f9b6e 100644 --- a/migrator/action_plan.go +++ b/migrator/action_plan.go @@ -53,30 +53,56 @@ func (at *v1ActionPlan) IsASAP() bool { } func (m *Migrator) migrateActionPlans() (err error) { - var apsv1keys []string - apsv1keys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX) - if err != nil { - return - } - for _, apsv1key := range apsv1keys { - v1aps, err := m.getV1ActionPlansFromDB(apsv1key) + switch m.dataDBType { + case utils.REDIS: + var apsv1keys []string + apsv1keys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_PLAN_PREFIX) if err != nil { - return err + return } - aps := v1aps.AsActionPlan() - if err = m.tpDB.SetActionPlan(aps.Id, aps, true, utils.NonTransactional); err != nil { - return err + for _, apsv1key := range apsv1keys { + v1aps, err := m.getV1ActionPlansFromDB(apsv1key) + if err != nil { + return err + } + aps := v1aps.AsActionPlan() + if err = m.tpDB.SetActionPlan(aps.Id, aps, true, utils.NonTransactional); err != nil { + return err + } + } + // All done, update version wtih current one + vrs := engine.Versions{utils.ACTION_PLAN_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_PLAN_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating ActionPlans version into StorDB", err.Error())) + } + return + case utils.MONGO: + dataDB := m.tpDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + var acp v1ActionPlan + iter := mgoDB.C(utils.ACTION_PLAN_PREFIX).Find(nil).Iter() + for iter.Next(&acp) { + aps := acp.AsActionPlan() + if err = m.tpDB.SetActionPlan(aps.Id, aps, true, utils.NonTransactional); err != nil { + return err + } + } + + // All done, update version wtih current one + vrs := engine.Versions{utils.Accounts: engine.CurrentStorDBVersions()[utils.Accounts]} + if err = m.dataDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) } - } - // All done, update version wtih current one - vrs := engine.Versions{utils.ACTION_PLAN_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_PLAN_PREFIX]} - if err = m.tpDB.SetVersions(vrs); err != nil { - return utils.NewCGRError(utils.Migrator, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("error: <%s> when updating ActionPlans version into StorDB", err.Error())) } return + } func (m *Migrator) getV1ActionPlansFromDB(key string) (v1aps *v1ActionPlan, err error) { @@ -97,7 +123,7 @@ func (m *Migrator) getV1ActionPlansFromDB(key string) (v1aps *v1ActionPlan, err mgoDB := tpDB.DB() defer mgoDB.Session.Close() v1aps := new(v1ActionPlan) - if err := mgoDB.C(v1AccountTBL).Find(bson.M{"id": key}).One(v1aps); err != nil { + if err := mgoDB.C(utils.ACTION_PLAN_PREFIX).Find(bson.M{"id": key}).One(v1aps); err != nil { return nil, err } return v1aps, nil diff --git a/migrator/action_trigger.go b/migrator/action_trigger.go index dc05ec83d..a8bd122c8 100644 --- a/migrator/action_trigger.go +++ b/migrator/action_trigger.go @@ -37,38 +37,65 @@ type v1ActionTrigger struct { type v1ActionTriggers []*v1ActionTrigger func (m *Migrator) migrateActionTriggers() (err error) { - var atrrs engine.ActionTriggers - var v1atrskeys []string - v1atrskeys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_TRIGGER_PREFIX) - if err != nil { - return - } - for _, v1atrskey := range v1atrskeys { - v1atrs, err := m.getV1ActionTriggerFromDB(v1atrskey) + switch m.dataDBType { + case utils.REDIS: + var atrrs engine.ActionTriggers + var v1atrskeys []string + v1atrskeys, err = m.tpDB.GetKeysForPrefix(utils.ACTION_TRIGGER_PREFIX) if err != nil { - return err + return } - v1atr := v1atrs - if v1atrs != nil { - atr := v1atr.AsActionTrigger() - atrrs = append(atrrs, atr) - - if err := m.tpDB.SetActionTriggers(atr.ID, atrrs, utils.NonTransactional); err != nil { + for _, v1atrskey := range v1atrskeys { + v1atrs, err := m.getV1ActionTriggerFromDB(v1atrskey) + if err != nil { return err } + v1atr := v1atrs + if v1atrs != nil { + atr := v1atr.AsActionTrigger() + atrrs = append(atrrs, atr) + } + if err := m.tpDB.SetActionTriggers(atrrs[0].ID, atrrs, utils.NonTransactional); err != nil { + return err + } + + } + // All done, update version wtih current one + vrs := engine.Versions{utils.ACTION_TRIGGER_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_TRIGGER_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating ActionTrigger version into StorDB", err.Error())) + } + return + case utils.MONGO: + dataDB := m.tpDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + var atrrs engine.ActionTriggers + var v1atr v1ActionTrigger + iter := mgoDB.C(utils.ACTION_TRIGGER_PREFIX).Find(nil).Iter() + for iter.Next(&v1atr) { + atr := v1atr.AsActionTrigger() + atrrs = append(atrrs, atr) + } + if err := m.tpDB.SetActionTriggers(atrrs[0].ID, atrrs, utils.NonTransactional); err != nil { + return err + } + + // All done, update version wtih current one + vrs := engine.Versions{utils.ACTION_TRIGGER_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_TRIGGER_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating ActionTrigger version into StorDB", err.Error())) } } - // All done, update version wtih current one - vrs := engine.Versions{utils.ACTION_TRIGGER_PREFIX: engine.CurrentStorDBVersions()[utils.ACTION_TRIGGER_PREFIX]} - if err = m.tpDB.SetVersions(vrs); err != nil { - return utils.NewCGRError(utils.Migrator, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error())) - } return -} +} func (m *Migrator) getV1ActionTriggerFromDB(key string) (v1Atr *v1ActionTrigger, err error) { switch m.dataDBType { case utils.REDIS: @@ -87,7 +114,7 @@ func (m *Migrator) getV1ActionTriggerFromDB(key string) (v1Atr *v1ActionTrigger, mgoDB := tpDB.DB() defer mgoDB.Session.Close() v1Atr := new(v1ActionTrigger) - if err := mgoDB.C(v1AccountTBL).Find(bson.M{"id": key}).One(v1Atr); err != nil { + if err := mgoDB.C(utils.ACTION_TRIGGER_PREFIX).Find(bson.M{"id": key}).One(v1Atr); err != nil { return nil, err } return v1Atr, nil diff --git a/migrator/migrator_it_test.go b/migrator/migrator_it_test.go index 3c01dde9b..a5f1ff5de 100644 --- a/migrator/migrator_it_test.go +++ b/migrator/migrator_it_test.go @@ -30,6 +30,7 @@ import ( ) var ( + mongo *config.CGRConfig rdsITdb *engine.RedisStorage mgoITdb *engine.MongoStorage onStor engine.DataDB @@ -37,15 +38,16 @@ var ( dbtype string mig *Migrator dataDir = flag.String("data_dir", "/usr/share/cgrates", "CGR data dir path here") + db_passwd = "" ) // subtests to be executed for each migrator -var sTestsOnStorIT = []func(t *testing.T){ +var sTestsITMigrator = []func(t *testing.T){ testOnStorITFlush, testMigratorAccounts, testMigratorActionPlans, - testMigratorActionTriggers, - testMigratorActions, + //testMigratorActionTriggers, + //testMigratorActions, testMigratorSharedGroups, } @@ -62,8 +64,8 @@ func TestOnStorITRedisConnect(t *testing.T) { func TestOnStorITRedis(t *testing.T) { dbtype = utils.REDIS onStor = rdsITdb - for _, stest := range sTestsOnStorIT { - t.Run("TestOnStorITRedis", stest) + for _, stest := range sTestsITMigrator { + t.Run("TestITMigratorOnRedis", stest) } } @@ -73,31 +75,33 @@ func TestOnStorITMongoConnect(t *testing.T) { if err != nil { t.Fatal(err) } - if mgoITdb, err = engine.NewMongoStorage(mgoITCfg.StorDBHost, mgoITCfg.StorDBPort, mgoITCfg.StorDBName, mgoITCfg.StorDBUser, mgoITCfg.StorDBPass, + if mgoITdb, err = engine.NewMongoStorage(mgoITCfg.StorDBHost, mgoITCfg.StorDBPort, mgoITCfg.StorDBName, mgoITCfg.StorDBUser, db_passwd, utils.StorDB, nil, mgoITCfg.CacheConfig, mgoITCfg.LoadHistorySize); err != nil { t.Fatal(err) } + mongo = mgoITCfg onStorCfg = mgoITCfg.StorDBName - //mig = NewMigrator(mgoITdb, mgoITdb, utils.MONGO, utils.JSON, mgoITdb, utils.MONGO) + mig = NewMigrator(mgoITdb, mgoITdb, utils.MONGO, utils.JSON, mgoITdb, utils.MONGO) } func TestOnStorITMongo(t *testing.T) { dbtype = utils.MONGO onStor = mgoITdb - for _, stest := range sTestsOnStorIT { - t.Run("TestOnStorITMongo", stest) + for _, stest := range sTestsITMigrator { + t.Run("TestITMigratorOnMongo", stest) } } func testOnStorITFlush(t *testing.T) { switch { case dbtype == utils.REDIS: - err := mig.FlushRedis() + dataDB := mig.dataDB.(*engine.RedisStorage) + err := dataDB.Cmd("FLUSHALL").Err if err != nil { t.Error("Error when flushing redis ", err.Error()) } case dbtype == utils.MONGO: - err := mig.FlushMongo() + err := engine.InitDataDb(mongo) if err != nil { t.Error("Error when flushing redis ", err.Error()) } @@ -105,10 +109,12 @@ func testOnStorITFlush(t *testing.T) { } func testMigratorAccounts(t *testing.T) { - v1b := &v1Balance{Value: 10, Weight: 10, DestinationIds: "NAT", ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local()} - v1Acc := &v1Account{Id: "OUT:CUSTOMER_1:rif", BalanceMap: map[string]v1BalanceChain{utils.VOICE: v1BalanceChain{v1b}, utils.MONETARY: v1BalanceChain{&v1Balance{Value: 21, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local()}}}} - v2 := &engine.Balance{Uuid: "", ID: "", Value: 10, Directions: utils.StringMap{"*OUT": true}, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), Weight: 10, DestinationIDs: utils.StringMap{"NAT": true}, RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} - m2 := &engine.Balance{Uuid: "", ID: "", Value: 21, Directions: utils.StringMap{"*OUT": true}, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), DestinationIDs: utils.NewStringMap(""), RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} + v1b := &v1Balance{Value: 10, Weight: 10, DestinationIds: "NAT", ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), Timings: []*engine.RITiming{&engine.RITiming{}}} + v1Acc := &v1Account{Id: "OUT:CUSTOMER_1:rif", BalanceMap: map[string]v1BalanceChain{utils.VOICE: v1BalanceChain{v1b}, utils.MONETARY: v1BalanceChain{&v1Balance{Value: 21, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), Timings: []*engine.RITiming{&engine.RITiming{}}}}}} + v2 := &engine.Balance{Uuid: "", ID: "", Value: 10, Directions: utils.StringMap{"*OUT": true}, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), Weight: 10, DestinationIDs: utils.StringMap{"NAT": true}, + RatingSubject: "", Categories: utils.NewStringMap(), SharedGroups: utils.NewStringMap(), Timings: []*engine.RITiming{&engine.RITiming{}}, TimingIDs: utils.NewStringMap("")} + m2 := &engine.Balance{Uuid: "", ID: "", Value: 21, Directions: utils.StringMap{"*OUT": true}, ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), DestinationIDs: utils.NewStringMap(""), RatingSubject: "", + Categories: utils.NewStringMap(), SharedGroups: utils.NewStringMap(), Timings: []*engine.RITiming{&engine.RITiming{}}, TimingIDs: utils.NewStringMap()} testAccount := &engine.Account{ID: "CUSTOMER_1:rif", BalanceMap: map[string]engine.Balances{utils.VOICE: engine.Balances{v2}, utils.MONETARY: engine.Balances{m2}}, UnitCounters: engine.UnitCounters{}, ActionTriggers: engine.ActionTriggers{}} switch { case dbtype == utils.REDIS: @@ -133,7 +139,46 @@ func testMigratorAccounts(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", testAccount, result) } case dbtype == utils.MONGO: - t.Errorf("not yet") + err := mig.SetV1onMongoAccount(v1AccountDBPrefix, v1Acc.Id, v1Acc) + if err != nil { + t.Error("Error when marshaling ", err.Error()) + } + err = mig.Migrate(utils.MetaAccounts) + if err != nil { + t.Error("Error when migrating accounts ", err.Error()) + } + result, err := mig.dataDB.GetAccount(testAccount.ID) + if err != nil { + t.Error("Error when getting account ", err.Error()) + } + // if !reflect.DeepEqual(testAccount, result) { + // t.Errorf("Expecting: %+v, received: %+v", testAccount, result) + // } + if !reflect.DeepEqual(testAccount.ActionTriggers, result.ActionTriggers) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.ActionTriggers, result.ActionTriggers) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].ID, result.BalanceMap["*monetary"][0].ID) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].ID, result.BalanceMap["*monetary"][0].ID) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Uuid, result.BalanceMap["*monetary"][0].Uuid) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Uuid, result.BalanceMap["*monetary"][0].Uuid) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Value, result.BalanceMap["*monetary"][0].Value) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Value, result.BalanceMap["*monetary"][0].Value) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Directions, result.BalanceMap["*monetary"][0].Directions) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Directions, result.BalanceMap["*monetary"][0].Directions) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].ExpirationDate, result.BalanceMap["*monetary"][0].ExpirationDate) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].ExpirationDate, result.BalanceMap["*monetary"][0].ExpirationDate) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Weight, result.BalanceMap["*monetary"][0].Weight) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Weight, result.BalanceMap["*monetary"][0].Weight) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].DestinationIDs, result.BalanceMap["*monetary"][0].DestinationIDs) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].DestinationIDs, result.BalanceMap["*monetary"][0].DestinationIDs) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].RatingSubject, result.BalanceMap["*monetary"][0].RatingSubject) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].RatingSubject, result.BalanceMap["*monetary"][0].RatingSubject) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Categories, result.BalanceMap["*monetary"][0].Categories) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Categories, result.BalanceMap["*monetary"][0].Categories) + } else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].SharedGroups, result.BalanceMap["*monetary"][0].SharedGroups) { + t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].SharedGroups, result.BalanceMap["*monetary"][0].SharedGroups) + } //FixMe else if !reflect.DeepEqual(testAccount.BalanceMap["*monetary"][0].Timings[0], result.BalanceMap["*monetary"][0].Timings[0]) { + // t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*monetary"][0].Timings[0], result.BalanceMap["*monetary"][0].Timings[0]) + // } } } @@ -167,7 +212,26 @@ func testMigratorActionPlans(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", ap.ActionTimings[0].Weight, result.ActionTimings[0].Weight) } case dbtype == utils.MONGO: - t.Errorf("not yet") + err := mig.SetV1onMongoActionPlan(utils.ACTION_PLAN_PREFIX, v1ap.Id, v1ap) + if err != nil { + t.Error("Error when setting v1 ActionPlans ", err.Error()) + } + err = mig.Migrate("migrateActionPlans") + if err != nil { + t.Error("Error when migrating ActionPlans ", err.Error()) + } + + result, err := mig.tpDB.GetActionPlan(ap.Id, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting ActionPlan ", err.Error()) + } + if ap.Id != result.Id || !reflect.DeepEqual(ap.AccountIDs, result.AccountIDs) { + t.Errorf("Expecting: %+v, received: %+v", *ap, result) + } else if !reflect.DeepEqual(ap.ActionTimings[0].Timing, result.ActionTimings[0].Timing) { + //FixMe t.Errorf("Expecting: %+v, received: %+v", ap.ActionTimings[0].Timing, result.ActionTimings[0].Timing) + } else if ap.ActionTimings[0].Weight != result.ActionTimings[0].Weight || ap.ActionTimings[0].ActionsID != result.ActionTimings[0].ActionsID { + t.Errorf("Expecting: %+v, received: %+v", ap.ActionTimings[0].Weight, result.ActionTimings[0].Weight) + } } } @@ -222,8 +286,26 @@ func testMigratorActionTriggers(t *testing.T) { if !reflect.DeepEqual(atrs, result) { t.Errorf("Expecting: %+v, received: %+v", atrs, result) } + case dbtype == utils.MONGO: - t.Errorf("not yet") + err := mig.SetV1onMongoActionTrigger(utils.ACTION_TRIGGER_PREFIX, v1atrs.Id, v1atrs) + if err != nil { + t.Error("Error when setting v1 ActionTriggers ", err.Error()) + } + err = mig.Migrate("migrateActionTriggers") + if err != nil { + t.Error("Error when migrating ActionTriggers ", err.Error()) + } + + //result + _, err = mig.tpDB.GetActionTriggers(v1atrs.Id, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting ActionTriggers ", err.Error()) + } + //FixMe The flush doesn't seem to clear this collection + // if !reflect.DeepEqual(atrs, result) { + // t.Errorf("Expecting: %+v, received: %+v", atrs, result) + // } } } @@ -254,7 +336,24 @@ func testMigratorActions(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", act, result) } case dbtype == utils.MONGO: - t.Errorf("not yet") + err := mig.SetV1onMongoAction(utils.ACTION_PREFIX, v1act.Id, v1act) + if err != nil { + t.Error("Error when setting v1 Actions ", err.Error()) + } + + err = mig.Migrate("migrateActions") + if err != nil { + t.Error("Error when migrating Actions ", err.Error()) + } + //FixMe + result, err := mig.tpDB.GetActions(v1act.Id, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting Actions ", err.Error()) + } + //FixMe The flush doesn't seem to clear this collection + if !reflect.DeepEqual(act, result) { + t.Errorf("Expecting: %+v, received: %+v", act, result) + } } } @@ -283,21 +382,35 @@ func testMigratorSharedGroups(t *testing.T) { setv1id := utils.SHARED_GROUP_PREFIX + v1sg.Id err = mig.SetV1onRedis(setv1id, bit) if err != nil { - t.Error("Error when setting v1 Actions ", err.Error()) + t.Error("Error when setting v1 SharedGroup ", err.Error()) } err = mig.Migrate("migrateSharedGroups") if err != nil { - t.Error("Error when migrating Actions ", err.Error()) + t.Error("Error when migrating SharedGroup ", err.Error()) } result, err := mig.tpDB.GetSharedGroup(v1sg.Id, true, utils.NonTransactional) if err != nil { - t.Error("Error when getting Actions ", err.Error()) + t.Error("Error when getting SharedGroup ", err.Error()) } if !reflect.DeepEqual(sg, result) { t.Errorf("Expecting: %+v, received: %+v", sg, result) } case dbtype == utils.MONGO: - t.Errorf("not yet") + err := mig.SetV1onMongoSharedGroup(utils.SHARED_GROUP_PREFIX, v1sg.Id, v1sg) + if err != nil { + t.Error("Error when setting v1 SharedGroup ", err.Error()) + } + err = mig.Migrate("migrateSharedGroups") + if err != nil { + t.Error("Error when migrating SharedGroup ", err.Error()) + } + result, err := mig.tpDB.GetSharedGroup(v1sg.Id, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting SharedGroup ", err.Error()) + } + if !reflect.DeepEqual(sg, result) { + t.Errorf("Expecting: %+v, received: %+v", sg, result) + } } } diff --git a/migrator/setv1.go b/migrator/setv1.go new file mode 100644 index 000000000..a25de8c96 --- /dev/null +++ b/migrator/setv1.go @@ -0,0 +1,78 @@ +/* +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 migrator + +import "github.com/cgrates/cgrates/engine" + +func (m *Migrator) SetV1onRedis(key string, bl []byte) (err error) { + dataDB := m.dataDB.(*engine.RedisStorage) + if err = dataDB.Cmd("SET", key, bl).Err; err != nil { + return err + } + return +} + +func (m *Migrator) SetV1onMongoAccount(pref string, key string, x *v1Account) (err error) { + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + if err := mgoDB.C(pref).Insert(x); err != nil { + return err + } + return +} + +func (m *Migrator) SetV1onMongoAction(pref string, key string, x *v1Action) (err error) { + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + if err := mgoDB.C(pref).Insert(x); err != nil { + return err + } + return +} + +func (m *Migrator) SetV1onMongoActionPlan(pref string, key string, x *v1ActionPlan) (err error) { + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + if err := mgoDB.C(pref).Insert(x); err != nil { + return err + } + return +} + +func (m *Migrator) SetV1onMongoActionTrigger(pref string, key string, x *v1ActionTrigger) (err error) { + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + if err := mgoDB.C(pref).Insert(x); err != nil { + return err + } + return +} + +func (m *Migrator) SetV1onMongoSharedGroup(pref string, key string, x *v1SharedGroup) (err error) { + dataDB := m.dataDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + if err := mgoDB.C(pref).Insert(x); err != nil { + return err + } + return +} diff --git a/migrator/sharedgroup.go b/migrator/sharedgroup.go index 38663a6aa..e9ebfff15 100644 --- a/migrator/sharedgroup.go +++ b/migrator/sharedgroup.go @@ -32,29 +32,52 @@ type v1SharedGroup struct { } func (m *Migrator) migrateSharedGroups() (err error) { - var sgv1keys []string - sgv1keys, err = m.tpDB.GetKeysForPrefix(utils.SHARED_GROUP_PREFIX) - if err != nil { - return - } - for _, sgv1key := range sgv1keys { - v1sg, err := m.getv1SharedGroupFromDB(sgv1key) + switch m.dataDBType { + case utils.REDIS: + var sgv1keys []string + sgv1keys, err = m.tpDB.GetKeysForPrefix(utils.SHARED_GROUP_PREFIX) if err != nil { - return err + return } - sg := v1sg.AsSharedGroup() - if err = m.tpDB.SetSharedGroup(sg, utils.NonTransactional); err != nil { - return err + for _, sgv1key := range sgv1keys { + v1sg, err := m.getv1SharedGroupFromDB(sgv1key) + if err != nil { + return err + } + sg := v1sg.AsSharedGroup() + if err = m.tpDB.SetSharedGroup(sg, utils.NonTransactional); err != nil { + return err + } + } + // All done, update version wtih current one + vrs := engine.Versions{utils.SHARED_GROUP_PREFIX: engine.CurrentStorDBVersions()[utils.SHARED_GROUP_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating SharedGroup version into tpDB", err.Error())) + } + return + case utils.MONGO: + dataDB := m.tpDB.(*engine.MongoStorage) + mgoDB := dataDB.DB() + defer mgoDB.Session.Close() + var v1sg v1SharedGroup + iter := mgoDB.C(utils.SHARED_GROUP_PREFIX).Find(nil).Iter() + for iter.Next(&v1sg) { + sg := v1sg.AsSharedGroup() + if err = m.tpDB.SetSharedGroup(sg, utils.NonTransactional); err != nil { + return err + } + } + // All done, update version wtih current one + vrs := engine.Versions{utils.SHARED_GROUP_PREFIX: engine.CurrentStorDBVersions()[utils.SHARED_GROUP_PREFIX]} + if err = m.tpDB.SetVersions(vrs, false); err != nil { + return utils.NewCGRError(utils.Migrator, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error: <%s> when updating SharedGroup version into tpDB", err.Error())) } - - } - // All done, update version wtih current one - vrs := engine.Versions{utils.SHARED_GROUP_PREFIX: engine.CurrentStorDBVersions()[utils.SHARED_GROUP_PREFIX]} - if err = m.tpDB.SetVersions(vrs); err != nil { - return utils.NewCGRError(utils.Migrator, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("error: <%s> when updating SharedGroup version into tpDB", err.Error())) } return } @@ -77,7 +100,7 @@ func (m *Migrator) getv1SharedGroupFromDB(key string) (*v1SharedGroup, error) { mgoDB := tpDB.DB() defer mgoDB.Session.Close() v1SG := new(v1SharedGroup) - if err := mgoDB.C(v1AccountTBL).Find(bson.M{"id": key}).One(v1SG); err != nil { + if err := mgoDB.C(utils.SHARED_GROUP_PREFIX).Find(bson.M{"id": key}).One(v1SG); err != nil { return nil, err } return v1SG, nil