From a86fcad2ff1dd371ff224a4dc95c1b4c8ffa7b34 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 14 Sep 2015 13:22:50 +0200 Subject: [PATCH] Aliases old implementation compatibility, local tests modified --- apier/v1/aliases.go | 121 +++++++++++++++++------------ apier/v1/apier_local_test.go | 39 +++++----- data/conf/samples/apier/apier.json | 5 ++ utils/consts.go | 1 + 4 files changed, 94 insertions(+), 72 deletions(-) diff --git a/apier/v1/aliases.go b/apier/v1/aliases.go index 19be1c7a6..1afbc6b90 100644 --- a/apier/v1/aliases.go +++ b/apier/v1/aliases.go @@ -20,34 +20,39 @@ package v1 import ( "errors" + "fmt" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" ) type AttrAddRatingSubjectAliases struct { - Tenant, Subject string - Aliases []string + Tenant, Category, Subject string + Aliases []string } type AttrAddAccountAliases struct { - Tenant, Account string - Aliases []string + Tenant, Category, Account string + Aliases []string } -// Retrieve aliases configured for a rating profile subject +// Add aliases configured for a rating profile subject func (self *ApierV1) AddRatingSubjectAliases(attrs AttrAddRatingSubjectAliases, reply *string) error { - if engine.GetAliasService() == nil { - return errors.New("ALIASES_NOT_ENABLED") - } if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Subject", "Aliases"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } + if attrs.Category == "" { + attrs.Category = utils.CALL + } + aliases := engine.GetAliasService() + if aliases == nil { + return errors.New("ALIASES_NOT_ENABLED") + } + var ignr string for _, alias := range attrs.Aliases { - var ignr string - if err := engine.GetAliasService().SetAlias( - engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Account: utils.META_ANY, Subject: attrs.Subject, Group: utils.ALIAS_GROUP_RP, - Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Alias: alias, Weight: 10.0}}}, &ignr); err != nil { + if err := aliases.SetAlias( + engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Group: utils.ALIAS_GROUP_RP, + Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Alias: attrs.Subject, Weight: 10.0}}}, &ignr); err != nil { return utils.NewErrServerError(err) } } @@ -55,40 +60,25 @@ func (self *ApierV1) AddRatingSubjectAliases(attrs AttrAddRatingSubjectAliases, return nil } -/* -// Retrieve aliases configured for a rating profile subject +// Remove aliases configured for a rating profile subject func (self *ApierV1) RemRatingSubjectAliases(tenantRatingSubject engine.TenantRatingSubject, reply *string) error { - if engine.GetAliasService() == nil { - return errors.New("ALIASES_NOT_ENABLED") - } if missing := utils.MissingStructFields(&tenantRatingSubject, []string{"Tenant", "Subject"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } - if err := self.RatingDb.RemoveRpAliases([]*engine.TenantRatingSubject{&tenantRatingSubject}, false); err != nil { - if err == utils.ErrNotFound { - return err - } - return utils.NewErrServerError(err) - } - - // cache refresh not needed, synched in RemoveRpAliases - *reply = utils.OK - return nil -} -*/ - -func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *string) error { - if engine.GetAliasService() == nil { + aliases := engine.GetAliasService() + if aliases == nil { return errors.New("ALIASES_NOT_ENABLED") } - if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account", "Aliases"}); len(missing) != 0 { - return utils.NewErrMandatoryIeMissing(missing...) + var reverseAliases map[string]*engine.Alias + if err := aliases.GetReverseAlias(engine.AttrReverseAlias{Alias: tenantRatingSubject.Subject, Group: utils.ALIAS_GROUP_RP}, &reverseAliases); err != nil { + return utils.NewErrServerError(err) } - for _, alias := range attrs.Aliases { - var ignr string - if err := engine.GetAliasService().SetAlias( - engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Account: attrs.Account, Subject: utils.META_ANY, Group: utils.ALIAS_GROUP_ACC, - Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Alias: alias, Weight: 10.0}}}, &ignr); err != nil { + var ignr string + for _, alias := range reverseAliases { + if alias.Tenant != tenantRatingSubject.Tenant { + continue // From another tenant + } + if err := aliases.RemoveAlias(*alias, &ignr); err != nil { return utils.NewErrServerError(err) } } @@ -96,22 +86,51 @@ func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *strin return nil } -/* -// Retrieve aliases configured for a rating profile subject -func (self *ApierV1) RemAccountAliases(tenantAccount engine.TenantAccount, reply *string) error { - if engine.GetAliasService() == nil { - return errors.New("ALIASES_NOT_ENABLED") - } - if missing := utils.MissingStructFields(&tenantAccount, []string{"Tenant", "Account"}); len(missing) != 0 { +func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account", "Aliases"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } - if err := self.RatingDb.RemoveAccAliases([]*engine.TenantAccount{&tenantAccount}, false); err != nil { - if err == utils.ErrNotFound { - return err + if attrs.Category == "" { + attrs.Category = utils.CALL + } + aliases := engine.GetAliasService() + if aliases == nil { + return errors.New("ALIASES_NOT_ENABLED") + } + var ignr string + for _, alias := range attrs.Aliases { + if err := aliases.SetAlias( + engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: utils.META_ANY, Group: utils.ALIAS_GROUP_ACC, + Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Alias: attrs.Account, Weight: 10.0}}}, &ignr); err != nil { + return utils.NewErrServerError(err) + } + } + *reply = utils.OK + return nil +} + +// Remove aliases configured for an account +func (self *ApierV1) RemAccountAliases(tenantAccount engine.TenantAccount, reply *string) error { + if missing := utils.MissingStructFields(&tenantAccount, []string{"Tenant", "Account"}); len(missing) != 0 { + return utils.NewErrMandatoryIeMissing(missing...) + } + aliases := engine.GetAliasService() + if aliases == nil { + return errors.New("ALIASES_NOT_ENABLED") + } + var reverseAliases map[string]*engine.Alias + if err := aliases.GetReverseAlias(engine.AttrReverseAlias{Alias: tenantAccount.Account, Group: utils.ALIAS_GROUP_ACC}, &reverseAliases); err != nil { + return utils.NewErrServerError(err) + } + var ignr string + for _, alias := range reverseAliases { + if alias.Tenant != tenantAccount.Tenant { + continue // From another tenant + } + if err := aliases.RemoveAlias(*alias, &ignr); err != nil { + return utils.NewErrServerError(err) } - return utils.NewErrServerError(err) } *reply = utils.OK return nil } -*/ diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index eabab92a5..8d5650912 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -30,6 +30,7 @@ import ( "os/exec" "path" "reflect" + "sort" "strings" "testing" "time" @@ -109,6 +110,7 @@ func TestApierInitStorDb(t *testing.T) { } } +/* // Finds cgr-engine executable and starts it with default configuration func TestApierStartEngine(t *testing.T) { if !*testLocal { @@ -126,6 +128,7 @@ func TestApierStartEngine(t *testing.T) { } time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time to rater to fire up } +*/ // Connect rpc client to rater func TestApierRpcConn(t *testing.T) { @@ -1542,13 +1545,13 @@ func TestApierLocalSetDestination(t *testing.T) { } } -/* func TestApierLocalGetRatingSubjectAliases(t *testing.T) { if !*testLocal { return } - var subjAliases []string - if err := rater.Call("ApierV1.GetRatingSubjectAliases", engine.TenantRatingSubject{Tenant: "cgrates.org", Subject: "1001"}, &subjAliases); err == nil { + var alias engine.Alias + //al.Direction, al.Tenant, al.Category, al.Account, al.Subject, al.Group + if err := rater.Call("AliasesV1.GetAlias", engine.Alias{Group: utils.ALIAS_GROUP_RP, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "2001", Subject: "2001"}, &alias); err == nil { t.Error("Unexpected nil error received") } else if err.Error() != utils.ErrNotFound.Error() { t.Error("Unexpected error", err.Error()) @@ -1559,23 +1562,20 @@ func TestApierLocalAddRatingSubjectAliases(t *testing.T) { if !*testLocal { return } - addRtSubjAliases := &AttrAddRatingSubjectAliases{Tenant: "cgrates.org", Subject: "1001", Aliases: []string{"2001", "2002", "2003"}} + addRtSubjAliases := &AttrAddRatingSubjectAliases{Tenant: "cgrates.org", Category: "call", Subject: "1001", Aliases: []string{"2001", "2002", "2003"}} var rply string + fmt.Println("Before AddRatingSubjectAliases") if err := rater.Call("ApierV1.AddRatingSubjectAliases", addRtSubjAliases, &rply); err != nil { t.Error("Unexpected error", err.Error()) } else if rply != utils.OK { t.Error("Unexpected reply: ", rply) } - var subjAliases []string - expectSubjAliases := sort.StringSlice(addRtSubjAliases.Aliases) - expectSubjAliases.Sort() - if err := rater.Call("ApierV1.GetRatingSubjectAliases", engine.TenantRatingSubject{Tenant: "cgrates.org", Subject: "1001"}, &subjAliases); err != nil { - t.Error("Unexpected error", err.Error()) - } else { - subjAliases := sort.StringSlice(subjAliases) - subjAliases.Sort() - if !reflect.DeepEqual(expectSubjAliases, subjAliases) { - t.Errorf("Expecting: %v, received: %v", expectSubjAliases, subjAliases) + fmt.Println("After AddRatingSubjectAliases") + var alias engine.Alias + for _, als := range addRtSubjAliases.Aliases { + if err := rater.Call("AliasesV1.GetAlias", engine.Alias{Group: utils.ALIAS_GROUP_RP, Direction: "*out", Tenant: addRtSubjAliases.Tenant, Category: addRtSubjAliases.Category, + Account: als, Subject: als}, &alias); err != nil { + t.Error("Unexpected error", err.Error()) } } } @@ -1591,11 +1591,10 @@ func TestApierLocalRemRatingSubjectAliases(t *testing.T) { } else if rply != utils.OK { t.Error("Unexpected reply: ", rply) } - var subjAliases []string - if err := rater.Call("ApierV1.GetRatingSubjectAliases", engine.TenantRatingSubject{Tenant: "cgrates.org", Subject: "1001"}, &subjAliases); err == nil { - t.Error("Unexpected nil error received") - } else if err.Error() != utils.ErrNotFound.Error() { - t.Error("Unexpected error", err.Error()) + var alias engine.Alias + //al.Direction, al.Tenant, al.Category, al.Account, al.Subject, al.Group + if err := rater.Call("AliasesV1.GetAlias", engine.Alias{Group: utils.ALIAS_GROUP_RP, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "2001", Subject: "2001"}, &alias); err == nil || err != utils.ErrNotFound { + t.Errorf("Unexpected error %v, alias: %+v", err, alias) } } @@ -1612,7 +1611,6 @@ func TestApierLocalGetAccountAliases(t *testing.T) { } } - func TestApierLocalAddAccountAliases(t *testing.T) { if !*testLocal { return @@ -1656,7 +1654,6 @@ func TestApierLocalRemAccountAliases(t *testing.T) { t.Error("Unexpected error", err.Error()) } } -*/ func TestApierLocalGetScheduledActions(t *testing.T) { if !*testLocal { diff --git a/data/conf/samples/apier/apier.json b/data/conf/samples/apier/apier.json index 262abf177..6b80a486b 100644 --- a/data/conf/samples/apier/apier.json +++ b/data/conf/samples/apier/apier.json @@ -12,6 +12,7 @@ "rater": { "enabled": true, // enable Rater service: + "aliases": "internal" }, "scheduler": { @@ -23,6 +24,10 @@ "rater": "internal", // address where to reach the Rater for cost calculation, empty to disable functionality: <""|internal|x.y.z.y:1234> }, +"aliases": { + "enabled": true, // start the CDR Server service: +}, + "cdre": { "*default": { "export_dir": "/tmp/cgrates/cdr/cdrexport/csv", // path where the exported CDRs will be placed diff --git a/utils/consts.go b/utils/consts.go index cc5a07d0b..3f0f1f23d 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -225,6 +225,7 @@ const ( ALIAS_GROUP_RP = "*rating_profile" ALIAS_GROUP_ACC = "*account" NOT_AVAILABLE = "N/A" + CALL = "call" ) var (