diff --git a/flags/selector-flag-combined-metadata.json b/flags/selector-flag-combined-metadata.json new file mode 100644 index 0000000..cdefb50 --- /dev/null +++ b/flags/selector-flag-combined-metadata.json @@ -0,0 +1,29 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {}, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } + } + }, + "metadata": { + "string": "b", + "integer": 2, + "float": 2.2, + "boolean": false, + "flag-set-string": "c", + "flag-set-integer": 3, + "flag-set-float": 3.2, + "flag-set-boolean": false + } +} diff --git a/flags/selector-flag-metadata.json b/flags/selector-flag-metadata.json new file mode 100644 index 0000000..3fccde3 --- /dev/null +++ b/flags/selector-flag-metadata.json @@ -0,0 +1,19 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {}, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } + } + } +} diff --git a/flags/selector-flag-set-metadata.json b/flags/selector-flag-set-metadata.json new file mode 100644 index 0000000..e048dd2 --- /dev/null +++ b/flags/selector-flag-set-metadata.json @@ -0,0 +1,19 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {} + } + }, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } +} diff --git a/gherkin/metadata.feature b/gherkin/metadata.feature new file mode 100644 index 0000000..597ea08 --- /dev/null +++ b/gherkin/metadata.feature @@ -0,0 +1,52 @@ +@in-process @metadata @file +Feature: flag and flag set metadata + + # This test suite contains scenarios to test flagd providers. + # It's associated with the flags configured in flags. + # It should be used in conjunction with the suites supplied by the OpenFeature specification. + + Scenario: Returns metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + + Scenario: Returns flag set metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-set-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + + Scenario: Flag metadata overwrites flag set metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-combined-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + | flag-set-string | String | c | + | flag-set-integer | Integer | 3 | + | flag-set-float | Float | 3.2 | + | flag-set-boolean | Boolean | false | + + Scenario: Returns no metadata + Given a Boolean-flag with key "boolean-flag" and a default value "true" + And a stable flagd provider + When the flag was evaluated with details + Then the resolved metadata is empty diff --git a/launchpad/configs/default.json b/launchpad/configs/default.json index 484d2be..f0fbb32 100644 --- a/launchpad/configs/default.json +++ b/launchpad/configs/default.json @@ -7,6 +7,18 @@ { "uri": "rawflags/selector-flags.json", "provider": "file" + }, + { + "uri": "rawflags/selector-flag-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-set-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-combined-metadata.json", + "provider": "file" } ], "context-value": { diff --git a/launchpad/configs/ssl.json b/launchpad/configs/ssl.json index 550c2a7..5e306dd 100644 --- a/launchpad/configs/ssl.json +++ b/launchpad/configs/ssl.json @@ -9,6 +9,18 @@ { "uri": "rawflags/selector-flags.json", "provider": "file" + }, + { + "uri": "rawflags/selector-flag-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-set-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-combined-metadata.json", + "provider": "file" } ], "context-value": { diff --git a/launchpad/pkg/json.go b/launchpad/pkg/json.go index 440dd07..79e2854 100644 --- a/launchpad/pkg/json.go +++ b/launchpad/pkg/json.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "sync" ) @@ -28,7 +29,7 @@ func CombineJSONFiles(inputDir string) error { combinedData := make(map[string]interface{}) for _, file := range files { - if filepath.Ext(file.Name()) == ".json" { + if filepath.Ext(file.Name()) == ".json" && !strings.HasPrefix(file.Name(), "selector-") { filePath := filepath.Join(inputDir, file.Name()) content, err := ioutil.ReadFile(filePath) if err != nil {