blob: adbfb7ffa42b4d0570967ff1216439ed0e492bb3 [file] [log] [blame]
// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef VM_TOOLS_MAITRED_SERVICE_IMPL_H_
#define VM_TOOLS_MAITRED_SERVICE_IMPL_H_
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <base/callback.h>
#include <base/macros.h>
#include <grpcpp/grpcpp.h>
#include <vm_protos/proto_bindings/vm_guest.grpc.pb.h>
#include "vm_tools/maitred/init.h"
namespace vm_tools {
namespace maitred {
// Actually implements the maitred service.
class ServiceImpl final : public vm_tools::Maitred::Service {
public:
explicit ServiceImpl(std::unique_ptr<Init> init);
ServiceImpl(const ServiceImpl&) = delete;
ServiceImpl& operator=(const ServiceImpl&) = delete;
~ServiceImpl() override = default;
// Initializes ServiceImpl for first use.
bool Init();
void set_shutdown_cb(base::Callback<bool(void)> cb) {
shutdown_cb_ = std::move(cb);
}
// Maitred::Service overrides.
grpc::Status ConfigureNetwork(grpc::ServerContext* ctx,
const vm_tools::NetworkConfigRequest* request,
vm_tools::EmptyMessage* response) override;
grpc::Status Shutdown(grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::EmptyMessage* response) override;
grpc::Status LaunchProcess(
grpc::ServerContext* ctx,
const vm_tools::LaunchProcessRequest* request,
vm_tools::LaunchProcessResponse* response) override;
grpc::Status Mount(grpc::ServerContext* ctx,
const vm_tools::MountRequest* request,
vm_tools::MountResponse* response) override;
grpc::Status Mount9P(grpc::ServerContext* ctx,
const vm_tools::Mount9PRequest* request,
vm_tools::MountResponse* response) override;
// DEPRECATED. Use OnHostNetworkChanged instead.
grpc::Status ResetIPv6(grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::EmptyMessage* response) override;
grpc::Status OnHostNetworkChanged(grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::EmptyMessage* response) override;
grpc::Status ConfigureContainerGuest(
grpc::ServerContext* ctx,
const vm_tools::ConfigureContainerGuestRequest* request,
vm_tools::EmptyMessage* response) override;
grpc::Status StartTermina(grpc::ServerContext* ctx,
const vm_tools::StartTerminaRequest* request,
vm_tools::StartTerminaResponse* response) override;
grpc::Status SetResolvConfig(grpc::ServerContext* ctx,
const vm_tools::SetResolvConfigRequest* request,
vm_tools::EmptyMessage* response) override;
grpc::Status SetTime(grpc::ServerContext* ctx,
const vm_tools::SetTimeRequest* request,
vm_tools::EmptyMessage* response) override;
grpc::Status GetKernelVersion(
grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::GetKernelVersionResponse* response) override;
grpc::Status ResizeFilesystem(
grpc::ServerContext* ctx,
const vm_tools::ResizeFilesystemRequest* request,
vm_tools::ResizeFilesystemResponse* response) override;
grpc::Status GetResizeStatus(
grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::GetResizeStatusResponse* response) override;
grpc::Status GetResizeBounds(
grpc::ServerContext* ctx,
const EmptyMessage* request,
vm_tools::GetResizeBoundsResponse* response) override;
grpc::Status PrepareToSuspend(grpc::ServerContext* ctx,
const EmptyMessage* request,
EmptyMessage* response) override;
private:
std::unique_ptr<vm_tools::maitred::Init> init_;
// Callback used for shutting down the gRPC server. Called when handling a
// Shutdown RPC.
base::Callback<bool(void)> shutdown_cb_;
// Flags to configure LXD functionality. Configuration happens statically in
// the constructor as well as at runtime in the |StartTermina| function.
std::map<std::string, std::string> lxd_env_;
void ResizeCommandExitCallback(Init::ProcessStatus status, int code);
// Global resize status for the stateful filesystem (/mnt/stateful).
// All accesses must be done while resize_state_.lock is held.
struct {
base::Lock lock;
bool resize_in_progress = false;
uint64_t current_size = 0;
uint64_t target_size = 0;
} resize_state_;
// Name of the stateful device (e.g. /dev/vdb) as determined by StartTermina.
std::string stateful_device_;
};
} // namespace maitred
} // namespace vm_tools
#endif // VM_TOOLS_MAITRED_SERVICE_IMPL_H_