diff --git a/apier/v1/apier_it_test.go b/apier/v1/apier_it_test.go
index 136729664..67aea47f3 100644
--- a/apier/v1/apier_it_test.go
+++ b/apier/v1/apier_it_test.go
@@ -1785,7 +1785,24 @@ func TestApierReplayFailedPosts(t *testing.T) {
t.Errorf("Error %s removing folder: %s", err, dir)
}
}
+}
+func TestApierGetDataDBVesions(t *testing.T) {
+ var reply *engine.Versions
+ if err := rater.Call("ApierV1.GetDataDBVersions", "", &reply); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(engine.CurrentDataDBVersions(), *reply) {
+ t.Errorf("Expecting : %+v, received: %+v", engine.CurrentDataDBVersions(), *reply)
+ }
+}
+
+func TestApierGetStorDBVesions(t *testing.T) {
+ var reply *engine.Versions
+ if err := rater.Call("ApierV1.GetStorDBVersions", "", &reply); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(engine.CurrentStorDBVersions(), *reply) {
+ t.Errorf("Expecting : %+v, received: %+v", engine.CurrentStorDBVersions(), *reply)
+ }
}
// Simply kill the engine after we are done with tests within this file
diff --git a/apier/v1/versions.go b/apier/v1/versions.go
new file mode 100644
index 000000000..0d840a48b
--- /dev/null
+++ b/apier/v1/versions.go
@@ -0,0 +1,48 @@
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+
+package v1
+
+import (
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/utils"
+)
+
+// Queries all versions from stordb
+func (self *ApierV1) GetStorDBVersions(arg string, reply *engine.Versions) error {
+ if vrs, err := self.StorDb.GetVersions(utils.TBLVersions); err != nil {
+ return utils.NewErrServerError(err)
+ } else if len(vrs) == 0 {
+ return utils.ErrNotFound
+ } else {
+ *reply = vrs
+ }
+ return nil
+}
+
+// Queries all versions from stordb
+func (self *ApierV1) GetDataDBVersions(arg string, reply *engine.Versions) error {
+ if vrs, err := self.DataManager.DataDB().GetVersions(utils.TBLVersions); err != nil {
+ return utils.NewErrServerError(err)
+ } else if len(vrs) == 0 {
+ return utils.ErrNotFound
+ } else {
+ *reply = vrs
+ }
+ return nil
+}
diff --git a/cmd/cgr-migrator/cgr-migrator.go b/cmd/cgr-migrator/cgr-migrator.go
index 02dec1af5..9c7083cdf 100755
--- a/cmd/cgr-migrator/cgr-migrator.go
+++ b/cmd/cgr-migrator/cgr-migrator.go
@@ -32,7 +32,7 @@ import (
var (
sameDBname = true
- inDataDB migrator.MigratorDataDB
+ outDataDB migrator.MigratorDataDB
storDB engine.Storage
oDBDataEncoding string
migrate = flag.String("migrate", "", "Fire up automatic migration "+
@@ -46,12 +46,12 @@ var (
outDataDBUser = flag.String("out_datadb_user", config.CgrConfig().DataDbUser, "The DataDb user to sign in as.")
outDataDBPass = flag.String("out_datadb_passwd", config.CgrConfig().DataDbPass, "The DataDb user's password.")
- outStorDBType = flag.String("out_stordb_type", "", "The type of the storDb Database ")
- outStorDBHost = flag.String("out_stordb_host", config.CgrConfig().StorDBHost, "The storDb host to connect to.")
- outStorDBPort = flag.String("out_stordb_port", config.CgrConfig().StorDBPort, "The storDb port to bind to.")
- outStorDBName = flag.String("out_stordb_name", config.CgrConfig().StorDBName, "The name/number of the storDb to connect to.")
- outStorDBUser = flag.String("out_stordb_user", config.CgrConfig().StorDBUser, "The storDb user to sign in as.")
- outStorDBPass = flag.String("out_stordb_passwd", config.CgrConfig().StorDBPass, "The storDb user's password.")
+ outStorDBType = flag.String("out_stordb_type", "", "The type of the StorDB Database ")
+ outStorDBHost = flag.String("out_stordb_host", config.CgrConfig().StorDBHost, "The StorDB host to connect to.")
+ outStorDBPort = flag.String("out_stordb_port", config.CgrConfig().StorDBPort, "The StorDB port to bind to.")
+ outStorDBName = flag.String("out_stordb_name", config.CgrConfig().StorDBName, "The name/number of the StorDB to connect to.")
+ outStorDBUser = flag.String("out_stordb_user", config.CgrConfig().StorDBUser, "The StorDB user to sign in as.")
+ outStorDBPass = flag.String("out_stordb_passwd", config.CgrConfig().StorDBPass, "The StorDB user's password.")
inDataDBType = flag.String("datadb_type", config.CgrConfig().DataDbType, "The type of the DataDb Database ")
inDataDBHost = flag.String("datadb_host", config.CgrConfig().DataDbHost, "The DataDb host to connect to.")
@@ -60,15 +60,18 @@ var (
inDataDBUser = flag.String("datadb_user", config.CgrConfig().DataDbUser, "The DataDb user to sign in as.")
inDataDBPass = flag.String("datadb_passwd", config.CgrConfig().DataDbPass, "The DataDb user's password.")
- inStorDBType = flag.String("stordb_type", config.CgrConfig().StorDBType, "The type of the storDb Database ")
- inStorDBHost = flag.String("stordb_host", config.CgrConfig().StorDBHost, "The storDb host to connect to.")
- inStorDBPort = flag.String("stordb_port", config.CgrConfig().StorDBPort, "The storDb port to bind to.")
- inStorDBName = flag.String("stordb_name", config.CgrConfig().StorDBName, "The name/number of the storDb to connect to.")
- inStorDBUser = flag.String("stordb_user", config.CgrConfig().StorDBUser, "The storDb user to sign in as.")
- inStorDBPass = flag.String("stordb_passwd", config.CgrConfig().StorDBPass, "The storDb user's password.")
+ inStorDBType = flag.String("stordb_type", config.CgrConfig().StorDBType, "The type of the StorDB Database ")
+ inStorDBHost = flag.String("stordb_host", config.CgrConfig().StorDBHost, "The StorDB host to connect to.")
+ inStorDBPort = flag.String("stordb_port", config.CgrConfig().StorDBPort, "The StorDB port to bind to.")
+ inStorDBName = flag.String("stordb_name", config.CgrConfig().StorDBName, "The name/number of the StorDB to connect to.")
+ inStorDBUser = flag.String("stordb_user", config.CgrConfig().StorDBUser, "The StorDB user to sign in as.")
+ inStorDBPass = flag.String("stordb_passwd", config.CgrConfig().StorDBPass, "The StorDB user's password.")
loadHistorySize = flag.Int("load_history_size", config.CgrConfig().LoadHistorySize, "Limit the number of records in the load history")
+ datadb_versions = flag.Bool("datadb_versions", false, "Print DataDB versions")
+ stordb_versions = flag.Bool("stordb_versions", false, "Print StorDB versions")
+
dbDataEncoding = flag.String("dbData_encoding", config.CgrConfig().DBDataEncoding, "The encoding used to store object Data in strings")
inDBDataEncoding = flag.String("in_dbData_encoding", "", "The encoding used to store object Data in strings")
dryRun = flag.Bool("dry_run", false, "When true will not save loaded Data to DataDb but just parse it for consistency and errors.")
@@ -82,61 +85,80 @@ func main() {
fmt.Println(utils.GetCGRVersion())
return
}
- if migrate != nil && *migrate != "" { // Run migrator
- if *verbose {
- log.Print("Initializing DataDB:", *inDataDBType)
- log.Print("Initializing storDB:", *inStorDBType)
+ if *verbose {
+ log.Print("Initializing DataDB:", *inDataDBType)
+ log.Print("Initializing storDB:", *inStorDBType)
+ }
+ var dmIN *engine.DataManager
+ dmIN, _ = engine.ConfigureDataStorage(*inDataDBType, *inDataDBHost, *inDataDBPort,
+ *inDataDBName, *inDataDBUser, *inDataDBPass, *dbDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize)
+ instorDB, err := engine.ConfigureStorStorage(*inStorDBType, *inStorDBHost, *inStorDBPort, *inStorDBName, *inStorDBUser, *inStorDBPass, *inDBDataEncoding,
+ config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if *outDataDBType == "" {
+ *outDataDBType = *inDataDBType
+ *outDataDBHost = *inDataDBHost
+ *outDataDBPort = *inDataDBPort
+ *outDataDBName = *inDataDBName
+ *outDataDBUser = *inDataDBUser
+ *outDataDBPass = *inDataDBPass
+ }
+ if *verbose {
+ log.Print("Initializing outDataDB:", *outDataDBType)
+ }
+ var dmOUT *engine.DataManager
+ dmOUT, _ = engine.ConfigureDataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort,
+ *outDataDBName, *outDataDBUser, *outDataDBPass, *dbDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize)
+ outDataDB, err := migrator.ConfigureV1DataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort, *outDataDBName, *outDataDBUser, *outDataDBPass, *dbDataEncoding)
+ if err != nil {
+ log.Fatal(err)
+ }
+ storDB = instorDB
+
+ if *verbose {
+ if *outStorDBType != "" {
+ log.Print("Initializing outStorDB:", *outStorDBType)
+ } else {
+ log.Print("Initializing outStorDB:", *inStorDBType)
}
- var dmIN *engine.DataManager
- dmIN, _ = engine.ConfigureDataStorage(*inDataDBType, *inDataDBHost, *inDataDBPort, *inDataDBName, *inDataDBUser, *inDataDBPass, *dbDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize)
- instorDB, err := engine.ConfigureStorStorage(*inStorDBType, *inStorDBHost, *inStorDBPort, *inStorDBName, *inStorDBUser, *inStorDBPass, *inDBDataEncoding,
+ }
+ if *outStorDBType != "" {
+ storDB, err = engine.ConfigureStorStorage(*outStorDBType, *outStorDBHost, *outStorDBPort, *outStorDBName, *outStorDBUser, *outStorDBPass, *dbDataEncoding,
config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes)
if err != nil {
log.Fatal(err)
}
- if *outDataDBType == "" {
- *outDataDBType = *inDataDBType
- *outDataDBHost = *inDataDBHost
- *outDataDBPort = *inDataDBPort
- *outDataDBName = *inDataDBName
- *outDataDBUser = *inDataDBUser
- *outDataDBPass = *inDataDBPass
+ }
+ if *verbose {
+ log.Print("Migrating: ", *migrate)
+ }
+ if inDataDBName != outDataDBName || inStorDBName != outStorDBName {
+ sameDBname = false
+ }
+ m, err := migrator.NewMigrator(dmIN, dmOUT, *inDataDBType, *dbDataEncoding, storDB, *inStorDBType, outDataDB,
+ *outDataDBType, *inDBDataEncoding, instorDB, *outStorDBType, *dryRun, sameDBname, *datadb_versions, *stordb_versions)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if *datadb_versions {
+ vrs, _ := dmOUT.DataDB().GetVersions(utils.TBLVersions)
+ if len(vrs) != 0 {
+ log.Print("DataDB versions :", vrs)
+ } else {
+ log.Print("DataDB versions not_found")
}
- if *verbose {
- log.Print("Initializing outDataDB:", *outDataDBType)
- }
- var dmOUT *engine.DataManager
- dmOUT, _ = engine.ConfigureDataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort, *outDataDBName, *outDataDBUser, *outDataDBPass, *dbDataEncoding, config.CgrConfig().CacheCfg(), *loadHistorySize)
- inDataDB, err := migrator.ConfigureV1DataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort, *outDataDBName, *outDataDBUser, *outDataDBPass, *dbDataEncoding)
- if err != nil {
- log.Fatal(err)
- }
- storDB = instorDB
-
- if *verbose {
- if *outStorDBType != "" {
- log.Print("Initializing outStorDB:", *outStorDBType)
- } else {
- log.Print("Initializing outStorDB:", *inStorDBType)
- }
- }
- if *outStorDBType != "" {
- storDB, err = engine.ConfigureStorStorage(*outStorDBType, *outStorDBHost, *outStorDBPort, *outStorDBName, *outStorDBUser, *outStorDBPass, *dbDataEncoding,
- config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes)
- if err != nil {
- log.Fatal(err)
- }
- }
- if *verbose {
- log.Print("Migrating: ", *migrate)
- }
- if inDataDBName != outDataDBName || inStorDBName != outStorDBName {
- sameDBname = false
- }
- m, err := migrator.NewMigrator(dmIN, dmOUT, *inDataDBType, *dbDataEncoding, storDB, *inStorDBType, inDataDB, *outDataDBType, *inDBDataEncoding, instorDB, *outStorDBType, *dryRun, sameDBname)
- if err != nil {
- log.Fatal(err)
+ }
+ if *stordb_versions {
+ vrs, _ := storDB.GetVersions(utils.TBLVersions)
+ if len(vrs) != 0 {
+ log.Print("StorDB versions :", vrs)
+ } else {
+ log.Print("StorDB versions not_found")
}
+ }
+ if migrate != nil && *migrate != "" { // Run migrator
migrstats := make(map[string]int)
mig := strings.Split(*migrate, ",")
log.Print("migrating", mig)
diff --git a/console/datadb_versions.go b/console/datadb_versions.go
new file mode 100644
index 000000000..686367072
--- /dev/null
+++ b/console/datadb_versions.go
@@ -0,0 +1,68 @@
+/*
+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 console
+
+import (
+ "github.com/cgrates/cgrates/engine"
+)
+
+func init() {
+ c := &CmdGetDataDBVersions{
+ name: "datadb_versions",
+ rpcMethod: "ApierV1.GetDataDBVersions",
+ }
+ commands[c.Name()] = c
+ c.CommandExecuter = &CommandExecuter{c}
+}
+
+// Commander implementation
+type CmdGetDataDBVersions struct {
+ name string
+ rpcMethod string
+ rpcParams *EmptyWrapper
+ *CommandExecuter
+}
+
+func (self *CmdGetDataDBVersions) Name() string {
+ return self.name
+}
+
+func (self *CmdGetDataDBVersions) RpcMethod() string {
+ return self.rpcMethod
+}
+
+func (self *CmdGetDataDBVersions) RpcParams(reset bool) interface{} {
+ if reset || self.rpcParams == nil {
+ self.rpcParams = &EmptyWrapper{}
+ }
+ return self.rpcParams
+}
+
+func (self *CmdGetDataDBVersions) PostprocessRpcParams() error {
+ return nil
+}
+
+func (self *CmdGetDataDBVersions) RpcResult() interface{} {
+ s := engine.Versions{}
+ return &s
+}
+
+func (self *CmdGetDataDBVersions) ClientArgs() (args []string) {
+ return
+}
diff --git a/console/stordb_versions.go b/console/stordb_versions.go
new file mode 100644
index 000000000..d8b86c9b9
--- /dev/null
+++ b/console/stordb_versions.go
@@ -0,0 +1,68 @@
+/*
+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 console
+
+import (
+ "github.com/cgrates/cgrates/engine"
+)
+
+func init() {
+ c := &CmdGetStorDBVersions{
+ name: "stordb_versions",
+ rpcMethod: "ApierV1.GetStorDBVersions",
+ }
+ commands[c.Name()] = c
+ c.CommandExecuter = &CommandExecuter{c}
+}
+
+// Commander implementation
+type CmdGetStorDBVersions struct {
+ name string
+ rpcMethod string
+ rpcParams *EmptyWrapper
+ *CommandExecuter
+}
+
+func (self *CmdGetStorDBVersions) Name() string {
+ return self.name
+}
+
+func (self *CmdGetStorDBVersions) RpcMethod() string {
+ return self.rpcMethod
+}
+
+func (self *CmdGetStorDBVersions) RpcParams(reset bool) interface{} {
+ if reset || self.rpcParams == nil {
+ self.rpcParams = &EmptyWrapper{}
+ }
+ return self.rpcParams
+}
+
+func (self *CmdGetStorDBVersions) PostprocessRpcParams() error {
+ return nil
+}
+
+func (self *CmdGetStorDBVersions) RpcResult() interface{} {
+ s := engine.Versions{}
+ return &s
+}
+
+func (self *CmdGetStorDBVersions) ClientArgs() (args []string) {
+ return
+}
diff --git a/migrator/migrator.go b/migrator/migrator.go
index 4b1a00954..cd0070927 100755
--- a/migrator/migrator.go
+++ b/migrator/migrator.go
@@ -26,7 +26,9 @@ import (
"github.com/cgrates/cgrates/utils"
)
-func NewMigrator(dmIN *engine.DataManager, dmOut *engine.DataManager, dataDBType, dataDBEncoding string, storDB engine.Storage, storDBType string, oldDataDB MigratorDataDB, oldDataDBType, oldDataDBEncoding string, oldStorDB engine.Storage, oldStorDBType string, dryRun bool, sameDBname bool) (m *Migrator, err error) {
+func NewMigrator(dmIN *engine.DataManager, dmOut *engine.DataManager, dataDBType, dataDBEncoding string,
+ storDB engine.Storage, storDBType string, oldDataDB MigratorDataDB, oldDataDBType, oldDataDBEncoding string,
+ oldStorDB engine.Storage, oldStorDBType string, dryRun bool, sameDBname bool, datadb_versions bool, stordb_versions bool) (m *Migrator, err error) {
var mrshlr engine.Marshaler
var oldmrshlr engine.Marshaler
if dataDBEncoding == utils.MSGPACK {
@@ -46,26 +48,28 @@ func NewMigrator(dmIN *engine.DataManager, dmOut *engine.DataManager, dataDBType
mrshlr: mrshlr, dmIN: dmIN,
oldDataDB: oldDataDB, oldDataDBType: oldDataDBType,
oldStorDB: oldStorDB, oldStorDBType: oldStorDBType,
- oldmrshlr: oldmrshlr, dryRun: dryRun, sameDBname: sameDBname, stats: stats,
+ oldmrshlr: oldmrshlr, dryRun: dryRun, sameDBname: sameDBname, datadb_versions: datadb_versions, stordb_versions: stordb_versions, stats: stats,
}
return m, err
}
type Migrator struct {
- dmIN *engine.DataManager //oldatadb
- dmOut *engine.DataManager
- dataDBType string
- storDB engine.Storage
- storDBType string
- mrshlr engine.Marshaler
- oldDataDB MigratorDataDB
- oldDataDBType string
- oldStorDB engine.Storage
- oldStorDBType string
- oldmrshlr engine.Marshaler
- dryRun bool
- sameDBname bool
- stats map[string]int
+ dmIN *engine.DataManager //oldatadb
+ dmOut *engine.DataManager
+ dataDBType string
+ storDB engine.Storage
+ storDBType string
+ mrshlr engine.Marshaler
+ oldDataDB MigratorDataDB
+ oldDataDBType string
+ oldStorDB engine.Storage
+ oldStorDBType string
+ oldmrshlr engine.Marshaler
+ dryRun bool
+ sameDBname bool
+ datadb_versions bool
+ stordb_versions bool
+ stats map[string]int
}
// Migrate implements the tasks to migrate, used as a dispatcher to the individual methods
@@ -93,6 +97,20 @@ func (m *Migrator) Migrate(taskIDs []string) (err error, stats map[string]int) {
err.Error(),
fmt.Sprintf("error: <%s> when updating CostDetails version into StorDB", err.Error())), nil
}
+ if m.datadb_versions {
+ vrs, err := m.dmOut.DataDB().GetVersions(utils.TBLVersions)
+ if err != nil {
+ return err, nil
+ }
+ log.Print("After migrate, DataDB versions :", vrs)
+ }
+ if m.stordb_versions {
+ vrs, err := m.storDB.GetVersions(utils.TBLVersions)
+ if err != nil {
+ return err, nil
+ }
+ log.Print("After migrate, StorDB versions :", vrs)
+ }
} else {
log.Print("Cannot dryRun SetVersions!")
}