mirror of https://github.com/apache/superset.git
refactor: Removes the deprecated CLIENT_CACHE feature flag (#26348)
This commit is contained in:
parent
7ab37d2aae
commit
7fccea1556
|
@ -85,7 +85,6 @@ These features flags currently default to True and **will be removed in a future
|
|||
|
||||
[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY"
|
||||
|
||||
- CLIENT_CACHE
|
||||
- DASHBOARD_FILTERS_EXPERIMENTAL
|
||||
- DASHBOARD_NATIVE_FILTERS
|
||||
- ENABLE_EXPLORE_JSON_CSRF_PROTECTION
|
||||
|
|
|
@ -31,6 +31,7 @@ assists people when migrating to a new version.
|
|||
|
||||
### Breaking Changes
|
||||
|
||||
- [26348](https://github.com/apache/superset/issues/26348): Removes the deprecated `CLIENT_CACHE` feature flag. The previous value of the feature flag was `False` and now the feature is permanently removed.
|
||||
- [26349](https://github.com/apache/superset/issues/26349): Removes the deprecated `DASHBOARD_CACHE` feature flag. The previous value of the feature flag was `False` and now the feature is permanently removed.
|
||||
- [26369](https://github.com/apache/superset/issues/26369): Removes the Filter Sets feature including the deprecated `DASHBOARD_NATIVE_FILTERS_SET` feature flag and all related API endpoints. The feature is permanently removed as it was not being actively maintained, it was not widely used, and it was full of bugs. We also considered that if we were to provide a similar feature, it would be better to re-implement it from scratch given the amount of technical debt that the current implementation has. The previous value of the feature flag was `False` and now the feature is permanently removed.
|
||||
- [26343](https://github.com/apache/superset/issues/26343): Removes the deprecated `ENABLE_EXPLORE_DRAG_AND_DROP` feature flag. The previous value of the feature flag was `True` and now the feature is permanently enabled.
|
||||
|
|
|
@ -9,24 +9,27 @@ version: 1
|
|||
|
||||
### Configuration
|
||||
|
||||
To configure your application, you need to create a file `superset_config.py`. Add this file to your
|
||||
To configure your application, you need to create a file `superset_config.py`. Add this file to your
|
||||
|
||||
`PYTHONPATH` or create an environment variable `SUPERSET_CONFIG_PATH` specifying the full path of the `superset_config.py`.
|
||||
|
||||
For example, if deploying on Superset directly on a Linux-based system where your `superset_config.py` is under `/app` directory, you can run:
|
||||
|
||||
```bash
|
||||
export SUPERSET_CONFIG_PATH=/app/superset_config.py
|
||||
```
|
||||
|
||||
If you are using your own custom Dockerfile with official Superset image as base image, then you can add your overrides as shown below:
|
||||
|
||||
```bash
|
||||
COPY --chown=superset superset_config.py /app/
|
||||
ENV SUPERSET_CONFIG_PATH /app/superset_config.py
|
||||
```
|
||||
|
||||
Docker compose deployments handle application configuration differently. See [https://github.com/apache/superset/tree/master/docker#readme](https://github.com/apache/superset/tree/master/docker#readme) for details.
|
||||
Docker compose deployments handle application configuration differently. See [https://github.com/apache/superset/tree/master/docker#readme](https://github.com/apache/superset/tree/master/docker#readme) for details.
|
||||
|
||||
The following is an example of just a few of the parameters you can set in your `superset_config.py` file:
|
||||
|
||||
```
|
||||
# Superset specific config
|
||||
ROW_LIMIT = 5000
|
||||
|
@ -88,7 +91,7 @@ WTF_CSRF_EXEMPT_LIST = [‘’]
|
|||
|
||||
#### Adding an initial SECRET_KEY
|
||||
|
||||
Superset requires a user-specified SECRET_KEY to start up. This requirement was [added in version 2.1.0 to force secure configurations](https://preset.io/blog/superset-security-update-default-secret_key-vulnerability/). Add a strong SECRET_KEY to your `superset_config.py` file like:
|
||||
Superset requires a user-specified SECRET_KEY to start up. This requirement was [added in version 2.1.0 to force secure configurations](https://preset.io/blog/superset-security-update-default-secret_key-vulnerability/). Add a strong SECRET_KEY to your `superset_config.py` file like:
|
||||
|
||||
```python
|
||||
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
|
||||
|
@ -99,7 +102,7 @@ You can generate a strong secure key with `openssl rand -base64 42`.
|
|||
#### Rotating to a newer SECRET_KEY
|
||||
|
||||
If you wish to change your existing SECRET_KEY, add the existing SECRET_KEY to your `superset_config.py` file as
|
||||
`PREVIOUS_SECRET_KEY = `and provide your new key as `SECRET_KEY =`. You can find your current SECRET_KEY with these
|
||||
`PREVIOUS_SECRET_KEY = `and provide your new key as `SECRET_KEY =`. You can find your current SECRET_KEY with these
|
||||
commands - if running Superset with Docker, execute from within the Superset application container:
|
||||
|
||||
```python
|
||||
|
@ -119,23 +122,21 @@ database engine on a separate host or container.
|
|||
|
||||
Superset supports the following database engines/versions:
|
||||
|
||||
| Database Engine | Supported Versions |
|
||||
| --------------------------------------------------------- | ---------------------------------- |
|
||||
| [PostgreSQL](https://www.postgresql.org/) | 10.X, 11.X, 12.X, 13.X, 14.X, 15.X |
|
||||
| [MySQL](https://www.mysql.com/) | 5.7, 8.X |
|
||||
|
||||
| Database Engine | Supported Versions |
|
||||
| ----------------------------------------- | ---------------------------------- |
|
||||
| [PostgreSQL](https://www.postgresql.org/) | 10.X, 11.X, 12.X, 13.X, 14.X, 15.X |
|
||||
| [MySQL](https://www.mysql.com/) | 5.7, 8.X |
|
||||
|
||||
Use the following database drivers and connection strings:
|
||||
|
||||
| Database | PyPI package | Connection String |
|
||||
| ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------ |
|
||||
| [PostgreSQL](https://www.postgresql.org/) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [MySQL](https://www.mysql.com/) | `pip install mysqlclient` | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| Database | PyPI package | Connection String |
|
||||
| ----------------------------------------- | ------------------------- | ---------------------------------------------------------------------- |
|
||||
| [PostgreSQL](https://www.postgresql.org/) | `pip install psycopg2` | `postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
| [MySQL](https://www.mysql.com/) | `pip install mysqlclient` | `mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>` |
|
||||
|
||||
To configure Superset metastore set `SQLALCHEMY_DATABASE_URI` config key on `superset_config`
|
||||
to the appropriate connection string.
|
||||
|
||||
|
||||
### Running on a WSGI HTTP Server
|
||||
|
||||
While you can run Superset on NGINX or Apache, we recommend using Gunicorn in async mode. This
|
||||
|
@ -167,7 +168,7 @@ So, when you use `BigQuery` datasource on Superset, you have to use `gunicorn` w
|
|||
|
||||
### HTTPS Configuration
|
||||
|
||||
You can configure HTTPS upstream via a load balancer or a reverse proxy (such as nginx) and do SSL/TLS Offloading before traffic reaches the Superset application. In this setup, local traffic from a Celery worker taking a snapshot of a chart for Alerts & Reports can access Superset at a `http://` URL, from behind the ingress point.
|
||||
You can configure HTTPS upstream via a load balancer or a reverse proxy (such as nginx) and do SSL/TLS Offloading before traffic reaches the Superset application. In this setup, local traffic from a Celery worker taking a snapshot of a chart for Alerts & Reports can access Superset at a `http://` URL, from behind the ingress point.
|
||||
You can also configure [SSL in Gunicorn](https://docs.gunicorn.org/en/stable/settings.html#ssl) (the Python webserver) if you are using an official Superset Docker image.
|
||||
|
||||
### Configuration Behind a Load Balancer
|
||||
|
@ -191,7 +192,7 @@ RequestHeader set X-Forwarded-Proto "https"
|
|||
### Custom OAuth2 Configuration
|
||||
|
||||
Superset is built on Flask-AppBuilder (FAB), which supports many providers out of the box
|
||||
(GitHub, Twitter, LinkedIn, Google, Azure, etc). Beyond those, Superset can be configured to connect
|
||||
(GitHub, Twitter, LinkedIn, Google, Azure, etc). Beyond those, Superset can be configured to connect
|
||||
with other OAuth2 Authorization Server implementations that support “code” authorization.
|
||||
|
||||
Make sure the pip package [`Authlib`](https://authlib.org/) is installed on the webserver.
|
||||
|
@ -357,7 +358,6 @@ You can enable or disable features with flag from `superset_config.py`:
|
|||
|
||||
```python
|
||||
FEATURE_FLAGS = {
|
||||
'CLIENT_CACHE': False,
|
||||
'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
|
||||
'PRESTO_EXPAND_DATA': False,
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ export enum FeatureFlag {
|
|||
ALERTS_ATTACH_REPORTS = 'ALERTS_ATTACH_REPORTS',
|
||||
ALERT_REPORTS = 'ALERT_REPORTS',
|
||||
ALLOW_FULL_CSV_EXPORT = 'ALLOW_FULL_CSV_EXPORT',
|
||||
CLIENT_CACHE = 'CLIENT_CACHE',
|
||||
DASHBOARD_CROSS_FILTERS = 'DASHBOARD_CROSS_FILTERS',
|
||||
DASHBOARD_FILTERS_EXPERIMENTAL = 'DASHBOARD_FILTERS_EXPERIMENTAL',
|
||||
CONFIRM_DASHBOARD_DIFF = 'CONFIRM_DASHBOARD_DIFF',
|
||||
|
|
|
@ -31,7 +31,6 @@ it('initializes feature flags with predefined values', () => {
|
|||
value: undefined,
|
||||
});
|
||||
const featureFlags = {
|
||||
CLIENT_CACHE: true,
|
||||
DRILL_BY: false,
|
||||
};
|
||||
uiCore.initFeatureFlags(featureFlags);
|
||||
|
@ -67,10 +66,8 @@ it('returns false for unset feature flag', () => {
|
|||
it('returns true for set feature flag', () => {
|
||||
Object.defineProperty(window, 'featureFlags', {
|
||||
value: {
|
||||
CLIENT_CACHE: true,
|
||||
DRILL_BY: true,
|
||||
},
|
||||
});
|
||||
expect(uiCore.isFeatureEnabled(uiCore.FeatureFlag.CLIENT_CACHE)).toEqual(
|
||||
true,
|
||||
);
|
||||
expect(uiCore.isFeatureEnabled(uiCore.FeatureFlag.DRILL_BY)).toEqual(true);
|
||||
});
|
||||
|
|
|
@ -155,27 +155,15 @@ class Chart extends React.PureComponent {
|
|||
}
|
||||
|
||||
runQuery() {
|
||||
if (this.props.chartId > 0 && isFeatureEnabled(FeatureFlag.CLIENT_CACHE)) {
|
||||
// Load saved chart with a GET request
|
||||
this.props.actions.getSavedChart(
|
||||
this.props.formData,
|
||||
this.props.force || getUrlParam(URL_PARAMS.force), // allow override via url params force=true
|
||||
this.props.timeout,
|
||||
this.props.chartId,
|
||||
this.props.dashboardId,
|
||||
this.props.ownState,
|
||||
);
|
||||
} else {
|
||||
// Create chart with POST request
|
||||
this.props.actions.postChartFormData(
|
||||
this.props.formData,
|
||||
Boolean(this.props.force || getUrlParam(URL_PARAMS.force)), // allow override via url params force=true
|
||||
this.props.timeout,
|
||||
this.props.chartId,
|
||||
this.props.dashboardId,
|
||||
this.props.ownState,
|
||||
);
|
||||
}
|
||||
// Create chart with POST request
|
||||
this.props.actions.postChartFormData(
|
||||
this.props.formData,
|
||||
Boolean(this.props.force || getUrlParam(URL_PARAMS.force)), // allow override via url params force=true
|
||||
this.props.timeout,
|
||||
this.props.chartId,
|
||||
this.props.dashboardId,
|
||||
this.props.ownState,
|
||||
);
|
||||
}
|
||||
|
||||
handleRenderContainerFailure(error, info) {
|
||||
|
|
|
@ -143,11 +143,7 @@ const legacyChartDataRequest = async (
|
|||
parseMethod,
|
||||
};
|
||||
|
||||
const clientMethod =
|
||||
'GET' && isFeatureEnabled(FeatureFlag.CLIENT_CACHE)
|
||||
? SupersetClient.get
|
||||
: SupersetClient.post;
|
||||
return clientMethod(querySettings).then(({ json, response }) =>
|
||||
return SupersetClient.post(querySettings).then(({ json, response }) =>
|
||||
// Make the legacy endpoint return a payload that corresponds to the
|
||||
// V1 chart data endpoint response signature.
|
||||
({
|
||||
|
@ -379,7 +375,6 @@ export function exploreJSON(
|
|||
force = false,
|
||||
timeout = 60,
|
||||
key,
|
||||
method,
|
||||
dashboardId,
|
||||
ownState,
|
||||
) {
|
||||
|
@ -402,7 +397,7 @@ export function exploreJSON(
|
|||
resultFormat: 'json',
|
||||
resultType: 'full',
|
||||
force,
|
||||
method,
|
||||
method: 'POST',
|
||||
requestParams,
|
||||
ownState,
|
||||
});
|
||||
|
@ -518,36 +513,6 @@ export function exploreJSON(
|
|||
};
|
||||
}
|
||||
|
||||
export const GET_SAVED_CHART = 'GET_SAVED_CHART';
|
||||
export function getSavedChart(
|
||||
formData,
|
||||
force = false,
|
||||
timeout = 60,
|
||||
key,
|
||||
dashboardId,
|
||||
ownState,
|
||||
) {
|
||||
/*
|
||||
* Perform a GET request to `/explore_json`.
|
||||
*
|
||||
* This will return the payload of a saved chart, optionally filtered by
|
||||
* ad-hoc or extra filters from dashboards. Eg:
|
||||
*
|
||||
* GET /explore_json?{"chart_id":1}
|
||||
* GET /explore_json?{"chart_id":1,"extra_filters":"..."}
|
||||
*
|
||||
*/
|
||||
return exploreJSON(
|
||||
formData,
|
||||
force,
|
||||
timeout,
|
||||
key,
|
||||
'GET',
|
||||
dashboardId,
|
||||
ownState,
|
||||
);
|
||||
}
|
||||
|
||||
export const POST_CHART_FORM_DATA = 'POST_CHART_FORM_DATA';
|
||||
export function postChartFormData(
|
||||
formData,
|
||||
|
@ -557,21 +522,7 @@ export function postChartFormData(
|
|||
dashboardId,
|
||||
ownState,
|
||||
) {
|
||||
/*
|
||||
* Perform a POST request to `/explore_json`.
|
||||
*
|
||||
* This will post the form data to the endpoint, returning a new chart.
|
||||
*
|
||||
*/
|
||||
return exploreJSON(
|
||||
formData,
|
||||
force,
|
||||
timeout,
|
||||
key,
|
||||
'POST',
|
||||
dashboardId,
|
||||
ownState,
|
||||
);
|
||||
return exploreJSON(formData, force, timeout, key, dashboardId, ownState);
|
||||
}
|
||||
|
||||
export function redirectSQLLab(formData, history) {
|
||||
|
|
|
@ -402,8 +402,6 @@ CURRENCIES = ["USD", "EUR", "GBP", "INR", "MXN", "JPY", "CNY"]
|
|||
# and FEATURE_FLAGS = { 'BAR': True, 'BAZ': True } in superset_config.py
|
||||
# will result in combined feature flags of { 'FOO': True, 'BAR': True, 'BAZ': True }
|
||||
DEFAULT_FEATURE_FLAGS: dict[str, bool] = {
|
||||
# Experimental feature introducing a client (browser) cache
|
||||
"CLIENT_CACHE": False, # deprecated
|
||||
# When using a recent version of Druid that supports JOINs turn this on
|
||||
"DRUID_JOINS": False,
|
||||
"DYNAMIC_PLUGINS": False,
|
||||
|
|
Loading…
Reference in New Issue