| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use fidl::endpoints::ServiceMarker; |
| use fidl_fuchsia_cobalt::LoggerFactoryMarker; |
| use fidl_fuchsia_fonts::ProviderMarker; |
| use fidl_fuchsia_ledger_cloud::CloudProviderMarker; |
| use fidl_fuchsia_logger::LogSinkMarker; |
| use fidl_fuchsia_sys::EnvironmentControllerProxy; |
| use fidl_fuchsia_tracelink::RegistryMarker; |
| use fidl_fuchsia_ui_input::ImeServiceMarker; |
| use fidl_fuchsia_ui_scenic::ScenicMarker; |
| use fidl_fuchsia_vulkan_loader::LoaderMarker; |
| use fuchsia_app::{ |
| client::{App as LaunchedApp, LaunchOptions}, |
| fuchsia_single_component_package_url, |
| server::FdioServer, |
| server::ServicesServer, |
| }; |
| use fuchsia_async as fasync; |
| use fuchsia_syslog::fx_log_err; |
| use std::sync::Arc; |
| |
| const SESSIONMGR_URI: &str = fuchsia_single_component_package_url!("sessionmgr"); |
| const FLAG_USE_CLOUD_PROVIDER_FROM_ENV: &str = "--use_cloud_provider_from_environment"; |
| |
| pub fn make_replica_env( |
| replica_id: &str, |
| cloud_provider_app: Arc<LaunchedApp>, |
| ) -> Result<(FdioServer, EnvironmentControllerProxy, LaunchedApp), failure::Error> { |
| // Configure disk directory. |
| let data_origin = format!("/data/voila/{}", replica_id); |
| std::fs::create_dir_all(data_origin.clone())?; |
| let mut launch_options = LaunchOptions::new(); |
| launch_options.add_dir_to_namespace("/data".to_string(), std::fs::File::open(data_origin)?)?; |
| |
| let (server, environment_ctrl, app) = ServicesServer::new() |
| .add_service((CloudProviderMarker::NAME, move |chan: fasync::Channel| { |
| cloud_provider_app |
| .pass_to_service::<CloudProviderMarker>(chan.into_zx_channel()) |
| .unwrap_or_else(|e| fx_log_err!("failed to pass cloud provider request {:?}", e)); |
| })) |
| .add_proxy_service::<LogSinkMarker>() |
| .add_proxy_service::<LoggerFactoryMarker>() |
| .add_proxy_service::<ScenicMarker>() |
| .add_proxy_service::<ImeServiceMarker>() |
| .add_proxy_service::<LoaderMarker>() |
| .add_proxy_service::<ProviderMarker>() |
| .add_proxy_service::<RegistryMarker>() |
| .launch_component_in_nested_environment_with_options( |
| SESSIONMGR_URI.to_string(), |
| Some(vec![FLAG_USE_CLOUD_PROVIDER_FROM_ENV.to_string()]), |
| launch_options, |
| replica_id, |
| )?; |
| Ok((server, environment_ctrl, app)) |
| } |