blob: b9b00813fd033fc3ccad8c10f74f1be7764b8b41 [file] [log] [blame] [edit]
#pragma once
#include <memory>
#include <string>
#include <thread> // NOLINT(build/c++11)
#include "baremetal_callback.h"
#include "biossettings_callback.h"
#include "boottime_callback.h"
#include "smbios_callback.h"
#include "grpcpp/server_builder.h"
namespace blobs {
class GrpcInstance {
public:
explicit GrpcInstance(int instanceNumber, const std::string& basePath = "")
: instance(instanceNumber),
basePath_(basePath),
smbiosServiceCallback(
std::make_unique<SmbiosTransferServiceImpl>(instance, basePath)),
biosSettingGrpcService(
std::make_unique<BiosSettingsServiceImpl>(instance, basePath)),
bmServiceCallback(
std::make_unique<BaremetalTransferServiceImpl>(instance, basePath)),
bootTimeServiceCallback(
std::make_unique<BootTimeServiceImpl>(instance, basePath)) {}
void start();
void stop();
protected:
[[nodiscard]] std::string threadId(const std::thread& thread) const;
[[nodiscard]] bool validatePreviousFile() const;
void restoreLink();
void threadRun();
private:
int instance;
std::string basePath_;
// Incoming gRPC requests arrive here
// This is a pointer because gRPC RegisterService() requires it
std::unique_ptr<SmbiosTransferServiceImpl> smbiosServiceCallback;
std::unique_ptr<BiosSettingsServiceImpl> biosSettingGrpcService;
std::unique_ptr<BaremetalTransferServiceImpl> bmServiceCallback;
std::unique_ptr<BootTimeServiceImpl> bootTimeServiceCallback;
// Here, and below, do not need parameters in constructor
// This is a pointer because gRPC BuildAndStart() requires it
std::unique_ptr<grpc::Server> grpcServer;
// Not pointer, this has no prerequisites and can directly construct
grpc::ServerBuilder grpcBuilder;
// Should be unique, but gRPC API requires it to be shared
std::shared_ptr<grpc::ServerCredentials> grpcCredentials;
// gRPC runs its own event loop and does not use ASIO
// This is a pointer because we need to construct it later
std::unique_ptr<std::thread> grpcThread;
};
} // namespace blobs