blob: 0e0d4cca3ad29f9313e0df33ab99aeea6231c4a1 [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.
#include "logger/project_context_factory.h"
#include <utility>
#include "./logging.h"
#include "config/metric_definition.pb.h"
#include "config/project.pb.h"
#include "config/project_configs.h"
namespace cobalt {
namespace logger {
ProjectContextFactory::ProjectContextFactory(
std::string cobalt_registry_bytes) {
// Attempt to deserialize a CobaltRegistry.
auto cobalt_registry = std::make_unique<CobaltRegistry>();
if (!cobalt_registry->ParseFromString(cobalt_registry_bytes)) {
LOG(ERROR) << "Unable to parse a CobaltRegistry from the provided bytes.";
return;
}
// Create a second CobaltRegistry and separate the Cobalt 1.0 data
// from the Cobalt 0.1 data.
auto legacy_cobalt_registry = std::make_unique<CobaltRegistry>();
legacy_cobalt_registry->mutable_metric_configs()->Swap(
cobalt_registry->mutable_metric_configs());
legacy_cobalt_registry->mutable_encoding_configs()->Swap(
cobalt_registry->mutable_encoding_configs());
// If there is any Cobalt 1.0 data create a Cobalt 1.0 ProjectConfigs
// object to wrap it.
if (cobalt_registry->customers_size() > 0) {
project_configs_ = config::ProjectConfigs::CreateFromCobaltRegistryProto(
std::move(cobalt_registry));
}
// If there is any Cobalt 0.1 data create a Cobalt 0.1 ClientConfig object
// to wrap it.
if (legacy_cobalt_registry->metric_configs_size() > 0) {
client_config_ = config::ClientConfig::CreateFromCobaltRegistryProto(
std::move(legacy_cobalt_registry));
}
}
std::unique_ptr<ProjectContext> ProjectContextFactory::NewProjectContext(
std::string customer_name, std::string project_name,
ReleaseStage release_stage) {
if (project_configs_ == nullptr) {
return nullptr;
}
const auto* customer_config =
project_configs_->GetCustomerConfig(customer_name);
if (!customer_config) {
return nullptr;
}
const auto* project_config =
project_configs_->GetProjectConfig(customer_name, project_name);
if (!project_config) {
return nullptr;
}
return std::make_unique<ProjectContext>(customer_config->customer_id(),
customer_name, project_config,
release_stage);
}
std::unique_ptr<ProjectContext> ProjectContextFactory::TakeSingleProjectContext(
ReleaseStage release_stage) {
if (!is_single_project()) {
return nullptr;
}
auto project_context = std::make_unique<ProjectContext>(
project_configs_->single_customer_id(),
project_configs_->single_customer_name(),
project_configs_->TakeSingleProjectConfig(), release_stage);
project_configs_.reset();
return project_context;
}
std::unique_ptr<encoder::ProjectContext>
ProjectContextFactory::NewLegacyProjectContext(uint32_t customer_id,
uint32_t project_id) {
if (client_config_ == nullptr) {
return nullptr;
}
return std::make_unique<encoder::ProjectContext>(customer_id, project_id,
client_config_);
}
std::unique_ptr<encoder::ProjectContext>
ProjectContextFactory::NewSingleLegacyProjectContext() {
if (!is_single_legacy_project()) {
return nullptr;
}
return NewLegacyProjectContext(client_config_->single_customer_id(),
client_config_->single_project_id());
}
} // namespace logger
} // namespace cobalt