From b55516927fb191b31ea0d5f882abd0e55ff54072 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 13 Jan 2020 11:38:37 +0100 Subject: [PATCH 1/9] Expose a method that allows converting RunCmd to Configuration --- client/cli/src/lib.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 620a90c514d00..a105319c5d3c2 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -295,6 +295,26 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> where CC: GetSharedParams { } } +impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { + /// Convert ParseAndPrepare to Configuration + pub fn into_configuration( + self, + spec_factory: S, + ) -> error::Result> + where + C: Default, + G: RuntimeGenesis, + E: ChainSpecExtension, + S: FnOnce(&str) -> Result>, String>, + { + match self { + ParseAndPrepare::Run(c) => + create_run_node_config(c.params.left, spec_factory, c.impl_name, c.version), + _ => todo!(), + } + } +} + /// Command ready to run the main client. pub struct ParseAndPrepareRun<'a, RP> { params: MergeParameters, From 66be58865f84e0b80b0bdc2c64f3f3b16a88ee4f Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 13 Jan 2020 14:32:45 +0100 Subject: [PATCH 2/9] WIP --- client/cli/src/lib.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index a105319c5d3c2..cad1880ce4708 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -300,7 +300,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { pub fn into_configuration( self, spec_factory: S, - ) -> error::Result> + ) -> Option>> where C: Default, G: RuntimeGenesis, @@ -309,8 +309,44 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { { match self { ParseAndPrepare::Run(c) => - create_run_node_config(c.params.left, spec_factory, c.impl_name, c.version), - _ => todo!(), + Some(create_run_node_config( + c.params.left, + spec_factory, + c.impl_name, + c.version + )), + ParseAndPrepare::BuildSpec(_) => None, + ParseAndPrepare::ExportBlocks(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + )), + ParseAndPrepare::ImportBlocks(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + )), + ParseAndPrepare::CheckBlock(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + )), + ParseAndPrepare::PurgeChain(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version + )), + ParseAndPrepare::RevertChain(c) => + Some(create_config_with_db_path( + spec_factory, + &c.params.shared_params, + c.version, + )), + ParseAndPrepare::CustomCommand(_) => None, } } } From 3ead9ceacd0fd1018f2d137d5da41cdb2a148316 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 13 Jan 2020 15:48:23 +0100 Subject: [PATCH 3/9] WIP --- client/cli/src/lib.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index cad1880ce4708..9536c3d0e548f 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -1309,4 +1309,40 @@ mod tests { assert_eq!(expected_path, node_config.keystore.path().unwrap().to_owned()); } } + + #[test] + fn parse_and_prepare_into_configuration() { + let chain_spec = ChainSpec::from_genesis( + "test", + "test-id", + || (), + Vec::new(), + None, + None, + None, + None, + ); + let version = VersionInfo { + name: "test", + version: "42", + commit: "234234", + executable_name: "test", + description: "cool test", + author: "universe", + support_url: "com", + }; + let spec_factory = |_: &str| Ok(Some(chain_spec.clone())); + + let args = vec!["substrate", "--dev", "--state-cache-size=42"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory).unwrap().unwrap(); + assert_eq!(config.roles, sc_service::Roles::AUTHORITY); + assert_eq!(config.state_cache_size, 42); + + let args = vec!["substrate", "import-blocks", "--dev"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory).unwrap().unwrap(); + // NOTE: only RunCmd (no subcommand) knows --dev + assert_eq!(config.roles, sc_service::Roles::FULL); + } } From 7c5345511b1cfbb69f150d1c2e631beb602217f6 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Mon, 13 Jan 2020 16:38:21 +0100 Subject: [PATCH 4/9] WIP --- client/cli/src/lib.rs | 56 ++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 9536c3d0e548f..5027443977cf5 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -300,7 +300,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { pub fn into_configuration( self, spec_factory: S, - ) -> Option>> + ) -> error::Result>> where C: Default, G: RuntimeGenesis, @@ -314,39 +314,47 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { spec_factory, c.impl_name, c.version - )), - ParseAndPrepare::BuildSpec(_) => None, + )).transpose(), + ParseAndPrepare::BuildSpec(c) => { + let spec = load_spec(&c.params.shared_params, spec_factory)?; + + Some(create_build_spec_config( + &spec, + &c.params.shared_params, + c.version, + )).transpose() + }, ParseAndPrepare::ExportBlocks(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - )), + )).transpose(), ParseAndPrepare::ImportBlocks(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - )), + )).transpose(), ParseAndPrepare::CheckBlock(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - )), + )).transpose(), ParseAndPrepare::PurgeChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version - )), + )).transpose(), ParseAndPrepare::RevertChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - )), - ParseAndPrepare::CustomCommand(_) => None, + )).transpose(), + ParseAndPrepare::CustomCommand(_) => Ok(None), } } } @@ -406,11 +414,11 @@ impl<'a> ParseAndPrepareBuildSpec<'a> { let mut spec = load_spec(&self.params.shared_params, spec_factory)?; if spec.boot_nodes().is_empty() && !self.params.disable_default_bootnode { - let base_path = base_path(&self.params.shared_params, self.version); - let cfg = sc_service::Configuration::::default_with_spec_and_base_path( - spec.clone(), - Some(base_path), - ); + let cfg = create_build_spec_config::( + &spec, + &self.params.shared_params, + self.version, + )?; let node_key = node_key_config( self.params.node_key_params, &Some(cfg.in_chain_config_dir(DEFAULT_NETWORK_CONFIG_PATH).expect("We provided a base_path")) @@ -1062,6 +1070,26 @@ where Ok(config) } +/// Creates a configuration including the base path and the shared params +fn create_build_spec_config( + spec: &ChainSpec, + cli: &SharedParams, + version: &VersionInfo, +) -> error::Result> +where + C: Default, + G: RuntimeGenesis, + E: ChainSpecExtension, +{ + let base_path = base_path(&cli, version); + let cfg = sc_service::Configuration::::default_with_spec_and_base_path( + spec.clone(), + Some(base_path), + ); + + Ok(cfg) +} + /// Internal trait used to cast to a dynamic type that implements Read and Seek. trait ReadPlusSeek: Read + Seek {} From 69953044d9f9269d54496aa1111c3cbc61dbed6a Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Wed, 15 Jan 2020 12:52:32 +0100 Subject: [PATCH 5/9] WIP --- client/cli/src/lib.rs | 83 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 5027443977cf5..5576871148c09 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -300,6 +300,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { pub fn into_configuration( self, spec_factory: S, + base_path_override: Option, ) -> error::Result>> where C: Default, @@ -313,7 +314,8 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { c.params.left, spec_factory, c.impl_name, - c.version + c.version, + base_path_override, )).transpose(), ParseAndPrepare::BuildSpec(c) => { let spec = load_spec(&c.params.shared_params, spec_factory)?; @@ -322,6 +324,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { &spec, &c.params.shared_params, c.version, + base_path_override, )).transpose() }, ParseAndPrepare::ExportBlocks(c) => @@ -329,30 +332,35 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { spec_factory, &c.params.shared_params, c.version, + base_path_override, )).transpose(), ParseAndPrepare::ImportBlocks(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, + base_path_override, )).transpose(), ParseAndPrepare::CheckBlock(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, + base_path_override, )).transpose(), ParseAndPrepare::PurgeChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, - c.version + c.version, + base_path_override, )).transpose(), ParseAndPrepare::RevertChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, + base_path_override, )).transpose(), ParseAndPrepare::CustomCommand(_) => Ok(None), } @@ -385,7 +393,11 @@ impl<'a, RP> ParseAndPrepareRun<'a, RP> { RS: FnOnce(Exit, RunCmd, RP, Configuration) -> Result<(), E> { let config = create_run_node_config( - self.params.left.clone(), spec_factory, self.impl_name, self.version, + self.params.left.clone(), + spec_factory, + self.impl_name, + self.version, + None, )?; run_service(exit, self.params.left, self.params.right, config).map_err(Into::into) @@ -418,6 +430,7 @@ impl<'a> ParseAndPrepareBuildSpec<'a> { &spec, &self.params.shared_params, self.version, + None, )?; let node_key = node_key_config( self.params.node_key_params, @@ -465,7 +478,12 @@ impl<'a> ParseAndPrepareExport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; if let DatabaseConfig::Path { ref path, .. } = &config.database { info!("DB path: {}", path.display()); @@ -527,7 +545,12 @@ impl<'a> ParseAndPrepareImport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; let file: Box = match self.params.input { @@ -587,7 +610,12 @@ impl<'a> CheckBlock<'a> { E: ChainSpecExtension, Exit: IntoExit { - let mut config = create_config_with_db_path(spec_factory, &self.params.shared_params, self.version)?; + let mut config = create_config_with_db_path( + spec_factory, + &self.params.shared_params, + self.version, + None, + )?; fill_import_params(&mut config, &self.params.import_params, sc_service::Roles::FULL)?; let input = if self.params.input.starts_with("0x") { &self.params.input[2..] } else { &self.params.input[..] }; @@ -627,7 +655,10 @@ impl<'a> ParseAndPreparePurge<'a> { E: ChainSpecExtension, { let config = create_config_with_db_path::<(), _, _, _>( - spec_factory, &self.params.shared_params, self.version + spec_factory, + &self.params.shared_params, + self.version, + None, )?; let db_path = match config.database { DatabaseConfig::Path { path, .. } => path, @@ -691,7 +722,10 @@ impl<'a> ParseAndPrepareRevert<'a> { E: ChainSpecExtension, { let config = create_config_with_db_path( - spec_factory, &self.params.shared_params, self.version + spec_factory, + &self.params.shared_params, + self.version, + None, )?; let blocks = self.params.num.parse()?; builder(config)?.revert_chain(blocks)?; @@ -904,7 +938,11 @@ pub fn fill_import_params( } fn create_run_node_config( - cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo, + cli: RunCmd, + spec_factory: S, + impl_name: &'static str, + version: &VersionInfo, + base_path_override: Option, ) -> error::Result> where C: Default, @@ -912,7 +950,12 @@ where E: ChainSpecExtension, S: FnOnce(&str) -> Result>, String>, { - let mut config = create_config_with_db_path(spec_factory, &cli.shared_params, &version)?; + let mut config = create_config_with_db_path( + spec_factory, + &cli.shared_params, + &version, + base_path_override, + )?; fill_config_keystore_password_and_path(&mut config, &cli)?; @@ -1046,7 +1089,10 @@ fn interface_str( /// Creates a configuration including the database path. pub fn create_config_with_db_path( - spec_factory: S, cli: &SharedParams, version: &VersionInfo, + spec_factory: S, + cli: &SharedParams, + version: &VersionInfo, + base_path_override: Option, ) -> error::Result> where C: Default, @@ -1055,7 +1101,7 @@ where S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(cli, spec_factory)?; - let base_path = base_path(cli, version); + let base_path = base_path_override.unwrap_or_else(|| base_path(cli, version)); let mut config = sc_service::Configuration::default_with_spec_and_base_path( spec.clone(), @@ -1075,13 +1121,14 @@ fn create_build_spec_config( spec: &ChainSpec, cli: &SharedParams, version: &VersionInfo, + base_path_override: Option, ) -> error::Result> where C: Default, G: RuntimeGenesis, E: ChainSpecExtension, { - let base_path = base_path(&cli, version); + let base_path = base_path_override.unwrap_or_else(|| base_path(&cli, version)); let cfg = sc_service::Configuration::::default_with_spec_and_base_path( spec.clone(), Some(base_path), @@ -1363,14 +1410,18 @@ mod tests { let args = vec!["substrate", "--dev", "--state-cache-size=42"]; let pnp = parse_and_prepare::(&version, "test", args); - let config = pnp.into_configuration::<(), _, _, _>(spec_factory).unwrap().unwrap(); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); assert_eq!(config.roles, sc_service::Roles::AUTHORITY); assert_eq!(config.state_cache_size, 42); let args = vec!["substrate", "import-blocks", "--dev"]; let pnp = parse_and_prepare::(&version, "test", args); - let config = pnp.into_configuration::<(), _, _, _>(spec_factory).unwrap().unwrap(); - // NOTE: only RunCmd (no subcommand) knows --dev + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, None).unwrap().unwrap(); assert_eq!(config.roles, sc_service::Roles::FULL); + + let args = vec!["substrate", "--base-path=/foo"]; + let pnp = parse_and_prepare::(&version, "test", args); + let config = pnp.into_configuration::<(), _, _, _>(spec_factory, Some("/bar".into())).unwrap().unwrap(); + assert_eq!(config.config_dir, Some("/bar".into())); } } From 148420901e0199cb9b204e483e545d5f3c5018ca Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Wed, 15 Jan 2020 13:12:28 +0100 Subject: [PATCH 6/9] WIP --- client/cli/src/lib.rs | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 5576871148c09..32c8d0e0e7038 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -142,8 +142,13 @@ pub fn load_spec(cli: &SharedParams, factory: F) -> error::Result PathBuf { +fn base_path( + cli: &SharedParams, + version: &VersionInfo, + default_base_path: Option, +) -> PathBuf { cli.base_path.clone() + .or(default_base_path) .unwrap_or_else(|| app_dirs::get_app_root( AppDataType::UserData, @@ -300,7 +305,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { pub fn into_configuration( self, spec_factory: S, - base_path_override: Option, + default_base_path: Option, ) -> error::Result>> where C: Default, @@ -315,7 +320,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { spec_factory, c.impl_name, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::BuildSpec(c) => { let spec = load_spec(&c.params.shared_params, spec_factory)?; @@ -324,7 +329,7 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { &spec, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose() }, ParseAndPrepare::ExportBlocks(c) => @@ -332,35 +337,35 @@ impl<'a, CC, RP> ParseAndPrepare<'a, CC, RP> { spec_factory, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::ImportBlocks(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::CheckBlock(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::PurgeChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::RevertChain(c) => Some(create_config_with_db_path( spec_factory, &c.params.shared_params, c.version, - base_path_override, + default_base_path, )).transpose(), ParseAndPrepare::CustomCommand(_) => Ok(None), } @@ -942,7 +947,7 @@ fn create_run_node_config( spec_factory: S, impl_name: &'static str, version: &VersionInfo, - base_path_override: Option, + default_base_path: Option, ) -> error::Result> where C: Default, @@ -954,7 +959,7 @@ where spec_factory, &cli.shared_params, &version, - base_path_override, + default_base_path, )?; fill_config_keystore_password_and_path(&mut config, &cli)?; @@ -1092,7 +1097,7 @@ pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, - base_path_override: Option, + default_base_path: Option, ) -> error::Result> where C: Default, @@ -1101,7 +1106,7 @@ where S: FnOnce(&str) -> Result>, String>, { let spec = load_spec(cli, spec_factory)?; - let base_path = base_path_override.unwrap_or_else(|| base_path(cli, version)); + let base_path = base_path(cli, version, default_base_path); let mut config = sc_service::Configuration::default_with_spec_and_base_path( spec.clone(), @@ -1121,14 +1126,14 @@ fn create_build_spec_config( spec: &ChainSpec, cli: &SharedParams, version: &VersionInfo, - base_path_override: Option, + default_base_path: Option, ) -> error::Result> where C: Default, G: RuntimeGenesis, E: ChainSpecExtension, { - let base_path = base_path_override.unwrap_or_else(|| base_path(&cli, version)); + let base_path = base_path(&cli, version, default_base_path); let cfg = sc_service::Configuration::::default_with_spec_and_base_path( spec.clone(), Some(base_path), @@ -1422,6 +1427,6 @@ mod tests { let args = vec!["substrate", "--base-path=/foo"]; let pnp = parse_and_prepare::(&version, "test", args); let config = pnp.into_configuration::<(), _, _, _>(spec_factory, Some("/bar".into())).unwrap().unwrap(); - assert_eq!(config.config_dir, Some("/bar".into())); + assert_eq!(config.config_dir, Some("/foo".into())); } } From a5f77e4d9c0da165c27a4d486877ac70ceebfb2a Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 16 Jan 2020 12:16:11 +0100 Subject: [PATCH 7/9] WIP --- client/cli/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 0561f66906033..940f7a298b243 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -483,7 +483,7 @@ impl<'a> ParseAndPrepareExport<'a> { E: ChainSpecExtension, Exit: IntoExit { - let config = create_config_with_db_path( + let mut config = create_config_with_db_path( spec_factory, &self.params.shared_params, self.version, @@ -658,7 +658,7 @@ impl<'a> ParseAndPreparePurge<'a> { G: RuntimeGenesis, E: ChainSpecExtension, { - let config = create_config_with_db_path::<(), _, _, _>( + let mut config = create_config_with_db_path::<(), _, _, _>( spec_factory, &self.params.shared_params, self.version, @@ -726,7 +726,7 @@ impl<'a> ParseAndPrepareRevert<'a> { G: RuntimeGenesis, E: ChainSpecExtension, { - let config = create_config_with_db_path( + let mut config = create_config_with_db_path( spec_factory, &self.params.shared_params, self.version, From b9891a8fb5e5af3894a62c4275261ad153e1775c Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 16 Jan 2020 12:22:03 +0100 Subject: [PATCH 8/9] WIP --- client/cli/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 940f7a298b243..52a3fc46ec726 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -1391,6 +1391,7 @@ mod tests { |_| Ok(Some(chain_spec.clone())), "test", &version_info, + None, ).unwrap(); let expected_path = match keystore_path { From 9b8b4720b8346fdeb94effe154193ba5a19f8de9 Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Thu, 16 Jan 2020 12:28:54 +0100 Subject: [PATCH 9/9] WIP --- bin/node/cli/src/cli.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index 4442bb1b0378d..dcc5d39dbb7e7 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -138,6 +138,7 @@ pub fn run(args: I, exit: E, version: sc_cli::VersionInfo) -> error::Re load_spec, &cli_args.shared_params, &version, + None, )?; sc_cli::fill_import_params(&mut config, &cli_args.import_params, ServiceRoles::FULL)?;