diff --git a/.gitignore b/.gitignore index f9500ad9c..dfd8ef924 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ dean* data/vagrant/.vagrant data/vagrant/vagrant_ansible_inventory_default data/tutorials/fs_evsock/freeswitch/etc/freeswitch/ +vendor diff --git a/engine/aliases.go b/engine/aliases.go index 0a498d78e..9a0497223 100644 --- a/engine/aliases.go +++ b/engine/aliases.go @@ -76,6 +76,15 @@ func (avs AliasValues) Sort() { sort.Sort(avs) } +func (avs AliasValues) GetValueByDestId(destID string) *AliasValue { + for _, value := range avs { + if value.DestinationId == destID { + return value + } + } + return nil +} + func (al *Alias) GetId() string { return utils.ConcatenatedKey(al.Direction, al.Tenant, al.Category, al.Account, al.Subject, al.Context) } diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index 2e0c83292..f1145e87f 100644 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -223,6 +223,8 @@ cgrates.org,dan,another,value aliases = ` #Direction[0],Tenant[1],Category[2],Account[3],Subject[4],DestinationId[5],Group[6],Alias[7],Weight[8] *out,cgrates.org,call,dan,dan,EU_LANDLINE,*rating_profile,Subject,dan,dan1,10 +*out,cgrates.org,call,dan,dan,EU_LANDLINE,*rating_profile,Subject,rif,rif1,10 +*out,cgrates.org,call,dan,dan,EU_LANDLINE,*rating_profile,Cli,0723,0724,10 *out,cgrates.org,call,dan,dan,GLOBAL1,*rating_profile,Subject,dan,dan2,20 *any,*any,*any,*any,*any,*any,*rating_profile,Subject,*any,rif1,20 *any,*any,*any,*any,*any,*any,*account,Account,*any,dan1,10 @@ -1143,9 +1145,18 @@ func TestLoadAliases(t *testing.T) { Values: AliasValues{ &AliasValue{ DestinationId: "EU_LANDLINE", - Pairs: AliasPairs{"Subject": map[string]string{"dan": "dan1"}}, - Weight: 10, + Pairs: AliasPairs{ + "Subject": map[string]string{ + "dan": "dan1", + "rif": "rif1", + }, + "Cli": map[string]string{ + "0723": "0724", + }, + }, + Weight: 10, }, + &AliasValue{ DestinationId: "GLOBAL1", Pairs: AliasPairs{"Subject": map[string]string{"dan": "dan2"}}, @@ -1155,6 +1166,9 @@ func TestLoadAliases(t *testing.T) { } if !reflect.DeepEqual(csvr.aliases[alias1.GetId()], alias1) { - t.Errorf("Unexpected alias %+v", csvr.aliases[alias1.GetId()].Values[1]) + for _, value := range csvr.aliases[alias1.GetId()].Values { + t.Logf("Value: %+v", value) + } + t.Errorf("Unexpected alias %+v", csvr.aliases[alias1.GetId()]) } } diff --git a/engine/tp_reader.go b/engine/tp_reader.go index bf0b47ace..b83daf560 100644 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -1093,14 +1093,20 @@ func (tpr *TpReader) LoadAliasesFiltered(filter *TpAlias) (bool, error) { Values: make(AliasValues, 0), } for _, tpAlias := range tpAliases { - av := &AliasValue{ - DestinationId: tpAlias.DestinationId, - Pairs: make(AliasPairs), - Weight: tpAlias.Weight, + av := alias.Values.GetValueByDestId(tpAlias.DestinationId) + if av == nil { + av = &AliasValue{ + DestinationId: tpAlias.DestinationId, + Pairs: make(AliasPairs), + Weight: tpAlias.Weight, + } + alias.Values = append(alias.Values, av) + } + if av.Pairs[tpAlias.Target] == nil { + av.Pairs[tpAlias.Target] = make(map[string]string) } - av.Pairs[tpAlias.Target] = make(map[string]string) av.Pairs[tpAlias.Target][tpAlias.Original] = tpAlias.Alias - alias.Values = append(alias.Values) + } tpr.accountingStorage.SetAlias(alias) return len(tpAliases) > 0, err @@ -1130,16 +1136,20 @@ func (tpr *TpReader) LoadAliases() error { tpr.aliases[key] = al } for _, v := range tal.Values { - av := &AliasValue{ - DestinationId: v.DestinationId, - Pairs: make(AliasPairs), - Weight: v.Weight, + av := al.Values.GetValueByDestId(v.DestinationId) + if av == nil { + av = &AliasValue{ + DestinationId: v.DestinationId, + Pairs: make(AliasPairs), + Weight: v.Weight, + } + al.Values = append(al.Values, av) + } + if av.Pairs[v.Target] == nil { + av.Pairs[v.Target] = make(map[string]string) } - av.Pairs[v.Target] = make(map[string]string) av.Pairs[v.Target][v.Original] = v.Alias - al.Values = append(al.Values, av) } - } return err }