diff --git a/engine/version.go b/engine/version.go index 23b4f4232..0128f1f7d 100644 --- a/engine/version.go +++ b/engine/version.go @@ -143,7 +143,7 @@ func CurrentStorDBVersions() Versions { utils.TpFilters: 1, utils.TpDestinationRates: 1, utils.TpActionTriggers: 1, - utils.TpAccountActions: 1, + utils.TpAccountActionsV: 1, utils.TpActionPlans: 1, utils.TpActions: 1, utils.TpDerivedCharges: 1, diff --git a/migrator/alias.go b/migrator/alias.go index aa95945fb..775d0039a 100644 --- a/migrator/alias.go +++ b/migrator/alias.go @@ -20,6 +20,7 @@ package migrator import ( "fmt" + //"log" "strings" "github.com/cgrates/cgrates/engine" @@ -50,36 +51,43 @@ func (m *Migrator) migrateCurrentAlias() (err error) { return } -func (m *Migrator) migrateCurrentReverseAlias() (err error) { - var ids []string - ids, err = m.dmIN.DataDB().GetKeysForPrefix(utils.REVERSE_ALIASES_PREFIX) - if err != nil { - return err - } - for _, id := range ids { - idg := strings.TrimPrefix(id, utils.REVERSE_ALIASES_PREFIX) +// func (m *Migrator) migrateCurrentReverseAlias() (err error) { +// var ids []string +// ids, err = m.dmIN.DataDB().GetKeysForPrefix(utils.REVERSE_ALIASES_PREFIX) +// if err != nil { +// return err +// } +// log.Print("ids: ", ids) +// for _, id := range ids { +// idg := strings.TrimPrefix(id, utils.REVERSE_ALIASES_PREFIX) +// usrs, err := m.dmIN.DataDB().GetReverseAlias(idg, true, utils.NonTransactional) +// if err != nil { +// return err +// } +// log.Print(id) +// log.Print(idg) +// log.Print("values: ", usrs) - usrs, err := m.dmIN.DataDB().GetReverseAlias(idg, true, utils.NonTransactional) - if err != nil { - return err - } - for _, usr := range usrs { - alias, err := m.dmIN.DataDB().GetAlias(usr, true, utils.NonTransactional) - if err != nil { - return err - } - if alias != nil { - if m.dryRun != true { - if err := m.dmOut.DataDB().SetReverseAlias(alias, utils.NonTransactional); err != nil { - return err - } - m.stats[utils.ReverseAlias] += 1 - } - } - } - } - return -} +// for _, usr := range usrs { +// log.Print(usr) + +// alias, err := m.dmIN.DataDB().GetAlias(usr, true, utils.NonTransactional) +// if err != nil { +// log.Print("erorr") +// return err +// } +// if alias != nil { +// if m.dryRun != true { +// if err := m.dmOut.DataDB().SetReverseAlias(alias, utils.NonTransactional); err != nil { +// return err +// } +// m.stats[utils.ReverseAlias] += 1 +// } +// } +// } +// } +// return +// } func (m *Migrator) migrateAlias() (err error) { var vrs engine.Versions @@ -110,29 +118,29 @@ func (m *Migrator) migrateAlias() (err error) { } func (m *Migrator) migrateReverseAlias() (err error) { - var vrs engine.Versions - current := engine.CurrentDataDBVersions() - vrs, err = m.dmOut.DataDB().GetVersions(utils.TBLVersions) - if err != nil { - return utils.NewCGRError(utils.Migrator, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("error: <%s> when querying oldDataDB for versions", err.Error())) - } else if len(vrs) == 0 { - return utils.NewCGRError(utils.Migrator, - utils.MandatoryIEMissingCaps, - utils.UndefinedVersion, - "version number is not defined for ActionTriggers model") - } - switch vrs[utils.ReverseAlias] { - case current[utils.ReverseAlias]: - if m.sameDataDB { - return - } - if err := m.migrateCurrentReverseAlias(); err != nil { - return err - } - return - } + // var vrs engine.Versions + // current := engine.CurrentDataDBVersions() + // vrs, err = m.dmOut.DataDB().GetVersions(utils.TBLVersions) + // if err != nil { + // return utils.NewCGRError(utils.Migrator, + // utils.ServerErrorCaps, + // err.Error(), + // fmt.Sprintf("error: <%s> when querying oldDataDB for versions", err.Error())) + // } else if len(vrs) == 0 { + // return utils.NewCGRError(utils.Migrator, + // utils.MandatoryIEMissingCaps, + // utils.UndefinedVersion, + // "version number is not defined for ActionTriggers model") + // } + // switch vrs[utils.ReverseAlias] { + // case current[utils.ReverseAlias]: + // if m.sameDataDB { + // return + // } + // if err := m.migrateCurrentReverseAlias(); err != nil { + // return err + // } + // return + // } return } diff --git a/migrator/derived_chargers.go b/migrator/derived_chargers.go index 8ec73ad3f..b8996ef29 100644 --- a/migrator/derived_chargers.go +++ b/migrator/derived_chargers.go @@ -40,7 +40,7 @@ func (m *Migrator) migrateCurrentDerivedChargers() (err error) { } if drc != nil { if m.dryRun != true { - if err := m.dmOut.DataDB().SetDerivedChargers(id, drc, utils.NonTransactional); err != nil { + if err := m.dmOut.DataDB().SetDerivedChargers(idg, drc, utils.NonTransactional); err != nil { return err } m.stats[utils.DerivedChargersV] += 1 diff --git a/migrator/destinations.go b/migrator/destinations.go index e1a1bf53e..1582f047c 100644 --- a/migrator/destinations.go +++ b/migrator/destinations.go @@ -80,27 +80,34 @@ func (m *Migrator) migrateDestinations() (err error) { func (m *Migrator) migrateCurrentReverseDestinations() (err error) { var ids []string + var mapids []string + mappedvals := make(map[string][]string) ids, err = m.dmIN.DataDB().GetKeysForPrefix(utils.REVERSE_DESTINATION_PREFIX) if err != nil { return err } for _, id := range ids { + id := strings.TrimPrefix(id, utils.REVERSE_DESTINATION_PREFIX) rdst, err := m.dmIN.DataDB().GetReverseDestination(id, true, utils.NonTransactional) if err != nil { return err } - for _, id := range rdst { - rdst, err := m.dmIN.DataDB().GetDestination(id, true, utils.NonTransactional) - if err != nil { - return err + if rdst != nil { + for _, rdid := range rdst { + mapids = append(mapids, rdid) + mappedvals[rdid] = append(mappedvals[rdid], id) } - if rdst != nil { - if m.dryRun != true { - if err := m.dmOut.DataDB().SetReverseDestination(rdst, utils.NonTransactional); err != nil { - return err - } - m.stats[utils.ReverseDestinations] += 1 + } + } + for _, id := range mapids { + dst := &engine.Destination{Id: id, Prefixes: mappedvals[id]} + + if dst != nil { + if m.dryRun != true { + if err := m.dmOut.DataDB().SetReverseDestination(dst, utils.NonTransactional); err != nil { + return err } + m.stats[utils.ReverseDestinations] += 1 } } } diff --git a/migrator/request_filter.go b/migrator/filters.go similarity index 84% rename from migrator/request_filter.go rename to migrator/filters.go index cab97f16a..e30941f43 100644 --- a/migrator/request_filter.go +++ b/migrator/filters.go @@ -22,25 +22,27 @@ import ( "fmt" "strings" + "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) func (m *Migrator) migrateCurrentRequestFilter() (err error) { var ids []string - ids, err = m.dmIN.DataDB().GetKeysForPrefix("request_filter_indexes") + tenant := config.CgrConfig().DefaultTenant + ids, err = m.dmIN.DataDB().GetKeysForPrefix(utils.FilterPrefix) if err != nil { return err } for _, id := range ids { - idg := strings.TrimPrefix(id, "request_filter_indexes") - rq, err := m.dmIN.GetReqFilterIndexes(idg) + idg := strings.TrimPrefix(id, utils.FilterPrefix+tenant+":") + fl, err := m.dmIN.GetFilter(tenant, idg, true, utils.NonTransactional) if err != nil { return err } - if rq != nil { + if fl != nil { if m.dryRun != true { - if err := m.dmOut.SetReqFilterIndexes(id, rq); err != nil { + if err := m.dmOut.SetFilter(fl); err != nil { return err } m.stats[utils.RQF] += 1 diff --git a/migrator/migrator.go b/migrator/migrator.go index e98bef1c5..289785184 100755 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -165,8 +165,8 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { //TPS case utils.MetaTpRatingPlans: err = m.migrateTPratingplans() - case utils.MetaTpLcrs: - err = m.migrateTPlcrs() + case utils.MetaTpLCRRules: + err = m.migrateTpLCRRules() case utils.MetaTpFilters: err = m.migrateTPfilters() case utils.MetaTpDestinationRates: @@ -179,7 +179,7 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { err = m.migrateTPactionplans() case utils.MetaTpActions: err = m.migrateTPactions() - case utils.MetaTpDerivedCharges: + case utils.MetaTpDerivedChargers: err = m.migrateTPderivedchargers() case utils.MetaTpThresholds: err = m.migrateTPthresholds() @@ -201,8 +201,6 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { err = m.migrateTPaliases() case utils.MetaTpUsers: err = m.migrateTPusers() - case utils.MetaTpDerivedChargersV: - err = m.migrateTPderivedchargers() case utils.MetaTpCdrStats: err = m.migrateTPcdrstats() case utils.MetaTpDestinations: @@ -281,8 +279,8 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { if err := m.migrateTPratingplans(); err != nil { log.Print("ERROR: ", utils.MetaTpRatingPlans, " ", err) } - if err := m.migrateTPlcrs(); err != nil { - log.Print("ERROR: ", utils.MetaTpLcrs, " ", err) + if err := m.migrateTpLCRRules(); err != nil { + log.Print("ERROR: ", utils.MetaTpLCRRules, " ", err) } if err := m.migrateTPfilters(); err != nil { log.Print("ERROR: ", utils.MetaTpFilters, " ", err) @@ -303,7 +301,7 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) { log.Print("ERROR: ", utils.MetaTpActions, " ", err) } if err := m.migrateTPderivedchargers(); err != nil { - log.Print("ERROR: ", utils.MetaTpDerivedCharges, " ", err) + log.Print("ERROR: ", utils.MetaTpDerivedChargers, " ", err) } if err := m.migrateTPthresholds(); err != nil { log.Print("ERROR: ", utils.MetaTpThresholds, " ", err) diff --git a/migrator/migrator_it_test.go b/migrator/migrator_it_test.go index e4a839a55..82e3903c2 100644 --- a/migrator/migrator_it_test.go +++ b/migrator/migrator_it_test.go @@ -30,6 +30,10 @@ import ( ) var ( + path_in string + path_out string + cfg_in *config.CGRConfig + cfg_out *config.CGRConfig Move = "move" dbtype string mig *Migrator @@ -46,40 +50,82 @@ var sTestsITMigrator = []func(t *testing.T){ testMigratorActions, testMigratorSharedGroups, testMigratorStats, + testFlush, + testMigratorAlias, + //FIXME testMigratorReverseAlias, + testMigratorCdrStats, + testMigratorDerivedChargers, + testMigratorDestinations, + testMigratorReverseDestinations, + testMigratorLCR, + testMigratorRatingPlan, + testMigratorRatingProfile, + testMigratorRQF, + testMigratorResource, + testMigratorSubscribers, + testMigratorTimings, + testMigratorThreshold, + //TPS testMigratorTPRatingProfile, testMigratorTPSuppliers, + testMigratorTPActions, + testMigratorTPAccountActions, + testMigratorTpActionTriggers, + testMigratorTpActionPlans, + testMigratorTpUsers, + testMigratorTpTimings, + testMigratorTpThreshold, + testMigratorTpStats, + testMigratorTpSharedGroups, + testMigratorTpResources, + testMigratorTpRatingProfiles, + testMigratorTpRatingPlans, + testMigratorTpRates, + testMigratorTpLCRRules, + testMigratorTpFilter, + testMigratorTpDestination, + testMigratorTpDestinationRate, + testMigratorTpDerivedChargers, + testMigratorTpCdrStats, + testMigratorTpAliases, testFlush, } func TestMigratorITPostgresConnect(t *testing.T) { - cdrsPostgresCfgPath := path.Join(*dataDir, "conf", "samples", "tutpostgres") - postgresITCfg, err := config.NewCGRConfigFromFolder(cdrsPostgresCfgPath) + path_in := path.Join(*dataDir, "conf", "samples", "tutpostgres") + cfg_in, err := config.NewCGRConfigFromFolder(path_in) if err != nil { t.Fatal(err) } - dataDB, err := engine.ConfigureDataStorage(postgresITCfg.DataDbType, postgresITCfg.DataDbHost, postgresITCfg.DataDbPort, postgresITCfg.DataDbName, postgresITCfg.DataDbUser, postgresITCfg.DataDbPass, postgresITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, cfg_in.DataDbUser, + cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - dataDB2, err := engine.ConfigureDataStorage(postgresITCfg.DataDbType, postgresITCfg.DataDbHost, postgresITCfg.DataDbPort, postgresITCfg.DataDbName, postgresITCfg.DataDbUser, postgresITCfg.DataDbPass, postgresITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB2, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, cfg_in.DataDbUser, + cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - oldDataDB, err := ConfigureV1DataStorage(postgresITCfg.DataDbType, postgresITCfg.DataDbHost, postgresITCfg.DataDbPort, postgresITCfg.DataDbName, postgresITCfg.DataDbUser, postgresITCfg.DataDbPass, postgresITCfg.DBDataEncoding) + oldDataDB, err := ConfigureV1DataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, cfg_in.DataDbUser, + cfg_in.DataDbPass, cfg_in.DBDataEncoding) if err != nil { log.Fatal(err) } - storDB, err := engine.ConfigureStorStorage(postgresITCfg.StorDBType, postgresITCfg.StorDBHost, postgresITCfg.StorDBPort, postgresITCfg.StorDBName, postgresITCfg.StorDBUser, postgresITCfg.StorDBPass, postgresITCfg.DBDataEncoding, + storDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - oldstorDB, err := engine.ConfigureStorStorage(postgresITCfg.StorDBType, postgresITCfg.StorDBHost, postgresITCfg.StorDBPort, postgresITCfg.StorDBName, postgresITCfg.StorDBUser, postgresITCfg.StorDBPass, postgresITCfg.DBDataEncoding, + oldstorDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - mig, err = NewMigrator(dataDB, dataDB2, postgresITCfg.DataDbType, postgresITCfg.DBDataEncoding, storDB, postgresITCfg.StorDBType, oldDataDB, postgresITCfg.DataDbType, postgresITCfg.DBDataEncoding, oldstorDB, postgresITCfg.StorDBType, false, true, true, false, false) + mig, err = NewMigrator(dataDB, dataDB2, cfg_in.DataDbType, cfg_in.DBDataEncoding, storDB, cfg_in.StorDBType, oldDataDB, + cfg_in.DataDbType, cfg_in.DBDataEncoding, oldstorDB, cfg_in.StorDBType, false, true, true, false, false) if err != nil { log.Fatal(err) } @@ -94,34 +140,40 @@ func TestMigratorITPostgres(t *testing.T) { } func TestMigratorITRedisConnect(t *testing.T) { - cdrsMysqlCfgPath := path.Join(*dataDir, "conf", "samples", "tutmysql") - mysqlITCfg, err := config.NewCGRConfigFromFolder(cdrsMysqlCfgPath) + path_in := path.Join(*dataDir, "conf", "samples", "tutmysql") + cfg_in, err := config.NewCGRConfigFromFolder(path_in) if err != nil { t.Fatal(err) } - dataDB, err := engine.ConfigureDataStorage(mysqlITCfg.DataDbType, mysqlITCfg.DataDbHost, mysqlITCfg.DataDbPort, mysqlITCfg.DataDbName, mysqlITCfg.DataDbUser, mysqlITCfg.DataDbPass, mysqlITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - dataDB2, err := engine.ConfigureDataStorage(mysqlITCfg.DataDbType, mysqlITCfg.DataDbHost, mysqlITCfg.DataDbPort, mysqlITCfg.DataDbName, mysqlITCfg.DataDbUser, mysqlITCfg.DataDbPass, mysqlITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB2, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - oldDataDB, err := ConfigureV1DataStorage(mysqlITCfg.DataDbType, mysqlITCfg.DataDbHost, mysqlITCfg.DataDbPort, mysqlITCfg.DataDbName, mysqlITCfg.DataDbUser, mysqlITCfg.DataDbPass, mysqlITCfg.DBDataEncoding) + oldDataDB, err := ConfigureV1DataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding) if err != nil { log.Fatal(err) } - storDB, err := engine.ConfigureStorStorage(mysqlITCfg.StorDBType, mysqlITCfg.StorDBHost, mysqlITCfg.StorDBPort, mysqlITCfg.StorDBName, mysqlITCfg.StorDBUser, mysqlITCfg.StorDBPass, mysqlITCfg.DBDataEncoding, + storDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - oldstorDB, err := engine.ConfigureStorStorage(mysqlITCfg.StorDBType, mysqlITCfg.StorDBHost, mysqlITCfg.StorDBPort, mysqlITCfg.StorDBName, mysqlITCfg.StorDBUser, mysqlITCfg.StorDBPass, mysqlITCfg.DBDataEncoding, + oldstorDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - mig, err = NewMigrator(dataDB, dataDB2, mysqlITCfg.DataDbType, mysqlITCfg.DBDataEncoding, storDB, mysqlITCfg.StorDBType, oldDataDB, mysqlITCfg.DataDbType, mysqlITCfg.DBDataEncoding, oldstorDB, mysqlITCfg.StorDBType, false, true, true, false, false) + mig, err = NewMigrator(dataDB, dataDB2, cfg_in.DataDbType, cfg_in.DBDataEncoding, storDB, cfg_in.StorDBType, oldDataDB, + cfg_in.DataDbType, cfg_in.DBDataEncoding, oldstorDB, cfg_in.StorDBType, false, true, true, false, false) if err != nil { log.Fatal(err) } @@ -136,34 +188,40 @@ func TestMigratorITRedis(t *testing.T) { } func TestMigratorITMongoConnect(t *testing.T) { - cdrsMongoCfgPath := path.Join(*dataDir, "conf", "samples", "tutmongo") - mgoITCfg, err := config.NewCGRConfigFromFolder(cdrsMongoCfgPath) + path_in := path.Join(*dataDir, "conf", "samples", "tutmongo") + cfg_in, err := config.NewCGRConfigFromFolder(path_in) if err != nil { t.Fatal(err) } - dataDB, err := engine.ConfigureDataStorage(mgoITCfg.DataDbType, mgoITCfg.DataDbHost, mgoITCfg.DataDbPort, mgoITCfg.DataDbName, mgoITCfg.DataDbUser, mgoITCfg.DataDbPass, mgoITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - dataDB2, err := engine.ConfigureDataStorage(mgoITCfg.DataDbType, mgoITCfg.DataDbHost, mgoITCfg.DataDbPort, mgoITCfg.DataDbName, mgoITCfg.DataDbUser, mgoITCfg.DataDbPass, mgoITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB2, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - oldDataDB, err := ConfigureV1DataStorage(mgoITCfg.DataDbType, mgoITCfg.DataDbHost, mgoITCfg.DataDbPort, mgoITCfg.DataDbName, mgoITCfg.DataDbUser, mgoITCfg.DataDbPass, mgoITCfg.DBDataEncoding) + oldDataDB, err := ConfigureV1DataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding) if err != nil { log.Fatal(err) } - storDB, err := engine.ConfigureStorStorage(mgoITCfg.StorDBType, mgoITCfg.StorDBHost, mgoITCfg.StorDBPort, mgoITCfg.StorDBName, mgoITCfg.StorDBUser, mgoITCfg.StorDBPass, mgoITCfg.DBDataEncoding, + storDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - oldstorDB, err := engine.ConfigureStorStorage(mgoITCfg.StorDBType, mgoITCfg.StorDBHost, mgoITCfg.StorDBPort, mgoITCfg.StorDBName, mgoITCfg.StorDBUser, mgoITCfg.StorDBPass, mgoITCfg.DBDataEncoding, + oldstorDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - mig, err = NewMigrator(dataDB, dataDB2, mgoITCfg.DataDbType, mgoITCfg.DBDataEncoding, storDB, mgoITCfg.StorDBType, oldDataDB, mgoITCfg.DataDbType, mgoITCfg.DBDataEncoding, oldstorDB, mgoITCfg.StorDBType, false, true, true, false, false) + mig, err = NewMigrator(dataDB, dataDB2, cfg_in.DataDbType, cfg_in.DBDataEncoding, storDB, cfg_in.StorDBType, oldDataDB, + cfg_in.DataDbType, cfg_in.DBDataEncoding, oldstorDB, cfg_in.StorDBType, false, true, true, false, false) if err != nil { log.Fatal(err) } @@ -178,39 +236,45 @@ func TestMigratorITMongo(t *testing.T) { } func TestMigratorITMoveConnect(t *testing.T) { - cdrsMongoCfgPath := path.Join(*dataDir, "conf", "samples", "tutmongo") - mgoITCfg, err := config.NewCGRConfigFromFolder(cdrsMongoCfgPath) + path_in := path.Join(*dataDir, "conf", "samples", "tutmongo") + cfg_in, err := config.NewCGRConfigFromFolder(path_in) if err != nil { t.Fatal(err) } - cdrsMysqlCfgPath := path.Join(*dataDir, "conf", "samples", "tutmysql") - mysqlITCfg, err := config.NewCGRConfigFromFolder(cdrsMysqlCfgPath) + path_out := path.Join(*dataDir, "conf", "samples", "tutmysql") + cfg_out, err := config.NewCGRConfigFromFolder(path_out) if err != nil { t.Fatal(err) } - dataDB, err := engine.ConfigureDataStorage(mgoITCfg.DataDbType, mgoITCfg.DataDbHost, mgoITCfg.DataDbPort, mgoITCfg.DataDbName, mgoITCfg.DataDbUser, mgoITCfg.DataDbPass, mgoITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB, err := engine.ConfigureDataStorage(cfg_in.DataDbType, cfg_in.DataDbHost, cfg_in.DataDbPort, cfg_in.DataDbName, + cfg_in.DataDbUser, cfg_in.DataDbPass, cfg_in.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - dataDB2, err := engine.ConfigureDataStorage(mysqlITCfg.DataDbType, mysqlITCfg.DataDbHost, mysqlITCfg.DataDbPort, mysqlITCfg.DataDbName, mysqlITCfg.DataDbUser, mysqlITCfg.DataDbPass, mysqlITCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) + dataDB2, err := engine.ConfigureDataStorage(cfg_out.DataDbType, cfg_out.DataDbHost, cfg_out.DataDbPort, cfg_out.DataDbName, + cfg_out.DataDbUser, cfg_out.DataDbPass, cfg_out.DBDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize) if err != nil { log.Fatal(err) } - oldDataDB, err := ConfigureV1DataStorage(mysqlITCfg.DataDbType, mysqlITCfg.DataDbHost, mysqlITCfg.DataDbPort, mysqlITCfg.DataDbName, mysqlITCfg.DataDbUser, mysqlITCfg.DataDbPass, mysqlITCfg.DBDataEncoding) + oldDataDB, err := ConfigureV1DataStorage(cfg_out.DataDbType, cfg_out.DataDbHost, cfg_out.DataDbPort, cfg_out.DataDbName, + cfg_out.DataDbUser, cfg_out.DataDbPass, cfg_out.DBDataEncoding) if err != nil { log.Fatal(err) } - storDB, err := engine.ConfigureStorStorage(mgoITCfg.StorDBType, mgoITCfg.StorDBHost, mgoITCfg.StorDBPort, mgoITCfg.StorDBName, mgoITCfg.StorDBUser, mgoITCfg.StorDBPass, mgoITCfg.DBDataEncoding, + storDB, err := engine.ConfigureStorStorage(cfg_in.StorDBType, cfg_in.StorDBHost, cfg_in.StorDBPort, cfg_in.StorDBName, + cfg_in.StorDBUser, cfg_in.StorDBPass, cfg_in.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - oldstorDB, err := engine.ConfigureStorStorage(mysqlITCfg.StorDBType, mysqlITCfg.StorDBHost, mysqlITCfg.StorDBPort, mysqlITCfg.StorDBName, mysqlITCfg.StorDBUser, mysqlITCfg.StorDBPass, mysqlITCfg.DBDataEncoding, + oldstorDB, err := engine.ConfigureStorStorage(cfg_out.StorDBType, cfg_out.StorDBHost, cfg_out.StorDBPort, cfg_out.StorDBName, + cfg_out.StorDBUser, cfg_out.StorDBPass, cfg_out.DBDataEncoding, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes) if err != nil { log.Fatal(err) } - mig, err = NewMigrator(dataDB2, dataDB, mgoITCfg.DataDbType, mgoITCfg.DBDataEncoding, storDB, mgoITCfg.StorDBType, oldDataDB, mgoITCfg.DataDbType, mgoITCfg.DBDataEncoding, oldstorDB, mgoITCfg.StorDBType, false, false, false, false, false) + mig, err = NewMigrator(dataDB2, dataDB, cfg_in.DataDbType, cfg_in.DBDataEncoding, storDB, cfg_in.StorDBType, oldDataDB, + cfg_in.DataDbType, cfg_in.DBDataEncoding, oldstorDB, cfg_in.StorDBType, false, false, false, false, false) if err != nil { log.Fatal(err) } @@ -229,7 +293,16 @@ func testFlush(t *testing.T) { if err := engine.SetDBVersions(mig.dmOut.DataDB()); err != nil { t.Error("Error ", err.Error()) } - + if path_out != "" { + if err := mig.InStorDB().Flush(path.Join(cfg_in.DataFolderPath, "storage", cfg_in.StorDBType)); err != nil { + t.Error(err) + } + } + if path_out != "" { + if err := mig.OutStorDB().Flush(path.Join(cfg_out.DataFolderPath, "storage", cfg_out.StorDBType)); err != nil { + t.Error(err) + } + } } func testMigratorAccounts(t *testing.T) { @@ -248,20 +321,20 @@ func testMigratorAccounts(t *testing.T) { case dbtype == utils.REDIS: err := mig.oldDataDB.setV1Account(v1Acc) if err != nil { - t.Error("Error when setting v1 acc ", err.Error()) + t.Error("Error when setting v1 Accounts ", err.Error()) } currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 1, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Accounts ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaAccounts}) if err != nil { - t.Error("Error when migrating accounts ", err.Error()) + t.Error("Error when migrating Accounts ", err.Error()) } result, err := mig.dmOut.DataDB().GetAccount(testAccount.ID) if err != nil { - t.Error("Error when getting account ", err.Error()) + t.Error("Error when getting Accounts ", err.Error()) } if !reflect.DeepEqual(testAccount.BalanceMap["*voice"][0], result.BalanceMap["*voice"][0]) { t.Errorf("Expecting: %+v, received: %+v", testAccount.BalanceMap["*voice"][0], result.BalanceMap["*voice"][0]) @@ -276,15 +349,15 @@ func testMigratorAccounts(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 1, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Accounts ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaAccounts}) if err != nil { - t.Error("Error when migrating accounts ", err.Error()) + t.Error("Error when migrating Accounts ", err.Error()) } result, err := mig.dmOut.DataDB().GetAccount(testAccount.ID) if err != nil { - t.Error("Error when getting account ", err.Error()) + t.Error("Error when getting Accounts ", err.Error()) } if !reflect.DeepEqual(testAccount, result) { t.Errorf("Expecting: %+v, received: %+v", testAccount, result) @@ -296,11 +369,11 @@ func testMigratorAccounts(t *testing.T) { currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Accounts ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaAccounts}) if err != nil { - t.Error("Error when migrating accounts ", err.Error()) + t.Error("Error when migrating Accounts ", err.Error()) } result, err := mig.dmOut.DataDB().GetAccount(testAccount.ID) if err != nil { @@ -324,7 +397,7 @@ func testMigratorActionPlans(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 1, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for ActionPlan ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActionPlans}) if err != nil { @@ -349,7 +422,7 @@ func testMigratorActionPlans(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 1, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for ActionPlan ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActionPlans}) if err != nil { @@ -373,7 +446,7 @@ func testMigratorActionPlans(t *testing.T) { currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for ActionPlan ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActionPlans}) if err != nil { @@ -434,7 +507,7 @@ func testMigratorActionTriggers(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 2, utils.ActionTriggers: 1, utils.ActionPlans: 2, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for ActionTriggers ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActionTriggers}) if err != nil { @@ -520,11 +593,11 @@ func testMigratorActionTriggers(t *testing.T) { currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for ActionTriggers ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActionTriggers}) if err != nil { - t.Error("Error when migrating ActionPlans ", err.Error()) + t.Error("Error when migrating ActionTriggers ", err.Error()) } result, err := mig.dmOut.GetActionTriggers(atrs[0].ID, true, utils.NonTransactional) if err != nil { @@ -597,8 +670,45 @@ func testMigratorActionTriggers(t *testing.T) { } func testMigratorActions(t *testing.T) { - v1act := &v1Actions{&v1Action{Id: "test", ActionType: "", BalanceType: "", Direction: "INBOUND", ExtraParameters: "", ExpirationString: "", Balance: &v1Balance{Timings: []*engine.RITiming{&engine.RITiming{Years: utils.Years{}, Months: utils.Months{}, MonthDays: utils.MonthDays{}, WeekDays: utils.WeekDays{}}}}}} - act := &engine.Actions{&engine.Action{Id: "test", ActionType: "", ExtraParameters: "", ExpirationString: "", Weight: 0.00, Balance: &engine.BalanceFilter{Timings: []*engine.RITiming{&engine.RITiming{Years: utils.Years{}, Months: utils.Months{}, MonthDays: utils.MonthDays{}, WeekDays: utils.WeekDays{}}}}}} + v1act := &v1Actions{ + &v1Action{ + Id: "test", + ActionType: "", + BalanceType: "", + Direction: "INBOUND", + ExtraParameters: "", + ExpirationString: "", + Balance: &v1Balance{ + Timings: []*engine.RITiming{ + &engine.RITiming{ + Years: utils.Years{}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + }, + }, + }, + }, + } + act := &engine.Actions{ + &engine.Action{ + Id: "test", + ActionType: "", + ExtraParameters: "", + ExpirationString: "", + Weight: 0.00, + Balance: &engine.BalanceFilter{ + Timings: []*engine.RITiming{ + &engine.RITiming{ + Years: utils.Years{}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + }, + }, + }, + }, + } switch { case dbtype == utils.REDIS: err := mig.oldDataDB.setV1Actions(v1act) @@ -608,7 +718,7 @@ func testMigratorActions(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 1, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Actions ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActions}) if err != nil { @@ -630,7 +740,7 @@ func testMigratorActions(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 1, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 2} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Actions ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActions}) if err != nil { @@ -650,15 +760,15 @@ func testMigratorActions(t *testing.T) { currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for Actions ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaActions}) if err != nil { - t.Error("Error when migrating ActionPlans ", err.Error()) + t.Error("Error when migrating Actions ", err.Error()) } result, err := mig.dmOut.GetActions((*v1act)[0].Id, true, utils.NonTransactional) if err != nil { - t.Error("Error when getting ActionPlan ", err.Error()) + t.Error("Error when getting Actions ", err.Error()) } if !reflect.DeepEqual(*act, result) { t.Errorf("Expecting: %+v, received: %+v", *act, result) @@ -690,7 +800,7 @@ func testMigratorSharedGroups(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 1} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for SharedGroup ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaSharedGroups}) if err != nil { @@ -711,7 +821,7 @@ func testMigratorSharedGroups(t *testing.T) { currentVersion := engine.Versions{utils.StatS: 2, utils.Thresholds: 2, utils.Accounts: 2, utils.Actions: 2, utils.ActionTriggers: 2, utils.ActionPlans: 2, utils.SharedGroups: 1} err = mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for SharedGroup ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaSharedGroups}) if err != nil { @@ -731,7 +841,7 @@ func testMigratorSharedGroups(t *testing.T) { currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) if err != nil { - t.Error("Error when setting version for stats ", err.Error()) + t.Error("Error when setting version for SharedGroup ", err.Error()) } err, _ = mig.Migrate([]string{utils.MetaSharedGroups}) if err != nil { @@ -1000,36 +1110,752 @@ func testMigratorStats(t *testing.T) { } } -func testMigratorTPRatingProfile(t *testing.T) { - tpRatingProfile := &utils.TPRatingProfile{ - TPid: "TPRProf1", - LoadId: "RPrf", +func testMigratorThreshold(t *testing.T) { + tim := time.Date(2012, time.February, 27, 23, 59, 59, 0, time.UTC).Local() + tenant := config.CgrConfig().DefaultTenant + var filters []*engine.RequestFilter + threshold := &v2ActionTrigger{ + ID: "test2", // original csv tag + UniqueID: "testUUID", // individual id + ThresholdType: "*min_event_counter", //*min_event_counter, *max_event_counter, *min_balance_counter, *max_balance_counter, *min_balance, *max_balance, *balance_expired + ThresholdValue: 5.32, + Recurrent: false, // reset excuted flag each run + MinSleep: time.Duration(5) * time.Second, // Minimum duration between two executions in case of recurrent triggers + ExpirationDate: time.Now(), + ActivationDate: time.Now(), + Balance: &engine.BalanceFilter{ + ID: utils.StringPointer("TESTZ"), + Timings: []*engine.RITiming{}, + ExpirationDate: utils.TimePointer(tim), + Type: utils.StringPointer(utils.MONETARY), + Directions: utils.StringMapPointer(utils.NewStringMap(utils.OUT)), + }, + Weight: 0, + ActionsID: "Action1", + MinQueuedItems: 10, // Trigger actions only if this number is hit (stats only) + Executed: false, + LastExecutionTime: time.Now(), + } + x, err := engine.NewRequestFilter(engine.MetaRSRFields, "Directions", threshold.Balance.Directions.Slice()) + if err != nil { + t.Error("Error when creating new NewRequestFilter", err.Error()) + } + filters = append(filters, x) + + filter := &engine.Filter{Tenant: config.CgrConfig().DefaultTenant, ID: *threshold.Balance.ID, RequestFilters: filters} + + thp := &engine.ThresholdProfile{ + ID: threshold.ID, + Tenant: config.CgrConfig().DefaultTenant, + Blocker: false, + Weight: threshold.Weight, + ActivationInterval: &utils.ActivationInterval{threshold.ExpirationDate, threshold.ActivationDate}, + MinSleep: threshold.MinSleep, + } + th := &engine.Threshold{ + Tenant: config.CgrConfig().DefaultTenant, + ID: threshold.ID, + } + + switch { + case dbtype == utils.REDIS: + if err := mig.dmIN.SetFilter(filter); err != nil { + t.Error("Error when setting Filter ", err.Error()) + } + if err := mig.dmIN.SetThresholdProfile(thp); err != nil { + t.Error("Error when setting threshold ", err.Error()) + } + if err := mig.dmIN.SetThreshold(th); err != nil { + t.Error("Error when setting threshold ", err.Error()) + } + err := mig.oldDataDB.setV2ActionTrigger(threshold) + if err != nil { + t.Error("Error when setting threshold ", err.Error()) + } + currentVersion := engine.CurrentDataDBVersions() + currentVersion[utils.Thresholds] = 1 + err = mig.dmOut.DataDB().SetVersions(currentVersion, false) + if err != nil { + t.Error("Error when setting version for threshold ", err.Error()) + } + err, _ = mig.Migrate([]string{utils.MetaThresholds}) + if err != nil { + t.Error("Error when migrating threshold ", err.Error()) + } + result, err := mig.dmOut.GetThreshold("cgrates.org", threshold.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting threshold ", err.Error()) + } + if !reflect.DeepEqual(th, result) { + t.Errorf("Expecting: %+v, received: %+v", th, result) + } + thpr, err := mig.dmOut.GetThresholdProfile(thp.Tenant, thp.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting thresholdProfile ", err.Error()) + } + if !reflect.DeepEqual(thp.ID, thpr.ID) { + t.Errorf("Expecting: %+v, received: %+v", thp.ID, thpr.ID) + } + case dbtype == utils.MONGO: + if err := mig.dmIN.SetFilter(filter); err != nil { + t.Error("Error when setting Filter ", err.Error()) + } + if err := mig.dmIN.SetThresholdProfile(thp); err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + if err := mig.dmIN.SetThreshold(th); err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + err := mig.oldDataDB.setV2ActionTrigger(threshold) + if err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + currentVersion := engine.CurrentDataDBVersions() + currentVersion[utils.Thresholds] = 1 + err = mig.dmOut.DataDB().SetVersions(currentVersion, false) + if err != nil { + t.Error("Error when setting version for Threshold ", err.Error()) + } + err, _ = mig.Migrate([]string{utils.MetaThresholds}) + if err != nil { + t.Error("Error when migrating Threshold ", err.Error()) + } + result, err := mig.dmOut.GetThreshold("cgrates.org", threshold.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting Threshold ", err.Error()) + } + if !reflect.DeepEqual(th, result) { + t.Errorf("Expecting: %+v, received: %+v", th, result) + } + thpr, err := mig.dmOut.GetThresholdProfile(thp.Tenant, thp.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting thresholdProfile ", err.Error()) + } + if !reflect.DeepEqual(thp.ID, thpr.ID) { + t.Errorf("Expecting: %+v, received: %+v", thp.ID, thpr.ID) + } + case dbtype == Move: + if err := mig.dmIN.SetFilter(filter); err != nil { + t.Error("Error when setting Filter ", err.Error()) + } + if err := mig.dmIN.SetThresholdProfile(thp); err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + if err := mig.dmIN.SetThreshold(th); err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + err := mig.oldDataDB.setV2ActionTrigger(threshold) + if err != nil { + t.Error("Error when setting Threshold ", err.Error()) + } + currentVersion := engine.CurrentDataDBVersions() + err = mig.dmOut.DataDB().SetVersions(currentVersion, false) + if err != nil { + t.Error("Error when setting version for Threshold ", err.Error()) + } + err, _ = mig.Migrate([]string{utils.MetaThresholds}) + if err != nil { + t.Error("Error when migrating Threshold ", err.Error()) + } + result, err := mig.dmOut.GetThreshold(tenant, threshold.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting Threshold ", err.Error()) + } + if !reflect.DeepEqual(th, result) { + t.Errorf("Expecting: %+v, received: %+v", th, result) + } + thpr, err := mig.dmOut.GetThresholdProfile(thp.Tenant, thp.ID, true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting ThresholdProfile ", err.Error()) + } + if !reflect.DeepEqual(thp.ID, thpr.ID) { + t.Errorf("Expecting: %+v, received: %+v", thp.ID, thpr.ID) + } + } +} + +func testMigratorAlias(t *testing.T) { + alias := &engine.Alias{ Direction: "*out", - Tenant: "Tenant1", - Category: "Category", - Subject: "Subject", - RatingPlanActivations: []*utils.TPRatingActivation{ - &utils.TPRatingActivation{ - ActivationTime: "2014-07-29T15:00:00Z", - RatingPlanId: "PlanOne", - FallbackSubjects: "FallBack", - CdrStatQueueIds: "RandomId", + Tenant: "cgrates.org", + Category: "call", + Account: "dan", + Subject: "dan", + Context: "*rating", + Values: engine.AliasValues{ + &engine.AliasValue{ + DestinationId: "EU_LANDLINE", + Pairs: engine.AliasPairs{ + "Subject": map[string]string{ + "dan": "dan1", + "rif": "rif1", + }, + "Cli": map[string]string{ + "0723": "0724", + }, + }, + Weight: 10, }, - &utils.TPRatingActivation{ - ActivationTime: "2015-07-29T10:00:00Z", - RatingPlanId: "PlanTwo", - FallbackSubjects: "FallOut", - CdrStatQueueIds: "RandomIdTwo", + + &engine.AliasValue{ + DestinationId: "GLOBAL1", + Pairs: engine.AliasPairs{"Subject": map[string]string{"dan": "dan2"}}, + Weight: 20, }, }, } switch dbtype { case Move: - if err := mig.InStorDB().SetTPRatingProfiles([]*utils.TPRatingProfile{tpRatingProfile}); err != nil { - t.Error("Error when setting Stats ", err.Error()) + if err := mig.dmIN.DataDB().SetAlias(alias, utils.NonTransactional); err != nil { + t.Error("Error when setting Alias ", err.Error()) } currentVersion := engine.CurrentDataDBVersions() err := mig.dmOut.DataDB().SetVersions(currentVersion, false) + if err != nil { + t.Error("Error when setting version for Alias ", err.Error()) + } + err, _ = mig.Migrate([]string{utils.MetaAlias}) + if err != nil { + t.Error("Error when migrating Alias ", err.Error()) + } + result, err := mig.dmOut.DataDB().GetAlias(alias.GetId(), true, utils.NonTransactional) + if err != nil { + t.Error("Error when getting Alias ", err.Error()) + } + if !reflect.DeepEqual(alias, result) { + t.Errorf("Expecting: %+v, received: %+v", alias, result) + } + } +} + +//WILL UPDATE AFTER RELEASE OF NEW ALIAS +//FIXME +// func testMigratorReverseAlias(t *testing.T) { +// alias := &engine.Alias{ +// Direction: "*out", +// Tenant: "cgrates.org", +// Category: "call", +// Account: "dan", +// Subject: "dan", +// Context: "*rating", +// Values: engine.AliasValues{ +// &engine.AliasValue{ +// DestinationId: "EU_LANDLINE", +// Pairs: engine.AliasPairs{ +// "Subject": map[string]string{ +// "dan": "dan1", +// "rif": "rif1", +// }, +// "Cli": map[string]string{ +// "0723": "0724", +// }, +// }, +// Weight: 10, +// }, + +// &engine.AliasValue{ +// DestinationId: "GLOBAL1", +// Pairs: engine.AliasPairs{"Subject": map[string]string{"dan": "dan2"}}, +// Weight: 20, +// }, +// }, +// } +// switch dbtype { +// case Move: +// if err := mig.dmIN.DataDB().SetReverseAlias(alias, utils.NonTransactional); err != nil { +// t.Error("Error when setting ReverseAlias ", err.Error()) +// } +// currentVersion := engine.CurrentDataDBVersions() +// err := mig.dmOut.DataDB().SetVersions(currentVersion, false) +// if err != nil { +// t.Error("Error when setting version for ReverseAlias ", err.Error()) +// } +// err, _ = mig.Migrate([]string{utils.MetaReverseAlias}) +// if err != nil { +// t.Error("Error when migrating ReverseAlias ", err.Error()) +// } +// result, err := mig.dmOut.DataDB().GetReverseAlias(alias.GetId(), true, utils.NonTransactional) +// if err != nil { +// t.Error("Error when getting ReverseAlias ", err.Error()) +// } +// if !reflect.DeepEqual(alias, result) { +// t.Errorf("Expecting: %+v, received: %+v", alias, result) +// } +// } +// } + +func testMigratorCdrStats(t *testing.T) { + cdrs := &engine.CdrStats{ + Id: "", + QueueLength: 10, // Number of items in the stats buffer + TimeWindow: time.Duration(1) * time.Second, // Will only keep the CDRs who's call setup time is not older than time.Now()-TimeWindow + SaveInterval: time.Duration(1) * time.Second, + Metrics: []string{engine.ASR, engine.PDD, engine.ACD, engine.TCD, engine.ACC, engine.TCC, engine.DDC}, + SetupInterval: []time.Time{time.Date(2012, time.February, 27, 23, 59, 59, 0, time.UTC).Local()}, // CDRFieldFilter on SetupInterval, 2 or less items (>= start interval,< stop_interval) + TOR: []string{""}, // CDRFieldFilter on TORs + CdrHost: []string{""}, // CDRFieldFilter on CdrHosts + CdrSource: []string{""}, // CDRFieldFilter on CdrSources + ReqType: []string{""}, // CDRFieldFilter on RequestTypes + Direction: []string{""}, // CDRFieldFilter on Directions + Tenant: []string{""}, // CDRFieldFilter on Tenants + Category: []string{""}, // CDRFieldFilter on Categories + Account: []string{""}, // CDRFieldFilter on Accounts + Subject: []string{""}, // CDRFieldFilter on Subjects + DestinationIds: []string{""}, // CDRFieldFilter on DestinationPrefixes + UsageInterval: []time.Duration{time.Duration(1) * time.Second}, // CDRFieldFilter on UsageInterval, 2 or less items (>= Usage, = Pdd, =Cost,