diff --git a/.drone.yml b/.drone.yml index 9557315a..6c2de9e5 100644 --- a/.drone.yml +++ b/.drone.yml @@ -5,14 +5,14 @@ name: default steps: - name: check - image: golang:1.16.2 + image: golang:1.18.6 commands: - make check volumes: - name: gopath path: /go - name: test - image: golang:1.16.2 + image: golang:1.18.6 commands: - make test volumes: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2136026..141d2ba2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: 1.16.2 + go-version: 1.18.6 - name: Check run: make check diff --git a/Makefile b/Makefile index f7eb47c6..39c254c1 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ sec: $(GOPATH)/bin/gosec $(GOPATH)/bin/golangci-lint: @echo "🔘 Installing golangci-lint... (`date '+%H:%M:%S'`)" - @curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH)/bin + @curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH)/bin v1.47.3 $(GOPATH)/bin/golint: @echo "🔘 Installing golint ... (`date '+%H:%M:%S'`)" @@ -95,7 +95,7 @@ $(GOPATH)/bin/gosec: $(GOPATH)/bin/oapi-codegen: @echo "🔘 Installing oapicodegen ... (`date '+%H:%M:%S'`)" - @go get github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.11.0 + @go install github.com/deepmap/oapi-codegen/cmd/oapi-codegen@v1.11.0 PHONY+= tools tools: $(GOPATH)/bin/golangci-lint $(GOPATH)/bin/golint $(GOPATH)/bin/gosec $(GOPATH)/bin/goimports $(GOPATH)/bin/oapi-codegen diff --git a/client/client.go b/client/client.go index 89e32917..553c80c0 100644 --- a/client/client.go +++ b/client/client.go @@ -86,11 +86,19 @@ func NewCfClient(sdkKey string, options ...ConfigOption) (*CfClient, error) { if sdkKey == "" { return client, types.ErrSdkCantBeEmpty } + + var err error + lruCache, err := repository.NewLruCache(10000) if err != nil { return nil, err } client.repository = repository.New(lruCache) + + if client.config != nil { + client.repository = repository.New(config.Cache) + } + client.evaluator, err = evaluation.NewEvaluator(client.repository, client, config.Logger) if err != nil { return nil, err @@ -359,7 +367,7 @@ func (c *CfClient) retrieveFlags(ctx context.Context) error { } for _, flag := range *flags.JSON200 { - c.repository.SetFlag(flag) + c.repository.SetFlag(flag, true) } c.config.Logger.Info("Retrieving flags finished") return nil @@ -383,7 +391,7 @@ func (c *CfClient) retrieveSegments(ctx context.Context) error { } for _, segment := range *segments.JSON200 { - c.repository.SetSegment(segment) + c.repository.SetSegment(segment, true) } c.config.Logger.Info("Retrieving segments finished") return nil diff --git a/client/helpers_test.go b/client/helpers_test.go index 12ef933a..a2afb1c8 100644 --- a/client/helpers_test.go +++ b/client/helpers_test.go @@ -53,7 +53,11 @@ func MakeStringFeatureConfigs(name, defaultVariation, offVariation, state string // If there are any PreReqs then we need to store them as flags as well. for _, x := range preReqs { - featureConfig = append(featureConfig, MakeBoolFeatureConfig(x.Feature, "true", "false", x.Variations[0], nil)) + state := "off" + if x.Variations[0] == "true" { + state = "on" + } + featureConfig = append(featureConfig, MakeBoolFeatureConfig(x.Feature, "true", "false", state, nil)) } return featureConfig diff --git a/docker/Dockerfile b/docker/Dockerfile index 7801a37f..69e9fc77 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16-alpine as builder +FROM golang:1.18.6-alpine as builder RUN apk update && apk add --no-cache make gcc musl-dev git ca-certificates && update-ca-certificates WORKDIR /app diff --git a/go.mod b/go.mod index 5ae2ac99..6835a392 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/harness/ff-golang-server-sdk -go 1.16 +go 1.18 require ( github.com/deepmap/oapi-codegen v1.11.0 @@ -16,7 +16,24 @@ require ( github.com/r3labs/sse v0.0.0-20201126193848-34e640891548 github.com/spaolacci/murmur3 v1.1.0 github.com/stretchr/testify v1.7.1 - go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 gopkg.in/cenkalti/backoff.v1 v1.1.0 ) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/swag v0.21.1 // indirect + github.com/hashicorp/go-cleanhttp v0.5.1 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + golang.org/x/net v0.0.0-20220513224357-95641704303c // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index a1dfed66..1ea3b049 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -13,8 +13,8 @@ type Repository interface { GetFlag(identifier string) (rest.FeatureConfig, error) GetSegment(identifier string) (rest.Segment, error) - SetFlag(featureConfig rest.FeatureConfig) - SetSegment(segment rest.Segment) + SetFlag(featureConfig rest.FeatureConfig, initialLoad bool) + SetSegment(segment rest.Segment, initialLoad bool) DeleteFlag(identifier string) DeleteSegment(identifier string) @@ -107,9 +107,11 @@ func (r FFRepository) GetSegment(identifier string) (rest.Segment, error) { } // SetFlag places a flag in the repository with the new value -func (r FFRepository) SetFlag(featureConfig rest.FeatureConfig) { - if r.isFlagOutdated(featureConfig) { - return +func (r FFRepository) SetFlag(featureConfig rest.FeatureConfig, initialLoad bool) { + if !initialLoad { + if r.isFlagOutdated(featureConfig) { + return + } } flagKey := formatFlagKey(featureConfig.Feature) if r.storage != nil { @@ -127,9 +129,11 @@ func (r FFRepository) SetFlag(featureConfig rest.FeatureConfig) { } // SetSegment places a segment in the repository with the new value -func (r FFRepository) SetSegment(segment rest.Segment) { - if r.isSegmentOutdated(segment) { - return +func (r FFRepository) SetSegment(segment rest.Segment, initialLoad bool) { + if !initialLoad { + if r.isSegmentOutdated(segment) { + return + } } segmentKey := formatSegmentKey(segment.Identifier) if r.storage != nil { @@ -202,9 +206,9 @@ func (r FFRepository) Close() { } func formatFlagKey(identifier string) string { - return "flags/" + identifier + return "flag/" + identifier } func formatSegmentKey(identifier string) string { - return "segments/" + identifier + return "target-segment/" + identifier } diff --git a/stream/sse.go b/stream/sse.go index abf3d40d..8a514466 100644 --- a/stream/sse.go +++ b/stream/sse.go @@ -134,7 +134,7 @@ func (c *SSEClient) handleEvent(event Event) { } if response.JSON200 != nil { - c.repository.SetFlag(*response.JSON200) + c.repository.SetFlag(*response.JSON200, false) } } @@ -159,7 +159,7 @@ func (c *SSEClient) handleEvent(event Event) { return } if response.JSON200 != nil { - c.repository.SetSegment(*response.JSON200) + c.repository.SetSegment(*response.JSON200, false) } } updateWithTimeout() diff --git a/test_wrapper/go.mod b/test_wrapper/go.mod index ebc75b02..35b00f32 100644 --- a/test_wrapper/go.mod +++ b/test_wrapper/go.mod @@ -1,6 +1,6 @@ module github.com/harness/ff-golang-server-sdk/test_wrapper -go 1.16 +go 1.18 replace github.com/harness/ff-golang-server-sdk => ../ diff --git a/tests/evaluator_test.go b/tests/evaluator_test.go index 29b412bd..56b7ce85 100644 --- a/tests/evaluator_test.go +++ b/tests/evaluator_test.go @@ -84,10 +84,10 @@ func TestEvaluator(t *testing.T) { t.Error(err) } for _, flag := range fixture.Flags { - repo.SetFlag(flag) + repo.SetFlag(flag, false) } for _, segment := range fixture.Segments { - repo.SetSegment(segment) + repo.SetSegment(segment, false) } for _, testCase := range fixture.Tests { diff --git a/tests/ff-test-cases b/tests/ff-test-cases index b79d82fd..6e782f1b 160000 --- a/tests/ff-test-cases +++ b/tests/ff-test-cases @@ -1 +1 @@ -Subproject commit b79d82fd5d80ef47a1c13e2e2bffd4a45a2e56b7 +Subproject commit 6e782f1b954f01feae622f707dbfef38a264476b