From cd2befb083a5f9c91a67a06f41f4636e75586eee Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 24 Aug 2015 11:09:44 +0200 Subject: [PATCH] ApierV1.GetLoadHistory implementation, console load_history command --- apier/v1/apier.go | 30 ++++++++++++++++++- console/accounts.go | 4 +-- console/load_history.go | 66 +++++++++++++++++++++++++++++++++++++++++ engine/storage_redis.go | 7 +++-- 4 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 console/load_history.go diff --git a/apier/v1/apier.go b/apier/v1/apier.go index 6ea68ed0c..caf00b34e 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -1186,8 +1186,36 @@ func (self *ApierV1) RemoveRatingProfile(attr AttrRemoveRatingProfile, reply *st }, "RemoveRatingProfile") if err != nil { *reply = err.Error() - return err + return utils.NewErrServerError(err) } *reply = utils.OK return nil } + +func (self *ApierV1) GetLoadHistory(attrs utils.Paginator, reply *[]*engine.LoadInstance) error { + nrItems := -1 + offset := 0 + if attrs.Offset != nil { // For offset we need full data + offset = *attrs.Offset + } else if attrs.Limit != nil { + nrItems = *attrs.Limit + } + loadHist, err := self.AccountDb.GetLoadHistory(nrItems, true) + if err != nil { + return utils.NewErrServerError(err) + } + if attrs.Offset != nil && attrs.Limit != nil { // Limit back to original + nrItems = *attrs.Limit + } + if len(loadHist) == 0 || len(loadHist) <= offset || nrItems == 0 { + return utils.ErrNotFound + } + if offset != 0 { + nrItems = offset + nrItems + } + if nrItems == -1 || nrItems > len(loadHist) { // So we can use it in indexing bellow + nrItems = len(loadHist) + } + *reply = loadHist[offset:nrItems] + return nil +} diff --git a/console/accounts.go b/console/accounts.go index 79fdf6beb..0e7ce79f9 100644 --- a/console/accounts.go +++ b/console/accounts.go @@ -1,6 +1,6 @@ /* -Rating system designed to be used in VoIP Carriers World -Copyright (C) 2012-2015 ITsysCOM +Real-time Charging System for Telecom & ISP environments +Copyright (C) 2012-2015 ITsysCOM GmbH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/console/load_history.go b/console/load_history.go new file mode 100644 index 000000000..fc4976059 --- /dev/null +++ b/console/load_history.go @@ -0,0 +1,66 @@ +/* +Real-time Charging System for Telecom & ISP environments +Copyright (C) 2012-2015 ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package console + +import ( + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +func init() { + c := &CmdGetLoadHistory{ + name: "load_history", + rpcMethod: "ApierV1.GetLoadHistory", + rpcParams: new(utils.Paginator), + } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} +} + +// Returns the list of load items from the history, in reverse order +type CmdGetLoadHistory struct { + name string + rpcMethod string + rpcParams *utils.Paginator + *CommandExecuter +} + +func (self *CmdGetLoadHistory) Name() string { + return self.name +} + +func (self *CmdGetLoadHistory) RpcMethod() string { + return self.rpcMethod +} + +func (self *CmdGetLoadHistory) RpcParams(reset bool) interface{} { + if reset || self.rpcParams == nil { + self.rpcParams = new(utils.Paginator) + } + return self.rpcParams +} + +func (self *CmdGetLoadHistory) PostprocessRpcParams() error { + return nil +} + +func (self *CmdGetLoadHistory) RpcResult() interface{} { + a := make([]*engine.LoadInstance, 0) + return &a +} diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 5acfd20e6..1eeda1d2a 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -706,13 +706,16 @@ func (rs *RedisStorage) GetLoadHistory(limit int, skipCache bool) ([]*LoadInstan return nil, err } else { items := x.([]*LoadInstance) - if len(items) < limit { + if len(items) < limit || limit == -1 { return items, nil } return items[:limit], nil } } - marshaleds, err := rs.db.Lrange(utils.LOADINST_KEY, 0, limit-1) + if limit != -1 { + limit -= -1 // Decrease limit to match redis approach on lrange + } + marshaleds, err := rs.db.Lrange(utils.LOADINST_KEY, 0, limit) if err != nil { return nil, err }