blob: 66904979eb142f76df4c859ec81df747ecc9563c [file] [log] [blame]
// 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))
}