blob: 62ed78aea3c2fea01b086836349b8c3dbefd86f1 [file] [log] [blame]
// Copyright 2018 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.
#include "src/virtualization/bin/guest_manager/manager_impl.h"
#include <lib/syslog/cpp/macros.h>
static uint32_t g_next_env_id = 0;
ManagerImpl::ManagerImpl() : context_(sys::ComponentContext::CreateAndServeOutgoingDirectory()) {
context_->outgoing()->AddPublicService(bindings_.GetHandler(this));
}
void ManagerImpl::Create(fidl::StringPtr label,
fidl::InterfaceRequest<fuchsia::virtualization::Realm> request) {
uint32_t env_id = g_next_env_id++;
auto env =
std::make_unique<RealmImpl>(env_id, label.value_or(""), context_.get(), std::move(request));
env->set_unbound_handler([this, env_id]() { environments_.erase(env_id); });
environments_.insert({env_id, std::move(env)});
}
void ManagerImpl::List(ListCallback callback) {
std::vector<fuchsia::virtualization::EnvironmentInfo> env_infos;
for (const auto& env : environments_) {
std::vector<fuchsia::virtualization::InstanceInfo> instance_infos;
fuchsia::virtualization::EnvironmentInfo env_info;
env_info.id = env.first;
env_info.label = env.second->label();
env_info.instances = env.second->ListGuests();
env_infos.push_back(std::move(env_info));
}
callback(std::move(env_infos));
}
void ManagerImpl::Connect(uint32_t id,
fidl::InterfaceRequest<fuchsia::virtualization::Realm> request) {
const auto& it = environments_.find(id);
if (it != environments_.end()) {
it->second->AddBinding(std::move(request));
}
}