mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Added migration for *rsr filters
This commit is contained in:
@@ -144,14 +144,14 @@ func (vers Versions) Compare(curent Versions, storType string, isDataDB bool) st
|
||||
// CurrentDataDBVersions returns the needed DataDB versions
|
||||
func CurrentDataDBVersions() Versions {
|
||||
return Versions{
|
||||
utils.StatS: 3,
|
||||
utils.StatS: 4,
|
||||
utils.Accounts: 3,
|
||||
utils.Actions: 2,
|
||||
utils.ActionTriggers: 2,
|
||||
utils.ActionPlans: 3,
|
||||
utils.SharedGroups: 2,
|
||||
utils.Thresholds: 3,
|
||||
utils.Routes: 1,
|
||||
utils.Thresholds: 4,
|
||||
utils.Routes: 2,
|
||||
utils.Attributes: 6,
|
||||
utils.Timing: 1,
|
||||
utils.RQF: 5,
|
||||
@@ -161,8 +161,8 @@ func CurrentDataDBVersions() Versions {
|
||||
utils.ReverseDestinations: 1,
|
||||
utils.RatingPlan: 1,
|
||||
utils.RatingProfile: 1,
|
||||
utils.Chargers: 1,
|
||||
utils.Dispatchers: 1,
|
||||
utils.Chargers: 2,
|
||||
utils.Dispatchers: 2,
|
||||
utils.LoadIDsVrs: 1,
|
||||
utils.RateProfiles: 1,
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ package migrator
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -55,7 +56,7 @@ func (m *Migrator) migrateCurrentAccounts() (err error) {
|
||||
if err := m.dmIN.DataManager().RemoveAccount(idg); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Accounts] += 1
|
||||
m.stats[utils.Accounts]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -129,34 +130,34 @@ func (m *Migrator) migrateAccounts() (err error) {
|
||||
var v3Acnt *engine.Account
|
||||
for {
|
||||
version := vrs[utils.Accounts]
|
||||
migratedFrom = int(version)
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Accounts]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
migrated = false
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentAccounts(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
version = 3
|
||||
migrated = false
|
||||
case 1: //migrate v1 to v3
|
||||
if v3Acnt, err = m.migrateV1Accounts(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
migratedFrom = 1
|
||||
version = 3
|
||||
case 2: //migrate v2 to v3
|
||||
if v3Acnt, err = m.migrateV2Accounts(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 3
|
||||
migratedFrom = 2
|
||||
}
|
||||
if version == current[utils.Accounts] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
@@ -166,12 +167,12 @@ func (m *Migrator) migrateAccounts() (err error) {
|
||||
break
|
||||
}
|
||||
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
if err = m.dmOut.DataManager().SetAccount(v3Acnt); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.Accounts] += 1
|
||||
m.stats[utils.Accounts]++
|
||||
|
||||
}
|
||||
if m.dryRun || !migrated {
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -56,7 +57,7 @@ func (m *Migrator) migrateCurrentActions() (err error) {
|
||||
if err := m.dmOut.DataManager().SetActions(idg, acts, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Actions] += 1
|
||||
m.stats[utils.Actions]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -106,17 +107,19 @@ func (m *Migrator) migrateActions() (err error) {
|
||||
version := vrs[utils.Actions]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Actions]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentActions(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if acts, err = m.migrateV1Actions(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
version = 2
|
||||
}
|
||||
@@ -127,12 +130,12 @@ func (m *Migrator) migrateActions() (err error) {
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if !m.dryRun && migrated {
|
||||
if err := m.dmOut.DataManager().SetActions(acts[0].Id, acts, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
if !m.dryRun {
|
||||
if err = m.dmOut.DataManager().SetActions(acts[0].Id, acts, utils.NonTransactional); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.Actions] += 1
|
||||
m.stats[utils.Actions]++
|
||||
}
|
||||
|
||||
if m.dryRun || !migrated {
|
||||
@@ -142,7 +145,7 @@ func (m *Migrator) migrateActions() (err error) {
|
||||
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Actions); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
|
||||
return m.ensureIndexesDataDB(engine.ColAct)
|
||||
|
||||
@@ -51,24 +51,24 @@ func (m *Migrator) migrateCurrentActionPlans() (err error) {
|
||||
var ids []string
|
||||
ids, err = m.dmIN.DataManager().DataDB().GetKeysForPrefix(utils.ACTION_PLAN_PREFIX)
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
for _, id := range ids {
|
||||
idg := strings.TrimPrefix(id, utils.ACTION_PLAN_PREFIX)
|
||||
acts, err := m.dmIN.DataManager().GetActionPlan(idg, true, utils.NonTransactional)
|
||||
if err != nil {
|
||||
return err
|
||||
var acts *engine.ActionPlan
|
||||
if acts, err = m.dmIN.DataManager().GetActionPlan(idg, true, utils.NonTransactional); err != nil {
|
||||
return
|
||||
}
|
||||
if acts == nil || m.dryRun {
|
||||
continue
|
||||
}
|
||||
if err := m.dmOut.DataManager().SetActionPlan(idg, acts, true, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
if err = m.dmOut.DataManager().SetActionPlan(idg, acts, true, utils.NonTransactional); err != nil {
|
||||
return
|
||||
}
|
||||
if err := m.dmIN.DataManager().RemoveActionPlan(idg, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
if err = m.dmIN.DataManager().RemoveActionPlan(idg, utils.NonTransactional); err != nil {
|
||||
return
|
||||
}
|
||||
m.stats[utils.ActionPlans] += 1
|
||||
m.stats[utils.ActionPlans]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -76,13 +76,13 @@ func (m *Migrator) removeV1ActionPlans() (err error) {
|
||||
var v1 *v1ActionPlans
|
||||
for {
|
||||
if v1, err = m.dmIN.getV1ActionPlans(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
if v1 == nil {
|
||||
return nil
|
||||
}
|
||||
if err = m.dmIN.remV1ActionPlans(v1); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -111,7 +111,7 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
return fmt.Errorf("Storage type %s could not be cated to <*engine.RedisStorage>", m.dmIN.DataManager().DataDB().GetStorageType())
|
||||
}
|
||||
if err = redisDB.RebbuildActionPlanKeys(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
migrated := true
|
||||
@@ -119,21 +119,23 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
var v3 []*engine.ActionPlan
|
||||
for {
|
||||
version := vrs[utils.ActionPlans]
|
||||
migratedFrom = int(version)
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.ActionPlans]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentActionPlans(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if v3, err = m.migrateV1ActionPlans(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
migratedFrom = 1
|
||||
version = 3
|
||||
case 2: // neded to rebuild action plan indexes for redis
|
||||
// All done, update version wtih current one
|
||||
@@ -144,7 +146,6 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
err.Error(),
|
||||
fmt.Sprintf("error: <%s> when updating ActionPlans version into dataDB", err.Error()))
|
||||
}
|
||||
migratedFrom = 2
|
||||
version = 3
|
||||
}
|
||||
if version == current[utils.ActionPlans] || err == utils.ErrNoMoreData {
|
||||
@@ -155,11 +156,11 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
break
|
||||
}
|
||||
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
//set action plan
|
||||
for _, ap := range v3 {
|
||||
if err = m.dmOut.DataManager().SetActionPlan(ap.Id, ap, true, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -170,8 +171,7 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
}
|
||||
// remove old action plans
|
||||
if !m.sameDataDB {
|
||||
switch migratedFrom {
|
||||
case 1:
|
||||
if migratedFrom == 1 {
|
||||
if err = m.removeV1ActionPlans(); err != nil {
|
||||
return
|
||||
}
|
||||
@@ -186,8 +186,8 @@ func (m *Migrator) migrateActionPlans() (err error) {
|
||||
}
|
||||
|
||||
func (v1AP v1ActionPlan) AsActionPlan() (ap *engine.ActionPlan) {
|
||||
for idx, actionId := range v1AP.AccountIds {
|
||||
idElements := strings.Split(actionId, "_")
|
||||
for idx, actionID := range v1AP.AccountIds {
|
||||
idElements := strings.Split(actionID, "_")
|
||||
if len(idElements) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -120,22 +121,23 @@ func (m *Migrator) migrateActionTriggers() (err error) {
|
||||
var v2 engine.ActionTriggers
|
||||
for {
|
||||
version := vrs[utils.ActionTriggers]
|
||||
migratedFrom = int(version)
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.ActionTriggers]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
migrated = false
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentActionTrigger(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
migrated = false
|
||||
case 1:
|
||||
if v2, err = m.migrateV1ActionTrigger(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
migratedFrom = 1
|
||||
version = 2
|
||||
}
|
||||
if version == current[utils.ActionTriggers] || err == utils.ErrNoMoreData {
|
||||
@@ -145,21 +147,20 @@ func (m *Migrator) migrateActionTriggers() (err error) {
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
//set action triggers
|
||||
if err := m.dmOut.DataManager().SetActionTriggers(v2[0].ID, v2, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
if err = m.dmOut.DataManager().SetActionTriggers(v2[0].ID, v2, utils.NonTransactional); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.ActionTriggers] += 1
|
||||
m.stats[utils.ActionTriggers]++
|
||||
}
|
||||
if m.dryRun || !migrated {
|
||||
return nil
|
||||
}
|
||||
// remove old action triggers
|
||||
if !m.sameDataDB {
|
||||
switch migratedFrom {
|
||||
case 1:
|
||||
if migratedFrom == 1 {
|
||||
if err = m.removeV1ActionTriggers(); err != nil {
|
||||
return
|
||||
}
|
||||
@@ -168,7 +169,7 @@ func (m *Migrator) migrateActionTriggers() (err error) {
|
||||
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.ActionTriggers); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
|
||||
return m.ensureIndexesDataDB(engine.ColAtr)
|
||||
|
||||
@@ -40,8 +40,8 @@ type v1Alias struct {
|
||||
}
|
||||
|
||||
var (
|
||||
ALIASES_PREFIX = "als_"
|
||||
Alias = "Alias"
|
||||
AliasesPrefix = "als_"
|
||||
Alias = "Alias"
|
||||
)
|
||||
|
||||
type v1AliasValues []*v1AliasValue
|
||||
@@ -184,7 +184,7 @@ func (m *Migrator) migrateAlias2Attributes() (err error) {
|
||||
if err := m.dmOut.DataManager().SetAttributeProfile(attr, true); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[Alias] += 1
|
||||
m.stats[Alias]++
|
||||
}
|
||||
if m.dryRun {
|
||||
return
|
||||
@@ -207,7 +207,7 @@ func (m *Migrator) migrateAlias2Attributes() (err error) {
|
||||
|
||||
func (m *Migrator) migrateAlias() (err error) {
|
||||
if err = m.migrateAlias2Attributes(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColAttr)
|
||||
}
|
||||
|
||||
@@ -273,7 +273,7 @@ func testAttrITMigrateOnlyVersion(t *testing.T) {
|
||||
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
if attrMigrator.stats[utils.Attributes] != 0 {
|
||||
@@ -365,7 +365,7 @@ func testAttrITMigrateAndMove(t *testing.T) {
|
||||
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
result, err := attrMigrator.dmOut.DataManager().GetAttributeProfile("cgrates.org",
|
||||
@@ -457,7 +457,7 @@ func testAttrITMigrateV2(t *testing.T) {
|
||||
ExpiryTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v2Attribute{
|
||||
&v2Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Initial: "In1",
|
||||
Substitute: config.NewRSRParsersMustCompile("Al1", utils.INFIELD_SEP),
|
||||
@@ -510,7 +510,7 @@ func testAttrITMigrateV2(t *testing.T) {
|
||||
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
result, err := attrMigrator.dmOut.DataManager().GetAttributeProfile("cgrates.org",
|
||||
@@ -540,7 +540,7 @@ func testAttrITMigrateV3(t *testing.T) {
|
||||
ExpiryTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v3Attribute{
|
||||
&v3Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
FieldName: "FL1",
|
||||
Substitute: config.NewRSRParsersMustCompile("Al1", utils.INFIELD_SEP),
|
||||
@@ -592,7 +592,7 @@ func testAttrITMigrateV3(t *testing.T) {
|
||||
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
result, err := attrMigrator.dmOut.DataManager().GetAttributeProfile("cgrates.org",
|
||||
@@ -625,7 +625,7 @@ func testAttrITMigrateV4(t *testing.T) {
|
||||
ExpiryTime: time.Date(2014, 7, 14, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v4Attribute{
|
||||
&v4Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:~*req.FL1:In1"},
|
||||
FieldName: "FL1",
|
||||
Value: config.NewRSRParsersMustCompile("~Category:s/(.*)/${1}_UK_Mobile_Vodafone_GBRVF/", utils.INFIELD_SEP),
|
||||
@@ -678,7 +678,7 @@ func testAttrITMigrateV4(t *testing.T) {
|
||||
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
result, err := attrMigrator.dmOut.DataManager().GetAttributeProfile("cgrates.org",
|
||||
@@ -754,7 +754,7 @@ func testAttrITV1ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -772,7 +772,7 @@ func testAttrITV1ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -788,7 +788,7 @@ func testAttrITV1ToV5(t *testing.T) {
|
||||
// check the version
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
|
||||
@@ -844,7 +844,7 @@ func testAttrITV2ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v2Attribute{
|
||||
&v2Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Initial: "In1",
|
||||
Substitute: sbstPrsr,
|
||||
@@ -863,7 +863,7 @@ func testAttrITV2ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v2Attribute{
|
||||
&v2Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Initial: "In1",
|
||||
Substitute: sbstPrsr,
|
||||
@@ -893,7 +893,7 @@ func testAttrITV2ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -911,7 +911,7 @@ func testAttrITV2ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -927,7 +927,7 @@ func testAttrITV2ToV5(t *testing.T) {
|
||||
//check the version
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
|
||||
@@ -974,7 +974,7 @@ func testAttrITV3ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v3Attribute{
|
||||
&v3Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Substitute: sbstPrsr,
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
@@ -992,7 +992,7 @@ func testAttrITV3ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v3Attribute{
|
||||
&v3Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Substitute: sbstPrsr,
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
@@ -1021,7 +1021,7 @@ func testAttrITV3ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -1039,7 +1039,7 @@ func testAttrITV3ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*engine.Attribute{
|
||||
&engine.Attribute{
|
||||
{
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
Path: utils.MetaReq + utils.NestingSep + "FL1",
|
||||
Type: utils.MetaVariable,
|
||||
@@ -1055,7 +1055,7 @@ func testAttrITV3ToV5(t *testing.T) {
|
||||
//check the version
|
||||
if vrs, err := attrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.Attributes] != 5 {
|
||||
} else if vrs[utils.Attributes] != 6 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.Attributes])
|
||||
}
|
||||
|
||||
@@ -1112,7 +1112,7 @@ func testAttrITdryRunV2ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v2Attribute{
|
||||
&v2Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Initial: "In1",
|
||||
Substitute: sbstPrsr,
|
||||
@@ -1171,7 +1171,7 @@ func testAttrITdryRunV3ToV5(t *testing.T) {
|
||||
ExpiryTime: time.Date(2020, 4, 18, 14, 25, 0, 0, time.UTC),
|
||||
},
|
||||
Attributes: []*v3Attribute{
|
||||
&v3Attribute{
|
||||
{
|
||||
FieldName: "FL1",
|
||||
Substitute: sbstPrsr,
|
||||
FilterIDs: []string{"*string:FL1:In1"},
|
||||
|
||||
@@ -20,6 +20,7 @@ package migrator
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -54,15 +55,20 @@ func (m *Migrator) migrateCDRs() (err error) {
|
||||
for {
|
||||
version := vrs[utils.CDRs]
|
||||
for {
|
||||
switch vrs[utils.CDRs] {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.CDRs]:
|
||||
migrated = false
|
||||
if m.sameStorDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentCDRs(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if v2, err = m.migrateV1CDRs(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
version = 2
|
||||
}
|
||||
@@ -74,17 +80,17 @@ func (m *Migrator) migrateCDRs() (err error) {
|
||||
break
|
||||
}
|
||||
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
//set action plan
|
||||
if err = m.storDBOut.StorDB().SetCDR(v2, true); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.CDRs]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.CDRs); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesStorDB(engine.ColCDRs)
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -51,7 +52,7 @@ func (m *Migrator) migrateCurrentCharger() (err error) {
|
||||
tntID[1], utils.NonTransactional, false); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Chargers] += 1
|
||||
m.stats[utils.Chargers]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -62,14 +63,62 @@ func (m *Migrator) migrateChargers() (err error) {
|
||||
if vrs, err = m.getVersions(utils.Chargers); err != nil {
|
||||
return
|
||||
}
|
||||
switch vrs[utils.Chargers] {
|
||||
case current[utils.Chargers]:
|
||||
if m.sameDataDB {
|
||||
migrated := true
|
||||
var v2 *engine.ChargerProfile
|
||||
for {
|
||||
version := vrs[utils.Chargers]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Chargers]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentCharger(); err != nil {
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if v2, err = m.migrateV1ToV2Chargers(); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 2
|
||||
}
|
||||
if version == current[utils.Chargers] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentCharger(); err != nil {
|
||||
return err
|
||||
|
||||
if !m.dryRun {
|
||||
//set action plan
|
||||
if err = m.dmOut.DataManager().SetChargerProfile(v2, true); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.Chargers]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Chargers); err != nil {
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColCpp)
|
||||
}
|
||||
|
||||
func (m *Migrator) migrateV1ToV2Chargers() (v4Cpp *engine.ChargerProfile, err error) {
|
||||
v4Cpp, err = m.dmIN.getV1ChargerProfile()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if v4Cpp == nil {
|
||||
return nil, errors.New("Charger NIL")
|
||||
}
|
||||
if v4Cpp.FilterIDs, err = migrateInlineFilterV4(v4Cpp.FilterIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -141,7 +141,11 @@ func derivedChargers2Charger(dc *v1DerivedCharger, tenant string, key string, fi
|
||||
if strings.HasPrefix(filter, utils.DynamicDataPrefix) {
|
||||
filter = filter[1:]
|
||||
}
|
||||
ch.FilterIDs = append(ch.FilterIDs, "*rsr::"+utils.DynamicDataPrefix+utils.MetaReq+utils.NestingSep+filter)
|
||||
flt, err := migrateInlineFilterV4([]string{"*rsr::" + utils.DynamicDataPrefix + utils.MetaReq + utils.NestingSep + filter})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
ch.FilterIDs = append(ch.FilterIDs, flt...)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -193,10 +197,10 @@ func (m *Migrator) removeV1DerivedChargers() (err error) {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
if err = m.dmIN.remV1DerivedChargers(dck.Key); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
@@ -210,13 +214,13 @@ func (m *Migrator) migrateV1DerivedChargers() (err error) {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
if dck == nil || m.dryRun {
|
||||
continue
|
||||
}
|
||||
if err = m.derivedChargers2Chargers(dck); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
|
||||
m.stats[utils.DerivedChargersV]++
|
||||
@@ -240,7 +244,7 @@ func (m *Migrator) migrateV1DerivedChargers() (err error) {
|
||||
|
||||
func (m *Migrator) migrateDerivedChargers() (err error) {
|
||||
if err = m.migrateV1DerivedChargers(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColCpp, engine.ColAttr)
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ func testDCITMigrateAndMove(t *testing.T) {
|
||||
dcGetMapKeys = func(m utils.StringMap) (keys []string) { //make sure destination are in order
|
||||
keys = make([]string, len(m))
|
||||
i := 0
|
||||
for k, _ := range m {
|
||||
for k := range m {
|
||||
keys[i] = k
|
||||
i += 1
|
||||
}
|
||||
@@ -135,7 +135,7 @@ func testDCITMigrateAndMove(t *testing.T) {
|
||||
Chargers: []*v1DerivedCharger{
|
||||
{
|
||||
RunID: "RunID",
|
||||
RunFilters: "~filterhdr1:s/(.+)/special_run3/",
|
||||
RunFilters: "~filterhdr1(.+)",
|
||||
|
||||
RequestTypeField: utils.MetaDefault,
|
||||
CategoryField: utils.MetaDefault,
|
||||
@@ -176,7 +176,7 @@ func testDCITMigrateAndMove(t *testing.T) {
|
||||
FilterIDs: []string{
|
||||
"*destinations:~*req.Destination:1001;1002;1003",
|
||||
"*string:~*req.Account:1003",
|
||||
"*rsr::~*req.filterhdr1:s/(.+)/special_run3/",
|
||||
"*rsr:~*req.filterhdr1:.+",
|
||||
},
|
||||
ActivationInterval: nil,
|
||||
RunID: "RunID",
|
||||
|
||||
@@ -222,7 +222,7 @@ func TestDerivedChargers2Charger(t *testing.T) {
|
||||
FilterIDs: []string{
|
||||
"*string:~*req.Category:*voice1",
|
||||
"*string:~*req.Account:1001",
|
||||
"*rsr::~*req.Header4:s/a/${1}b/{*duration_seconds&*round:2}(b&c)",
|
||||
"*rsr:~*req.Header4:b;c",
|
||||
},
|
||||
ActivationInterval: nil,
|
||||
RunID: "runID",
|
||||
@@ -233,7 +233,7 @@ func TestDerivedChargers2Charger(t *testing.T) {
|
||||
{
|
||||
DC: &v1DerivedCharger{
|
||||
RunID: "runID2",
|
||||
RunFilters: "^1003",
|
||||
RunFilters: "~Account(^1003)",
|
||||
AccountField: "^1003",
|
||||
},
|
||||
Tenant: defaultTenant,
|
||||
@@ -242,7 +242,7 @@ func TestDerivedChargers2Charger(t *testing.T) {
|
||||
Expected: &engine.ChargerProfile{
|
||||
Tenant: defaultTenant,
|
||||
ID: "key2",
|
||||
FilterIDs: []string{"*rsr::~*req.1003"},
|
||||
FilterIDs: []string{"*rsr:~*req.Account:^1003"},
|
||||
ActivationInterval: nil,
|
||||
RunID: "runID2",
|
||||
AttributeIDs: make([]string, 0),
|
||||
|
||||
@@ -44,7 +44,7 @@ func (m *Migrator) migrateCurrentDestinations() (err error) {
|
||||
if err := m.dmOut.DataManager().SetDestination(dst, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Destinations] += 1
|
||||
m.stats[utils.Destinations]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -55,13 +55,40 @@ func (m *Migrator) migrateDestinations() (err error) {
|
||||
if vrs, err = m.getVersions(utils.Destinations); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
switch vrs[utils.Destinations] {
|
||||
case current[utils.Destinations]:
|
||||
if m.sameDataDB {
|
||||
return
|
||||
migrated := true
|
||||
for {
|
||||
version := vrs[utils.Destinations]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Destinations]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentDestinations(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if version == current[utils.Destinations] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
return m.migrateCurrentDestinations()
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
|
||||
// if !m.dryRun {
|
||||
// if err = m.dmIN.DataManager().SetDestination(v2, true); err != nil {
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
m.stats[utils.Destinations]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Destinations); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -30,7 +31,7 @@ func (m *Migrator) migrateCurrentDispatcher() (err error) {
|
||||
var ids []string
|
||||
ids, err = m.dmIN.DataManager().DataDB().GetKeysForPrefix(utils.DispatcherProfilePrefix)
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
for _, id := range ids {
|
||||
tntID := strings.SplitN(strings.TrimPrefix(id, utils.DispatcherProfilePrefix), utils.InInFieldSep, 2)
|
||||
@@ -51,7 +52,7 @@ func (m *Migrator) migrateCurrentDispatcher() (err error) {
|
||||
tntID[1], utils.NonTransactional, false); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Dispatchers] += 1
|
||||
m.stats[utils.Dispatchers]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -91,17 +92,65 @@ func (m *Migrator) migrateDispatchers() (err error) {
|
||||
if vrs, err = m.getVersions(utils.Dispatchers); err != nil {
|
||||
return
|
||||
}
|
||||
switch vrs[utils.Dispatchers] {
|
||||
case current[utils.Dispatchers]:
|
||||
if m.sameDataDB {
|
||||
migrated := true
|
||||
var v2 *engine.DispatcherProfile
|
||||
for {
|
||||
version := vrs[utils.Dispatchers]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Dispatchers]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentDispatcher(); err != nil {
|
||||
return
|
||||
}
|
||||
if err = m.migrateCurrentDispatcherHost(); err != nil {
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if v2, err = m.migrateV1ToV2Dispatchers(); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 2
|
||||
}
|
||||
if version == current[utils.Dispatchers] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentDispatcher(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = m.migrateCurrentDispatcherHost(); err != nil {
|
||||
return err
|
||||
|
||||
if !m.dryRun {
|
||||
//set action plan
|
||||
if err = m.dmOut.DataManager().SetDispatcherProfile(v2, true); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.Dispatchers]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Dispatchers); err != nil {
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColDpp, engine.ColDph)
|
||||
}
|
||||
|
||||
func (m *Migrator) migrateV1ToV2Dispatchers() (v4Cpp *engine.DispatcherProfile, err error) {
|
||||
v4Cpp, err = m.dmIN.getV1DispatcherProfile()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if v4Cpp == nil {
|
||||
return nil, errors.New("Dispatcher NIL")
|
||||
}
|
||||
if v4Cpp.FilterIDs, err = migrateInlineFilterV4(v4Cpp.FilterIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/config"
|
||||
@@ -179,16 +180,12 @@ func migrateInlineFilterV2(fl string) string {
|
||||
}
|
||||
|
||||
if ruleSplt[0] != utils.MetaRSR {
|
||||
if strings.HasPrefix(ruleSplt[1], utils.DynamicDataPrefix) {
|
||||
// remove dynamic data prefix from fieldName
|
||||
ruleSplt[1] = ruleSplt[1][1:]
|
||||
}
|
||||
// remove dynamic data prefix from fieldName
|
||||
ruleSplt[1] = strings.TrimPrefix(ruleSplt[1], utils.DynamicDataPrefix)
|
||||
return fmt.Sprintf("%s:~%s:%s", ruleSplt[0], utils.MetaReq+utils.NestingSep+ruleSplt[1], strings.Join(ruleSplt[2:], utils.InInFieldSep))
|
||||
} // in case of *rsr filter we need to add the prefix at fieldValue
|
||||
if strings.HasPrefix(ruleSplt[2], utils.DynamicDataPrefix) {
|
||||
// remove dynamic data prefix from fieldName
|
||||
ruleSplt[2] = ruleSplt[2][1:]
|
||||
}
|
||||
// remove dynamic data prefix from fieldName
|
||||
ruleSplt[2] = strings.TrimPrefix(ruleSplt[2], utils.DynamicDataPrefix)
|
||||
return fmt.Sprintf("%s::~%s", ruleSplt[0], utils.MetaReq+utils.NestingSep+strings.Join(ruleSplt[2:], utils.InInFieldSep))
|
||||
}
|
||||
|
||||
@@ -329,6 +326,11 @@ func (m *Migrator) migrateFilters() (err error) {
|
||||
if fltr, err = m.migrateRequestFilterV4(v4Fltr); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
}
|
||||
|
||||
// remove the filter to not compile the old rule on set
|
||||
// if err = m.dmOut.DataManager().DataDB().SetFilterDrv(fltr); err != nil {
|
||||
// return
|
||||
// }
|
||||
version = 5
|
||||
}
|
||||
if version == current[utils.RQF] || err == utils.ErrNoMoreData {
|
||||
@@ -822,28 +824,60 @@ func (m *Migrator) migrateRequestFilterV4(v4Fltr *engine.Filter) (fltr *engine.F
|
||||
}
|
||||
for _, rule := range v4Fltr.Rules {
|
||||
if rule.Type != utils.MetaRSR &&
|
||||
rule.Type == utils.MetaNotRSR {
|
||||
rule.Type != utils.MetaNotRSR {
|
||||
fltr.Rules = append(fltr.Rules, rule)
|
||||
continue
|
||||
}
|
||||
for _, val := range rule.Values {
|
||||
if !strings.HasSuffix(val, utils.FilterValEnd) { // is not a filter so we ignore this value
|
||||
continue
|
||||
el, vals, err := migrateRSRFilterV4(val)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%s for filter<%s>", err.Error(), fltr.TenantID())
|
||||
}
|
||||
fltrStart := strings.Index(val, utils.FilterValStart)
|
||||
if fltrStart < 1 {
|
||||
return nil, fmt.Errorf("invalid RSRFilter start rule in string: <%s> for filter<%s>", val, fltr.TenantID())
|
||||
if len(vals) == 0 { // is not a filter so we ignore this value
|
||||
continue
|
||||
}
|
||||
fltr.Rules = append(fltr.Rules, &engine.FilterRule{
|
||||
Type: rule.Type,
|
||||
Element: val[:fltrStart],
|
||||
Values: strings.Split(val[fltrStart+1:len(val)-1], utils.ANDSep),
|
||||
Element: el,
|
||||
Values: vals,
|
||||
})
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
var (
|
||||
spltRgxp = regexp.MustCompile(`:s\/`)
|
||||
)
|
||||
|
||||
func migrateRSRFilterV4(rsr string) (el string, vals []string, err error) {
|
||||
if !strings.HasSuffix(rsr, utils.FilterValEnd) { // is not a filter so we ignore this value
|
||||
return
|
||||
}
|
||||
fltrStart := strings.Index(rsr, utils.FilterValStart)
|
||||
if fltrStart < 1 {
|
||||
err = fmt.Errorf("invalid RSRFilter start rule in string: <%s> ", rsr)
|
||||
return
|
||||
}
|
||||
vals = strings.Split(rsr[fltrStart+1:len(rsr)-1], utils.ANDSep)
|
||||
el = rsr[:fltrStart]
|
||||
|
||||
if idxConverters := strings.Index(el, "{*"); idxConverters != -1 { // converters in the string
|
||||
if !strings.HasSuffix(el, "}") {
|
||||
err = fmt.Errorf("invalid converter terminator in rule: <%s>", el)
|
||||
return
|
||||
}
|
||||
el = el[:idxConverters]
|
||||
}
|
||||
if !strings.HasPrefix(el, utils.DynamicDataPrefix) ||
|
||||
len(el) == 1 { // special case when RSR is defined as static attribute
|
||||
return
|
||||
}
|
||||
// dynamic content via attributeNames
|
||||
el = spltRgxp.Split(el, -1)[0]
|
||||
return
|
||||
}
|
||||
|
||||
func migrateInlineFilterV4(v4fltIDs []string) (fltrIDs []string, err error) {
|
||||
fltrIDs = make([]string, 0, len(v4fltIDs))
|
||||
for _, v4flt := range v4fltIDs {
|
||||
@@ -857,17 +891,17 @@ func migrateInlineFilterV4(v4fltIDs []string) (fltrIDs []string, err error) {
|
||||
} else {
|
||||
fltrIDs = append(fltrIDs, v4flt)
|
||||
}
|
||||
for _, val := range strings.Split(v4flt, utils.InInFieldSep) {
|
||||
if !strings.HasSuffix(val, utils.FilterValEnd) { // is not a filter so we ignore this value
|
||||
for _, val := range strings.Split(v4flt, utils.INFIELD_SEP) {
|
||||
el, vals, err := migrateRSRFilterV4(val)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(vals) == 0 { // is not a filter so we ignore this value
|
||||
continue
|
||||
}
|
||||
fltrStart := strings.Index(val, utils.FilterValStart)
|
||||
if fltrStart < 1 {
|
||||
return nil, fmt.Errorf("invalid RSRFilter start rule in string: <%s> ", val)
|
||||
}
|
||||
fltrVal := val[fltrStart+1 : len(val)-1]
|
||||
fltrIDs = append(fltrIDs, fltr+val[:fltrStart]+utils.InInFieldSep+
|
||||
strings.Replace(fltrVal, utils.ANDSep, utils.INFIELD_SEP, strings.Count(fltrVal, utils.ANDSep)))
|
||||
|
||||
fltrIDs = append(fltrIDs, fltr+el+utils.InInFieldSep+
|
||||
strings.Join(vals, utils.INFIELD_SEP))
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
@@ -218,7 +218,7 @@ func testFltrITMigrateAndMove(t *testing.T) {
|
||||
//check if version was updated
|
||||
if vrs, err := fltrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.RQF] != 4 {
|
||||
} else if vrs[utils.RQF] != 5 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.RQF])
|
||||
}
|
||||
//check if Filters was migrate correctly
|
||||
@@ -302,8 +302,8 @@ func testFltrITMigratev2(t *testing.T) {
|
||||
},
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
FieldName: "~Tenant",
|
||||
Values: []string{`~^cgr.*\.org$`},
|
||||
FieldName: utils.EmptyString,
|
||||
Values: []string{`~Tenant(~^cgr.*\.org$)`},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -387,7 +387,7 @@ func testFltrITMigratev2(t *testing.T) {
|
||||
//check if version was updated
|
||||
if vrs, err := fltrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.RQF] != 4 {
|
||||
} else if vrs[utils.RQF] != 5 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.RQF])
|
||||
}
|
||||
//check if Filters was migrate correctly
|
||||
@@ -443,8 +443,8 @@ func testFltrITMigratev3(t *testing.T) {
|
||||
},
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
FieldName: "~*req.Tenant",
|
||||
Values: []string{"~^cgr.*\\.org$"},
|
||||
FieldName: utils.EmptyString,
|
||||
Values: []string{"~*req.Tenant(~^cgr.*\\.org$)"},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -493,7 +493,7 @@ func testFltrITMigratev3(t *testing.T) {
|
||||
//check if version was updated
|
||||
if vrs, err := fltrMigrator.dmOut.DataManager().DataDB().GetVersions(""); err != nil {
|
||||
t.Error(err)
|
||||
} else if vrs[utils.RQF] != 4 {
|
||||
} else if vrs[utils.RQF] != 5 {
|
||||
t.Errorf("Unexpected version returned: %d", vrs[utils.RQF])
|
||||
}
|
||||
//check if Filters was migrate correctly
|
||||
|
||||
@@ -281,3 +281,97 @@ func TestFiltersInlineV2Migrate(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestMigrateInlineFilterV4(t *testing.T) {
|
||||
flts := []string{
|
||||
"*string:*~req.Account:1001",
|
||||
"*rsr::*~req.Destination",
|
||||
"*notrsr::*~req.MaxUsage(<0);*req.Account(^10)",
|
||||
}
|
||||
exp := []string{
|
||||
"*string:*~req.Account:1001",
|
||||
"*notrsr:*~req.MaxUsage:<0",
|
||||
"*notrsr:*req.Account:^10",
|
||||
}
|
||||
if rply, err := migrateInlineFilterV4(flts); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(exp, rply) {
|
||||
t.Errorf("Expected: %s,received: %s", exp, rply)
|
||||
}
|
||||
|
||||
flts = []string{
|
||||
"*string:*~req.Account:1001",
|
||||
"*rsr::*~req.Destination)",
|
||||
}
|
||||
if _, err := migrateInlineFilterV4(flts); err == nil {
|
||||
t.Error("Expected error received none")
|
||||
}
|
||||
flts = []string{
|
||||
"*rsr::*~req.Destination{*(1001)",
|
||||
}
|
||||
if _, err := migrateInlineFilterV4(flts); err == nil {
|
||||
t.Error("Expected error received none")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMigrateRequestFilterV4(t *testing.T) {
|
||||
flt := &engine.Filter{
|
||||
Tenant: "cgrates.org",
|
||||
ID: "FLT_1",
|
||||
Rules: []*engine.FilterRule{
|
||||
{
|
||||
Type: utils.MetaString,
|
||||
Element: "~*req.Account",
|
||||
Values: []string{"1001"},
|
||||
},
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
Element: utils.EmptyString,
|
||||
Values: []string{"~*req.Account"},
|
||||
},
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
Element: utils.EmptyString,
|
||||
Values: []string{"~*req.Destination(^1001&1$)"},
|
||||
},
|
||||
},
|
||||
}
|
||||
exp := &engine.Filter{
|
||||
Tenant: "cgrates.org",
|
||||
ID: "FLT_1",
|
||||
Rules: []*engine.FilterRule{
|
||||
{
|
||||
Type: utils.MetaString,
|
||||
Element: "~*req.Account",
|
||||
Values: []string{"1001"},
|
||||
},
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
Element: "~*req.Destination",
|
||||
Values: []string{"^1001", "1$"},
|
||||
},
|
||||
},
|
||||
}
|
||||
m := new(Migrator)
|
||||
if rply, err := m.migrateRequestFilterV4(flt); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(exp, rply) {
|
||||
t.Errorf("Expected: %s,received: %s", utils.ToJSON(exp), utils.ToJSON(rply))
|
||||
}
|
||||
|
||||
flt = &engine.Filter{
|
||||
Tenant: "cgrates.org",
|
||||
ID: "FLT_1",
|
||||
Rules: []*engine.FilterRule{
|
||||
{
|
||||
Type: utils.MetaRSR,
|
||||
Element: utils.EmptyString,
|
||||
Values: []string{"~*req.Destination^1001&1$)"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if _, err := m.migrateRequestFilterV4(flt); err == nil {
|
||||
t.Error("Expected error received none")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ func (m *Migrator) migrateLoadIDs() (err error) {
|
||||
if err = m.dmOut.DataManager().DataDB().RemoveLoadIDsDrv(); err != nil {
|
||||
return
|
||||
}
|
||||
if err = m.setVersions(utils.ActionTriggers); err != nil {
|
||||
if err = m.setVersions(utils.LoadIDsVrs); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,13 @@ type MigratorDataDB interface {
|
||||
setSupplier(spl *SupplierProfile) (err error)
|
||||
remSupplier(tenant, id string) (err error)
|
||||
|
||||
getV1ChargerProfile() (v1chrPrf *engine.ChargerProfile, err error)
|
||||
getV1DispatcherProfile() (v1chrPrf *engine.DispatcherProfile, err error)
|
||||
getV1RouteProfile() (v1chrPrf *engine.RouteProfile, err error)
|
||||
|
||||
getV3Stats() (v1st *engine.StatQueueProfile, err error)
|
||||
getV3ThresholdProfile() (v2T *engine.ThresholdProfile, err error)
|
||||
|
||||
DataManager() *engine.DataManager
|
||||
close()
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -46,7 +47,7 @@ func (m *Migrator) migrateCurrentRatingPlans() (err error) {
|
||||
if err := m.dmIN.DataManager().RemoveRatingPlan(idg, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.RatingPlan] += 1
|
||||
m.stats[utils.RatingPlan]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -58,14 +59,39 @@ func (m *Migrator) migrateRatingPlans() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
switch vrs[utils.RatingPlan] {
|
||||
case current[utils.RatingPlan]:
|
||||
if m.sameDataDB {
|
||||
migrated := true
|
||||
for {
|
||||
version := vrs[utils.RatingPlan]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.RatingPlan]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRatingPlans(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if version == current[utils.RatingPlan] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRatingPlans(); err != nil {
|
||||
return err
|
||||
}
|
||||
// if !m.dryRun {
|
||||
// if err = m.dmIN.DataManager().SetRatingPlan(v2, true); err != nil {
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
m.stats[utils.RatingPlan]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.RatingPlan); err != nil {
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColRpl)
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -46,7 +47,7 @@ func (m *Migrator) migrateCurrentRatingProfiles() (err error) {
|
||||
if err := m.dmIN.DataManager().RemoveRatingProfile(idg, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.RatingProfile] += 1
|
||||
m.stats[utils.RatingProfile]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -58,14 +59,39 @@ func (m *Migrator) migrateRatingProfiles() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
switch vrs[utils.RatingProfile] {
|
||||
case current[utils.RatingProfile]:
|
||||
if m.sameDataDB {
|
||||
migrated := true
|
||||
for {
|
||||
version := vrs[utils.RatingProfile]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.RatingProfile]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRatingProfiles(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if version == current[utils.RatingProfile] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRatingProfiles(); err != nil {
|
||||
return err
|
||||
}
|
||||
// if !m.dryRun {
|
||||
// if err = m.dmIN.DataManager().SetRatingProfile(v2, true); err != nil {
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
m.stats[utils.RatingProfile]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.RatingProfile); err != nil {
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColRpf)
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ func (m *Migrator) migrateCurrentResource() (err error) {
|
||||
if err := m.dmIN.DataManager().RemoveResourceProfile(tntID[0], tntID[1], utils.NonTransactional, false); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Resource] += 1
|
||||
m.stats[utils.Resource]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -62,14 +62,39 @@ func (m *Migrator) migrateResources() (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
switch vrs[utils.Resource] {
|
||||
case current[utils.Resource]:
|
||||
if m.sameDataDB {
|
||||
migrated := true
|
||||
for {
|
||||
version := vrs[utils.Resource]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Resource]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentResource(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if version == current[utils.Resource] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentResource(); err != nil {
|
||||
return err
|
||||
}
|
||||
// if !m.dryRun {
|
||||
// if err = m.dmIN.DataManager().SetResourceProfile(v2, true); err != nil {
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
m.stats[utils.Resource]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Resource); err != nil {
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColRsP)
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
@@ -62,10 +63,10 @@ func (m *Migrator) removeSupplier() (err error) {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
if err = m.dmIN.remSupplier(spp.Tenant, spp.ID); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
@@ -88,7 +89,7 @@ func (m *Migrator) migrateFromSupplierToRoute() (err error) {
|
||||
if err := m.dmOut.DataManager().SetRouteProfile(convertSupplierToRoute(spp), true); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.DerivedChargersV] += 1
|
||||
m.stats[utils.DerivedChargersV]++
|
||||
}
|
||||
if m.dryRun {
|
||||
return
|
||||
@@ -142,23 +143,56 @@ func (m *Migrator) migrateRouteProfiles() (err error) {
|
||||
if vrs, err = m.getVersions(utils.ActionTriggers); err != nil {
|
||||
return
|
||||
}
|
||||
if routeVersion, has := vrs[utils.Routes]; !has {
|
||||
routeVersion, has := vrs[utils.Routes]
|
||||
if !has {
|
||||
if vrs[utils.RQF] != current[utils.RQF] {
|
||||
return fmt.Errorf("please migrate the filters before migrating the routes")
|
||||
}
|
||||
if err = m.migrateFromSupplierToRoute(); err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
switch routeVersion {
|
||||
case current[utils.Routes]:
|
||||
if m.sameDataDB {
|
||||
}
|
||||
migrated := true
|
||||
var v2 *engine.RouteProfile
|
||||
for {
|
||||
version := routeVersion
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Routes]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRouteProfile(); err != nil {
|
||||
return err
|
||||
}
|
||||
case 1:
|
||||
if v2, err = m.migrateV1ToV2Routes(); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 2
|
||||
}
|
||||
if version == current[utils.Routes] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentRouteProfile(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if !m.dryRun {
|
||||
if err = m.dmIN.DataManager().SetRouteProfile(v2, true); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.Routes]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Routes); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return m.ensureIndexesDataDB(engine.ColRts)
|
||||
@@ -190,3 +224,16 @@ func convertSupplierToRoute(spp *SupplierProfile) (route *engine.RouteProfile) {
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (m *Migrator) migrateV1ToV2Routes() (v4Cpp *engine.RouteProfile, err error) {
|
||||
v4Cpp, err = m.dmIN.getV1RouteProfile()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if v4Cpp == nil {
|
||||
return nil, errors.New("Dispatcher NIL")
|
||||
}
|
||||
if v4Cpp.FilterIDs, err = migrateInlineFilterV4(v4Cpp.FilterIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -61,7 +61,9 @@ func (m *Migrator) migrateSessionSCosts() (err error) {
|
||||
utils.UndefinedVersion,
|
||||
"version number is not defined for SessionsCosts model")
|
||||
}
|
||||
switch vrs[utils.SessionSCosts] {
|
||||
switch version := vrs[utils.SessionSCosts]; version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case 0, 1:
|
||||
if err = m.migrateV1SessionSCosts(); err != nil {
|
||||
return err
|
||||
@@ -115,7 +117,7 @@ func (m *Migrator) migrateV2SessionSCosts() (err error) {
|
||||
if err = m.storDBIn.remV2SMCost(v2Cost); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.SessionSCosts] += 1
|
||||
m.stats[utils.SessionSCosts]++
|
||||
}
|
||||
if m.dryRun {
|
||||
return
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -49,7 +50,7 @@ func (m *Migrator) migrateCurrentSharedGroups() (err error) {
|
||||
if err := m.dmOut.DataManager().SetSharedGroup(sgs, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.SharedGroups] += 1
|
||||
m.stats[utils.SharedGroups]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -71,7 +72,7 @@ func (m *Migrator) migrateV1SharedGroups() (err error) {
|
||||
if err = m.dmOut.DataManager().SetSharedGroup(acnt, utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.SharedGroups] += 1
|
||||
m.stats[utils.SharedGroups]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.SharedGroups); err != nil {
|
||||
@@ -86,7 +87,9 @@ func (m *Migrator) migrateSharedGroups() (err error) {
|
||||
if vrs, err = m.getVersions(utils.SharedGroups); err != nil {
|
||||
return
|
||||
}
|
||||
switch vrs[utils.SharedGroups] {
|
||||
switch version := vrs[utils.SharedGroups]; version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.SharedGroups]:
|
||||
if m.sameDataDB {
|
||||
break
|
||||
|
||||
@@ -137,7 +137,6 @@ func (m *Migrator) migrateV1Stats() (filter *engine.Filter, v2Stats *engine.Stat
|
||||
if filter, v2Stats, sts, err = v1Sts.AsStatQP(); err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
m.stats[utils.StatS]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -179,37 +178,46 @@ func (m *Migrator) migrateStats() (err error) {
|
||||
}
|
||||
migrated := true
|
||||
var filter *engine.Filter
|
||||
var sts *engine.StatQueueProfile
|
||||
var v3sts *engine.StatQueueProfile
|
||||
var v4sts *engine.StatQueueProfile
|
||||
var v2Stats *engine.StatQueue
|
||||
var v3Stats *engine.StatQueue
|
||||
for {
|
||||
version := vrs[utils.StatS]
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.StatS]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
migrated = false
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentStats(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
version = 3
|
||||
migrated = false
|
||||
case 1: // migrate from V1 to V2
|
||||
if filter, v2Stats, sts, err = m.migrateV1Stats(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
if filter, v2Stats, v3sts, err = m.migrateV1Stats(); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 2
|
||||
case 2: // migrate from V2 to V3 (actual)
|
||||
if v3Stats, err = m.migrateV2Stats(v2Stats); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 3
|
||||
case 3:
|
||||
if v4sts, err = m.migrateV3ToV4Stats(v3sts); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 4
|
||||
}
|
||||
if version == current[utils.StatS] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
@@ -218,20 +226,21 @@ func (m *Migrator) migrateStats() (err error) {
|
||||
if err == utils.ErrNoMoreData || !migrated {
|
||||
break
|
||||
}
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
if vrs[utils.StatS] == 1 {
|
||||
if err := m.dmOut.DataManager().SetFilter(filter, true); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := m.dmOut.DataManager().SetStatQueueProfile(sts, true); err != nil {
|
||||
return err
|
||||
if err = m.dmOut.DataManager().SetFilter(filter, true); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
// Set the fresh-migrated Stats into DB
|
||||
if err = m.dmOut.DataManager().SetStatQueueProfile(v4sts, true); err != nil {
|
||||
return
|
||||
}
|
||||
if err = m.dmOut.DataManager().SetStatQueue(v3Stats); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
}
|
||||
m.stats[utils.StatS]++
|
||||
}
|
||||
if m.dryRun || !migrated {
|
||||
return nil
|
||||
@@ -427,3 +436,16 @@ func (v1Sts v1Stat) AsStatQP() (filter *engine.Filter, sq *engine.StatQueue, stq
|
||||
}
|
||||
return filter, sq, stq, nil
|
||||
}
|
||||
|
||||
func (m *Migrator) migrateV3ToV4Stats(v3sts *engine.StatQueueProfile) (v4Cpp *engine.StatQueueProfile, err error) {
|
||||
if v3sts == nil {
|
||||
// read data from DataDB
|
||||
if v3sts, err = m.dmIN.getV3Stats(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if v3sts.FilterIDs, err = migrateInlineFilterV4(v3sts.FilterIDs); err != nil {
|
||||
return
|
||||
}
|
||||
return v3sts, nil
|
||||
}
|
||||
|
||||
@@ -139,6 +139,10 @@ func (iDBMig *internalMigrator) getV1Stats() (v1st *v1Stat, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
func (iDBMig *internalMigrator) getV3Stats() (v1st *engine.StatQueueProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
//set
|
||||
func (iDBMig *internalMigrator) setV1Stats(x *v1Stat) (err error) {
|
||||
return utils.ErrNotImplemented
|
||||
@@ -181,6 +185,10 @@ func (iDBMig *internalMigrator) getV2ThresholdProfile() (v2T *v2Threshold, err e
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
func (iDBMig *internalMigrator) getV3ThresholdProfile() (v2T *engine.ThresholdProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
//set
|
||||
func (iDBMig *internalMigrator) setV2ThresholdProfile(x *v2Threshold) (err error) {
|
||||
return utils.ErrNotImplemented
|
||||
@@ -327,3 +335,15 @@ func (iDBMig *internalMigrator) remSupplier(tenant, id string) (err error) {
|
||||
}
|
||||
|
||||
func (iDBMig *internalMigrator) close() {}
|
||||
|
||||
func (iDBMig *internalMigrator) getV1ChargerProfile() (v1chrPrf *engine.ChargerProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
func (iDBMig *internalMigrator) getV1DispatcherProfile() (v1chrPrf *engine.DispatcherProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
func (iDBMig *internalMigrator) getV1RouteProfile() (v1chrPrf *engine.RouteProfile, err error) {
|
||||
return nil, utils.ErrNotImplemented
|
||||
}
|
||||
|
||||
@@ -299,6 +299,25 @@ func (v1ms *mongoMigrator) getV1Stats() (v1st *v1Stat, err error) {
|
||||
return v1st, nil
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV3Stats() (v1st *engine.StatQueueProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(engine.ColSqp).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !(*v1ms.cursor).Next(v1ms.mgoDB.GetContext()) {
|
||||
(*v1ms.cursor).Close(v1ms.mgoDB.GetContext())
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1st = new(engine.StatQueueProfile)
|
||||
if err := (*v1ms.cursor).Decode(v1st); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return v1st, nil
|
||||
}
|
||||
|
||||
//set
|
||||
func (v1ms *mongoMigrator) setV1Stats(x *v1Stat) (err error) {
|
||||
_, err = v1ms.mgoDB.DB().Collection(utils.CDR_STATS_PREFIX).InsertOne(v1ms.mgoDB.GetContext(), x)
|
||||
@@ -406,6 +425,25 @@ func (v1ms *mongoMigrator) getV2ThresholdProfile() (v2T *v2Threshold, err error)
|
||||
return v2T, nil
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV3ThresholdProfile() (v2T *engine.ThresholdProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(engine.ColTps).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !(*v1ms.cursor).Next(v1ms.mgoDB.GetContext()) {
|
||||
(*v1ms.cursor).Close(v1ms.mgoDB.GetContext())
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v2T = new(engine.ThresholdProfile)
|
||||
if err := (*v1ms.cursor).Decode(v2T); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return v2T, nil
|
||||
}
|
||||
|
||||
//set
|
||||
func (v1ms *mongoMigrator) setV2ThresholdProfile(x *v2Threshold) (err error) {
|
||||
_, err = v1ms.mgoDB.DB().Collection(v2ThresholdProfileCol).InsertOne(v1ms.mgoDB.GetContext(), x)
|
||||
@@ -776,3 +814,60 @@ func (v1ms *mongoMigrator) remSupplier(tenant, id string) (err error) {
|
||||
_, err = v1ms.mgoDB.DB().Collection(ColSpp).DeleteOne(v1ms.mgoDB.GetContext(), bson.M{"tenant": tenant, "id": id})
|
||||
return
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV1ChargerProfile() (v1chrPrf *engine.ChargerProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(engine.ColCpp).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !(*v1ms.cursor).Next(v1ms.mgoDB.GetContext()) {
|
||||
(*v1ms.cursor).Close(v1ms.mgoDB.GetContext())
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1chrPrf = new(engine.ChargerProfile)
|
||||
if err := (*v1ms.cursor).Decode(v1chrPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV1DispatcherProfile() (v1dppPrf *engine.DispatcherProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(engine.ColDpp).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !(*v1ms.cursor).Next(v1ms.mgoDB.GetContext()) {
|
||||
(*v1ms.cursor).Close(v1ms.mgoDB.GetContext())
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1dppPrf = new(engine.DispatcherProfile)
|
||||
if err := (*v1ms.cursor).Decode(v1dppPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (v1ms *mongoMigrator) getV1RouteProfile() (v1dppPrf *engine.RouteProfile, err error) {
|
||||
if v1ms.cursor == nil {
|
||||
v1ms.cursor, err = v1ms.mgoDB.DB().Collection(engine.ColRpp).Find(v1ms.mgoDB.GetContext(), bson.D{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !(*v1ms.cursor).Next(v1ms.mgoDB.GetContext()) {
|
||||
(*v1ms.cursor).Close(v1ms.mgoDB.GetContext())
|
||||
v1ms.cursor = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1dppPrf = new(engine.RouteProfile)
|
||||
if err := (*v1ms.cursor).Decode(v1dppPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -360,6 +360,32 @@ func (v1rs *redisMigrator) getV1Stats() (v1st *v1Stat, err error) {
|
||||
return v1st, nil
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV3Stats() (v1st *engine.StatQueueProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(utils.StatQueueProfilePrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1rs.qryIdx = utils.IntPointer(0)
|
||||
}
|
||||
if *v1rs.qryIdx <= len(v1rs.dataKeys)-1 {
|
||||
strVal, err := v1rs.rds.Cmd("GET", v1rs.dataKeys[*v1rs.qryIdx]).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v1st); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
} else {
|
||||
v1rs.qryIdx = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
return v1st, nil
|
||||
}
|
||||
|
||||
//set
|
||||
func (v1rs *redisMigrator) setV1Stats(x *v1Stat) (err error) {
|
||||
key := utils.CDR_STATS_PREFIX + x.Id
|
||||
@@ -525,6 +551,32 @@ func (v1rs *redisMigrator) getV2ThresholdProfile() (v2T *v2Threshold, err error)
|
||||
return v2Th, nil
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV3ThresholdProfile() (v2T *engine.ThresholdProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(utils.ThresholdProfilePrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1rs.qryIdx = utils.IntPointer(0)
|
||||
}
|
||||
if *v1rs.qryIdx <= len(v1rs.dataKeys)-1 {
|
||||
strVal, err := v1rs.rds.Cmd("GET", v1rs.dataKeys[*v1rs.qryIdx]).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v2T); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
} else {
|
||||
v1rs.qryIdx = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
return v2T, nil
|
||||
}
|
||||
|
||||
//set
|
||||
func (v1rs *redisMigrator) setV2ThresholdProfile(x *v2Threshold) (err error) {
|
||||
key := utils.ThresholdProfilePrefix + utils.ConcatenatedKey(x.Tenant, x.ID)
|
||||
@@ -549,7 +601,7 @@ func (v1rs *redisMigrator) remV2ThresholdProfile(tenant, id string) (err error)
|
||||
func (v1rs *redisMigrator) getV1Alias() (v1a *v1Alias, err error) {
|
||||
v1a = &v1Alias{Values: make(v1AliasValues, 0)}
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(ALIASES_PREFIX)
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(AliasesPrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
@@ -563,7 +615,7 @@ func (v1rs *redisMigrator) getV1Alias() (v1a *v1Alias, err error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v1a.SetId(strings.TrimPrefix(key, ALIASES_PREFIX))
|
||||
v1a.SetId(strings.TrimPrefix(key, AliasesPrefix))
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v1a.Values); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -582,7 +634,7 @@ func (v1rs *redisMigrator) setV1Alias(al *v1Alias) (err error) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
key := ALIASES_PREFIX + al.GetId()
|
||||
key := AliasesPrefix + al.GetId()
|
||||
if err = v1rs.rds.Cmd("SET", key, result).Err; err != nil {
|
||||
return
|
||||
}
|
||||
@@ -596,7 +648,7 @@ func (v1rs *redisMigrator) remV1Alias(key string) (err error) {
|
||||
|
||||
var values []byte
|
||||
if values, err = v1rs.rds.Cmd("GET",
|
||||
ALIASES_PREFIX+key).Bytes(); err != nil {
|
||||
AliasesPrefix+key).Bytes(); err != nil {
|
||||
if err == redis.ErrRespNil { // did not find the destination
|
||||
err = utils.ErrNotFound
|
||||
}
|
||||
@@ -608,7 +660,7 @@ func (v1rs *redisMigrator) remV1Alias(key string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
err = v1rs.rds.Cmd("DEL", ALIASES_PREFIX+key).Err
|
||||
err = v1rs.rds.Cmd("DEL", AliasesPrefix+key).Err
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1003,3 +1055,81 @@ func (v1rs *redisMigrator) remSupplier(tenant, id string) (err error) {
|
||||
key := SupplierProfilePrefix + utils.ConcatenatedKey(tenant, id)
|
||||
return v1rs.rds.Cmd("DEL", key).Err
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV1ChargerProfile() (v1chrPrf *engine.ChargerProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(utils.ChargerProfilePrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1rs.qryIdx = utils.IntPointer(0)
|
||||
}
|
||||
if *v1rs.qryIdx <= len(v1rs.dataKeys)-1 {
|
||||
strVal, err := v1rs.rds.Cmd("GET", v1rs.dataKeys[*v1rs.qryIdx]).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v1chrPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
} else {
|
||||
v1rs.qryIdx = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV1DispatcherProfile() (v1chrPrf *engine.DispatcherProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(utils.DispatcherProfilePrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1rs.qryIdx = utils.IntPointer(0)
|
||||
}
|
||||
if *v1rs.qryIdx <= len(v1rs.dataKeys)-1 {
|
||||
strVal, err := v1rs.rds.Cmd("GET", v1rs.dataKeys[*v1rs.qryIdx]).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v1chrPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
} else {
|
||||
v1rs.qryIdx = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (v1rs *redisMigrator) getV1RouteProfile() (v1chrPrf *engine.RouteProfile, err error) {
|
||||
if v1rs.qryIdx == nil {
|
||||
v1rs.dataKeys, err = v1rs.rds.GetKeysForPrefix(utils.RouteProfilePrefix)
|
||||
if err != nil {
|
||||
return
|
||||
} else if len(v1rs.dataKeys) == 0 {
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
v1rs.qryIdx = utils.IntPointer(0)
|
||||
}
|
||||
if *v1rs.qryIdx <= len(v1rs.dataKeys)-1 {
|
||||
strVal, err := v1rs.rds.Cmd("GET", v1rs.dataKeys[*v1rs.qryIdx]).Bytes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := v1rs.rds.Marshaler().Unmarshal(strVal, &v1chrPrf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*v1rs.qryIdx = *v1rs.qryIdx + 1
|
||||
} else {
|
||||
v1rs.qryIdx = nil
|
||||
return nil, utils.ErrNoMoreData
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ func (m *Migrator) migrateCurrentThresholds() (err error) {
|
||||
if err := m.dmIN.DataManager().RemoveThreshold(tntID[0], tntID[1], utils.NonTransactional); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Thresholds] += 1
|
||||
m.stats[utils.Thresholds]++
|
||||
}
|
||||
//ThresholdProfiles
|
||||
ids, err = m.dmIN.DataManager().DataDB().GetKeysForPrefix(utils.ThresholdProfilePrefix)
|
||||
@@ -151,34 +151,42 @@ func (m *Migrator) migrateThresholds() (err error) {
|
||||
}
|
||||
migrated := true
|
||||
migratedFrom := 0
|
||||
var thp *engine.ThresholdProfile
|
||||
var th *engine.Threshold
|
||||
var filter *engine.Filter
|
||||
var v3 *engine.ThresholdProfile
|
||||
var v4 *engine.ThresholdProfile
|
||||
for {
|
||||
version := vrs[utils.Thresholds]
|
||||
migratedFrom = int(version)
|
||||
for {
|
||||
switch version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Thresholds]:
|
||||
migrated = false
|
||||
if m.sameDataDB {
|
||||
break
|
||||
}
|
||||
if err = m.migrateCurrentThresholds(); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
case 1:
|
||||
if thp, th, filter, err = m.migrateV2ActionTriggers(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
if v3, th, filter, err = m.migrateV2ActionTriggers(); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
}
|
||||
version = 3
|
||||
migratedFrom = 1
|
||||
case 2:
|
||||
if v3, err = m.migrateV2Thresholds(); err != nil && err != utils.ErrNoMoreData {
|
||||
return err
|
||||
return
|
||||
}
|
||||
version = 3
|
||||
migratedFrom = 2
|
||||
case 3:
|
||||
if v4, err = m.migrateV3ToV4Threshold(v3); err != nil && err != utils.ErrNoMoreData {
|
||||
return
|
||||
} else if err == utils.ErrNoMoreData {
|
||||
break
|
||||
}
|
||||
version = 4
|
||||
}
|
||||
if version == current[utils.Thresholds] || err == utils.ErrNoMoreData {
|
||||
break
|
||||
@@ -188,24 +196,19 @@ func (m *Migrator) migrateThresholds() (err error) {
|
||||
break
|
||||
}
|
||||
|
||||
if !m.dryRun && migrated {
|
||||
if !m.dryRun {
|
||||
//set threshond
|
||||
switch migratedFrom {
|
||||
case 1:
|
||||
if err := m.dmOut.DataManager().SetFilter(filter, true); err != nil {
|
||||
return err
|
||||
if migratedFrom == 1 {
|
||||
if err = m.dmOut.DataManager().SetFilter(filter, true); err != nil {
|
||||
return
|
||||
}
|
||||
if err := m.dmOut.DataManager().SetThreshold(th); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := m.dmOut.DataManager().SetThresholdProfile(thp, true); err != nil {
|
||||
return err
|
||||
}
|
||||
case 2:
|
||||
if err = m.dmOut.DataManager().SetThresholdProfile(v3, true); err != nil {
|
||||
return err
|
||||
if err = m.dmOut.DataManager().SetThreshold(th); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if err = m.dmOut.DataManager().SetThresholdProfile(v4, true); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
m.stats[utils.Thresholds]++
|
||||
@@ -221,7 +224,7 @@ func (m *Migrator) migrateThresholds() (err error) {
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
if err = m.setVersions(utils.Thresholds); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
return m.ensureIndexesDataDB(engine.ColTps)
|
||||
}
|
||||
@@ -329,7 +332,7 @@ func (m *Migrator) SasThreshold(v2ATR *engine.ActionTrigger) (err error) {
|
||||
if err := m.dmOut.DataManager().SetThresholdProfile(thp, true); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Thresholds] += 1
|
||||
m.stats[utils.Thresholds]++
|
||||
}
|
||||
// All done, update version wtih current one
|
||||
vrs = engine.Versions{utils.Thresholds: engine.CurrentStorDBVersions()[utils.Thresholds]}
|
||||
@@ -437,3 +440,16 @@ func (v2T v2Threshold) V2toV3Threshold() (th *engine.ThresholdProfile) {
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (m *Migrator) migrateV3ToV4Threshold(v3sts *engine.ThresholdProfile) (v4Cpp *engine.ThresholdProfile, err error) {
|
||||
if v3sts == nil {
|
||||
// read data from DataDB
|
||||
if v3sts, err = m.dmIN.getV3ThresholdProfile(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if v3sts.FilterIDs, err = migrateInlineFilterV4(v3sts.FilterIDs); err != nil {
|
||||
return
|
||||
}
|
||||
return v3sts, nil
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package migrator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
@@ -43,7 +44,7 @@ func (m *Migrator) migrateCurrentTiming() (err error) {
|
||||
if err := m.dmOut.DataManager().SetTiming(tm); err != nil {
|
||||
return err
|
||||
}
|
||||
m.stats[utils.Timing] += 1
|
||||
m.stats[utils.Timing]++
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -54,7 +55,9 @@ func (m *Migrator) migrateTimings() (err error) {
|
||||
if vrs, err = m.getVersions(utils.Timing); err != nil {
|
||||
return
|
||||
}
|
||||
switch vrs[utils.Timing] {
|
||||
switch version := vrs[utils.Timing]; version {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported version %v", version)
|
||||
case current[utils.Timing]:
|
||||
if m.sameDataDB {
|
||||
break
|
||||
|
||||
@@ -44,7 +44,7 @@ func (m *Migrator) migrateCurrentTPaccountAcction() (err error) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
m.stats[utils.TpAccountActionsV] += 1
|
||||
m.stats[utils.TpAccountActionsV]++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ func (m *Migrator) migrateCurrentTPactionplans() (err error) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
m.stats[utils.TpActionPlans] += 1
|
||||
m.stats[utils.TpActionPlans]++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user