Skip to content

Commit a9c51cf

Browse files
authored
feat: Add Unleash Provider (#338)
Signed-off-by: liran2000 <[email protected]>
1 parent 32f3cd2 commit a9c51cf

11 files changed

+715
-1
lines changed

.github/component_owners.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ components:
2525
providers/launchdarkly:
2626
- c4milo
2727
- kinyoklion
28+
providers/unleash:
29+
- liran2000
30+
- sighphyre
2831

2932
ignored-authors:
3033
- renovate-bot

.release-please-manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
"providers/go-feature-flag": "0.1.29",
99
"providers/flagsmith": "0.1.4",
1010
"providers/launchdarkly": "0.1.3",
11-
"tests/flagd": "1.3.1"
11+
"tests/flagd": "1.3.1",
12+
"tests/unleash": "0.0.1-alpha"
1213
}

providers/unleash/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Changelog

providers/unleash/README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Unofficial Unleash OpenFeature GO Provider
2+
3+
[Unleash](https://getunleash.io) OpenFeature Provider can provide usage for Unleash via OpenFeature GO SDK.
4+
5+
# Installation
6+
7+
To use the Unleash provider, you'll need to install [unleash Go client](github.com/Unleash/unleash-client-go/v3) and unleash provider. You can install the packages using the following command
8+
9+
```shell
10+
go get github.com/Unleash/unleash-client-go/v3
11+
go get github.com/open-feature/go-sdk-contrib/providers/unleash
12+
```
13+
14+
## Concepts
15+
* Boolean evaluation gets feature enabled status.
16+
* String evaluation gets feature variant value.
17+
18+
## Usage
19+
Unleash OpenFeature Provider is using Unleash GO SDK.
20+
21+
## Usage Example
22+
23+
```go
24+
import (
25+
"github.com/Unleash/unleash-client-go/v3"
26+
unleashProvider "github.com/open-feature/go-sdk-contrib/providers/unleash/pkg"
27+
)
28+
29+
providerConfig := unleashProvider.ProviderConfig{
30+
Options: []unleash.ConfigOption{
31+
unleash.WithListener(&unleash.DebugListener{}),
32+
unleash.WithAppName("my-application"),
33+
unleash.WithRefreshInterval(5 * time.Second),
34+
unleash.WithMetricsInterval(5 * time.Second),
35+
unleash.WithStorage(&unleash.BootstrapStorage{Reader: demoReader}),
36+
unleash.WithUrl("https://localhost:4242"),
37+
},
38+
}
39+
40+
provider, err := unleashProvider.NewProvider(providerConfig)
41+
err = provider.Init(of.EvaluationContext{})
42+
43+
ctx := context.Background()
44+
45+
of.SetProvider(provider)
46+
ofClient := of.NewClient("my-app")
47+
48+
evalCtx := of.NewEvaluationContext(
49+
"",
50+
map[string]interface{}{
51+
"UserId": "111",
52+
},
53+
)
54+
enabled, err := ofClient.BooleanValue(context.Background(), "users-flag", false, evalCtx)
55+
56+
evalCtx := of.NewEvaluationContext(
57+
"",
58+
map[string]interface{}{},
59+
)
60+
value, err := ofClient.StringValue(context.Background(), "variant-flag", "", evalCtx)
61+
62+
```
63+
See [provider_test.go](./pkg/provider_test.go) for more information.
64+
65+
66+
### Additional Usage Details
67+
68+
* When default value is used and returned, default variant is not used and variant name is not set.
69+
* json/csv payloads are evaluated via object evaluation as what returned from Unleash - string, wrapped with Value.
70+
* Additional evaluation data can be received via flag metadata, such as:
71+
* *enabled* - boolean

providers/unleash/go.mod

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module github.com/open-feature/go-sdk-contrib/providers/unleash
2+
3+
go 1.19
4+
5+
require (
6+
github.com/Unleash/unleash-client-go/v3 v3.8.0
7+
github.com/open-feature/go-sdk v1.7.0
8+
github.com/stretchr/testify v1.8.4
9+
)
10+
11+
require (
12+
github.com/Masterminds/semver/v3 v3.1.1 // indirect
13+
github.com/blang/semver/v4 v4.0.0 // indirect
14+
github.com/davecgh/go-spew v1.1.1 // indirect
15+
github.com/go-logr/logr v1.2.4 // indirect
16+
github.com/go-resty/resty/v2 v2.7.0 // indirect
17+
github.com/kr/pretty v0.3.1 // indirect
18+
github.com/pmezard/go-difflib v1.0.0 // indirect
19+
github.com/stretchr/objx v0.5.0 // indirect
20+
github.com/twmb/murmur3 v1.1.5 // indirect
21+
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect
22+
golang.org/x/net v0.12.0 // indirect
23+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
24+
gopkg.in/yaml.v3 v3.0.1 // indirect
25+
)

providers/unleash/go.sum

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
github.com/Flagsmith/flagsmith-go-client/v3 v3.1.0 h1:RHF5lpe9QT+RqHg3CETqW3g6F5H+u6tN4y6dzP+jwVY=
2+
github.com/Flagsmith/flagsmith-go-client/v3 v3.1.0/go.mod h1:a+QkobiC/lwFSFoEMXxta3yRubhBkOGkeHgZl2a/FG4=
3+
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
4+
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
5+
github.com/Unleash/unleash-client-go/v3 v3.8.0 h1:DS2yU0/ouy8lXGO3FzocUTZMyO7uhjHPEYmwqGEJopQ=
6+
github.com/Unleash/unleash-client-go/v3 v3.8.0/go.mod h1:jAf7F2WWpfJbfn1n8bZ74p7hkAhijrqH4TpWoT7kWLc=
7+
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
8+
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
9+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
10+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
12+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
13+
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
14+
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
15+
github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
16+
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
17+
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
18+
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
19+
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
20+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
21+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
22+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
23+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
24+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
25+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
26+
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
27+
github.com/open-feature/go-sdk v1.5.1 h1:ja1+XtWwqLqgJSFJ31sh+MCioVW4vWj5ya/e/f81y38=
28+
github.com/open-feature/go-sdk v1.5.1/go.mod h1:yllFTs5yJguao9zdcmYYGJBHTyBGwO2zC+GP2JeFR0o=
29+
github.com/open-feature/go-sdk v1.6.0 h1:9Wi8J77ORVKvm/8d1ZGKI7+/Uq+5JrpxylQ50DvZZnA=
30+
github.com/open-feature/go-sdk v1.6.0/go.mod h1:xR4RHexQNwvE/7IOR0LOiCuH+2wlQyoZwpAc4bp508o=
31+
github.com/open-feature/go-sdk v1.7.0 h1:g6o/sf5xaED7xawXwZ0LqE7RS9co7HZJMClXCXmIbgw=
32+
github.com/open-feature/go-sdk v1.7.0/go.mod h1:5aV26tEoQuompRa8A6BAGukhi88pRMZsslJJwucGNzs=
33+
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
34+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
35+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
36+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
37+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
38+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
39+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
40+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
41+
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
42+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
43+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
44+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
45+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
46+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
47+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
48+
github.com/twmb/murmur3 v1.1.5 h1:i9OLS9fkuLzBXjt6dptlAEyk58fJsSTXbRg3SgVyqgk=
49+
github.com/twmb/murmur3 v1.1.5/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
50+
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
51+
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
52+
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA=
53+
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
54+
golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
55+
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
56+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
57+
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
58+
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
59+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
60+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
61+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
62+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
63+
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
64+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
65+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
66+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
67+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
68+
gopkg.in/h2non/gock.v1 v1.0.10/go.mod h1:KHI4Z1sxDW6P4N3DfTWSEza07YpkQP7KJBfglRMEjKY=
69+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
70+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
71+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
{
2+
"version": 1,
3+
"features": [
4+
{
5+
"name": "variant-flag",
6+
"type": "experiment",
7+
"enabled": true,
8+
"stale": false,
9+
"strategies": [
10+
{ "name": "default", "parameters": {}, "constraints": [] }
11+
],
12+
"variants": [
13+
{
14+
"name": "v1",
15+
"weight": 1000,
16+
"weightType": "fix",
17+
"payload": { "type": "string", "value": "v1" },
18+
"overrides": [],
19+
"stickiness": "default"
20+
},
21+
{
22+
"name": "v2",
23+
"weight": 0,
24+
"weightType": "variable",
25+
"payload": { "type": "string", "value": "v2" },
26+
"overrides": [{ "contextName": "userId", "values": ["me"] }],
27+
"stickiness": "default"
28+
}
29+
]
30+
},
31+
{
32+
"name": "users-flag",
33+
"type": "release",
34+
"enabled": true,
35+
"stale": false,
36+
"strategies": [
37+
{ "name": "userWithId", "parameters": { "userIds": "111,234" } }
38+
],
39+
"variants": []
40+
},
41+
{
42+
"name": "json-flag",
43+
"type": "experiment",
44+
"enabled": true,
45+
"stale": false,
46+
"strategies": [{ "name": "default", "parameters": {} }],
47+
"variants": [
48+
{
49+
"name": "aaaa",
50+
"weight": 1000,
51+
"payload": { "type": "json", "value": "{ a: 1 }" },
52+
"overrides": [],
53+
"weightType": "variable",
54+
"stickiness": "default"
55+
}
56+
]
57+
},
58+
{
59+
"name": "csv-flag",
60+
"type": "experiment",
61+
"enabled": true,
62+
"stale": false,
63+
"strategies": [{ "name": "default", "parameters": {} }],
64+
"variants": [
65+
{
66+
"name": "aaaa",
67+
"weight": 1000,
68+
"payload": { "type": "csv", "value": "a,b,c" },
69+
"overrides": [],
70+
"weightType": "variable",
71+
"stickiness": "default"
72+
}
73+
]
74+
},
75+
{
76+
"name": "int-flag",
77+
"type": "experiment",
78+
"enabled": true,
79+
"stale": false,
80+
"strategies": [{ "name": "default", "parameters": {} }],
81+
"variants": [
82+
{
83+
"name": "aaaa",
84+
"weight": 1000,
85+
"payload": { "type": "number", "value": "123" },
86+
"overrides": [],
87+
"weightType": "variable",
88+
"stickiness": "default"
89+
}
90+
]
91+
},
92+
{
93+
"name": "double-flag",
94+
"type": "experiment",
95+
"enabled": true,
96+
"stale": false,
97+
"strategies": [{ "name": "default", "parameters": {} }],
98+
"variants": [
99+
{
100+
"name": "aaaa",
101+
"weight": 1000,
102+
"payload": { "type": "number", "value": "1.23" },
103+
"overrides": [],
104+
"weightType": "variable",
105+
"stickiness": "default"
106+
}
107+
]
108+
}
109+
]
110+
}

0 commit comments

Comments
 (0)