refactor to fit the modified API request
diff --git a/api.go b/api.go index 8da5978..b71bc82 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" @@ -43,12 +44,15 @@ return } + fmt.Println("test1") + results, err := qBucket.IncrementQuotaLimit() if err != nil { util.WriteErrorResponse(http.StatusBadRequest, constants.ErrorCheckingQuotaLimit, "error retrieving count for the give identifier "+err.Error(), res, req) return } + fmt.Println("test2 : ", results) respMap := results.ToAPIResponse() respbytes, err := json.Marshal(respMap) @@ -91,4 +95,4 @@ res.Header().Set("Content-Type", "application/json") res.WriteHeader(http.StatusOK) res.Write(respbytes) -} \ No newline at end of file +}
diff --git a/api_test.go b/api_test.go index 6dfde56..226b3d3 100644 --- a/api_test.go +++ b/api_test.go
@@ -3,12 +3,13 @@ import ( . "github.com/onsi/ginkgo" //"net/http" - "encoding/json" - "net/http" - "io/ioutil" "bytes" - "time" + "encoding/json" + "fmt" "github.com/google/uuid" + "io/ioutil" + "net/http" + "time" ) func init() { @@ -29,11 +30,13 @@ requestData["id"] = "testID" requestData["interval"] = 1 requestData["timeUnit"] = "HOUR" - requestData["quotaType"] = "CALENDAR" + requestData["type"] = "CALENDAR" requestData["preciseAtSecondsLevel"] = false - requestData["startTime"] = time.Now().UTC().AddDate(0,0,1).Unix() + requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() requestData["maxCount"] = 5 - requestData["bucketType"] = "Synchronous" + requestData["weight"] = 2 + requestData["distributed"] = true + requestData["synchronous"] = true requestData["weight"] = 2 reqBytes, err := json.Marshal(requestData) @@ -54,6 +57,14 @@ // Check the status code is what we expect. if status := res.StatusCode; status != http.StatusOK { + respBodyBytes, err := ioutil.ReadAll(res.Body) + respBody := make(map[string]interface{}) + err = json.Unmarshal(respBodyBytes, &respBody) + if err != nil { + fmt.Println("error: ", err) + } + + fmt.Println(respBody) Fail("wrong status code: " + res.Status) } @@ -92,12 +103,19 @@ // Check the status code is what we expect. if status := res.StatusCode; status != http.StatusOK { + respBodyBytes, err := ioutil.ReadAll(res.Body) + respBody := make(map[string]interface{}) + err = json.Unmarshal(respBodyBytes, &respBody) + if err != nil { + fmt.Println("error: ", err) + } + Fail("wrong status code: " + res.Status) } //TestCase3: quotaType = "RollingWidow" requestData["quotaType"] = "RollingWindow" - requestData["startTime"] = time.Now().UTC().AddDate(0,0,1).Unix() + requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() req, err = http.NewRequest("POST", testQuotaAPIURL, ioutil.NopCloser(bytes.NewReader(reqBytes))) if err != nil { Fail("error getting newRequest: " + err.Error()) @@ -113,12 +131,11 @@ Fail("wrong status code: " + res.Status) } - }) It("test Synchronous quota - invalidation test cases", func() { requestData := make(map[string]interface{}) - uuid,err := uuid.NewUUID() + uuid, err := uuid.NewUUID() if err != nil { Fail("error getting uuid") } @@ -129,7 +146,7 @@ requestData["timeUnit"] = "HOUR" requestData["quotaType"] = "CALENDAR" requestData["preciseAtSecondsLevel"] = false - requestData["startTime"] = time.Now().UTC().AddDate(0,0,1).Unix() + requestData["startTime"] = time.Now().UTC().AddDate(0, 0, 1).Unix() requestData["maxCount"] = 5 requestData["bucketType"] = "Synchronous" requestData["weight"] = 2 @@ -154,6 +171,13 @@ // Check the status code is what we expect. if status := res.StatusCode; status != http.StatusBadRequest { + respBodyBytes, err := ioutil.ReadAll(res.Body) + respBody := make(map[string]interface{}) + err = json.Unmarshal(respBodyBytes, &respBody) + if err != nil { + fmt.Println("error: ", err) + } + Fail("wrong status code: " + res.Status) }
diff --git a/constants/constants.go b/constants/constants.go index 261e9cb..459efb2 100644 --- a/constants/constants.go +++ b/constants/constants.go
@@ -1,6 +1,25 @@ package constants const ( + + //add to acceptedTimeUnitList in init() if case any other new timeUnit is added + TimeUnitSECOND = "second" + TimeUnitMINUTE = "minute" + TimeUnitHOUR = "hour" + TimeUnitDAY = "day" + TimeUnitWEEK = "week" + TimeUnitMONTH = "month" + + //errors + InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType" + InvalidQuotaBucketType = "invalidQuotaType" + InvalidQuotaType = "invalidQUotaType" + InvalidQuotaPeriod = "invalidQuotaPeriod" + + QuotaTypeCalendar = "calendar" // after start time + QuotaTypeRollingWindow = "rollingwindow" // in the past "window" time + + cacheKeyDelimiter = "|" UnableToParseBody = "unable_to_parse_body" UnMarshalJSONError = "unmarshal_json_error" ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity"
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go index 30cffed..27d964d 100644 --- a/quotaBucket/apiUtil.go +++ b/quotaBucket/apiUtil.go
@@ -23,10 +23,12 @@ } func (qBucket *QuotaBucket) FromAPIRequest(quotaBucketMap map[string]interface{}) error { - var edgeOrgID, id, timeUnit, quotaType, bucketType string + var edgeOrgID, id, timeUnit, quotaType string var interval int var startTime, maxCount, weight int64 - var preciseAtSecondsLevel bool + var preciseAtSecondsLevel, distributed bool + newQBucket := &QuotaBucket{} + var err error value, ok := quotaBucketMap[reqEdgeOrgID] if !ok { @@ -67,13 +69,13 @@ } timeUnit = value.(string) - //Type {CALENDAR, FLEXI, ROLLING_WINDOW} - value, ok = quotaBucketMap["quotaType"] + //QuotaType {CALENDAR, FLEXI, ROLLING_WINDOW} + value, ok = quotaBucketMap["type"] if !ok { - return errors.New(`missing field: 'quotaType' is required`) + return errors.New(`missing field: 'type' is required`) } if quotaTypeType := reflect.TypeOf(value); quotaTypeType.Kind() != reflect.String { - return errors.New(`invalid type : 'quotaType' should be a string`) + return errors.New(`invalid type : 'type' should be a string`) } quotaType = value.(string) @@ -86,16 +88,17 @@ } preciseAtSecondsLevel = value.(bool) - value, ok = quotaBucketMap["startTime"] - if !ok { //todo: in the current cps code startTime is optional for QuotaBucket. should we make start time optional to NewQuotaBucket? + value, ok = quotaBucketMap["startTimestamp"] + if !ok { //todo: in the current cps code startTime is optional for QuotaBucket. should we make startTime optional to NewQuotaBucket? startTime = time.Now().UTC().Unix() + } else { + // //from input when its read its float, need to then convert to int. + if startTimeType := reflect.TypeOf(value); startTimeType.Kind() != reflect.Float64 { + return errors.New(`invalid type : 'startTime' should be UNIX timestamp`) + } + startTimeFloat := value.(float64) + startTime = int64(startTimeFloat) } - //from input when its read its float, need to then convert to int. - if startTimeType := reflect.TypeOf(value); startTimeType.Kind() != reflect.Float64 { - return errors.New(`invalid type : 'startTime' should be UNIX timestamp`) - } - startTimeFloat := value.(float64) - startTime = int64(startTimeFloat) value, ok = quotaBucketMap[reqMaxCount] if !ok { @@ -108,15 +111,6 @@ maxCountFloat := value.(float64) maxCount = int64(maxCountFloat) - value, ok = quotaBucketMap["bucketType"] - if !ok { - return errors.New(`missing field: 'bucketType' is required`) - } - if bucketTypeType := reflect.TypeOf(value); bucketTypeType.Kind() != reflect.String { - return errors.New(`invalid type : 'bucketType' should be a string`) - } - bucketType = value.(string) - value, ok = quotaBucketMap["weight"] if !ok { return errors.New(`missing field: 'weight' is required`) @@ -128,7 +122,97 @@ weightFloat := value.(float64) weight = int64(weightFloat) - newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + value, ok = quotaBucketMap["distributed"] + if !ok { + return errors.New(`missing field: 'distributed' is required`) + } + if preciseAtSecondsLevelType := reflect.TypeOf(value); preciseAtSecondsLevelType.Kind() != reflect.Bool { + return errors.New(`invalid type : 'distributed' should be boolean`) + } + distributed = value.(bool) + + //if distributed check for sync or async Quota + if distributed { + value, ok = quotaBucketMap["synchronous"] + if !ok { + return errors.New(`missing field: 'synchronous' is required`) + } + if synchronousType := reflect.TypeOf(value); synchronousType.Kind() != reflect.Bool { + return errors.New(`invalid type : 'synchronous' should be boolean`) + } + synchronous := value.(bool) + + // for async retrieve syncTimeSec or syncMessageCount + if !synchronous { + syncTimeValue, syncTimeOK := quotaBucketMap["syncTimeInSec"] + syncMsgCountValue, syncMsgCountOK := quotaBucketMap["syncMessageCount"] + + if syncTimeOK && syncMsgCountOK { + return errors.New(`either syncTimeInSec or syncMessageCount should be present but not both.`) + } + + if !syncTimeOK && !syncMsgCountOK { + return errors.New(`either syncTimeInSec or syncMessageCount should be present. both cant be empty.`) + } + + if syncTimeOK { + if syncTimeType := reflect.TypeOf(syncTimeValue); syncTimeType.Kind() != reflect.Float64 { + return errors.New(`invalid type : 'syncTimeInSec' should be a number`) + } + syncTimeFloat := value.(float64) + syncTimeInt := int64(syncTimeFloat) + newQBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, + startTime, maxCount, weight, distributed, synchronous, syncTimeInt, -1) + if err != nil { + return errors.New("error creating quotaBucket: " + err.Error()) + } + qBucket.quotaBucketData = newQBucket.quotaBucketData + + if err := qBucket.Validate(); err != nil { + return errors.New("failed in Validating the quotaBucket: " + err.Error()) + } + + return nil + + } else if syncMsgCountOK { + if syncMsgCountType := reflect.TypeOf(syncMsgCountValue); syncMsgCountType.Kind() != reflect.Float64 { + return errors.New(`invalid type : 'syncTimeInSec' should be a number`) + } + syncMsgCountFloat := value.(float64) + syncMsgCountInt := int64(syncMsgCountFloat) + newQBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, + startTime, maxCount, weight, distributed, synchronous, -1, syncMsgCountInt) + if err != nil { + return errors.New("error creating quotaBucket: " + err.Error()) + } + qBucket.quotaBucketData = newQBucket.quotaBucketData + + if err := qBucket.Validate(); err != nil { + return errors.New("failed in Validating the quotaBucket: " + err.Error()) + } + + return nil + } + } + + //for synchronous quotaBucket + newQBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, + startTime, maxCount, weight, distributed, synchronous, -1, -1) + if err != nil { + return errors.New("error creating quotaBucket: " + err.Error()) + } + qBucket.quotaBucketData = newQBucket.quotaBucketData + + if err := qBucket.Validate(); err != nil { + return errors.New("failed in Validating the quotaBucket: " + err.Error()) + } + + return nil + } + + //for non distributed quotaBucket + newQBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, + startTime, maxCount, weight, distributed, false, -1, -1) if err != nil { return errors.New("error creating quotaBucket: " + err.Error())
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go index a2dc84b..ca22202 100644 --- a/quotaBucket/quotaBucket.go +++ b/quotaBucket/quotaBucket.go
@@ -2,44 +2,23 @@ import ( "errors" + "github.com/30x/apidQuota/constants" "strings" "time" ) -const ( - //add to acceptedTimeUnitList in init() if case any other new timeUnit is added - TimeUnitSECOND = "second" - TimeUnitMINUTE = "minute" - TimeUnitHOUR = "hour" - TimeUnitDAY = "day" - TimeUnitWEEK = "week" - TimeUnitMONTH = "month" - - //add to acceptedBucketTypeList in init() if case any other new bucketType is added - QuotaBucketTypeSynchronous = "synchronous" - QuotaBucketTypeAsynchronous = "asynchronous" - QuotaBucketTypeNonDistributed = "nonDistributed" - //todo: Add other accepted bucketTypes - - //errors - InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType" - InvalidQuotaDescriptorType = "invalidQuotaTimeUnitType" - InvalidQuotaBucketType = "invalidQuotaBucketType" - InvalidQuotaPeriod = "invalidQuotaPeriod" -) - var ( - acceptedTimeUnitList map[string]bool - acceptedBucketTypeList map[string]bool + acceptedTimeUnitList map[string]bool + acceptedTypeList map[string]bool ) func init() { - acceptedTimeUnitList = map[string]bool{TimeUnitSECOND: true, - TimeUnitMINUTE: true, TimeUnitHOUR: true, - TimeUnitDAY: true, TimeUnitWEEK: true, TimeUnitMONTH: true} - acceptedBucketTypeList = map[string]bool{QuotaBucketTypeSynchronous: true, - QuotaBucketTypeAsynchronous: true, QuotaBucketTypeNonDistributed: true} //todo: add other accpeted bucketTypes + acceptedTimeUnitList = map[string]bool{constants.TimeUnitSECOND: true, + constants.TimeUnitMINUTE: true, constants.TimeUnitHOUR: true, + constants.TimeUnitDAY: true, constants.TimeUnitWEEK: true, constants.TimeUnitMONTH: true} + acceptedTypeList = map[string]bool{constants.QuotaTypeCalendar: true, + constants.QuotaTypeRollingWindow: true} } @@ -88,7 +67,7 @@ if qp.startTime.Before(qp.endTime) { return true, nil } - return false, errors.New(InvalidQuotaPeriod + " : startTime in the period must be before endTime") + return false, errors.New(constants.InvalidQuotaPeriod + " : startTime in the period must be before endTime") } @@ -97,13 +76,16 @@ ID string Interval int TimeUnit string //TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH} - QuotaDescriptorType string //Type {CALENDAR, FLEXI, ROLLING_WINDOW} + QuotaType string //QuotaType {CALENDAR, FLEXI, ROLLING_WINDOW} PreciseAtSecondsLevel bool Period QuotaPeriod StartTime time.Time MaxCount int64 - BucketType string // SyncDistributed, AsyncDistributed, NonDistributed Weight int64 + Distributed bool + Synchronous bool + SyncTimeInSec int64 + SyncMessageCount int64 } type QuotaBucket struct { @@ -112,7 +94,8 @@ func NewQuotaBucket(edgeOrgID string, id string, interval int, timeUnit string, quotaType string, preciseAtSecondsLevel bool, - startTime int64, maxCount int64, bucketType string, weight int64) (*QuotaBucket, error) { + startTime int64, maxCount int64, weight int64, distributed bool, + synchronous bool, syncTimeInSec int64, syncMessageCount int64) (*QuotaBucket, error) { fromUNIXTime := time.Unix(startTime, 0) @@ -121,12 +104,15 @@ ID: id, Interval: interval, TimeUnit: timeUnit, - QuotaDescriptorType: quotaType, + QuotaType: quotaType, PreciseAtSecondsLevel: preciseAtSecondsLevel, StartTime: fromUNIXTime, MaxCount: maxCount, - BucketType: bucketType, Weight: weight, + Distributed: distributed, + Synchronous: synchronous, + SyncTimeInSec: syncTimeInSec, + SyncMessageCount: syncMessageCount, } quotaBucket := &QuotaBucket{ @@ -145,19 +131,18 @@ //check valid quotaTimeUnit if ok := IsValidTimeUnit(strings.ToLower(q.GetTimeUnit())); !ok { - return errors.New(InvalidQuotaTimeUnitType) + return errors.New(constants.InvalidQuotaTimeUnitType) } - //check valid quotaBucketType - if ok := IsValidQuotaBucketType(strings.ToLower(q.GetBucketType())); !ok { - return errors.New(InvalidQuotaBucketType) + if ok := IsValidType(strings.ToLower(q.GetType())); !ok { + return errors.New(constants.InvalidQuotaBucketType) } - //check if the period is valid period, err := q.GetQuotaBucketPeriod() if err != nil { return err } + if ok, err := period.Validate(); !ok { return errors.New("invalid Period: " + err.Error()) } @@ -185,8 +170,8 @@ return q.quotaBucketData.StartTime } -func (q *QuotaBucket) GetQuotaDescriptorType() string { - return q.quotaBucketData.QuotaDescriptorType +func (q *QuotaBucket) GetType() string { + return q.quotaBucketData.QuotaType } func (q *QuotaBucket) GetIsPreciseAtSecondsLevel() bool { @@ -197,19 +182,22 @@ return q.quotaBucketData.MaxCount } -func (q *QuotaBucket) GetBucketType() string { - return q.quotaBucketData.BucketType -} - func (q *QuotaBucket) GetWeight() int64 { return q.quotaBucketData.Weight } +func (q *QuotaBucket) IsDistrubuted() bool { + return q.quotaBucketData.Distributed +} + +func (q *QuotaBucket) IsSynchronous() bool { + return q.quotaBucketData.Synchronous +} //Calls setCurrentPeriod if DescriptorType is 'rollingWindow' or period.endTime is before now(). // It is required to setPeriod while incrementing the count. func (q *QuotaBucket) GetPeriod() (*QuotaPeriod, error) { - if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow { + if q.quotaBucketData.QuotaType == constants.QuotaTypeRollingWindow { qRWType := RollingWindowQuotaDescriptorType{} err := qRWType.SetCurrentPeriod(q) if err != nil { @@ -234,7 +222,7 @@ //setCurrentPeriod only for rolling window else just return the value of QuotaPeriod. func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod, error) { - if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow { + if q.quotaBucketData.QuotaType == constants.QuotaTypeRollingWindow { qRWType := RollingWindowQuotaDescriptorType{} err := qRWType.SetCurrentPeriod(q) if err != nil { @@ -260,7 +248,7 @@ func (q *QuotaBucket) setCurrentPeriod() error { - qDescriptorType, err := GetQuotaDescriptorTypeHandler(q.GetQuotaDescriptorType()) + qDescriptorType, err := GetQuotaTypeHandler(q.GetType()) if err != nil { return err } @@ -269,8 +257,8 @@ } func (period *QuotaPeriod) IsCurrentPeriod(qBucket *QuotaBucket) bool { - if qBucket != nil && qBucket.GetBucketType() != "" { - if qBucket.GetQuotaDescriptorType() == QuotaTypeRollingWindow { + if qBucket != nil && qBucket.GetType() != "" { + if qBucket.GetType() == constants.QuotaTypeRollingWindow { return (period.inputStartTime.Equal(time.Now().UTC()) || period.inputStartTime.Before(time.Now().UTC())) } @@ -285,20 +273,22 @@ } func (q *QuotaBucket) ResetQuotaLimit() (*QuotaBucketResults, error) { - qBucketHandler, err := GetQuotaBucketHandler(q.BucketType) + bucketType, err := GetQuotaBucketHandler(q) if err != nil { - return nil, errors.New("error getting QuotaBucketType: " + err.Error()) + return nil, errors.New("error getting quotaBucketHandler: " + err.Error()) } - return qBucketHandler.resetQuotaForCurrentPeriod(q) + + return bucketType.resetQuotaForCurrentPeriod(q) } func (q *QuotaBucket) IncrementQuotaLimit() (*QuotaBucketResults, error) { - qBucketHandler, err := GetQuotaBucketHandler(q.BucketType) + qBucketHandler, err := GetQuotaBucketHandler(q) if err != nil { - return nil, errors.New("error getting QuotaBucketType: " + err.Error()) + return nil, errors.New("error getting quotaBucketHandler: " + err.Error()) } + return qBucketHandler.incrementQuotaCount(q) } @@ -310,8 +300,8 @@ return false } -func IsValidQuotaBucketType(bucketType string) bool { - if _, ok := acceptedBucketTypeList[bucketType]; ok { +func IsValidType(qtype string) bool { + if _, ok := acceptedTypeList[qtype]; ok { return true } return false
diff --git a/quotaBucket/quotaBucketType.go b/quotaBucket/quotaBucketType.go index dd02914..b905bd7 100644 --- a/quotaBucket/quotaBucketType.go +++ b/quotaBucket/quotaBucketType.go
@@ -2,9 +2,8 @@ import ( "errors" - "strings" - "github.com/30x/apidQuota/services" "fmt" + "github.com/30x/apidQuota/services" ) type QuotaBucketType interface { @@ -42,7 +41,7 @@ } -func (sQuotaBucket SynchronousQuotaBucketType) incrementQuotaCount(q *QuotaBucket) (*QuotaBucketResults, error){ +func (sQuotaBucket SynchronousQuotaBucketType) incrementQuotaCount(q *QuotaBucket) (*QuotaBucketResults, error) { fmt.Println("increment count for sync") maxCount := q.GetMaxCount() @@ -98,10 +97,11 @@ return results, nil } -type AsynchronousQuotaBucketType struct{ - initialized bool - - +type AsynchronousQuotaBucketType struct { + initialized bool + globalCount int64 + syncMessageCount int64 + syncTimeInSec int64 } func (quotaBucketType AsynchronousQuotaBucketType) resetCount(qBucket *QuotaBucket) error { @@ -110,11 +110,14 @@ } func (quotaBucketType AsynchronousQuotaBucketType) incrementQuotaCount(qBucket *QuotaBucket) (*QuotaBucketResults, error) { + //getCount() + fmt.Println("increment count for async") + return nil, nil } func (quotaBucketType AsynchronousQuotaBucketType) resetQuotaForCurrentPeriod(q *QuotaBucket) (*QuotaBucketResults, error) { - return nil,nil + return nil, nil } type NonDistributedQuotaBucketType struct{} @@ -124,27 +127,29 @@ return nil } func (sQuotaBucket NonDistributedQuotaBucketType) incrementQuotaCount(qBucket *QuotaBucket) (*QuotaBucketResults, error) { + fmt.Println("increment count for nondistributed.") + return nil, nil } func (sQuotaBucket NonDistributedQuotaBucketType) resetQuotaForCurrentPeriod(q *QuotaBucket) (*QuotaBucketResults, error) { - return nil,nil + return nil, nil } -func GetQuotaBucketHandler(qBucket string) (QuotaBucketType, error) { - var quotaBucketType QuotaBucketType - qBucketType := strings.ToLower(strings.TrimSpace(qBucket)) - switch qBucketType { - case QuotaBucketTypeSynchronous: - quotaBucketType = &SynchronousQuotaBucketType{} +func GetQuotaBucketHandler(qBucket *QuotaBucket) (QuotaBucketType, error) { + + if !qBucket.IsDistrubuted() { + quotaBucketType := &NonDistributedQuotaBucketType{} return quotaBucketType, nil - case QuotaBucketTypeAsynchronous: - quotaBucketType = &AsynchronousQuotaBucketType{} + } else { + if qBucket.IsSynchronous() { + quotaBucketType := &SynchronousQuotaBucketType{} + return quotaBucketType, nil + } + quotaBucketType := &AsynchronousQuotaBucketType{} return quotaBucketType, nil - case QuotaBucketTypeNonDistributed: - quotaBucketType = &NonDistributedQuotaBucketType{} - return quotaBucketType, nil - default: - return nil, errors.New("Ignoring unrecognized quota type in request: " + qBucket) } + + return nil, errors.New("ignoring: unrecognized quota type") + }
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go index aa1cebc..3a8fcfb 100644 --- a/quotaBucket/quotaBucket_test.go +++ b/quotaBucket/quotaBucket_test.go
@@ -1,6 +1,7 @@ package quotaBucket_test import ( + "github.com/30x/apidQuota/constants" . "github.com/30x/apidQuota/quotaBucket" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -82,44 +83,31 @@ }) }) -var _ = Describe("Test AcceptedQuotaBucketTypes", func() { - It("testBucketTypes", func() { - if !IsValidQuotaBucketType("synchronous") { - Fail("Expected true: synchronous is a valid quotaBucket") - } - if !IsValidQuotaBucketType("asynchronous") { - Fail("Expected true: asynchronous is a valid quotaBucket") - } - if !IsValidQuotaBucketType("nonDistributed") { - Fail("Expected true: nonDistributed is a valid quotaBucket") - } - - //invalid type - if IsValidQuotaBucketType("invalidType") { - Fail("Expected false: invalidType is a invalid quotaBucket") - } - }) -}) - //Tests for QuotaBucket var _ = Describe("QuotaBucket", func() { It("Create with NewQuotaBucket", func() { edgeOrgID := "sampleOrg" id := "sampleID" + interval := 1 timeUnit := "hour" quotaType := "calendar" - bucketType := "synchronous" - interval := 1 + preciseAtSecondsLevel := true maxCount := int64(10) weight := int64(1) - preciseAtSecondsLevel := true + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) + //start time before now() startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) now := time.Now().UTC() - currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(),0,0,0, time.UTC) + currentHour := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) @@ -129,8 +117,7 @@ Expect(edgeOrgID).To(Equal(quotaBucket.GetEdgeOrgID())) Expect(id).To(Equal(quotaBucket.GetID())) Expect(timeUnit).To(Equal(quotaBucket.GetTimeUnit())) - Expect(quotaType).To(Equal(quotaBucket.GetQuotaDescriptorType())) - Expect(bucketType).To(Equal(quotaBucket.GetBucketType())) + Expect(quotaType).To(Equal(quotaBucket.GetType())) Expect(interval).To(Equal(quotaBucket.GetInterval())) Expect(maxCount).To(Equal(quotaBucket.GetMaxCount())) Expect(preciseAtSecondsLevel).To(Equal(quotaBucket.GetIsPreciseAtSecondsLevel())) @@ -142,14 +129,15 @@ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String())) Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String())) - //start time is after now() -> should still set period. startTime = time.Now().UTC().AddDate(0, 1, 0).Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) now = time.Now().UTC() - currentHour = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(),0,0,0, time.UTC) + currentHour = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) @@ -162,7 +150,6 @@ Expect(getPeriod.GetPeriodStartTime().String()).Should(Equal(currentHour.String())) Expect(getPeriod.GetPeriodEndTime().String()).Should(Equal(currentHour.Add(time.Hour).String())) - }) //end before start @@ -171,14 +158,19 @@ id := "sampleID" timeUnit := "hour" quotaType := "calendar" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true startTime := time.Now().UTC().AddDate(0, -1, 0).Unix() + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 1, 0), time.Now().UTC().AddDate(0, 0, -1)) @@ -186,8 +178,8 @@ if err == nil { Fail("error expected but got <nil>") } - if !strings.Contains(err.Error(), InvalidQuotaPeriod) { - Fail("expected: " + InvalidQuotaPeriod + " in the error but got: " + err.Error()) + if !strings.Contains(err.Error(), constants.InvalidQuotaPeriod) { + Fail("expected: " + constants.InvalidQuotaPeriod + " in the error but got: " + err.Error()) } }) @@ -197,17 +189,23 @@ id := "sampleID" timeUnit := "invalidTimeUnit" quotaType := "calendar" - bucketType := "synchronous" interval := 1 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, weight) + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) + + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).To(HaveOccurred()) - if !strings.Contains(err.Error(), InvalidQuotaTimeUnitType) { - Fail("expected: " + InvalidQuotaTimeUnitType + "but got: " + err.Error()) + if !strings.Contains(err.Error(), constants.InvalidQuotaTimeUnitType) { + Fail("expected: " + constants.InvalidQuotaTimeUnitType + "but got: " + err.Error()) } if quotaBucket != nil { Fail("quotaBucket returned should be nil.") @@ -215,30 +213,6 @@ }) - It("Test invalid quotaBucketType", func() { - edgeOrgID := "sampleOrg" - id := "sampleID" - timeUnit := "hour" - quotaType := "calendar" - bucketType := "invalidQuotaBucket" - interval := 1 - 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, weight) - Expect(err).NotTo(HaveOccurred()) - - err = quotaBucket.Validate() - if err == nil { - Fail("error expected but got <nil>") - } - if !strings.Contains(err.Error(), InvalidQuotaBucketType) { - Fail("expected: " + InvalidQuotaBucketType + " in the error message but got: " + err.Error()) - } - }) - }) var _ = Describe("IsCurrentPeriod", func() { @@ -248,15 +222,21 @@ id := "sampleID" timeUnit := "hour" quotaType := "rollingwindow" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) + //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, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) @@ -271,7 +251,9 @@ //InputStart time is now startTime = time.Now().UTC().Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() Expect(err).NotTo(HaveOccurred()) @@ -292,15 +274,20 @@ id := "sampleID" timeUnit := "hour" quotaType := "rollingwindow" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true //InputStart time is after now. startTime := time.Now().UTC().AddDate(0, 1, 0).Unix() + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -315,7 +302,9 @@ //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, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0)) @@ -330,16 +319,21 @@ id := "sampleID" timeUnit := "hour" quotaType := "calendar" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) //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, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -355,7 +349,9 @@ //InputStart time is now startTime = time.Now().UTC().Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -372,7 +368,9 @@ //start Time in period is before now startTime = time.Now().UTC().Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -391,7 +389,9 @@ //start Time in period is now startTime = time.Now().UTC().Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -426,7 +426,9 @@ //end Time in period is after now startTime = time.Now().UTC().Unix() - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -446,7 +448,9 @@ //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, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -470,18 +474,23 @@ id := "sampleID" timeUnit := "hour" quotaType := "calendar" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) //InputStart time is after now. period := NewQuotaPeriod(time.Now().UTC().AddDate(0, 1, 0).Unix(), 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, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -493,7 +502,9 @@ //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, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -528,14 +539,20 @@ id := "sampleID" timeUnit := "hour" quotaType := "rollingwindow" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) + //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, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), time.Now().UTC().AddDate(0, 1, 0)) @@ -557,7 +574,9 @@ 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, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) quotaBucket.SetPeriod(pstartTime, pendTime) @@ -573,7 +592,9 @@ 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, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) quotaBucket.SetPeriod(pstartTime, pendTime)
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go index 8dec92c..af25b56 100644 --- a/quotaBucket/quotaDescriptorType.go +++ b/quotaBucket/quotaDescriptorType.go
@@ -2,32 +2,27 @@ import ( "errors" + "github.com/30x/apidQuota/constants" "strings" "time" ) -const ( - QuotaTypeCalendar = "calendar" // after start time - QuotaTypeFlexi = "flexi" //after first request - QuotaTypeRollingWindow = "rollingwindow" // in the past "window" time -) - type QuotaDescriptorType interface { SetCurrentPeriod(bucket *QuotaBucket) error } -func GetQuotaDescriptorTypeHandler(qType string) (QuotaDescriptorType, error) { +func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) { var qDescriptor QuotaDescriptorType quotaType := strings.ToLower(strings.TrimSpace(qType)) switch quotaType { - case QuotaTypeCalendar: + case constants.QuotaTypeCalendar: qDescriptor = &CalendarQuotaDescriptorType{} return qDescriptor, nil - case QuotaTypeRollingWindow: + case constants.QuotaTypeRollingWindow: qDescriptor = &RollingWindowQuotaDescriptorType{} return qDescriptor, nil default: - return nil, errors.New(InvalidQuotaDescriptorType + " Quota type " + qType + " in the request is not supported") + return nil, errors.New(constants.InvalidQuotaType + " Quota type: " + qType + " in the request is not supported") } } @@ -49,9 +44,9 @@ if currentPeriod.IsCurrentPeriod(qbucket) { return nil } else { - qBucketHandler, err := GetQuotaBucketHandler(qbucket.BucketType) + qBucketHandler, err := GetQuotaBucketHandler(qbucket) if err != nil { - return errors.New("error getting QuotaBucketType: " + err.Error()) + return errors.New("error retrieving qBucketHandler: " + err.Error()) } qBucketHandler.resetCount(qbucket) } @@ -62,27 +57,27 @@ now := time.Now().UTC() timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit)) switch timeUnit { - case TimeUnitSECOND: + case constants.TimeUnitSECOND: currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.UTC) secInDuration := time.Duration(int64(qbucket.Interval) * time.Second.Nanoseconds()) currentEnd = currentStart.Add(secInDuration) break - case TimeUnitMINUTE: + case constants.TimeUnitMINUTE: currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.UTC) minInDuration := time.Duration(int64(qbucket.Interval) * time.Minute.Nanoseconds()) currentEnd = currentStart.Add(minInDuration) break - case TimeUnitHOUR: + case constants.TimeUnitHOUR: currentStart = time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, time.UTC) hoursInDuration := time.Duration(int64(qbucket.Interval) * time.Hour.Nanoseconds()) currentEnd = currentStart.Add(hoursInDuration) break - case TimeUnitDAY: + case constants.TimeUnitDAY: currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC) currentEnd = currentStart.AddDate(0, 0, 1*qbucket.Interval) break - case TimeUnitWEEK: + case constants.TimeUnitWEEK: //todo currentStart = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC) for currentStart.Weekday() != time.Monday { @@ -90,12 +85,12 @@ } currentEnd = currentStart.AddDate(0, 0, 7*qbucket.Interval) break - case TimeUnitMONTH: + case constants.TimeUnitMONTH: currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC) currentEnd = currentStart.AddDate(0, qbucket.Interval, 0) break default: - return errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) + return errors.New(constants.InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) } @@ -123,35 +118,35 @@ timeUnit := strings.ToLower(strings.TrimSpace(qb.TimeUnit)) switch timeUnit { - case TimeUnitSECOND: + case constants.TimeUnitSECOND: return time.Duration(int64(qb.Interval) * time.Second.Nanoseconds()), nil - case TimeUnitMINUTE: + case constants.TimeUnitMINUTE: return time.Duration(int64(qb.Interval) * time.Minute.Nanoseconds()), nil - case TimeUnitHOUR: + case constants.TimeUnitHOUR: return time.Duration(int64(qb.Interval) * time.Hour.Nanoseconds()), nil - case TimeUnitDAY: + case constants.TimeUnitDAY: return time.Duration(int64(qb.Interval*24) * time.Hour.Nanoseconds()), nil - case TimeUnitWEEK: + case constants.TimeUnitWEEK: return time.Duration(int64(qb.Interval*24*7) * time.Hour.Nanoseconds()), nil - case TimeUnitMONTH: + case constants.TimeUnitMONTH: now := time.Now().UTC() var currentStart, currentEnd time.Time - quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaDescriptorType)) + quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaType)) switch quotaType { - case QuotaTypeCalendar: + case constants.QuotaTypeCalendar: currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC) currentEnd = currentStart.AddDate(0, qb.Interval, 0) return currentEnd.Sub(currentStart), nil - case QuotaTypeRollingWindow: + case constants.QuotaTypeRollingWindow: currentEnd = now 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) + return time.Duration(0), errors.New(constants.InvalidQuotaBucketType + " : ignoring unrecognized quotaType : " + quotaType) } default: - return time.Duration(0), errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) + return time.Duration(0), errors.New(constants.InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit) }
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go index bceac12..ee85724 100644 --- a/quotaBucket/quotaDescriptorType_test.go +++ b/quotaBucket/quotaDescriptorType_test.go
@@ -1,6 +1,7 @@ package quotaBucket_test import ( + "github.com/30x/apidQuota/constants" . "github.com/30x/apidQuota/quotaBucket" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -11,7 +12,7 @@ var _ = Describe("Check Descriptor Type ", func() { It("test Calendar Type descriptor", func() { - descriptorType, err := GetQuotaDescriptorTypeHandler("calendar") + descriptorType, err := GetQuotaTypeHandler("calendar") Expect(err).NotTo(HaveOccurred()) if reflect.TypeOf(descriptorType) != reflect.TypeOf(&CalendarQuotaDescriptorType{}) { Fail("Excepted CalendarQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String()) @@ -19,7 +20,7 @@ }) It("test RollingWindow Type descriptor", func() { - descriptorType, err := GetQuotaDescriptorTypeHandler("rollingwindow") + descriptorType, err := GetQuotaTypeHandler("rollingwindow") Expect(err).NotTo(HaveOccurred()) if reflect.TypeOf(descriptorType) != reflect.TypeOf(&RollingWindowQuotaDescriptorType{}) { Fail("Excepted RollingWindowQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String()) @@ -27,10 +28,10 @@ }) It("test invalid Type descriptor", func() { - _, err := GetQuotaDescriptorTypeHandler("invalxidDescriptorType") + _, err := GetQuotaTypeHandler("invalidDescriptorType") Expect(err).To(HaveOccurred()) - if !strings.Contains(err.Error(), InvalidQuotaDescriptorType) { - Fail("Excepted error to contain: " + InvalidQuotaDescriptorType + " but got: " + err.Error()) + if !strings.Contains(err.Error(), constants.InvalidQuotaType) { + Fail("Excepted error to contain: " + constants.InvalidQuotaType + " but got: " + err.Error()) } }) }) @@ -43,15 +44,19 @@ id := "sampleID" timeUnit := "second" quotaType := "calendar" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) - + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := 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, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -72,7 +77,9 @@ // test set period for timeUnit=minute timeUnit = "minute" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -93,7 +100,9 @@ // test set period for timeUnit=hour timeUnit = "hour" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -114,7 +123,9 @@ // test set period for timeUnit=day timeUnit = "day" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -135,7 +146,9 @@ // test set period for timeUnit=week timeUnit = "week" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -156,7 +169,9 @@ // test set period for timeUnit=month timeUnit = "month" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -185,14 +200,19 @@ id := "sampleID" timeUnit := "second" quotaType := "calendar" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -213,10 +233,12 @@ // test set period for timeUnit=month timeUnit = "invalidTimeUnit" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).To(HaveOccurred()) - if ok := strings.Contains(err.Error(), InvalidQuotaTimeUnitType); !ok { - Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) + if ok := strings.Contains(err.Error(), constants.InvalidQuotaTimeUnitType); !ok { + Fail("expected error to contain " + constants.InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) } }) @@ -228,14 +250,19 @@ id := "sampleID" timeUnit := "second" quotaType := "rollingWindow" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -256,7 +283,9 @@ // test set period for timeUnit=minute timeUnit = "minute" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -277,7 +306,9 @@ // test set period for timeUnit=hour timeUnit = "hour" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -298,7 +329,9 @@ // test set period for timeUnit=day timeUnit = "day" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -319,7 +352,9 @@ // test set period for timeUnit=week timeUnit = "week" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -340,7 +375,9 @@ // test set period for timeUnit=month timeUnit = "month" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -369,14 +406,19 @@ id := "sampleID" timeUnit := "second" quotaType := "rollingwindow" - bucketType := "synchronous" interval := 1 maxCount := int64(10) weight := int64(1) preciseAtSecondsLevel := true startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix() + distributed := true + synchronous := true + syncTimeInSec := int64(-1) + syncMessageCount := int64(-1) - quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).NotTo(HaveOccurred()) err = quotaBucket.Validate() @@ -397,10 +439,12 @@ // test set period for timeUnit=month timeUnit = "invalidTimeUnit" - quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight) + quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, + quotaType, preciseAtSecondsLevel, startTime, maxCount, + weight, distributed, synchronous, syncTimeInSec, syncMessageCount) Expect(err).To(HaveOccurred()) - if ok := strings.Contains(err.Error(), InvalidQuotaTimeUnitType); !ok { - Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) + if ok := strings.Contains(err.Error(), constants.InvalidQuotaTimeUnitType); !ok { + Fail("expected error to contain " + constants.InvalidQuotaTimeUnitType + " but got different error message: " + err.Error()) } })
diff --git a/services/counterServiceHelper.go b/services/counterServiceHelper.go index d689fc8..a2c95aa 100644 --- a/services/counterServiceHelper.go +++ b/services/counterServiceHelper.go
@@ -28,10 +28,9 @@ func GetCount(orgID string, quotaKey string, startTimeInt int64, endTimeInt int64) (int64, error) { - return IncrementAndGetCount(orgID, quotaKey,0,startTimeInt,endTimeInt) + return IncrementAndGetCount(orgID, quotaKey, 0, startTimeInt, endTimeInt) } - func IncrementAndGetCount(orgID string, quotaKey string, count int64, startTimeInt int64, endTimeInt int64) (int64, error) { fmt.Println("calling counter service") headers := http.Header{} @@ -74,6 +73,7 @@ ContentLength: int64(contentLength), } + fmt.Println("req: ", request) resp, err := client.Do(request) if err != nil { @@ -82,10 +82,10 @@ globalVariables.Log.Debug("response: ", resp) if resp.StatusCode != http.StatusOK { - if resp.StatusCode == http.StatusNotFound { - return 0, errors.New(err.Error()) - } respBodyBytes, err := ioutil.ReadAll(resp.Body) + if resp.StatusCode == http.StatusNotFound { + return 0, errors.New("response from counter service: " + resp.Status + " and response body is: " + string(respBodyBytes)) + } if err != nil { }