From d4a52d31ef78cdc2c695439fd54b89f9da18e353 Mon Sep 17 00:00:00 2001 From: Jorik Schellekens Date: Wed, 28 Aug 2019 13:14:22 +0100 Subject: [PATCH] Extra support for configuring postgres --- synapse_topology/model/config.py | 16 +++- synapse_topology/server/schemas.py | 9 +- .../webui/src/js/actions/index.js | 4 +- .../webui/src/js/components/Database.jsx | 85 ++++++++++++++++--- .../webui/src/js/containers/Database.js | 4 +- .../src/js/reducers/base-config-reducer.js | 2 +- synapse_topology/webui/src/js/utils/yaml.js | 27 +++++- 7 files changed, 123 insertions(+), 24 deletions(-) diff --git a/synapse_topology/model/config.py b/synapse_topology/model/config.py index 99db6584a3..f5ac8b61ca 100644 --- a/synapse_topology/model/config.py +++ b/synapse_topology/model/config.py @@ -1,8 +1,10 @@ +from os.path import join + from synapse.config.database import DatabaseConfig +from synapse.config.homeserver import HomeServerConfig +from synapse.config.logger import LoggingConfig from synapse.config.server import ServerConfig from synapse.config.tls import TlsConfig -from synapse.config.logger import LoggingConfig -from synapse.config.homeserver import HomeServerConfig def create_config(config_dir_path, data_dir_path, conf): @@ -12,6 +14,14 @@ def create_config(config_dir_path, data_dir_path, conf): server_config_in_use = conf["server_config_in_use"] del conf["server_config_in_use"] + database_conf = conf["database"] + del conf["database"] + + if database_conf["name"] == "sqlite3": + database_conf.setdefault( + "args", {"database": join(data_dir_path, "homeserver.db")} + ) + base_configs = [ServerConfig, DatabaseConfig, TlsConfig] # Generate configs for all the ones we didn't cover explicitely @@ -30,6 +40,7 @@ def create_config(config_dir_path, data_dir_path, conf): "data_dir_path": data_dir_path, "server_name": server_name, **conf, + "database_conf": database_conf, } base_config = BaseConfig().generate_config(**config_args) @@ -41,4 +52,3 @@ def create_config(config_dir_path, data_dir_path, conf): + "\n\nserver_config_in_use: {}".format(server_config_in_use), "the_rest.yaml": rest_of_config, } - diff --git a/synapse_topology/server/schemas.py b/synapse_topology/server/schemas.py index 17f1dfb45a..480ce5b875 100644 --- a/synapse_topology/server/schemas.py +++ b/synapse_topology/server/schemas.py @@ -9,7 +9,14 @@ BASE_CONFIG_SCHEMA = { "pid_file": {"type": "string", "minlength": 1}, "listeners": {"type": "array"}, "acme": {"type": "object"}, - "database": {"type": "string", "minlength": 1}, + "database": { + "type": "object", + "properties": { + "name": {"type": "string", "minlength": 1}, + "args": {"type": "object"}, + }, + "required": ["name"], + }, "tls_certificate_path": {"type": "string", "minlength": 1}, "tls_private_key_path": {"type": "string", "minlength": 1}, "server_config_in_use": {"type": "boolean"}, diff --git a/synapse_topology/webui/src/js/actions/index.js b/synapse_topology/webui/src/js/actions/index.js index 8b8033d1f5..3ade21a71b 100644 --- a/synapse_topology/webui/src/js/actions/index.js +++ b/synapse_topology/webui/src/js/actions/index.js @@ -277,9 +277,9 @@ export const testingSynapsePorts = verifying => ({ verifying, }) -export const setDatabase = database => ({ +export const setDatabase = databaseConfig => ({ type: SET_DATABASE, - database, + databaseConfig, }) export const writeConfig = (config, subConfigName) => { diff --git a/synapse_topology/webui/src/js/components/Database.jsx b/synapse_topology/webui/src/js/components/Database.jsx index 923c98a8b4..dc12be9cf1 100644 --- a/synapse_topology/webui/src/js/components/Database.jsx +++ b/synapse_topology/webui/src/js/components/Database.jsx @@ -13,6 +13,8 @@ import { DATABASE_UI } from '../reducers/ui-constants'; import AccordionToggle from '../containers/AccordionToggle'; import { nextUI } from '../reducers/setup-ui-reducer'; +import Tabs from 'react-bootstrap/Tabs'; +import Tab from 'react-bootstrap/Tab'; export default ({ onClick, @@ -21,6 +23,11 @@ export default ({ const defaultDatabase = DATABASE_TYPES.POSTGRES; const [database, setDatabase] = useState(defaultDatabase) + const [databaseHost, setHost] = useState(); + const [postgresDatabase, setPostgresDatabase] = useState(); + const [databaseUsername, setUser] = useState(); + const [databasePassword, setPassword] = useState(); + const toggle = useAccordionToggle(nextUI(DATABASE_UI)); return @@ -32,20 +39,72 @@ export default ({

Synapse can use either SQLite3 or Postgres as it's database.

Postgres is recommended.

- - + setDatabase(k)}> + +

+ Host +

+ setHost(e.target.value)} + autoFocus + placeholder="localhost" + /> +

+ Database name +

+ setPostgresDatabase(e.target.value)} + autoFocus + placeholder="unspecified" + /> +

+ User name +

+ setUser(e.target.value)} + autoFocus + placeholder="unspecified" + /> +

+ Password +

+ setPassword(e.target.value)} + autoFocus + placeholder="unspecified" + /> + +
+ + + +
-
+ } diff --git a/synapse_topology/webui/src/js/containers/Database.js b/synapse_topology/webui/src/js/containers/Database.js index 8387c1df7f..1a198a7da9 100644 --- a/synapse_topology/webui/src/js/containers/Database.js +++ b/synapse_topology/webui/src/js/containers/Database.js @@ -8,9 +8,9 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => ({ - onClick: database => { + onClick: databaseConfig => { - dispatch(setDatabase(database)); + dispatch(setDatabase(databaseConfig)); dispatch(advanceUI()); }, diff --git a/synapse_topology/webui/src/js/reducers/base-config-reducer.js b/synapse_topology/webui/src/js/reducers/base-config-reducer.js index 6dbd8c1a40..3160c47684 100644 --- a/synapse_topology/webui/src/js/reducers/base-config-reducer.js +++ b/synapse_topology/webui/src/js/reducers/base-config-reducer.js @@ -127,7 +127,7 @@ export default (state, action) => { case SET_DATABASE: return { ...state, - database: action.database, + ...action.databaseConfig, } case SET_CONFIG_DIR: return { diff --git a/synapse_topology/webui/src/js/utils/yaml.js b/synapse_topology/webui/src/js/utils/yaml.js index 7387ddf93f..fa74925d1a 100644 --- a/synapse_topology/webui/src/js/utils/yaml.js +++ b/synapse_topology/webui/src/js/utils/yaml.js @@ -1,5 +1,5 @@ /* eslint-disable camelcase */ -import { TLS_TYPES, REVERSE_PROXY_TYPES } from '../actions/constants'; +import { TLS_TYPES, REVERSE_PROXY_TYPES, DATABASE_TYPES } from '../actions/constants'; import { CONFIG_LOCK } from '../api/constants'; const listeners = config => { @@ -114,12 +114,35 @@ const acme = config => { } +const database = config => { + + if (config.databaseType == DATABASE_TYPES.SQLITE3) { + return { + database: { + name: config.databaseType, + } + } + } else { + return { + database: { + name: config.databaseType, + args: { + user: config.databaseUsername, + password: config.databasePassword, + host: config.databaseHost, + database: config.database, + } + } + } + } +} + export const baseConfigToSynapseConfig = config => { const conf = { server_name: config.servername, report_stats: config.reportStats, - database: config.database, + ...database(config), ...listeners(config), ...tlsPaths(config), ...acme(config),