Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add MergedMigrationPath to aos_iamanager.cfg #92

Merged
merged 4 commits into from
Dec 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/app/app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <execinfo.h>
#include <iostream>

#include <Poco/Path.h>
#include <Poco/SignalHandler.h>
#include <Poco/Util/HelpFormatter.h>
#include <systemd/sd-daemon.h>
Expand Down Expand Up @@ -142,7 +141,7 @@
auto config = ParseConfig(mConfigFile.empty() ? cDefaultConfigFile : mConfigFile);
AOS_ERROR_CHECK_AND_THROW("can't parse config", config.mError);

err = mDatabase.Init(Poco::Path(config.mValue.mWorkingDir, cDBFileName).toString(), config.mValue.mMigrationPath);
err = mDatabase.Init(config.mValue.mWorkingDir, config.mValue.mMigration);

Check warning on line 144 in src/app/app.cpp

View check run for this annotation

Codecov / codecov/patch

src/app/app.cpp#L144

Added line #L144 was not covered by tests
AOS_ERROR_CHECK_AND_THROW("can't initialize database", err);

err = mNodeInfoProvider.Init(config.mValue.mNodeInfo);
Expand Down
1 change: 0 additions & 1 deletion src/app/app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class App : public Poco::Util::ServerApplication {

private:
static constexpr auto cSDNotifyReady = "READY=1";
static constexpr auto cDBFileName = "iamanager.db";
static constexpr auto cDefaultConfigFile = "aos_iamanager.cfg";
static constexpr auto cPKCS11CertModule = "pkcs11module";

Expand Down
12 changes: 11 additions & 1 deletion src/config/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,16 @@
return nodeInfoConfig;
}

static MigrationConfig ParseMigrationConfig(const aos::common::utils::CaseInsensitiveObjectWrapper& migration)
{
MigrationConfig config {};

config.mMigrationPath = migration.GetValue<std::string>("migrationPath");
config.mMergedMigrationPath = migration.GetValue<std::string>("mergedMigrationPath");

return config;
}

Check warning on line 112 in src/config/config.cpp

View check run for this annotation

Codecov / codecov/patch

src/config/config.cpp#L112

Added line #L112 was not covered by tests

/***********************************************************************************************************************
* Public functions
**********************************************************************************************************************/
Expand Down Expand Up @@ -129,8 +139,8 @@
config.mCACert = object.GetValue<std::string>("caCert");
config.mCertStorage = object.GetValue<std::string>("certStorage");
config.mWorkingDir = object.GetValue<std::string>("workingDir");
config.mMigrationPath = object.GetValue<std::string>("migrationPath");
config.mEnablePermissionsHandler = object.GetValue<bool>("enablePermissionsHandler");
config.mMigration = ParseMigrationConfig(object.GetObject("migration"));

config.mStartProvisioningCmdArgs = aos::common::utils::GetArrayValue<std::string>(object,
"startProvisioningCmdArgs", [](const Poco::Dynamic::Var& value) { return value.convert<std::string>(); });
Expand Down
10 changes: 9 additions & 1 deletion src/config/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ struct NodeInfoConfig {
std::vector<PartitionInfoConfig> mPartitions;
};

/**
* Migration configuration.
*/
struct MigrationConfig {
std::string mMigrationPath;
std::string mMergedMigrationPath;
};

/*
* Config instance.
*/
Expand All @@ -107,7 +115,7 @@ struct Config {
std::string mCACert;
std::string mCertStorage;
std::string mWorkingDir;
std::string mMigrationPath;
MigrationConfig mMigration;
std::vector<ModuleConfig> mCertModules;
std::vector<std::string> mStartProvisioningCmdArgs;
std::vector<std::string> mDiskEncryptionCmdArgs;
Expand Down
12 changes: 7 additions & 5 deletions src/database/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <Poco/Data/SQLite/Connector.h>
#include <Poco/JSON/Parser.h>
#include <Poco/JSON/Stringifier.h>
#include <Poco/Path.h>
#include <filesystem>

#include "database.hpp"
Expand Down Expand Up @@ -38,23 +39,24 @@ Database::Database()
Poco::Data::SQLite::Connector::registerConnector();
}

aos::Error Database::Init(const std::string& dbPath, const std::string& migrationPath)
aos::Error Database::Init(const std::string& workDir, const MigrationConfig& migration)
{
if (mSession && mSession->isConnected()) {
return aos::ErrorEnum::eNone;
}

try {
auto dirPath = std::filesystem::path(dbPath).parent_path();
auto dirPath = std::filesystem::path(workDir);
if (!std::filesystem::exists(dirPath)) {
std::filesystem::create_directories(dirPath);
}

mSession = std::make_unique<Poco::Data::Session>("SQLite", dbPath);
const auto dbPath = Poco::Path(workDir, cDBFileName);
mSession = std::make_unique<Poco::Data::Session>("SQLite", dbPath.toString());
CreateTables();

mMigration.emplace(*mSession, migrationPath);
mMigration->MigrateToVersion(mVersion);
mMigration.emplace(*mSession, migration.mMigrationPath, migration.mMergedMigrationPath);
mMigration->MigrateToVersion(cVersion);
} catch (const std::exception& e) {
LOG_ERR() << "Failed to initialize database: " << e.what();

Expand Down
10 changes: 6 additions & 4 deletions src/database/database.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include <aos/iam/certmodules/certmodule.hpp>
#include <aos/iam/nodemanager.hpp>
#include <config/config.hpp>
#include <migration/migration.hpp>

class Database : public aos::iam::certhandler::StorageItf, public aos::iam::nodemanager::NodeInfoStorageItf {
Expand All @@ -29,11 +30,11 @@ class Database : public aos::iam::certhandler::StorageItf, public aos::iam::node
/**
* Initializes certificate info storage.
*
* @param dbPath path to the database file.
* @param migrationPath path to the migration scripts.
* @param workDir working directory.
* @param migrationConf migration configuration.
* @return Error.
*/
aos::Error Init(const std::string& dbPath, const std::string& migrationPath);
aos::Error Init(const std::string& workDir, const MigrationConfig& migrationConf);

//
// certhandler::StorageItf interface
Expand Down Expand Up @@ -132,7 +133,8 @@ class Database : public aos::iam::certhandler::StorageItf, public aos::iam::node
enum CertColumns { eType = 0, eIssuer, eSerial, eCertURL, eKeyURL, eNotAfter };
using CertInfo = Poco::Tuple<std::string, Poco::Data::BLOB, Poco::Data::BLOB, std::string, std::string, uint64_t>;

constexpr static int mVersion = 0;
constexpr static int cVersion = 0;
constexpr static auto cDBFileName = "iamanager.db";

void CreateTables();
CertInfo ToAosCertInfo(const aos::String& certType, const aos::iam::certhandler::CertInfo& certInfo);
Expand Down
8 changes: 6 additions & 2 deletions tests/config/config_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ class ConfigTest : public Test {
"CACert": "/etc/ssl/certs/rootCA.crt",
"CertStorage": "/var/aos/crypt/iam/",
"WorkingDir": "/var/aos/iamanager",
"MigrationPath": "/var/aos/migration",
"Migration": {
"MigrationPath" : "/usr/share/aos/iam/migration",
"MergedMigrationPath" : "/var/aos/workdirs/iam/migration"
},
"FinishProvisioningCmdArgs": [
"/var/aos/finish.sh"
],
Expand Down Expand Up @@ -161,7 +164,8 @@ TEST_F(ConfigTest, ParseConfig)
EXPECT_EQ(config.mCACert, "/etc/ssl/certs/rootCA.crt");
EXPECT_EQ(config.mCertStorage, "/var/aos/crypt/iam/");
EXPECT_EQ(config.mWorkingDir, "/var/aos/iamanager");
EXPECT_EQ(config.mMigrationPath, "/var/aos/migration");
EXPECT_EQ(config.mMigration.mMigrationPath, "/usr/share/aos/iam/migration");
EXPECT_EQ(config.mMigration.mMergedMigrationPath, "/var/aos/workdirs/iam/migration");
EXPECT_EQ(config.mEnablePermissionsHandler, true);

EXPECT_EQ(config.mFinishProvisioningCmdArgs, std::vector<std::string> {"/var/aos/finish.sh"});
Expand Down
37 changes: 24 additions & 13 deletions tests/database/database_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,17 +83,28 @@ static aos::NodeInfo DefaultNodeInfo(const char* id = "node0")

class DatabaseTest : public Test {
protected:
void TearDown() override { std::remove(mFileName.c_str()); }
void SetUp() override
{
mMigrationConfig.mMigrationPath = cMigrationPath;
mMigrationConfig.mMergedMigrationPath = cMergedMigrationPath;

std::filesystem::create_directories(cMigrationPath);
}

void TearDown() override { std::filesystem::remove_all(cWorkingDir); }

const aos::Array<uint8_t> StringToDN(const char* str)
{
return aos::Array<uint8_t>(reinterpret_cast<const uint8_t*>(str), strlen(str) + 1);
}

protected:
std::string mFileName = "database/test/test.db";
std::string mMigrationPath = "database/test/migration";
Database mDB;
static constexpr auto cWorkingDir = "database";
static constexpr auto cMigrationPath = "database/migration";
static constexpr auto cMergedMigrationPath = "database/merged-migration";

MigrationConfig mMigrationConfig;
Database mDB;
};

/***********************************************************************************************************************
Expand All @@ -110,7 +121,7 @@ TEST_F(DatabaseTest, AddCertInfo)
certInfo.mKeyURL = "keyURL";
certInfo.mNotAfter = aos::Time::Now();

EXPECT_EQ(mDB.Init(mFileName, mMigrationPath), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.Init(cWorkingDir, mMigrationConfig), aos::ErrorEnum::eNone);

EXPECT_EQ(mDB.AddCertInfo("type", certInfo), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.AddCertInfo("type", certInfo), aos::ErrorEnum::eFailed);
Expand All @@ -125,7 +136,7 @@ TEST_F(DatabaseTest, AddCertInfo)

TEST_F(DatabaseTest, RemoveCertInfo)
{
EXPECT_EQ(mDB.Init(mFileName, mMigrationPath), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.Init(cWorkingDir, mMigrationConfig), aos::ErrorEnum::eNone);

aos::iam::certhandler::CertInfo certInfo;

Expand All @@ -142,7 +153,7 @@ TEST_F(DatabaseTest, RemoveCertInfo)

TEST_F(DatabaseTest, RemoveAllCertsInfo)
{
EXPECT_EQ(mDB.Init(mFileName, mMigrationPath), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.Init(cWorkingDir, mMigrationConfig), aos::ErrorEnum::eNone);

aos::iam::certhandler::CertInfo certInfo;

Expand All @@ -166,7 +177,7 @@ TEST_F(DatabaseTest, RemoveAllCertsInfo)

TEST_F(DatabaseTest, GetCertInfo)
{
EXPECT_EQ(mDB.Init(mFileName, mMigrationPath), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.Init(cWorkingDir, mMigrationConfig), aos::ErrorEnum::eNone);

aos::iam::certhandler::CertInfo certInfo {};

Expand Down Expand Up @@ -201,7 +212,7 @@ TEST_F(DatabaseTest, GetCertInfo)

TEST_F(DatabaseTest, GetCertsInfo)
{
EXPECT_EQ(mDB.Init(mFileName, mMigrationPath), aos::ErrorEnum::eNone);
EXPECT_EQ(mDB.Init(cWorkingDir, mMigrationConfig), aos::ErrorEnum::eNone);

aos::StaticArray<aos::iam::certhandler::CertInfo, 2> certsInfo;

Expand Down Expand Up @@ -249,7 +260,7 @@ TEST_F(DatabaseTest, GetNodeInfo)
{
const auto& nodeInfo = DefaultNodeInfo();

ASSERT_TRUE(mDB.Init(mFileName, mMigrationPath).IsNone());
ASSERT_TRUE(mDB.Init(cWorkingDir, mMigrationConfig).IsNone());

ASSERT_TRUE(mDB.SetNodeInfo(nodeInfo).IsNone());

Expand All @@ -264,7 +275,7 @@ TEST_F(DatabaseTest, GetAllNodeIds)
const auto& node1 = DefaultNodeInfo("node1");
const auto& node2 = DefaultNodeInfo("node2");

ASSERT_TRUE(mDB.Init(mFileName, mMigrationPath).IsNone());
ASSERT_TRUE(mDB.Init(cWorkingDir, mMigrationConfig).IsNone());

ASSERT_TRUE(mDB.SetNodeInfo(node0).IsNone());
ASSERT_TRUE(mDB.SetNodeInfo(node1).IsNone());
Expand All @@ -283,7 +294,7 @@ TEST_F(DatabaseTest, GetAllNodeIdsNotEnoughMemory)
const auto& node1 = DefaultNodeInfo("node1");
const auto& node2 = DefaultNodeInfo("node2");

ASSERT_TRUE(mDB.Init(mFileName, mMigrationPath).IsNone());
ASSERT_TRUE(mDB.Init(cWorkingDir, mMigrationConfig).IsNone());

ASSERT_TRUE(mDB.SetNodeInfo(node0).IsNone());
ASSERT_TRUE(mDB.SetNodeInfo(node1).IsNone());
Expand All @@ -300,7 +311,7 @@ TEST_F(DatabaseTest, RemoveNodeInfo)
const auto& node1 = DefaultNodeInfo("node1");
const auto& node2 = DefaultNodeInfo("node2");

ASSERT_TRUE(mDB.Init(mFileName, mMigrationPath).IsNone());
ASSERT_TRUE(mDB.Init(cWorkingDir, mMigrationConfig).IsNone());

ASSERT_TRUE(mDB.SetNodeInfo(node0).IsNone());
ASSERT_TRUE(mDB.SetNodeInfo(node1).IsNone());
Expand Down