Added migration for *rsr filters

This commit is contained in:
Trial97
2020-07-08 17:54:05 +03:00
parent 48a7440d2e
commit 547024a730
33 changed files with 932 additions and 242 deletions

View File

@@ -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,
}

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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"},

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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",

View File

@@ -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),

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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")
}
}

View File

@@ -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
}
}

View File

@@ -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()
}

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -44,7 +44,7 @@ func (m *Migrator) migrateCurrentTPaccountAcction() (err error) {
return err
}
}
m.stats[utils.TpAccountActionsV] += 1
m.stats[utils.TpAccountActionsV]++
}
}
}

View File

@@ -50,7 +50,7 @@ func (m *Migrator) migrateCurrentTPactionplans() (err error) {
return err
}
}
m.stats[utils.TpActionPlans] += 1
m.stats[utils.TpActionPlans]++
}
}
}