feat: Support feature flag overrides in ephemeral test envs (#14008)
* Add support for feature flag overrides in ephemeral env cmd * update docs to reference correct config * Update ephemeral env docs
This commit is contained in:
parent
5dd971eaf5
commit
6a81a7961c
|
|
@ -11,6 +11,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
slash-command: ${{ steps.eval-body.outputs.result }}
|
slash-command: ${{ steps.eval-body.outputs.result }}
|
||||||
|
feature-flags: ${{ steps.eval-feature-flags.outputs.result }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Debug
|
- name: Debug
|
||||||
|
|
@ -28,6 +29,22 @@ jobs:
|
||||||
const result = pattern.exec(context.payload.comment.body)
|
const result = pattern.exec(context.payload.comment.body)
|
||||||
return result === null ? 'noop' : result[1]
|
return result === null ? 'noop' : result[1]
|
||||||
|
|
||||||
|
- name: Eval comment body for feature flags
|
||||||
|
uses: actions/github-script@v3
|
||||||
|
id: eval-feature-flags
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const pattern = /FEATURE_(\w+)=(\w+)/g;
|
||||||
|
let results = [];
|
||||||
|
[...context.payload.comment.body.matchAll(pattern)].forEach(match => {
|
||||||
|
const config = {
|
||||||
|
name: `SUPERSET_FEATURE_${match[1]}`,
|
||||||
|
value: match[2],
|
||||||
|
};
|
||||||
|
results.push(config);
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
|
||||||
- name: Limit to committers
|
- name: Limit to committers
|
||||||
if: >
|
if: >
|
||||||
steps.eval-body.outputs.result != 'noop' &&
|
steps.eval-body.outputs.result != 'noop' &&
|
||||||
|
|
@ -100,6 +117,10 @@ jobs:
|
||||||
container-name: superset-ci
|
container-name: superset-ci
|
||||||
image: ${{ steps.login-ecr.outputs.registry }}/superset-ci:pr-${{ github.event.issue.number }}
|
image: ${{ steps.login-ecr.outputs.registry }}/superset-ci:pr-${{ github.event.issue.number }}
|
||||||
|
|
||||||
|
- name: Update env vars in the Amazon ECS task definition
|
||||||
|
run: |
|
||||||
|
cat <<< "$(jq '.containerDefinitions[0].environment += ${{ needs.ephemeral_env_comment.outputs.feature-flags }}' < ${{ steps.task-def.outputs.task-definition }})" > ${{ steps.task-def.outputs.task-definition }}
|
||||||
|
|
||||||
- name: Describe ECS service
|
- name: Describe ECS service
|
||||||
id: describe-services
|
id: describe-services
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
|
|
@ -251,9 +251,16 @@ Finally, never submit a PR that will put master branch in broken state. If the P
|
||||||
|
|
||||||
#### Test Environments
|
#### Test Environments
|
||||||
|
|
||||||
- Members of the Apache GitHub org can launch an ephemeral test environment directly on a pull request by creating a comment containing (only) the command `/testenv up`
|
- Members of the Apache GitHub org can launch an ephemeral test environment directly on a pull request by creating a comment containing (only) the command `/testenv up`.
|
||||||
|
- Note that org membership must be public in order for this validation to function properly.
|
||||||
|
- Feature flags may be set for a test environment by specifying the flag name (prefixed with `FEATURE_`) and value after the command.
|
||||||
|
- Format: `/testenv up FEATURE_<feature flag name>=true|false`
|
||||||
|
- Example: `/testenv up FEATURE_DASHBOARD_NATIVE_FILTERS=true`
|
||||||
|
- Multiple feature flags may be set in single command, separated by whitespace
|
||||||
- A comment will be created by the workflow script with the address and login information for the ephemeral environment.
|
- A comment will be created by the workflow script with the address and login information for the ephemeral environment.
|
||||||
- Test environments may be created once the Docker build CI workflow for the PR has completed successfully.
|
- Test environments may be created once the Docker build CI workflow for the PR has completed successfully.
|
||||||
|
- Test environments do not currently update automatically when new commits are added to a pull request.
|
||||||
|
- Test environments do not currently support async workers, though this is planned.
|
||||||
- Running test environments will be shutdown upon closing the pull request.
|
- Running test environments will be shutdown upon closing the pull request.
|
||||||
|
|
||||||
#### Merging
|
#### Merging
|
||||||
|
|
|
||||||
|
|
@ -1570,7 +1570,7 @@ You can enable or disable features with flag from ``superset_config.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
DEFAULT_FEATURE_FLAGS = {
|
FEATURE_FLAGS = {
|
||||||
'CLIENT_CACHE': False,
|
'CLIENT_CACHE': False,
|
||||||
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
|
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
|
||||||
'PRESTO_EXPAND_DATA': False,
|
'PRESTO_EXPAND_DATA': False,
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ can optionally specify a custom formatter. Eg:
|
||||||
return [{"Cost": f"US$ {cost:.2f}"}]
|
return [{"Cost": f"US$ {cost:.2f}"}]
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_FEATURE_FLAGS = {
|
FEATURE_FLAGS = {
|
||||||
"ESTIMATE_QUERY_COST": True,
|
"ESTIMATE_QUERY_COST": True,
|
||||||
"QUERY_COST_FORMATTERS_BY_ENGINE": {"presto": presto_query_cost_formatter},
|
"QUERY_COST_FORMATTERS_BY_ENGINE": {"presto": presto_query_cost_formatter},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ functionalities in Superset, but will be only affected by a subset of users.
|
||||||
You can enable or disable features with flag from `superset_config.py`:
|
You can enable or disable features with flag from `superset_config.py`:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
DEFAULT_FEATURE_FLAGS = {
|
FEATURE_FLAGS = {
|
||||||
'CLIENT_CACHE': False,
|
'CLIENT_CACHE': False,
|
||||||
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
|
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
|
||||||
'PRESTO_EXPAND_DATA': False,
|
'PRESTO_EXPAND_DATA': False,
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,11 @@ import importlib.util
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
from distutils.util import strtobool
|
||||||
from typing import Any, Callable, Dict, List, Optional, Type, TYPE_CHECKING, Union
|
from typing import Any, Callable, Dict, List, Optional, Type, TYPE_CHECKING, Union
|
||||||
|
|
||||||
from cachelib.base import BaseCache
|
from cachelib.base import BaseCache
|
||||||
|
|
@ -296,7 +298,7 @@ LANGUAGES = {}
|
||||||
# Feature flags
|
# Feature flags
|
||||||
# ---------------------------------------------------
|
# ---------------------------------------------------
|
||||||
# Feature flags that are set by default go here. Their values can be
|
# Feature flags that are set by default go here. Their values can be
|
||||||
# overwritten by those specified under FEATURE_FLAGS in super_config.py
|
# overwritten by those specified under FEATURE_FLAGS in superset_config.py
|
||||||
# For example, DEFAULT_FEATURE_FLAGS = { 'FOO': True, 'BAR': False } here
|
# For example, DEFAULT_FEATURE_FLAGS = { 'FOO': True, 'BAR': False } here
|
||||||
# and FEATURE_FLAGS = { 'BAR': True, 'BAZ': True } in superset_config.py
|
# and FEATURE_FLAGS = { 'BAR': True, 'BAZ': True } in superset_config.py
|
||||||
# will result in combined feature flags of { 'FOO': True, 'BAR': True, 'BAZ': True }
|
# will result in combined feature flags of { 'FOO': True, 'BAR': True, 'BAZ': True }
|
||||||
|
|
@ -374,6 +376,15 @@ DEFAULT_FEATURE_FLAGS: Dict[str, bool] = {
|
||||||
if DEFAULT_FEATURE_FLAGS["THUMBNAILS"]:
|
if DEFAULT_FEATURE_FLAGS["THUMBNAILS"]:
|
||||||
DEFAULT_FEATURE_FLAGS["LISTVIEWS_DEFAULT_CARD_VIEW"] = True
|
DEFAULT_FEATURE_FLAGS["LISTVIEWS_DEFAULT_CARD_VIEW"] = True
|
||||||
|
|
||||||
|
# Feature flags may also be set via 'SUPERSET_FEATURE_' prefixed environment vars.
|
||||||
|
DEFAULT_FEATURE_FLAGS.update(
|
||||||
|
{
|
||||||
|
k[len("SUPERSET_FEATURE_") :]: bool(strtobool(v))
|
||||||
|
for k, v in os.environ.items()
|
||||||
|
if re.search(r"^SUPERSET_FEATURE_\w+", k)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# This is merely a default.
|
# This is merely a default.
|
||||||
FEATURE_FLAGS: Dict[str, bool] = {}
|
FEATURE_FLAGS: Dict[str, bool] = {}
|
||||||
|
|
||||||
|
|
@ -721,7 +732,7 @@ ESTIMATE_QUERY_COST = False
|
||||||
#
|
#
|
||||||
# return out
|
# return out
|
||||||
#
|
#
|
||||||
# DEFAULT_FEATURE_FLAGS = {
|
# FEATURE_FLAGS = {
|
||||||
# "ESTIMATE_QUERY_COST": True,
|
# "ESTIMATE_QUERY_COST": True,
|
||||||
# "QUERY_COST_FORMATTERS_BY_ENGINE": {"postgresql": postgres_query_cost_formatter},
|
# "QUERY_COST_FORMATTERS_BY_ENGINE": {"postgresql": postgres_query_cost_formatter},
|
||||||
# }
|
# }
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,4 @@ from copy import copy
|
||||||
|
|
||||||
from .superset_test_config import *
|
from .superset_test_config import *
|
||||||
|
|
||||||
DEFAULT_FEATURE_FLAGS = {"SQLLAB_BACKEND_PERSISTENCE": True}
|
FEATURE_FLAGS = {"SQLLAB_BACKEND_PERSISTENCE": True}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue