misc
diff --git a/api.go b/api.go
index f72ec1b..cebd66b 100644
--- a/api.go
+++ b/api.go
@@ -2,6 +2,7 @@
import (
"encoding/json"
+ "fmt"
"github.com/30x/apid-core"
"github.com/30x/apidQuota/constants"
"github.com/30x/apidQuota/globalVariables"
@@ -9,26 +10,16 @@
"github.com/30x/apidQuota/util"
"io/ioutil"
"net/http"
- "strconv"
)
func InitAPI(services apid.Services) {
- globalVariables.Log.Debug("initialized API's exposed by apidQuota plugin")
+ globalVariables.Log.Debug("initializing apidQuota plugin APIs")
quotaBasePath := globalVariables.Config.GetString(constants.ConfigQuotaBasePath)
- services.API().HandleFunc(quotaBasePath, getAllQuotaValues).Methods("GET") //yet to implement.
- services.API().HandleFunc(quotaBasePath+"/{quotaItentifier}", incrementAndCheckQuotaLimit).Methods("POST")
+ services.API().HandleFunc(quotaBasePath, checkQuotaLimitExceeded).Methods("POST")
}
-func getAllQuotaValues(res http.ResponseWriter, req *http.Request) {
- stringbytes := []byte("yet to implement")
- res.Header().Set("Content-Type", "application/json")
- res.WriteHeader(http.StatusOK)
- res.Write(stringbytes)
-
-}
-
-func incrementAndCheckQuotaLimit(res http.ResponseWriter, req *http.Request) {
+func checkQuotaLimitExceeded(res http.ResponseWriter, req *http.Request) {
bodyBytes, err := ioutil.ReadAll(req.Body)
defer req.Body.Close()
@@ -42,24 +33,26 @@
util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req)
return
}
- globalVariables.Log.Println("quotaBucketMap from request: ", quotaBucketMap)
- // parse the request body into the Event struct
+ // parse the request body into the QuotaBucket struct
qBucket := new(quotaBucket.QuotaBucket)
if err = qBucket.FromAPIRequest(quotaBucketMap); err != nil {
util.WriteErrorResponse(http.StatusBadRequest, constants.ErrorConvertReqBodyToEntity, err.Error(), res, req)
return
}
- quotaCount, err := qBucket.GetQuotaCount()
+ results, err := qBucket.IncrementQuotaLimit()
if err != nil {
util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req)
return
}
- stringbytes := []byte(strconv.Itoa(quotaCount))
+ respMap := results.ToAPIResponse()
+ fmt.Println("results from inc quota: ", results)
+ respbytes, err := json.Marshal(respMap)
+
res.Header().Set("Content-Type", "application/json")
res.WriteHeader(http.StatusOK)
- res.Write(stringbytes)
+ res.Write(respbytes)
}
diff --git a/init.go b/init.go
index 66e0a40..8938f9a 100644
--- a/init.go
+++ b/init.go
@@ -1,32 +1,20 @@
package apidQuota
import (
+ "fmt"
"github.com/30x/apid-core"
"github.com/30x/apidQuota/constants"
"github.com/30x/apidQuota/globalVariables"
+ "reflect"
)
func init() {
apid.RegisterPlugin(initPlugin)
- initCounterService()
-}
-
-// set config for counter service.
-func initCounterService() {
- //counterBasePath := globalVariables.Config.Get(constants.ConfigCounterServiceBasePath)
- //fmt.Println("counterBasePath: ", counterBasePath , "//")
- /*if counterBasePath != nil {
- if reflect.TypeOf(counterBasePath).Kind() != reflect.String{
- globalVariables.Log.Fatal("value of: " + constants.ConfigCounterServiceBasePath + " in the config should be string")
- }
- globalVariables.CounterServiceURL = counterBasePath.(string)
- }*/
- globalVariables.CounterServiceURL = "http://54.86.114.219:8989/increment"
}
func initPlugin(services apid.Services) (apid.PluginData, error) {
globalVariables.Log = services.Log().ForModule("apidQuota")
- globalVariables.Log.Debug("start init")
+ globalVariables.Log.Debug("start init for apidQuota")
setConfig(services)
InitAPI(services)
@@ -40,4 +28,14 @@
// set plugin config defaults
globalVariables.Config.SetDefault(constants.ConfigQuotaBasePath, constants.QuotaBasePathDefault)
+ counterServiceBasePath := globalVariables.Config.Get(constants.ConfigCounterServiceBasePath)
+ fmt.Println("counterBasePath: ", counterServiceBasePath, "//")
+ if counterServiceBasePath != nil {
+ if reflect.TypeOf(counterServiceBasePath).Kind() != reflect.String {
+ globalVariables.Log.Fatal("value of: " + constants.ConfigCounterServiceBasePath + " in the config should be string")
+ }
+ globalVariables.CounterServiceURL = counterServiceBasePath.(string)
+ }
+ globalVariables.CounterServiceURL = "http://54.86.114.219:8989/increment" //todo: comment it once the above code works.
+
}
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
index c29e427..5515271 100644
--- a/quotaBucket/apiUtil.go
+++ b/quotaBucket/apiUtil.go
@@ -2,18 +2,25 @@
import (
"errors"
- "fmt"
"reflect"
)
+type QuotaBucketResults struct {
+ EdgeOrgID string
+ ID string
+ exceededTokens bool
+ allowedTokens int64
+ MaxCount int64
+ startedAt int64
+ expiresAt int64
+}
+
func (qBucket *QuotaBucket) FromAPIRequest(quotaBucketMap map[string]interface{}) error {
var edgeOrgID, id, timeUnit, quotaType, bucketType string
- var interval, maxCount int
- var startTime int64
+ var interval int
+ var startTime, maxCount, weight int64
var preciseAtSecondsLevel bool
- fmt.Println("quotaBucketMap: ", quotaBucketMap)
-
value, ok := quotaBucketMap["edgeOrgID"]
if !ok {
return errors.New(`missing field: 'edgeOrgID' is required`)
@@ -22,7 +29,6 @@
return errors.New(`invalid type : 'edgeOrgID' should be a string`)
}
edgeOrgID = value.(string)
- //fmt.Println("edgeOrgID: ", edgeOrgID)
value, ok = quotaBucketMap["id"]
if !ok {
@@ -32,7 +38,6 @@
return errors.New(`invalid type : 'id' should be a string`)
}
id = value.(string)
- //fmt.Println("id: ", id)
value, ok = quotaBucketMap["interval"]
if !ok {
@@ -44,7 +49,6 @@
}
intervalFloat := value.(float64)
interval = int(intervalFloat)
- //fmt.Println("interval: ", interval)
//TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH}
value, ok = quotaBucketMap["timeUnit"]
@@ -55,7 +59,6 @@
return errors.New(`invalid type : 'timeUnit' should be a string`)
}
timeUnit = value.(string)
- //fmt.Println("timeUnit: ", timeUnit)
//Type {CALENDAR, FLEXI, ROLLING_WINDOW}
value, ok = quotaBucketMap["quotaType"]
@@ -66,7 +69,6 @@
return errors.New(`invalid type : 'quotaType' should be a string`)
}
quotaType = value.(string)
- //fmt.Println("quotaType: ", quotaType)
value, ok = quotaBucketMap["preciseAtSecondsLevel"]
if !ok {
@@ -76,7 +78,6 @@
return errors.New(`invalid type : 'preciseAtSecondsLevel' should be boolean`)
}
preciseAtSecondsLevel = value.(bool)
- //fmt.Println("preciseAtSecondsLevel: ", preciseAtSecondsLevel)
value, ok = quotaBucketMap["startTime"]
if !ok {
@@ -88,7 +89,6 @@
}
startTimeFloat := value.(float64)
startTime = int64(startTimeFloat)
- //fmt.Println("startTime: ", startTime)
value, ok = quotaBucketMap["maxCount"]
if !ok {
@@ -99,8 +99,7 @@
return errors.New(`invalid type : 'maxCount' should be a number`)
}
maxCountFloat := value.(float64)
- maxCount = int(maxCountFloat)
- //fmt.Println("maxCount: ", maxCount)
+ maxCount = int64(maxCountFloat)
value, ok = quotaBucketMap["bucketType"]
if !ok {
@@ -110,9 +109,20 @@
return errors.New(`invalid type : 'bucketType' should be a string`)
}
bucketType = value.(string)
- //fmt.Println("bucketType: ", bucketType)
- newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ value, ok = quotaBucketMap["weight"]
+ if !ok {
+ return errors.New(`missing field: 'weight' is required`)
+ }
+ //from input when its read its float, need to then convert to int.
+ if weightType := reflect.TypeOf(value); weightType.Kind() != reflect.Float64 {
+ return errors.New(`invalid type : 'maxCount' should be a number`)
+ }
+ weightFloat := value.(float64)
+ weight = int64(weightFloat)
+
+
+ newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
if err != nil {
return errors.New("error creating newquotaBucket: " + err.Error())
@@ -127,3 +137,17 @@
return nil
}
+
+func (qBucketResults *QuotaBucketResults) ToAPIResponse() (map[string]interface{}) {
+ resultsMap := make(map[string]interface{})
+ resultsMap["edgeOrgID"] = qBucketResults.ID
+ resultsMap["id"] = qBucketResults.ID
+ resultsMap["exceededTokens"] = qBucketResults.exceededTokens
+ resultsMap["allowedTokens"] = qBucketResults.allowedTokens
+ resultsMap["MaxCount"] = qBucketResults.MaxCount
+ resultsMap["startedAt"] = qBucketResults.startedAt
+ resultsMap["expiresAt"] = qBucketResults.expiresAt
+
+
+ return resultsMap
+}
\ No newline at end of file
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
index 119482b..871baa5 100644
--- a/quotaBucket/quotaBucket.go
+++ b/quotaBucket/quotaBucket.go
@@ -92,8 +92,9 @@
PreciseAtSecondsLevel bool
Period QuotaPeriod
StartTime time.Time
- MaxCount int
+ MaxCount int64
BucketType string // SyncDistributed, AsyncDistributed, NonDistributed
+ Weight int64
}
type QuotaBucket struct {
@@ -102,7 +103,7 @@
func NewQuotaBucket(edgeOrgID string, id string, interval int,
timeUnit string, quotaType string, preciseAtSecondsLevel bool,
- startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) {
+ startTime int64, maxCount int64, bucketType string, weight int64) (*QuotaBucket, error) {
fromUNIXTime := time.Unix(startTime, 0)
@@ -116,6 +117,7 @@
StartTime: fromUNIXTime,
MaxCount: maxCount,
BucketType: bucketType,
+ Weight: weight,
}
quotaBucket := &QuotaBucket{
@@ -196,8 +198,9 @@
if err != nil {
return nil, err
}
+
//setCurrentPeriod if endTime > time.now()
- if period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) {
+ if period == nil || period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) {
if err := q.setCurrentPeriod(); err != nil {
return nil, err
}
@@ -218,7 +221,7 @@
return &q.quotaBucketData.Period, nil
}
-func (q *QuotaBucket) GetMaxCount() int {
+func (q *QuotaBucket) GetMaxCount() int64 {
return q.quotaBucketData.MaxCount
}
@@ -226,6 +229,10 @@
return q.quotaBucketData.BucketType
}
+func (q *QuotaBucket) GetBucketWeight() int64 {
+ return q.quotaBucketData.Weight
+}
+
func (q *QuotaBucket) SetPeriod(startTime time.Time, endTime time.Time) {
period := QuotaPeriod{inputStartTime: q.GetStartTime(),
startTime: startTime,
@@ -260,28 +267,69 @@
return false
}
-func (q *QuotaBucket) GetQuotaCount() (int, error) {
- err := q.setCurrentPeriod()
- if err != nil {
- return 0, errors.New("error setCurrentPeriod(): " + err.Error())
- }
+func (q *QuotaBucket) IncrementQuotaLimit() (*QuotaBucketResults, error) {
+ maxCount := q.GetMaxCount()
+ exceededCount := false
+ allowedCount := int64(0)
+ weight := q.GetBucketWeight()
period, err := q.GetPeriod()
if err != nil {
- return 0, errors.New("error getting period: " + err.Error())
+ return nil, errors.New("error getting period: " + err.Error())
}
- fmt.Println("period set: ", period)
+ fmt.Println("period set, start time: ", period.GetPeriodStartTime().String(), " end time: ", period.GetPeriodEndTime().String())
- resp, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0)
+ //first retrieve the count from counter service.
+ currentCount, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0, period.GetPeriodStartTime().Unix(), period.GetPeriodEndTime().Unix())
if err != nil {
- return 0, err
+ return nil, err
}
- return resp, nil
-}
+ fmt.Println("startTime get period : ", period.GetPeriodStartTime().String())
+ fmt.Println("endTime get period : ", period.GetPeriodEndTime().String())
-func (q *QuotaBucket) IncrementQuota() (int, error) {
- //todo
- return 0, nil
+ if period.IsCurrentPeriod(q) {
+
+ if currentCount < maxCount {
+ allowed := maxCount - currentCount
+
+ if allowed > weight {
+
+ if weight != 0 {
+
+ currentCount, err = services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), weight, period.GetPeriodStartTime().Unix(), period.GetPeriodEndTime().Unix())
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ allowedCount = currentCount + weight
+ } else {
+
+ if weight != 0 {
+
+ exceededCount = true
+ }
+ allowedCount = currentCount + weight
+ }
+ } else {
+
+ exceededCount = true
+ allowedCount = currentCount
+ }
+ }
+
+ results := &QuotaBucketResults{
+ EdgeOrgID : q.GetEdgeOrgID(),
+ ID : q.GetID(),
+ exceededTokens : exceededCount,
+ allowedTokens : allowedCount,
+ MaxCount : maxCount,
+ startedAt : period.GetPeriodStartTime().Unix(),
+ expiresAt : period.GetPeriodEndTime().Unix(),
+
+ }
+
+ return results, nil
}
func IsValidTimeUnit(timeUnit string) bool {
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go
index 4d1e166..3adfce6 100644
--- a/quotaBucket/quotaBucket_test.go
+++ b/quotaBucket/quotaBucket_test.go
@@ -95,11 +95,12 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -132,11 +133,12 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
quotaBucket.SetPeriod(time.Now().UTC().UTC().AddDate(0, 1, 0), time.Now().AddDate(0, 0, -1))
@@ -157,10 +159,11 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).To(HaveOccurred())
if !strings.Contains(err.Error(), InvalidQuotaTimeUnitType) {
@@ -179,11 +182,12 @@
quotaType := "calendar"
bucketType := "invalidQuotaBucket"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -206,12 +210,13 @@
quotaType := "rollingwindow"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
//InputStart time is before now
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
Expect(err).NotTo(HaveOccurred())
@@ -226,7 +231,7 @@
//InputStart time is now
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
Expect(err).NotTo(HaveOccurred())
@@ -249,12 +254,13 @@
quotaType := "rollingwindow"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
//InputStart time is after now.
startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -269,7 +275,7 @@
//endTime before startTime in period
startTime = time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0))
@@ -286,13 +292,14 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
//InputStart time is before now
startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -308,7 +315,7 @@
//InputStart time is now
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -325,7 +332,7 @@
//start Time in period is before now
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -344,7 +351,7 @@
//start Time in period is now
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -379,7 +386,7 @@
//end Time in period is after now
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -399,7 +406,7 @@
//start time in period is before end time
startTime = time.Now().UTC().Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -425,7 +432,8 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
//InputStart time is after now.
@@ -433,7 +441,7 @@
time.Now().UTC().AddDate(0, 1, 0).Unix(), time.Now().AddDate(1, 0, 1).Unix())
startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -445,7 +453,7 @@
//endTime is before start time
startTime = time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -482,11 +490,12 @@
quotaType := "rollingwindow"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
//InputStart time is before now
startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), time.Now().UTC().AddDate(0, 1, 0))
@@ -508,7 +517,7 @@
quotaType = "calendar"
pstartTime := time.Now().UTC().AddDate(0, -1, 0)
pendTime := time.Now().UTC().AddDate(0, 1, 0)
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
quotaBucket.SetPeriod(pstartTime, pendTime)
@@ -524,7 +533,7 @@
quotaType = "calendar"
pstartTime = time.Now().UTC().AddDate(0, -1, 0)
pendTime = time.Now().UTC().AddDate(0, -1, 0)
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
quotaBucket.SetPeriod(pstartTime, pendTime)
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go
index 87e8f0c..8dec92c 100644
--- a/quotaBucket/quotaDescriptorType.go
+++ b/quotaBucket/quotaDescriptorType.go
@@ -144,7 +144,7 @@
return currentEnd.Sub(currentStart), nil
case QuotaTypeRollingWindow:
currentEnd = now
- currentStart = currentEnd.AddDate(0, -qb.Interval, 0)
+ currentStart = currentEnd.AddDate(0, (-1)*qb.Interval, 0)
return currentEnd.Sub(currentStart), nil
default:
return time.Duration(0), errors.New(InvalidQuotaDescriptorType + " : ignoring unrecognized quotaType : " + quotaType)
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go
index 5c83148..30c7c68 100644
--- a/quotaBucket/quotaDescriptorType_test.go
+++ b/quotaBucket/quotaDescriptorType_test.go
@@ -4,17 +4,16 @@
. "github.com/30x/apidQuota/quotaBucket"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
- "time"
- "strings"
"reflect"
+ "strings"
+ "time"
)
-
var _ = Describe("Check Descriptor Type ", func() {
It("test Calendar Type descriptor", func() {
descriptorType, err := GetQuotaDescriptorTypeHandler("calendar")
Expect(err).NotTo(HaveOccurred())
- if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&CalendarQuotaDescriptorType{}){
+ if reflect.TypeOf(descriptorType) != reflect.TypeOf(&CalendarQuotaDescriptorType{}) {
Fail("Excepted CalendarQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
}
})
@@ -22,7 +21,7 @@
It("test RollingWindow Type descriptor", func() {
descriptorType, err := GetQuotaDescriptorTypeHandler("rollingwindow")
Expect(err).NotTo(HaveOccurred())
- if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&RollingWindowQuotaDescriptorType{}){
+ if reflect.TypeOf(descriptorType) != reflect.TypeOf(&RollingWindowQuotaDescriptorType{}) {
Fail("Excepted RollingWindowQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
}
})
@@ -46,11 +45,13 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
+
preciseAtSecondsLevel := true
startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -68,11 +69,10 @@
intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Second))
-
// test set period for timeUnit=minute
timeUnit = "minute"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -93,7 +93,7 @@
// test set period for timeUnit=hour
timeUnit = "hour"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -111,11 +111,10 @@
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Hour))
-
// test set period for timeUnit=day
timeUnit = "day"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -136,7 +135,7 @@
// test set period for timeUnit=week
timeUnit = "week"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -154,11 +153,10 @@
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour))
-
// test set period for timeUnit=month
timeUnit = "month"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -174,7 +172,7 @@
Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
- addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0)
+ addMonthToStartDate := period.GetPeriodStartTime().AddDate(0, interval*1, 0)
actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(actualDuration))
@@ -189,11 +187,12 @@
quotaType := "calendar"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -211,13 +210,12 @@
intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Second))
-
// test set period for timeUnit=month
timeUnit = "invalidTimeUnit"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).To(HaveOccurred())
- if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+ if ok := strings.Contains(err.Error(), InvalidQuotaTimeUnitType); !ok {
Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error())
}
@@ -232,11 +230,12 @@
quotaType := "rollingWindow"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -254,11 +253,10 @@
intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Second))
-
// test set period for timeUnit=minute
timeUnit = "minute"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -279,7 +277,7 @@
// test set period for timeUnit=hour
timeUnit = "hour"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -297,11 +295,10 @@
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Hour))
-
// test set period for timeUnit=day
timeUnit = "day"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -322,7 +319,7 @@
// test set period for timeUnit=week
timeUnit = "week"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -340,11 +337,10 @@
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour))
-
// test set period for timeUnit=month
timeUnit = "month"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -360,8 +356,8 @@
Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
- addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0)
- actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime())
+ subMonthToEndtDate := period.GetPeriodEndTime().AddDate(0, -interval*1, 0)
+ actualDuration := period.GetPeriodEndTime().Sub(subMonthToEndtDate)
Expect(intervalDuration).Should(Equal(actualDuration))
})
@@ -375,11 +371,12 @@
quotaType := "rollingwindow"
bucketType := "synchronous"
interval := 1
- maxCount := 10
+ maxCount := int64(10)
+ weight := int64(1)
preciseAtSecondsLevel := true
startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
- quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).NotTo(HaveOccurred())
err = quotaBucket.Validate()
@@ -397,15 +394,14 @@
intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
Expect(intervalDuration).Should(Equal(time.Second))
-
// test set period for timeUnit=month
timeUnit = "invalidTimeUnit"
- quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+ quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
Expect(err).To(HaveOccurred())
- if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+ if ok := strings.Contains(err.Error(), InvalidQuotaTimeUnitType); !ok {
Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error())
}
})
-})
\ No newline at end of file
+})
diff --git a/services/counterServiceHelper.go b/services/counterServiceHelper.go
index 8568d8d..1f08a6b 100644
--- a/services/counterServiceHelper.go
+++ b/services/counterServiceHelper.go
@@ -4,6 +4,7 @@
"bytes"
"encoding/json"
"errors"
+ "fmt"
"github.com/30x/apidQuota/constants"
"github.com/30x/apidQuota/globalVariables"
"io/ioutil"
@@ -23,7 +24,7 @@
Timeout: time.Duration(60 * time.Second),
}
-func IncrementAndGetCount(orgID string, quotaKey string, count int) (int, error) {
+func IncrementAndGetCount(orgID string, quotaKey string, count int64, startTimeInt int64, endTimeInt int64) (int64, error) {
headers := http.Header{}
headers.Set("Accept", "application/json")
headers.Set("Content-Type", "application/json")
@@ -44,6 +45,11 @@
reqBody[edgeOrgID] = orgID
reqBody[key] = quotaKey
reqBody[delta] = count
+ reqBody["startTime"] = startTimeInt
+ reqBody["endTime"] = endTimeInt
+
+ fmt.Println("startTime: ", startTimeInt)
+ fmt.Println("endTime: ", endTimeInt)
reqBodyBytes, err := json.Marshal(reqBody)
if err != nil {
@@ -89,13 +95,15 @@
if !ok {
return 0, errors.New(`invalid response from counter service. field 'count' not sent in the response`)
}
+ fmt.Println("respcount: ", respCount)
globalVariables.Log.Debug("responseCount: ", respCount)
- respCountInt, ok := respCount.(int)
+
+ respCountInt, ok := respCount.(float64)
if !ok {
- return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not int`)
+ return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not float`)
}
- return respCountInt, nil
+ return int64(respCountInt), nil
}