Added support for account migration

This commit is contained in:
edwardro22
2017-08-22 12:33:09 +00:00
parent 0c146664e9
commit cecefb75c4
5 changed files with 54 additions and 12 deletions

View File

@@ -80,32 +80,42 @@ func main() {
return
}
if migrate != nil && *migrate != "" { // Run migrator
dataDB, err := engine.ConfigureDataStorage(*dataDBType, *dataDBHost, *dataDBPort, *dataDBName, *dataDBUser, *dataDBPass, *dbDataEncoding, config.CgrConfig().CacheConfig, *loadHistorySize)
if err != nil {
log.Fatal(err)
}
log.Print("#1 The redis db loaded")
oldDataDB, err := engine.ConfigureDataStorage(*oldDataDBType, *oldDataDBHost, *oldDataDBPort, *oldDataDBName, *oldDataDBUser, *oldDataDBPass, *oldDBDataEncoding, config.CgrConfig().CacheConfig, *oldLoadHistorySize)
if err != nil {
log.Fatal(err)
}
log.Print("#2 Old redis db loaded")
storDB, err := engine.ConfigureStorStorage(*storDBType, *storDBHost, *storDBPort, *storDBName, *storDBUser, *storDBPass, *dbDataEncoding,
config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes)
if err != nil {
log.Fatal(err)
}
log.Print("#3 Old mysql db loaded")
oldstorDB, err := engine.ConfigureStorStorage(*oldStorDBType, *oldStorDBHost, *oldStorDBPort, *oldStorDBName, *oldStorDBUser, *oldStorDBPass, *oldDBDataEncoding,
config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes)
if err != nil {
log.Fatal(err)
}
log.Print("#4 Old mysql db loaded")
m,err := migrator.NewMigrator(dataDB, *dataDBType, *dbDataEncoding, storDB, *storDBType,oldDataDB,*oldDataDBType,*oldDBDataEncoding,oldstorDB,*oldStorDBType)
if err != nil {
log.Fatal(err)
}
if err:=m.Migrate(*migrate); err != nil {
log.Print("#5 Migrator started")
err = m.Migrate(*migrate);
if err != nil {
log.Fatal(err)
}
log.Print("Done migrating!")
return
}
}
}

View File

@@ -86,7 +86,7 @@ const CGRATES_CFG_JSON = `
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "redis", // data_db type: <redis|mongo>
"db_host": "127.0.0.1", // data_db host address
"db_host": "192.168.100.40", // data_db host address
"db_port": 6379, // data_db port to reach the database
"db_name": "10", // data_db database name to connect to
"db_user": "cgrates", // username to use when connecting to data_db
@@ -97,11 +97,11 @@ const CGRATES_CFG_JSON = `
"stor_db": { // database used to store offline tariff plans and CDRs
"db_type": "mysql", // stor database type to use: <mongo|mysql|postgres>
"db_host": "127.0.0.1", // the host to connect to
"db_host": "192.168.100.40", // the host to connect to
"db_port": 3306, // the port to reach the stordb
"db_name": "cgrates", // stor database name
"db_user": "cgrates", // username to use when connecting to stordb
"db_password": "", // password to use when connecting to stordb
"db_password": "CGRateS.org", // password to use when connecting to stordb
"max_open_conns": 100, // maximum database connections opened, not applying for mongo
"max_idle_conns": 10, // maximum database connections idle, not applying for mongo
"conn_max_lifetime": 0, // maximum amount of time in seconds a connection may be reused (0 for unlimited), not applying for mongo

View File

@@ -13,12 +13,31 @@
"rpc_gob": ":2013",
"http": ":2080",
},
"data_db": { // database used to store runtime data (eg: accounts, cdr stats)
"db_type": "redis", // data_db type: <redis|mongo>
"db_host": "192.168.100.40", // data_db host address
"db_port": 6379, // data_db port to reach the database
"db_name": "10", // data_db database name to connect to
"db_user": "cgrates", // username to use when connecting to data_db
"db_password": "", // password to use when connecting to data_db
"load_history_size": 10, // Number of records in the load history
},
"stor_db": { // database used to store offline tariff plans and CDRs
"db_password": "CGRateS.org", // password to use when connecting to stordb
"db_type": "mysql", // stor database type to use: <mongo|mysql|postgres>
"db_host": "192.168.100.40", // the host to connect to
"db_port": 3306, // the port to reach the stordb
"db_name": "cgrates", // stor database name
"db_user": "cgrates", // username to use when connecting to stordb
"db_password": "CGRateS.org", // password to use when connecting to stordb
"max_open_conns": 100, // maximum database connections opened, not applying for mongo
"max_idle_conns": 10, // maximum database connections idle, not applying for mongo
"conn_max_lifetime": 0, // maximum amount of time in seconds a connection may be reused (0 for unlimited), not applying for mongo
"cdrs_indexes": [], // indexes on cdrs table to speed up queries, used only in case of mongo
},
"cache":{
"destinations": {"limit": 10000, "ttl":"0s", "precache": true},
"reverse_destinations": {"limit": 10000, "ttl":"0s", "precache": true},

View File

@@ -36,16 +36,21 @@ const (
func (m *Migrator) migrateAccounts() (err error) {
switch m.dataDBType {
case utils.REDIS:
log.Print("#9 Starts migrateAccounts")
var acntV1Keys []string
acntV1Keys, err = m.oldDataDB.GetKeysForPrefix(v1AccountDBPrefix)
if err != nil {
return
}
log.Print("#10 it doesn't get to here",acntV1Keys)
for _, acntV1Key := range acntV1Keys {
log.Print("#11 acc key:",acntV1Key)
v1Acnt, err := m.getV1AccountFromDB(acntV1Key)
if err != nil {
return err
}
log.Print("#8 it doesn't get to here")
if v1Acnt != nil {
acnt := v1Acnt.AsAccount()
if err = m.dataDB.SetAccount(acnt); err != nil {
@@ -53,6 +58,7 @@ func (m *Migrator) migrateAccounts() (err error) {
}
}
}
log.Print("#8 it doesn't get to here")
// 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 {
@@ -61,6 +67,7 @@ func (m *Migrator) migrateAccounts() (err error) {
err.Error(),
fmt.Sprintf("error: <%s> when updating Accounts version into StorDB", err.Error()))
}
log.Print("#8 it doesn't get to here")
return
case utils.MONGO:
dataDB := m.dataDB.(*engine.MongoStorage)
@@ -93,20 +100,25 @@ func (m *Migrator) migrateAccounts() (err error) {
}
func (m *Migrator) getV1AccountFromDB(key string) (*v1Account, error) {
switch m.dataDBType {
switch m.oldDataDBType {
case utils.REDIS:
dataDB := m.dataDB.(*engine.RedisStorage)
log.Print("#12 start get ")
dataDB := m.oldDataDB.(*engine.RedisStorage)
log.Print("#12 start get")
if strVal, err := dataDB.Cmd("GET", key).Bytes(); err != nil {
return nil, err
} else {
log.Print("#12 start get")
v1Acnt := &v1Account{Id: key}
if err := m.oldmrshlr.Unmarshal(strVal, v1Acnt); err != nil {
log.Print("#12 start get")
if err := m.mrshlr.Unmarshal(strVal, v1Acnt); err != nil {
return nil, err
}
log.Print("#12 start get")
return v1Acnt, nil
}
case utils.MONGO:
dataDB := m.dataDB.(*engine.MongoStorage)
dataDB := m.oldDataDB.(*engine.MongoStorage)
mgoDB := dataDB.DB()
defer mgoDB.Session.Close()
v1Acnt := new(v1Account)
@@ -118,7 +130,7 @@ func (m *Migrator) getV1AccountFromDB(key string) (*v1Account, error) {
return nil, utils.NewCGRError(utils.Migrator,
utils.ServerErrorCaps,
utils.UnsupportedDB,
fmt.Sprintf("error: unsupported: <%s> for getV1AccountFromDB method", m.dataDBType))
fmt.Sprintf("error: unsupported: <%s> for getV1AccountFromDB method", m.oldDataDBType))
}
}

View File

@@ -19,7 +19,7 @@ package migrator
import (
"fmt"
"log"
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
@@ -76,6 +76,7 @@ func (m *Migrator) Migrate(taskID string) (err error) {
case utils.MetaCostDetails:
err = m.migrateCostDetails()
case utils.MetaAccounts:
log.Print("#7 function is about to start")
err = m.migrateAccounts()
case "migrateActionPlans":
err = m.migrateActionPlans()