diff --git a/.github/workflows/dev-benches-page.yml b/.github/workflows/dev-benches-page.yml index 7d256e977..93294a910 100644 --- a/.github/workflows/dev-benches-page.yml +++ b/.github/workflows/dev-benches-page.yml @@ -33,11 +33,11 @@ jobs: with: ref: gh-pages - name: Setup Pages - uses: actions/configure-pages@f156874f8191504dae5b037505266ed5dda6c382 # v3 + uses: actions/configure-pages@1f0c5cde4bc74cd7e1254d0cb4de8d49e9068c7d # v4 - name: Upload artifact uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c # v2 with: path: './dev/bench' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2 + uses: actions/deploy-pages@77d7344265e1f960dab5c00dbff52287a70b0d4f # v3 diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 243e83350..1a24597b7 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -22,11 +22,9 @@ jobs: - name: Get current date id: date run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - uses: google-github-actions/release-please-action@db8f2c60ee802b3748b512940dde88eabd7b7e01 # v3 + - uses: google-github-actions/release-please-action@a6d1fd9854c8c40688a72f7e4b072a1e965860a0 # v4 id: release with: - release-type: "go" - command: manifest token: ${{secrets.GITHUB_TOKEN}} default-branch: main @@ -88,7 +86,7 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@f3c3cad8ad5e1076ffba2449385b1547f1e3c566 + uses: docker/metadata-action@31cebacef4805868f9ce9a0cb03ee36c32df2ac4 with: images: ${{ env.REGISTRY }}/${{ matrix.path }} @@ -134,7 +132,7 @@ jobs: run: echo "IMG_SBOM_FILE=${{ format('{0}-{1}-sbom.spdx', matrix.path, env.VERSION) }}" >> $GITHUB_OUTPUT - name: SBOM for latest image - uses: anchore/sbom-action@fd74a6fb98a204a1ad35bbfae0122c1a302ff88b # v0 + uses: anchore/sbom-action@5ecf649a417b8ae17dc8383dc32d46c03f2312df # v0 with: image: ${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/${{ matrix.path }}:${{ env.VERSION }} artifact-name: ${{ steps.image-sbom-file-gen.outputs.IMG_SBOM_FILE }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json index f657d8565..477afbd8b 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.7.1", - "flagd-proxy": "0.3.1", - "core": "0.7.1" + "flagd": "0.7.2", + "flagd-proxy": "0.3.2", + "core": "0.7.2" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 27b249eb0..9f51c774e 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.7.2](https://github.com/open-feature/flagd/compare/core/v0.7.1...core/v0.7.2) (2023-12-05) + + +### 🐛 Bug Fixes + +* **deps:** update module github.com/open-feature/open-feature-operator to v0.5.0 ([#1039](https://github.com/open-feature/flagd/issues/1039)) ([eb128d9](https://github.com/open-feature/flagd/commit/eb128d97ecb8b6916f9c5a32c21c698207f82be5)) +* **deps:** update module github.com/open-feature/open-feature-operator to v0.5.1 ([#1046](https://github.com/open-feature/flagd/issues/1046)) ([0321935](https://github.com/open-feature/flagd/commit/0321935992ef50c2fc62bd659d8858c25c88efa7)) +* **deps:** update module golang.org/x/crypto to v0.16.0 ([#1033](https://github.com/open-feature/flagd/issues/1033)) ([b79aaf2](https://github.com/open-feature/flagd/commit/b79aaf2c2ca5fe9c43c1460d6cab349d5d68b7e1)) +* **deps:** update module golang.org/x/net to v0.19.0 ([#1034](https://github.com/open-feature/flagd/issues/1034)) ([c6426b2](https://github.com/open-feature/flagd/commit/c6426b20fa241066fc844a2a000812015790cf12)) +* various edge cases in targeting ([#1041](https://github.com/open-feature/flagd/issues/1041)) ([ca38c16](https://github.com/open-feature/flagd/commit/ca38c165c606ffa4517872f170375dde37f4ac5b)) + ## [0.7.1](https://github.com/open-feature/flagd/compare/core/v0.7.0...core/v0.7.1) (2023-11-28) diff --git a/core/go.mod b/core/go.mod index 19adcbf55..12d79cf84 100644 --- a/core/go.mod +++ b/core/go.mod @@ -11,7 +11,8 @@ require ( github.com/diegoholiveira/jsonlogic/v3 v3.3.2 github.com/fsnotify/fsnotify v1.7.0 github.com/golang/mock v1.6.0 - github.com/open-feature/open-feature-operator v0.2.37-0.20231108054703-a97d336468d5 + github.com/open-feature/open-feature-operator v0.5.1 + github.com/open-feature/open-feature-operator/apis v0.2.38-0.20231117101310-726a7f714906 github.com/open-feature/schemas v0.2.8 github.com/prometheus/client_golang v1.17.0 github.com/robfig/cron v1.2.0 @@ -31,10 +32,10 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.21.0 go.opentelemetry.io/otel/trace v1.21.0 go.uber.org/zap v1.26.0 - golang.org/x/crypto v0.15.0 + golang.org/x/crypto v0.16.0 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa golang.org/x/mod v0.14.0 - golang.org/x/net v0.18.0 + golang.org/x/net v0.19.0 golang.org/x/sync v0.5.0 google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 @@ -90,8 +91,8 @@ require ( go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/core/go.sum b/core/go.sum index d0cb60774..137f688e5 100644 --- a/core/go.sum +++ b/core/go.sum @@ -638,6 +638,12 @@ github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/open-feature/open-feature-operator v0.2.37-0.20231108054703-a97d336468d5 h1:ONgFdsDH0uAS3qrmZEQjYqFtqKw/MCkbbQSE33bGBsU= github.com/open-feature/open-feature-operator v0.2.37-0.20231108054703-a97d336468d5/go.mod h1:nM7T4oGQukeGmcAFkQm0uwt8WFdDb5hYPjXkm7pHhX4= +github.com/open-feature/open-feature-operator v0.5.0 h1:SPdU520R0ILUnFI544De5yHdAe7TtHLxcNHXlkSPOik= +github.com/open-feature/open-feature-operator v0.5.0/go.mod h1:ZCiRtyjZlAxd5cz5uG20zP4eiyIH6nuOjRJL/hjp7RM= +github.com/open-feature/open-feature-operator v0.5.1 h1:AbS5mRTJJ6/1AuB7otG485558pazcimJrHXKgrYwIYw= +github.com/open-feature/open-feature-operator v0.5.1/go.mod h1:ZCiRtyjZlAxd5cz5uG20zP4eiyIH6nuOjRJL/hjp7RM= +github.com/open-feature/open-feature-operator/apis v0.2.38-0.20231117101310-726a7f714906 h1:OUZVFPJgFytNSi3nxqy8nCKAlOlqdrqF4+eIGOaLSl8= +github.com/open-feature/open-feature-operator/apis v0.2.38-0.20231117101310-726a7f714906/go.mod h1:YtdYEXJHo9iKwmchxbwGGsmu33FbugMQ8lKGarA9UYM= github.com/open-feature/schemas v0.2.8 h1:oA75hJXpOd9SFgmNI2IAxWZkwzQPUDm7Jyyh3q489wM= github.com/open-feature/schemas v0.2.8/go.mod h1:vj+rfTsOLlh5PtGGkAbitnJmFPYuTHXTjOy13kzNgKQ= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -767,6 +773,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -862,6 +870,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -977,12 +987,16 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/core/pkg/eval/fractional_evaluation_test.go b/core/pkg/eval/fractional_evaluation_test.go index f0a096873..a5cb50cde 100644 --- a/core/pkg/eval/fractional_evaluation_test.go +++ b/core/pkg/eval/fractional_evaluation_test.go @@ -55,13 +55,13 @@ func TestFractionalEvaluation(t *testing.T) { } tests := map[string]struct { - flags Flags - flagKey string - context map[string]any - expectedValue string - expectedVariant string - expectedReason string - expectedError error + flags Flags + flagKey string + context map[string]any + expectedValue string + expectedVariant string + expectedReason string + expectedErrorCode string }{ "rachel@faas.com": { flags: flags, @@ -247,38 +247,6 @@ func TestFractionalEvaluation(t *testing.T) { expectedValue: "#FF0000", expectedReason: model.DefaultReason, }, - "fallback to default variant if invalid variant as result of fractional evaluation": { - flags: Flags{ - Flags: map[string]model.Flag{ - "headerColor": { - State: "ENABLED", - DefaultVariant: "red", - Variants: map[string]any{ - "red": "#FF0000", - "blue": "#0000FF", - "green": "#00FF00", - "yellow": "#FFFF00", - }, - Targeting: []byte(`{ - "fractional": [ - {"var": "email"}, - [ - "black", - 100 - ] - ] - }`), - }, - }, - }, - flagKey: "headerColor", - context: map[string]any{ - "email": "foo@foo.com", - }, - expectedVariant: "red", - expectedValue: "#FF0000", - expectedReason: model.DefaultReason, - }, "fallback to default variant if percentages don't sum to 100": { flags: Flags{ Flags: map[string]model.Flag{ @@ -379,8 +347,11 @@ func TestFractionalEvaluation(t *testing.T) { t.Errorf("expected reason '%s', got '%s'", tt.expectedReason, reason) } - if err != tt.expectedError { - t.Errorf("expected err '%v', got '%v'", tt.expectedError, err) + if err != nil { + errorCode := err.Error() + if errorCode != tt.expectedErrorCode { + t.Errorf("expected err '%v', got '%v'", tt.expectedErrorCode, err) + } } }) } @@ -433,13 +404,13 @@ func BenchmarkFractionalEvaluation(b *testing.B) { } tests := map[string]struct { - flags Flags - flagKey string - context map[string]any - expectedValue string - expectedVariant string - expectedReason string - expectedError error + flags Flags + flagKey string + context map[string]any + expectedValue string + expectedVariant string + expectedReason string + expectedErrorCode string }{ "test@faas.com": { flags: flags, @@ -509,8 +480,11 @@ func BenchmarkFractionalEvaluation(b *testing.B) { b.Errorf("expected reason '%s', got '%s'", tt.expectedReason, reason) } - if err != tt.expectedError { - b.Errorf("expected err '%v', got '%v'", tt.expectedError, err) + if err != nil { + errorCode := err.Error() + if errorCode != tt.expectedErrorCode { + b.Errorf("expected err '%v', got '%v'", tt.expectedErrorCode, err) + } } } }) diff --git a/core/pkg/eval/json_evaluator.go b/core/pkg/eval/json_evaluator.go index ac3bf60a7..30da42b9c 100644 --- a/core/pkg/eval/json_evaluator.go +++ b/core/pkg/eval/json_evaluator.go @@ -341,21 +341,25 @@ func (je *JSONEvaluator) evaluateVariant(reqID string, flagKey string, context m je.Logger.ErrorWithID(reqID, fmt.Sprintf("error applying rules: %s", err)) return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.ParseErrorCode) } + + // check if string is "null" before we strip quotes, so we can differentiate between JSON null and "null" + trimmed := strings.TrimSpace(result.String()) + if trimmed == "null" { + return flag.DefaultVariant, flag.Variants, model.DefaultReason, metadata, nil + } + // strip whitespace and quotes from the variant - variant = strings.ReplaceAll(strings.TrimSpace(result.String()), "\"", "") + variant = strings.ReplaceAll(trimmed, "\"", "") // if this is a valid variant, return it if _, ok := flag.Variants[variant]; ok { return variant, flag.Variants, model.TargetingMatchReason, metadata, nil } - - je.Logger.DebugWithID(reqID, fmt.Sprintf("returning default variant for flagKey: %s, variant is not valid", flagKey)) - reason = model.DefaultReason - } else { - reason = model.StaticReason + je.Logger.ErrorWithID(reqID, + fmt.Sprintf("invalid or missing variant: %s for flagKey: %s, variant is not valid", variant, flagKey)) + return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.ParseErrorCode) } - - return flag.DefaultVariant, flag.Variants, reason, metadata, nil + return flag.DefaultVariant, flag.Variants, model.StaticReason, metadata, nil } func (je *JSONEvaluator) setFlagdProperties( diff --git a/core/pkg/eval/json_evaluator_test.go b/core/pkg/eval/json_evaluator_test.go index 0ea872ea4..932365375 100644 --- a/core/pkg/eval/json_evaluator_test.go +++ b/core/pkg/eval/json_evaluator_test.go @@ -1281,3 +1281,98 @@ func TestFlagdAmbientProperties(t *testing.T) { } }) } + +func TestTargetingVariantBehavior(t *testing.T) { + t.Run("missing variant error", func(t *testing.T) { + evaluator := eval.NewJSONEvaluator(logger.NewLogger(nil, false), store.NewFlags()) + + _, _, err := evaluator.SetState(sync.DataSync{FlagData: `{ + "flags": { + "missing-variant": { + "state": "ENABLED", + "variants": { + "foo": true, + "bar": false + }, + "defaultVariant": "foo", + "targeting": { + "if": [ true, "buz", "baz"] + } + } + } + }`}) + if err != nil { + t.Fatal(err) + } + + _, _, _, _, err = evaluator.ResolveBooleanValue(context.Background(), "default", "missing-variant", nil) + if err == nil { + t.Fatal("missing variant did not result in error") + } + }) + + t.Run("null fallback", func(t *testing.T) { + evaluator := eval.NewJSONEvaluator(logger.NewLogger(nil, false), store.NewFlags()) + + _, _, err := evaluator.SetState(sync.DataSync{FlagData: `{ + "flags": { + "null-fallback": { + "state": "ENABLED", + "variants": { + "foo": true, + "bar": false + }, + "defaultVariant": "foo", + "targeting": { + "if": [ true, null, "baz"] + } + } + } + }`}) + if err != nil { + t.Fatal(err) + } + + value, variant, reason, _, err := evaluator.ResolveBooleanValue(context.Background(), "default", "null-fallback", nil) + if err != nil { + t.Fatal(err) + } + + if !value || variant != "foo" || reason != model.DefaultReason { + t.Fatal("did not fallback to defaultValue") + } + }) + + t.Run("match booleans", func(t *testing.T) { + evaluator := eval.NewJSONEvaluator(logger.NewLogger(nil, false), store.NewFlags()) + + //nolint:dupword + _, _, err := evaluator.SetState(sync.DataSync{FlagData: `{ + "flags": { + "match-boolean": { + "state": "ENABLED", + "variants": { + "false": 1, + "true": 2 + }, + "defaultVariant": "false", + "targeting": { + "if": [ true, true, false] + } + } + } + }`}) + if err != nil { + t.Fatal(err) + } + + value, variant, reason, _, err := evaluator.ResolveIntValue(context.Background(), "default", "match-boolean", nil) + if err != nil { + t.Fatal(err) + } + + if value != 2 || variant != "true" || reason != model.TargetingMatchReason { + t.Fatal("did not map to stringified boolean") + } + }) +} diff --git a/core/pkg/eval/legacy_fractional_evaluation_test.go b/core/pkg/eval/legacy_fractional_evaluation_test.go index 008aecd77..67dda2260 100644 --- a/core/pkg/eval/legacy_fractional_evaluation_test.go +++ b/core/pkg/eval/legacy_fractional_evaluation_test.go @@ -55,13 +55,13 @@ func TestLegacyFractionalEvaluation(t *testing.T) { } tests := map[string]struct { - flags Flags - flagKey string - context map[string]any - expectedValue string - expectedVariant string - expectedReason string - expectedError error + flags Flags + flagKey string + context map[string]any + expectedValue string + expectedVariant string + expectedReason string + expectedErrorCode string }{ "test@faas.com": { flags: flags, @@ -188,11 +188,12 @@ func TestLegacyFractionalEvaluation(t *testing.T) { }, }, }, - flagKey: "headerColor", - context: map[string]any{}, - expectedVariant: "red", - expectedValue: "#FF0000", - expectedReason: model.DefaultReason, + flagKey: "headerColor", + context: map[string]any{}, + expectedVariant: "", + expectedValue: "", + expectedReason: model.ErrorReason, + expectedErrorCode: model.ParseErrorCode, }, "fallback to default variant if invalid variant as result of fractional evaluation": { flags: Flags{ @@ -222,9 +223,10 @@ func TestLegacyFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "foo@foo.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", - expectedReason: model.DefaultReason, + expectedVariant: "", + expectedValue: "", + expectedReason: model.ErrorReason, + expectedErrorCode: model.ParseErrorCode, }, "fallback to default variant if percentages don't sum to 100": { flags: Flags{ @@ -291,8 +293,11 @@ func TestLegacyFractionalEvaluation(t *testing.T) { t.Errorf("expected reason '%s', got '%s'", tt.expectedReason, reason) } - if err != tt.expectedError { - t.Errorf("expected err '%v', got '%v'", tt.expectedError, err) + if err != nil { + errorCode := err.Error() + if errorCode != tt.expectedErrorCode { + t.Errorf("expected err '%v', got '%v'", tt.expectedErrorCode, err) + } } }) } diff --git a/core/pkg/eval/semver_evaluation.go b/core/pkg/eval/semver_evaluation.go index 09a97240c..cd2ef4f71 100644 --- a/core/pkg/eval/semver_evaluation.go +++ b/core/pkg/eval/semver_evaluation.go @@ -85,12 +85,12 @@ func (je *SemVerComparisonEvaluator) SemVerEvaluation(values, _ interface{}) int actualVersion, targetVersion, operator, err := parseSemverEvaluationData(values) if err != nil { je.Logger.Error(fmt.Sprintf("parse sem_ver evaluation data: %v", err)) - return nil + return false } res, err := operator.compare(actualVersion, targetVersion) if err != nil { je.Logger.Error(fmt.Sprintf("sem_ver evaluation: %v", err)) - return nil + return false } return res } diff --git a/core/pkg/eval/string_comparison_evaluation.go b/core/pkg/eval/string_comparison_evaluation.go index 20e4861dd..05650e833 100644 --- a/core/pkg/eval/string_comparison_evaluation.go +++ b/core/pkg/eval/string_comparison_evaluation.go @@ -72,7 +72,7 @@ func (sce StringComparisonEvaluator) EndsWithEvaluation(values, _ interface{}) i propertyValue, target, err := parseStringComparisonEvaluationData(values) if err != nil { sce.Logger.Error(fmt.Sprintf("parse ends_with evaluation data: %v", err)) - return nil + return false } return strings.HasSuffix(propertyValue, target) } diff --git a/docs/reference/flag-definitions.md b/docs/reference/flag-definitions.md index b667ce167..831a4b666 100644 --- a/docs/reference/flag-definitions.md +++ b/docs/reference/flag-definitions.md @@ -43,11 +43,17 @@ A fully configured flag may look like this. "new-welcome-banner": { "state": "ENABLED", "variants": { - "true": true, - "false": false + "on": true, + "off": false }, "defaultVariant": "false", - "targeting": { "in": ["@example.com", { "var": "email" }] } + "targeting": { + "if": [ + { "in": ["@example.com", { "var": "email" }] }, + "on", + "off" + ] + } } } } @@ -147,10 +153,18 @@ Example of an invalid configuration: `targeting` is an **optional** property. A targeting rule **must** be valid JSON. Flagd uses a modified version of [JsonLogic](https://jsonlogic.com/), as well as some custom pre-processing, to evaluate these rules. -The output of the targeting rule **must** match the name of one of the variants defined above. -If an invalid or null value is returned by the targeting rule, the `defaultVariant` value is used. If no targeting rules are defined, the response reason will always be `STATIC`, this allows for the flag values to be cached, this behavior is described [here](specifications/rpc-providers.md#caching). +#### Variants Returned From Targeting Rules + +The output of the targeting rule **must** match the name of one of the defined variants. +One exception to the above is that rules may return `true` or `false` which will map to the variant indexed by the equivalent string (`"true"`, `"false"`). +If a null value is returned by the targeting rule, the `defaultVariant` is used. +This can be useful for conditionally "exiting" targeting rules and falling back to the default (in this case the returned reason will be `DEFAULT`). +If an invalid variant is returned (not a string, `true`, or `false`, or a string that is not in the set of variants) the evaluation is considered erroneous. + +See [Boolean Variant Shorthand](#boolean-variant-shorthand). + #### Evaluation Context Evaluation context is included as part of the evaluation request. @@ -190,46 +204,49 @@ Conditions can be used to control the logical flow and grouping of targeting rul Operations are used to take action on, or compare properties retrieved from the context. These are provided out-of-the-box by JsonLogic. - -| Operator | Description | Context type | Example | -| ---------------------- | -------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Equals | Attribute equals the specified value, with type coercion. | any | Logic: `#!json { "==" : [1, 1] }`
Result: `true`

Logic: `#!json { "==" : [1, "1"] }`
Result: `true` | -| Strict equals | Attribute equals the specified value, with strict comparison. | any | Logic: `#!json { "===" : [1, 1] }`
Result: `true`

Logic: `#!json { "===" : [1, "1"] }`
Result: `false` | -| Not equals | Attribute doesn't equal the specified value, with type coercion. | any | Logic: `#!json { "!=" : [1, 2] }`
Result: `true`

Logic: `#!json { "!=" : [1, "1"] }`
Result: `false` | -| Strict not equal | Attribute doesn't equal the specified value, with strict comparison. | any | Logic: `#!json { "!==" : [1, 2] }`
Result: `true`

Logic: `#!json { "!==" : [1, "1"] }`
Result: `true` | -| Exists | Attribute is defined | any | Logic: `#!json { "!!": [ "mike" ] }`
Result: `true`

Logic: `#!json { "!!": [ "" ] }`
Result: `false` | -| Not exists | Attribute is not defined | any | Logic: `#!json {"!": [ "mike" ] }`
Result: `false`

Logic: `#!json {"!": [ "" ] }`
Result: `true` | -| Greater than | Attribute is greater than the specified value | number | Logic: `#!json { ">" : [2, 1] }`
Result: `true`

Logic: `#!json { ">" : [1, 2] }`
Result: `false` | -| Greater than or equals | Attribute is greater or equal to the specified value | number | Logic: `#!json { ">=" : [2, 1] }`
Result: `true`

Logic: `#!json { ">=" : [1, 1] }`
Result: `true` | -| Less than | Attribute is less than the specified value | number | Logic: `#!json { "<" : [1, 2] }`
Result: `true`

Logic: `#!json { "<" : [2, 1] }`
Result: `false` | -| Less than or equals | Attribute is less or equal to the specified value | number | Logic: `#!json { "<=" : [1, 1] }`
Result: `true`

Logic: `#!json { "<=" : [2, 1] }`
Result: `false` | -| Between | Attribute between the specified values | number | Logic: `#!json { "<" : [1, 5, 10]}`
Result: `true`

Logic: `#!json { "<" : [1, 11, 10] }`
Result: `false` | -| Between inclusive | Attribute between or equal to the specified values | number | Logic: `#!json {"<=" : [1, 1, 10] }`
Result: `true`

Logic: `#!json {"<=" : [1, 11, 10] }`
Result: `false` | -| Contains | Contains string | string | Logic: `#!json { "in": ["Spring", "Springfield"] }`
Result: `true`

Logic: `#!json { "in":["Illinois", "Springfield"] }`
Result: `false` | -| Not contains | Does not contain a string | string | Logic: `#!json { "!": { "in":["Spring", "Springfield"] } }`
Result: `false`

Logic: `#!json { "!": { "in":["Illinois", "Springfield"] } }`
Result: `true` | -| In | Attribute is in an array of strings | string | Logic: `#!json { "in" : [ "Mike", ["Bob", "Mike"]] }`
Result: `true`

Logic: `#!json { "in":["Todd", ["Bob", "Mike"]] }`
Result: `false` | -| Not it | Attribute is not in an array of strings | string | Logic: `#!json { "!": { "in" : [ "Mike", ["Bob", "Mike"]] } }`
Result: `false`

Logic: `#!json { "!": { "in":["Todd", ["Bob", "Mike"]] } }`
Result: `true` | +It's worth noting that JsonLogic operators never throw exceptions or abnormally terminate due to invalid input. +As long as a JsonLogic operator is structurally valid, it will return a falsy/nullish value. + +| Operator | Description | Context attribute type | Example | +| ---------------------- | -------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Equals | Attribute equals the specified value, with type coercion. | any | Logic: `#!json { "==" : [1, 1] }`
Result: `true`

Logic: `#!json { "==" : [1, "1"] }`
Result: `true` | +| Strict equals | Attribute equals the specified value, with strict comparison. | any | Logic: `#!json { "===" : [1, 1] }`
Result: `true`

Logic: `#!json { "===" : [1, "1"] }`
Result: `false` | +| Not equals | Attribute doesn't equal the specified value, with type coercion. | any | Logic: `#!json { "!=" : [1, 2] }`
Result: `true`

Logic: `#!json { "!=" : [1, "1"] }`
Result: `false` | +| Strict not equal | Attribute doesn't equal the specified value, with strict comparison. | any | Logic: `#!json { "!==" : [1, 2] }`
Result: `true`

Logic: `#!json { "!==" : [1, "1"] }`
Result: `true` | +| Exists | Attribute is defined | any | Logic: `#!json { "!!": [ "mike" ] }`
Result: `true`

Logic: `#!json { "!!": [ "" ] }`
Result: `false` | +| Not exists | Attribute is not defined | any | Logic: `#!json {"!": [ "mike" ] }`
Result: `false`

Logic: `#!json {"!": [ "" ] }`
Result: `true` | +| Greater than | Attribute is greater than the specified value | number | Logic: `#!json { ">" : [2, 1] }`
Result: `true`

Logic: `#!json { ">" : [1, 2] }`
Result: `false` | +| Greater than or equals | Attribute is greater or equal to the specified value | number | Logic: `#!json { ">=" : [2, 1] }`
Result: `true`

Logic: `#!json { ">=" : [1, 1] }`
Result: `true` | +| Less than | Attribute is less than the specified value | number | Logic: `#!json { "<" : [1, 2] }`
Result: `true`

Logic: `#!json { "<" : [2, 1] }`
Result: `false` | +| Less than or equals | Attribute is less or equal to the specified value | number | Logic: `#!json { "<=" : [1, 1] }`
Result: `true`

Logic: `#!json { "<=" : [2, 1] }`
Result: `false` | +| Between | Attribute between the specified values | number | Logic: `#!json { "<" : [1, 5, 10]}`
Result: `true`

Logic: `#!json { "<" : [1, 11, 10] }`
Result: `false` | +| Between inclusive | Attribute between or equal to the specified values | number | Logic: `#!json {"<=" : [1, 1, 10] }`
Result: `true`

Logic: `#!json {"<=" : [1, 11, 10] }`
Result: `false` | +| Contains | Contains string | string | Logic: `#!json { "in": ["Spring", "Springfield"] }`
Result: `true`

Logic: `#!json { "in":["Illinois", "Springfield"] }`
Result: `false` | +| Not contains | Does not contain a string | string | Logic: `#!json { "!": { "in":["Spring", "Springfield"] } }`
Result: `false`

Logic: `#!json { "!": { "in":["Illinois", "Springfield"] } }`
Result: `true` | +| In | Attribute is in an array of strings | string | Logic: `#!json { "in" : [ "Mike", ["Bob", "Mike"]] }`
Result: `true`

Logic: `#!json { "in":["Todd", ["Bob", "Mike"]] }`
Result: `false` | +| Not it | Attribute is not in an array of strings | string | Logic: `#!json { "!": { "in" : [ "Mike", ["Bob", "Mike"]] } }`
Result: `false`

Logic: `#!json { "!": { "in":["Todd", ["Bob", "Mike"]] } }`
Result: `true` | #### Custom Operations These are custom operations specific to flagd and flagd providers. They are purpose built extensions to JsonLogic in order to support common feature flag use cases. +Consistent with build-in JsonLogic operators, flagd's custom operators return falsy/nullish values with invalid inputs. -| Function | Description | Example | -| ---------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `fractional` (_available v0.6.4+_) | Deterministic, pseudorandom fractional distribution | Logic: `#!json { "fractional" : [ { "var": "email" }, [ "red" , 50], [ "green" , 50 ] ] }`
Result: Pseudo randomly `red` or `green` based on the evaluation context property `email`.

Additional documentation can be found [here](./custom-operations/fractional-operation.md). | -| `starts_with` | Attribute starts with the specified value | Logic: `#!json { "starts_with" : [ "192.168.0.1", "192.168"] }`
Result: `true`

Logic: `#!json { "starts_with" : [ "10.0.0.1", "192.168"] }`
Result: `false`
Additional documentation can be found [here](./custom-operations/string-comparison-operation.md). | -| `ends_with` | Attribute ends with the specified value | Logic: `#!json { "ends_with" : [ "noreply@example.com", "@example.com"] }`
Result: `true`

Logic: `#!json { ends_with" : [ "noreply@example.com", "@test.com"] }`
Result: `false`
Additional documentation can be found [here](./custom-operations/string-comparison-operation.md).| -| `sem_ver` | Attribute matches a semantic versioning condition | Logic: `#!json {"sem_ver": ["1.1.2", ">=", "1.0.0"]}`
Result: `true`

Additional documentation can be found [here](./custom-operations/semver-operation.md). | +| Function | Description | Context attribute type | Example | +| ---------------------------------- | --------------------------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fractional` (_available v0.6.4+_) | Deterministic, pseudorandom fractional distribution | string (bucketing value) | Logic: `#!json { "fractional" : [ { "var": "email" }, [ "red" , 50], [ "green" , 50 ] ] }`
Result: Pseudo randomly `red` or `green` based on the evaluation context property `email`.

Additional documentation can be found [here](./custom-operations/fractional-operation.md). | +| `starts_with` | Attribute starts with the specified value | string | Logic: `#!json { "starts_with" : [ "192.168.0.1", "192.168"] }`
Result: `true`

Logic: `#!json { "starts_with" : [ "10.0.0.1", "192.168"] }`
Result: `false`
Additional documentation can be found [here](./custom-operations/string-comparison-operation.md). | +| `ends_with` | Attribute ends with the specified value | string | Logic: `#!json { "ends_with" : [ "noreply@example.com", "@example.com"] }`
Result: `true`

Logic: `#!json { ends_with" : [ "noreply@example.com", "@test.com"] }`
Result: `false`
Additional documentation can be found [here](./custom-operations/string-comparison-operation.md). | +| `sem_ver` | Attribute matches a semantic versioning condition | string (valid [semver](https://semver.org/)) | Logic: `#!json {"sem_ver": ["1.1.2", ">=", "1.0.0"]}`
Result: `true`

Additional documentation can be found [here](./custom-operations/semver-operation.md). | #### $flagd properties in the evaluation context Flagd adds the following properties to the evaluation context that can be used in the targeting rules. -| Property | Description | From version | -|----------|-------------|--------------| -| `$flagd.flagKey` | the identifier for the flag being evaluated | v0.6.4 | -| `$flagd.timestamp`| a unix timestamp (in seconds) of the time of evaluation | v0.6.7 | +| Property | Description | From version | +| ------------------ | ------------------------------------------------------- | ------------ | +| `$flagd.flagKey` | the identifier for the flag being evaluated | v0.6.4 | +| `$flagd.timestamp` | a unix timestamp (in seconds) of the time of evaluation | v0.6.7 | ## Shared evaluators @@ -301,6 +318,54 @@ Example: } ``` +## Boolean Variant Shorthand + +Since rules that return `true` or `false` map to the variant indexed by the equivalent string (`"true"`, `"false"`), you can use shorthand for these cases. + +For example, this: + +```json +{ + "flags": { + "new-welcome-banner": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": { + "if": [ + { "in": ["@example.com", { "var": "email" }] }, + "true", + "false" + ] + } + } + } +} +``` + +can be shortened to this: + +```json +{ + "flags": { + "new-welcome-banner": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": { + { "in": ["@example.com", { "var": "email" }] } + } + } + } +} +``` + ## Examples Sample configurations can be found at . diff --git a/docs/reference/specifications/custom-operations/fractional-operation-spec.md b/docs/reference/specifications/custom-operations/fractional-operation-spec.md index 8e6eb5340..792c6cc1b 100644 --- a/docs/reference/specifications/custom-operations/fractional-operation-spec.md +++ b/docs/reference/specifications/custom-operations/fractional-operation-spec.md @@ -13,7 +13,7 @@ hash function should be used. This is to ensure that flag resolution requests yi regardless of which implementation of the in-process flagd provider is being used. The supplied array must contain at least two items, with the first item being an optional [json logic variable declaration](https://jsonlogic.com/operations.html#var) -specifying the bucketing property to base the distribution of values on. If not supplied, a concatenation of the +specifying the bucketing property to base the distribution of values on. If the bucketing property expression doesn't return a string, a concatenation of the `flagKey` and `targetingKey` are used: `{"cat": [{"var":"$flagd.flagKey"}, {"var":"targetingKey"}]}`. The remaining items are `arrays`, each with two values, with the first being `string` item representing the name of the variant, and the second being a `float` item representing the percentage for that variant. The percentages of all items must add up to @@ -62,8 +62,8 @@ The following flow chart depicts the logic of this evaluator: ```mermaid flowchart TD A[Parse targetingRule] --> B{Is an array containing at least one item?}; -B -- Yes --> C{Is targetingRule at index 0 a string?}; -B -- No --> D[return nil] +B -- Yes --> C{Does expression at index 0 return a string?}; +B -- No --> D[return null] C -- No --> E[bucketingPropertyValue := default to targetingKey]; C -- Yes --> F[bucketingPropertyValue := targetingRule at index 0]; E --> G[Iterate through the remaining elements of the targetingRule array and parse the variants and their percentages]; diff --git a/docs/reference/specifications/custom-operations/semver-operation-spec.md b/docs/reference/specifications/custom-operations/semver-operation-spec.md index 56c51f7af..352e44065 100644 --- a/docs/reference/specifications/custom-operations/semver-operation-spec.md +++ b/docs/reference/specifications/custom-operations/semver-operation-spec.md @@ -21,7 +21,7 @@ The 'sem_ver' evaluation rule contains exactly three items: 1. Target property value: the resolved value of the target property referenced in the targeting rule 2. Operator: One of the following: `=`, `!=`, `>`, `<`, `>=`, `<=`, `~` (match minor version), `^` (match major version) 3. Target value: this needs to resolve to a semantic versioning string. If this condition is not met, the evaluator should -log an appropriate error message and return `nil` +log an appropriate error message and return `false` The `sem_ver` evaluation returns a boolean, indicating whether the condition has been met. @@ -35,7 +35,7 @@ The following flow chart depicts the logic of this evaluator: flowchart TD A[Parse targetingRule] --> B{Is an array containing exactly three items?}; B -- Yes --> C{Is targetingRule at index 0 a semantic version string?}; -B -- No --> D[Return nil]; +B -- No --> D[Return false]; C -- Yes --> E{Is targetingRule at index 1 a supported operator?}; C -- No --> D; E -- Yes --> F{Is targetingRule at index 2 a semantic version string?}; diff --git a/docs/reference/specifications/custom-operations/string-comparison-operation-spec.md b/docs/reference/specifications/custom-operations/string-comparison-operation-spec.md index 3e9832563..8d57b3b71 100644 --- a/docs/reference/specifications/custom-operations/string-comparison-operation-spec.md +++ b/docs/reference/specifications/custom-operations/string-comparison-operation-spec.md @@ -32,7 +32,7 @@ The following flow chart depicts the logic of this evaluator: flowchart TD A[Parse targetingRule] --> B{Is an array containing exactly two items?}; B -- Yes --> C{Is targetingRule at index 0 a string?}; -B -- No --> D[Return nil]; +B -- No --> D[Return false]; C -- Yes --> E{Is targetingRule at index 1 a string?}; C -- No --> D; E -- No --> D; diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 40d200057..3fddcd049 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.3.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.3.1...flagd-proxy/v0.3.2) (2023-12-05) + + +### 🐛 Bug Fixes + +* **deps:** update module github.com/open-feature/flagd/core to v0.7.1 ([#1037](https://github.com/open-feature/flagd/issues/1037)) ([0ed9b68](https://github.com/open-feature/flagd/commit/0ed9b68341d026681c684a726b215ff910fe2a00)) + ## [0.3.1](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.3.0...flagd-proxy/v0.3.1) (2023-11-28) diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index f3227d7d2..2fbb7baa7 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/dimiro1/banner v1.1.0 github.com/mattn/go-colorable v0.1.13 - github.com/open-feature/flagd/core v0.7.0 + github.com/open-feature/flagd/core v0.7.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 go.uber.org/zap v1.26.0 @@ -78,15 +78,15 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/otel v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.43.0 // indirect - go.opentelemetry.io/otel/metric v1.20.0 // indirect - go.opentelemetry.io/otel/sdk v1.20.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.20.0 // indirect - go.opentelemetry.io/otel/trace v1.20.0 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.15.0 // indirect @@ -109,10 +109,10 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.3 // indirect + k8s.io/api v0.28.4 // indirect k8s.io/apiextensions-apiserver v0.28.3 // indirect - k8s.io/apimachinery v0.28.3 // indirect - k8s.io/client-go v0.28.3 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect k8s.io/component-base v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index d14b85a4a..9980f3db4 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -661,6 +661,8 @@ github.com/open-feature/flagd/core v0.6.8 h1:hGgQi5/FSrIV+3E1hK0T1veRfeuDjWQ4doz github.com/open-feature/flagd/core v0.6.8/go.mod h1:fxWilCV52+Me+jZK1lPesUJwPzmJty+4y7O5txropq8= github.com/open-feature/flagd/core v0.7.0 h1:dTUWCoX0Z8pgFGcv5xg2aZbqdmG1WDbD9vaRp7BTSQ8= github.com/open-feature/flagd/core v0.7.0/go.mod h1:lwyUOrkoY3YXxNwhYrmjT8+0/M7iAdS37bdNs2BKTaA= +github.com/open-feature/flagd/core v0.7.1 h1:xA74MzzP7n5pnA+Is9GCIW3hGEddcogDRGk8QIUDYZ0= +github.com/open-feature/flagd/core v0.7.1/go.mod h1:sj2wy2BvnlztGcjrJnz9vMDd3ixFKlYwPhzu2PEQNqo= github.com/open-feature/open-feature-operator v0.2.36 h1:dzyZh9JSIRvXkfpM9ynYplNk7vjQFLs9sd5aHhF48z4= github.com/open-feature/open-feature-operator v0.2.36/go.mod h1:nM7T4oGQukeGmcAFkQm0uwt8WFdDb5hYPjXkm7pHhX4= github.com/open-feature/open-feature-operator v0.2.37-0.20231108054703-a97d336468d5 h1:ONgFdsDH0uAS3qrmZEQjYqFtqKw/MCkbbQSE33bGBsU= @@ -759,22 +761,40 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0 h1:tFUz2BE6ucxU9PuPCwzbfDeQjMznIySJ4/73a3FSPUs= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0/go.mod h1:hbzqqcIxyywu6UQ5J1wb4ntla8nCwCfNBZnMo2Dgh48= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/prometheus v0.43.0 h1:Skkl6akzvdWweXX6LLAY29tyFSO6hWZ26uDbVGTDXe8= go.opentelemetry.io/otel/exporters/prometheus v0.43.0/go.mod h1:nZStMoc1H/YJpRjSx9IEX4abBMekORTLQcTUT1CgLkg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM= go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/metric v1.20.0 h1:5eD40l/H2CqdKmbSV7iht2KMK0faAIL2pVYzJOWobGk= go.opentelemetry.io/otel/sdk/metric v1.20.0/go.mod h1:AGvpC+YF/jblITiafMTYgvRBUiwi9hZf0EYE2E5XlS8= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= @@ -1365,12 +1385,18 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 67f688247..fe6397f74 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.7.2](https://github.com/open-feature/flagd/compare/flagd/v0.7.1...flagd/v0.7.2) (2023-12-05) + + +### 🐛 Bug Fixes + +* **deps:** update module github.com/open-feature/flagd/core to v0.7.1 ([#1037](https://github.com/open-feature/flagd/issues/1037)) ([0ed9b68](https://github.com/open-feature/flagd/commit/0ed9b68341d026681c684a726b215ff910fe2a00)) + ## [0.7.1](https://github.com/open-feature/flagd/compare/flagd/v0.7.0...flagd/v0.7.1) (2023-11-28) diff --git a/flagd/go.mod b/flagd/go.mod index 188b50bd4..1db5f0878 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/dimiro1/banner v1.1.0 github.com/mattn/go-colorable v0.1.13 - github.com/open-feature/flagd/core v0.7.0 + github.com/open-feature/flagd/core v0.7.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.17.0 go.uber.org/zap v1.26.0 @@ -80,15 +80,15 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/otel v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.43.0 // indirect - go.opentelemetry.io/otel/metric v1.20.0 // indirect - go.opentelemetry.io/otel/sdk v1.20.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.20.0 // indirect - go.opentelemetry.io/otel/trace v1.20.0 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.15.0 // indirect @@ -111,10 +111,10 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.28.3 // indirect + k8s.io/api v0.28.4 // indirect k8s.io/apiextensions-apiserver v0.28.3 // indirect - k8s.io/apimachinery v0.28.3 // indirect - k8s.io/client-go v0.28.3 // indirect + k8s.io/apimachinery v0.28.4 // indirect + k8s.io/client-go v0.28.4 // indirect k8s.io/component-base v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index 35b04deb5..6cc3b62b3 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -661,6 +661,8 @@ github.com/open-feature/flagd/core v0.6.8 h1:hGgQi5/FSrIV+3E1hK0T1veRfeuDjWQ4doz github.com/open-feature/flagd/core v0.6.8/go.mod h1:fxWilCV52+Me+jZK1lPesUJwPzmJty+4y7O5txropq8= github.com/open-feature/flagd/core v0.7.0 h1:dTUWCoX0Z8pgFGcv5xg2aZbqdmG1WDbD9vaRp7BTSQ8= github.com/open-feature/flagd/core v0.7.0/go.mod h1:lwyUOrkoY3YXxNwhYrmjT8+0/M7iAdS37bdNs2BKTaA= +github.com/open-feature/flagd/core v0.7.1 h1:xA74MzzP7n5pnA+Is9GCIW3hGEddcogDRGk8QIUDYZ0= +github.com/open-feature/flagd/core v0.7.1/go.mod h1:sj2wy2BvnlztGcjrJnz9vMDd3ixFKlYwPhzu2PEQNqo= github.com/open-feature/open-feature-operator v0.2.36 h1:dzyZh9JSIRvXkfpM9ynYplNk7vjQFLs9sd5aHhF48z4= github.com/open-feature/open-feature-operator v0.2.36/go.mod h1:nM7T4oGQukeGmcAFkQm0uwt8WFdDb5hYPjXkm7pHhX4= github.com/open-feature/open-feature-operator v0.2.37-0.20231108054703-a97d336468d5 h1:ONgFdsDH0uAS3qrmZEQjYqFtqKw/MCkbbQSE33bGBsU= @@ -760,22 +762,40 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0 h1:tFUz2BE6ucxU9PuPCwzbfDeQjMznIySJ4/73a3FSPUs= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0/go.mod h1:hbzqqcIxyywu6UQ5J1wb4ntla8nCwCfNBZnMo2Dgh48= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/prometheus v0.43.0 h1:Skkl6akzvdWweXX6LLAY29tyFSO6hWZ26uDbVGTDXe8= go.opentelemetry.io/otel/exporters/prometheus v0.43.0/go.mod h1:nZStMoc1H/YJpRjSx9IEX4abBMekORTLQcTUT1CgLkg= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w= +go.opentelemetry.io/otel/exporters/prometheus v0.44.0/go.mod h1:ERL2uIeBtg4TxZdojHUwzZfIFlUIjZtxubT5p4h1Gjg= go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM= go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk/metric v1.20.0 h1:5eD40l/H2CqdKmbSV7iht2KMK0faAIL2pVYzJOWobGk= go.opentelemetry.io/otel/sdk/metric v1.20.0/go.mod h1:AGvpC+YF/jblITiafMTYgvRBUiwi9hZf0EYE2E5XlS8= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= @@ -1366,12 +1386,18 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= +k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= +k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= +k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= +k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= diff --git a/flagd/snap/snapcraft.yaml b/flagd/snap/snapcraft.yaml index 5e8bb5e9b..03966dd88 100644 --- a/flagd/snap/snapcraft.yaml +++ b/flagd/snap/snapcraft.yaml @@ -1,16 +1,17 @@ name: flagd base: core20 -version: "v0.7.1" # x-release-please-version +version: 0.7.2 summary: A feature flag daemon with a Unix philosophy -description: | - Flagd is a simple command line tool for fetching and evaluating feature flags for services. It is designed to conform with the OpenFeature specification. -grade: stable # must be 'stable' to release into candidate/stable channels +description: > + Flagd is a simple command line tool for fetching and evaluating feature flags + for services. It is designed to conform with the OpenFeature specification. +grade: stable confinement: strict architectures: - - build-on: amd64 - - build-on: arm64 + - build-on: amd64 + - build-on: arm64 apps: - flagd: + flagd: command: bin/flagd plugs: - home @@ -18,7 +19,6 @@ apps: - network-bind parts: home: - # See 'snapcraft plugins' plugin: go source-type: git source: https://github.com/open-feature/flagd.git diff --git a/release-please-config.json b/release-please-config.json index ecb6ad636..6d6135581 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,5 +1,5 @@ { - "monorepo-tags": true, + "include-component-in-tag": true, "tag-separator": "/", "last-release-sha": "4f7b3cf32d6abbf91bd002abbfe851e84fc3dac5", "packages": {