diff --git a/apier/v1/aliases.go b/apier/v1/aliases.go
index a0feea2b6..19be1c7a6 100644
--- a/apier/v1/aliases.go
+++ b/apier/v1/aliases.go
@@ -18,94 +18,9 @@ along with this program. If not, see
package v1
-/*
import (
- "github.com/cgrates/cgrates/engine"
- "github.com/cgrates/cgrates/utils"
-)
+ "errors"
-type AttrGetTPAlias struct {
- TPid string
- Direction string
- Tenant string
- Category string
- Account string
- Subject string
- Group string
-}
-
-// Creates a new alias within a tariff plan
-func (self *ApierV1) SetTPAlias(attrs AttrGetTPAlias, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Direction", "Tenant", "Category", "Account", "Subject", "Group"}); len(missing) != 0 {
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- tm := engine.APItoModelTiming(&attrs)
- if err := self.StorDb.SetTpAliases([]engine.TpAlias{*tm}); err != nil {
- return utils.NewErrServerError(err)
- }
- *reply = "OK"
- return nil
-}
-
-type AttrGetTPAlias struct {
- TPid string // Tariff plan id
- AliasId string // Alias id
-}
-
-// Queries specific Alias on Tariff plan
-func (self *ApierV1) GetTPAlias(attrs AttrGetTPAlias, reply *utils.ApierTPAlias) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "AliasId"}); len(missing) != 0 { //Params missing
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- if tms, err := self.StorDb.GetTpAliases(attrs.TPid, attrs.AliasId); err != nil {
- return utils.NewErrServerError(err)
- } else if len(tms) == 0 {
- return utils.ErrNotFound
- } else {
- tmMap, err := engine.TpAliases(tms).GetApierAliases()
- if err != nil {
- return err
- }
- *reply = *tmMap[attrs.AliasId]
- }
- return nil
-}
-
-type AttrGetTPAliasIds struct {
- TPid string // Tariff plan id
- utils.Paginator
-}
-
-// Queries alias identities on specific tariff plan.
-func (self *ApierV1) GetTPAliasIds(attrs AttrGetTPAliasIds, reply *[]string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- if ids, err := self.StorDb.GetTpTableIds(attrs.TPid, utils.TBL_TP_TIMINGS, utils.TPDistinctIds{"tag"}, nil, &attrs.Paginator); err != nil {
- return utils.NewErrServerError(err)
- } else if ids == nil {
- return utils.ErrNotFound
- } else {
- *reply = ids
- }
- return nil
-}
-
-// Removes specific Alias on Tariff plan
-func (self *ApierV1) RemTPAlias(attrs AttrGetTPAlias, reply *string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"TPid", "AliasId"}); len(missing) != 0 { //Params missing
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- if err := self.StorDb.RemTpData(utils.TBL_TP_TIMINGS, attrs.TPid, attrs.AliasId); err != nil {
- return utils.NewErrServerError(err)
- } else {
- *reply = "OK"
- }
- return nil
-}
-*/
-/*
-import (
"github.com/cgrates/cgrates/engine"
"github.com/cgrates/cgrates/utils"
)
@@ -122,40 +37,30 @@ type AttrAddAccountAliases struct {
// Retrieve 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...)
}
- aliasesChanged := []string{}
for _, alias := range attrs.Aliases {
- if err := self.RatingDb.SetRpAlias(utils.RatingSubjectAliasKey(attrs.Tenant, alias), attrs.Subject); err != nil {
+ 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 {
return utils.NewErrServerError(err)
}
- aliasesChanged = append(aliasesChanged, utils.RP_ALIAS_PREFIX+utils.RatingSubjectAliasKey(attrs.Tenant, alias))
- }
- if err := self.RatingDb.CachePrefixValues(map[string][]string{utils.RP_ALIAS_PREFIX: aliasesChanged}); err != nil {
- return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
}
-// Retrieve aliases configured for a rating profile subject
-func (self *ApierV1) GetRatingSubjectAliases(attrs engine.TenantRatingSubject, reply *[]string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Subject"}); len(missing) != 0 {
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- if aliases, err := self.RatingDb.GetRPAliases(attrs.Tenant, attrs.Subject, false); err != nil {
- return utils.NewErrServerError(err)
- } else if len(aliases) == 0 { // Need it since otherwise we get some unexpected errrors in the client
- return utils.ErrNotFound
- } else {
- *reply = aliases
- }
- return nil
-}
-
+/*
// Retrieve 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...)
}
@@ -170,42 +75,33 @@ func (self *ApierV1) RemRatingSubjectAliases(tenantRatingSubject engine.TenantRa
*reply = utils.OK
return nil
}
+*/
func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *string) error {
+ if engine.GetAliasService() == nil {
+ return errors.New("ALIASES_NOT_ENABLED")
+ }
if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account", "Aliases"}); len(missing) != 0 {
return utils.NewErrMandatoryIeMissing(missing...)
}
- aliasesChanged := []string{}
for _, alias := range attrs.Aliases {
- if err := self.RatingDb.SetAccAlias(utils.AccountAliasKey(attrs.Tenant, alias), attrs.Account); err != nil {
+ 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 {
return utils.NewErrServerError(err)
}
- aliasesChanged = append(aliasesChanged, utils.ACC_ALIAS_PREFIX+utils.AccountAliasKey(attrs.Tenant, alias))
- }
- if err := self.RatingDb.CachePrefixValues(map[string][]string{utils.ACC_ALIAS_PREFIX: aliasesChanged}); err != nil {
- return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
}
-// Retrieve aliases configured for an account
-func (self *ApierV1) GetAccountAliases(attrs engine.TenantAccount, reply *[]string) error {
- if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account"}); len(missing) != 0 {
- return utils.NewErrMandatoryIeMissing(missing...)
- }
- if aliases, err := self.RatingDb.GetAccountAliases(attrs.Tenant, attrs.Account, false); err != nil {
- return utils.NewErrServerError(err)
- } else if len(aliases) == 0 {
- return utils.ErrNotFound
- } else {
- *reply = aliases
- }
- 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 {
return utils.NewErrMandatoryIeMissing(missing...)
}
diff --git a/cmd/cgr-engine/rater.go b/cmd/cgr-engine/rater.go
index 77ab2902b..fbbfd6730 100644
--- a/cmd/cgr-engine/rater.go
+++ b/cmd/cgr-engine/rater.go
@@ -20,7 +20,6 @@ package main
import (
"fmt"
- "sync"
"github.com/cgrates/cgrates/apier/v1"
"github.com/cgrates/cgrates/apier/v2"
@@ -45,12 +44,13 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
server *engine.Server,
ratingDb engine.RatingStorage, accountDb engine.AccountingStorage, loadDb engine.LoadStorage, cdrDb engine.CdrStorage, logDb engine.LogStorage,
stopHandled *bool, exitChan chan bool) {
- var wg sync.WaitGroup // Sync all external connections in a group
+ waitTasks := make([]chan struct{}, 0)
- // Cache data
- wg.Add(1)
+ //Cache load
+ cacheTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, cacheTaskChan)
go func() {
- defer wg.Done()
+ defer close(cacheTaskChan)
if err := ratingDb.CacheRatingAll(); err != nil {
engine.Logger.Crit(fmt.Sprintf("Cache rating error: %s", err.Error()))
exitChan <- true
@@ -61,25 +61,29 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
exitChan <- true
return
}
+
}()
// Retrieve scheduler for it's API methods
var sched *scheduler.Scheduler // Need the scheduler in APIer
if cfg.SchedulerEnabled {
- wg.Add(1)
+ schedTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, schedTaskChan)
go func() {
- defer wg.Done()
+ defer close(schedTaskChan)
sched = <-internalSchedulerChan
internalSchedulerChan <- sched
+
}()
}
// Connection to balancer
var bal *balancer2go.Balancer
if cfg.RaterBalancer != "" {
- wg.Add(1)
+ balTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, balTaskChan)
go func() {
- defer wg.Done()
+ defer close(balTaskChan)
if cfg.RaterBalancer == utils.INTERNAL {
bal = <-internalBalancerChan
internalBalancerChan <- bal // Put it back if someone else is interested about
@@ -94,9 +98,10 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
// Connection to CDRStats
var cdrStats engine.StatsInterface
if cfg.RaterCdrStats != "" {
- wg.Add(1)
+ cdrstatTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, cdrstatTaskChan)
go func() {
- defer wg.Done()
+ defer close(cdrstatTaskChan)
if cfg.RaterCdrStats == utils.INTERNAL {
cdrStats = <-internalCdrStatSChan
internalCdrStatSChan <- cdrStats
@@ -110,9 +115,10 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
// Connection to HistoryS
if cfg.RaterHistoryServer != "" {
- wg.Add(1)
+ histTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, histTaskChan)
go func() {
- defer wg.Done()
+ defer close(histTaskChan)
var scribeServer history.Scribe
if cfg.RaterHistoryServer == utils.INTERNAL {
scribeServer = <-internalHistorySChan
@@ -128,9 +134,10 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
// Connection to pubsubs
if cfg.RaterPubSubServer != "" {
- wg.Add(1)
+ pubsubTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, pubsubTaskChan)
go func() {
- defer wg.Done()
+ defer close(pubsubTaskChan)
var pubSubServer engine.PublisherSubscriber
if cfg.RaterPubSubServer == utils.INTERNAL {
pubSubServer = <-internalPubSubSChan
@@ -146,9 +153,10 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
// Connection to AliasService
if cfg.RaterAliasesServer != "" {
- wg.Add(1)
+ aliasesTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, aliasesTaskChan)
go func() {
- defer wg.Done()
+ defer close(aliasesTaskChan)
var aliasesServer engine.AliasService
if cfg.RaterAliasesServer == utils.INTERNAL {
aliasesServer = <-internalAliaseSChan
@@ -165,9 +173,10 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
// Connection to UserService
var userServer engine.UserService
if cfg.RaterUserServer != "" {
- wg.Add(1)
+ usersTaskChan := make(chan struct{})
+ waitTasks = append(waitTasks, usersTaskChan)
go func() {
- defer wg.Done()
+ defer close(usersTaskChan)
if cfg.RaterUserServer == utils.INTERNAL {
userServer = <-internalUserSChan
internalUserSChan <- userServer
@@ -181,7 +190,9 @@ func startRater(internalRaterChan chan *engine.Responder, internalBalancerChan c
}
// Wait for all connections to complete before going further
- wg.Wait()
+ for _, chn := range waitTasks {
+ <-chn
+ }
responder := &engine.Responder{Bal: bal, ExitChan: exitChan, Stats: cdrStats}
apierRpcV1 := &v1.ApierV1{StorDb: loadDb, RatingDb: ratingDb, AccountDb: accountDb, CdrDb: cdrDb, LogDb: logDb, Sched: sched,
diff --git a/data/conf/samples/tutlocal/cgrates.json b/data/conf/samples/tutlocal/cgrates.json
index 7cb87a87b..14e933058 100644
--- a/data/conf/samples/tutlocal/cgrates.json
+++ b/data/conf/samples/tutlocal/cgrates.json
@@ -13,8 +13,8 @@
"rater": {
"enabled": true, // enable Rater service:
"cdrstats": "internal", // address where to reach the cdrstats service, empty to disable stats functionality<""|internal|x.y.z.y:1234>
- "pubsubs": "internal", // address where to reach the pubusb service, empty to disable pubsub functionality: <""|internal|x.y.z.y:1234>
- "users": "internal", // address where to reach the user service, empty to disable user profile functionality: <""|internal|x.y.z.y:1234>
+ "pubsubs": "internal", // address where to reach the pubusb service, empty to disable pubsub functionality: <""|internal|x.y.z.y:1234>
+ "users": "internal", // address where to reach the user service, empty to disable user profile functionality: <""|internal|x.y.z.y:1234>
},
"scheduler": {
diff --git a/engine/aliases.go b/engine/aliases.go
index 6735bf0f5..9fdb41a3e 100644
--- a/engine/aliases.go
+++ b/engine/aliases.go
@@ -10,6 +10,11 @@ import (
"github.com/cgrates/rpcclient"
)
+// Temporary export AliasService for the ApierV1 to be able to emulate old APIs
+func GetAliasService() AliasService {
+ return aliasService
+}
+
type Alias struct {
Direction string
Tenant string
diff --git a/utils/consts.go b/utils/consts.go
index bd9819c27..42548a621 100644
--- a/utils/consts.go
+++ b/utils/consts.go
@@ -155,6 +155,8 @@ const (
NANOSECONDS = "nanoseconds"
SECONDS = "seconds"
OUT = "*out"
+ META_OUT = "*out"
+ META_ANY = "*any"
CDR_IMPORT = "cdr_import"
CDR_EXPORT = "cdr_export"
CDRFIELD = "cdrfield"