From ca9543ec62d3c1295677758be5df99cad79085e0 Mon Sep 17 00:00:00 2001
From: Piotr Bartosiewicz
Date: Thu, 22 Jan 2015 09:34:38 +0100
Subject: [PATCH] Provisioning uses dynamic configuration
[Bug/Feature] N/A
[Cause] N/A
[Solution] N/A
[Verification] Build, run tests
Change-Id: If1762b8d0993a98048d2f9310981c53f2a913124
---
server/configs/templates/template.conf | 1 +
server/zone-provision-config.hpp | 8 +-
server/zone-provision.cpp | 98 +++++------
server/zone-provision.hpp | 38 ++--
server/zone.cpp | 11 +-
server/zone.hpp | 2 +
server/zones-manager.cpp | 3 +-
server/zones-manager.hpp | 2 +-
.../configs/ut-client/zones/console1-dbus.conf.in | 1 +
.../configs/ut-client/zones/console2-dbus.conf.in | 1 +
.../configs/ut-client/zones/console3-dbus.conf.in | 1 +
tests/unit_tests/server/configs/CMakeLists.txt | 5 +
.../server/configs/ut-server/zones/zone1.conf | 1 +
.../server/configs/ut-server/zones/zone2.conf | 1 +
.../server/configs/ut-server/zones/zone3.conf | 1 +
.../server/configs/ut-zone-admin/zones/buggy.conf | 1 +
.../configs/ut-zone-admin/zones/missing.conf | 1 +
.../ut-zone-admin/zones/test-no-shutdown.conf | 1 +
.../server/configs/ut-zone-admin/zones/test.conf | 1 +
.../server/configs/ut-zone-provision/test.conf | 3 +
.../server/configs/ut-zone/zones/buggy.conf | 1 +
.../server/configs/ut-zone/zones/test-dbus.conf.in | 1 +
.../server/configs/ut-zone/zones/test.conf | 1 +
.../ut-zones-manager/templates/template.conf.in | 1 +
.../ut-zones-manager/zones/console1-dbus.conf.in | 1 +
.../configs/ut-zones-manager/zones/console1.conf | 1 +
.../ut-zones-manager/zones/console2-dbus.conf.in | 1 +
.../configs/ut-zones-manager/zones/console2.conf | 1 +
.../ut-zones-manager/zones/console3-dbus.conf.in | 1 +
.../configs/ut-zones-manager/zones/console3.conf | 1 +
tests/unit_tests/server/ut-zone-provision.cpp | 196 ++++++++++++---------
tests/unit_tests/server/ut-zone.cpp | 2 +
32 files changed, 225 insertions(+), 164 deletions(-)
create mode 100644 tests/unit_tests/server/configs/ut-zone-provision/test.conf
diff --git a/server/configs/templates/template.conf b/server/configs/templates/template.conf
index e011a64..9690a87 100644
--- a/server/configs/templates/template.conf
+++ b/server/configs/templates/template.conf
@@ -11,6 +11,7 @@
"switchToDefaultAfterTimeout" : true,
"enableDbusIntegration" : true,
"runMountPoint" : "~NAME~/run",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : [ "/tmp/",
diff --git a/server/zone-provision-config.hpp b/server/zone-provision-config.hpp
index 5a9f5ff..93fe1a0 100644
--- a/server/zone-provision-config.hpp
+++ b/server/zone-provision-config.hpp
@@ -34,7 +34,7 @@
namespace vasum {
-struct ZoneProvisioning
+struct ZoneProvisioningConfig
{
struct File
@@ -83,7 +83,7 @@ struct ZoneProvisioning
)
};
- struct Unit
+ struct Provision
{
CONFIG_DECLARE_UNION
(
@@ -93,11 +93,11 @@ struct ZoneProvisioning
)
};
- std::vector units;
+ std::vector provisions;
CONFIG_REGISTER
(
- units
+ provisions
)
};
diff --git a/server/zone-provision.cpp b/server/zone-provision.cpp
index c04a32a..928d887 100644
--- a/server/zone-provision.cpp
+++ b/server/zone-provision.cpp
@@ -42,29 +42,17 @@ namespace fs = boost::filesystem;
namespace vasum {
-namespace {
-
-const std::string ZONE_PROVISION_FILE = "provision.conf";
-
-void declareUnit(const std::string& file, ZoneProvisioning::Unit&& unit)
-{
- // TODO: Add to the dynamic configuration
- ZoneProvisioning config;
- if (fs::exists(file)) {
- config::loadFromJsonFile(file, config);
- }
- config.units.push_back(std::move(unit));
- config::saveToJsonFile(file, config);
-}
-
-} // namespace
-
-ZoneProvision::ZoneProvision(const std::string& zonePath,
+ZoneProvision::ZoneProvision(const std::string& rootPath,
+ const std::string& configPath,
+ const std::string& dbPath,
+ const std::string& dbPrefix,
const std::vector& validLinkPrefixes)
+ : mRootPath(rootPath)
+ , mDbPath(dbPath)
+ , mDbPrefix(dbPrefix)
+ , mValidLinkPrefixes(validLinkPrefixes)
{
- mProvisionFile = (fs::path(zonePath) / fs::path(ZONE_PROVISION_FILE)).string();
- mRootPath = (zonePath / fs::path("rootfs")).string();
- mValidLinkPrefixes = validLinkPrefixes;
+ config::loadFromKVStoreWithJsonFile(dbPath, configPath, mProvisioningConfig, dbPrefix);
}
ZoneProvision::~ZoneProvision()
@@ -72,21 +60,26 @@ ZoneProvision::~ZoneProvision()
stop();
}
-std::string ZoneProvision::getRootPath() const
+void ZoneProvision::saveProvisioningConfig()
{
- return mRootPath;
+ config::saveToKVStore(mDbPath, mProvisioningConfig, mDbPrefix);
}
+void ZoneProvision::declareProvision(ZoneProvisioningConfig::Provision&& provision)
+{
+ mProvisioningConfig.provisions.push_back(std::move(provision));
+ saveProvisioningConfig();
+}
void ZoneProvision::declareFile(const int32_t& type,
const std::string& path,
const int32_t& flags,
const int32_t& mode)
{
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::File({type, path, flags, mode}));
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::File({type, path, flags, mode}));
- declareUnit(mProvisionFile, std::move(unit));
+ declareProvision(std::move(provision));
}
void ZoneProvision::declareMount(const std::string& source,
@@ -95,49 +88,46 @@ void ZoneProvision::declareMount(const std::string& source,
const int64_t& flags,
const std::string& data)
{
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::Mount({source, target, type, flags, data}));
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::Mount({source, target, type, flags, data}));
- declareUnit(mProvisionFile, std::move(unit));
+ declareProvision(std::move(provision));
}
void ZoneProvision::declareLink(const std::string& source,
const std::string& target)
{
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::Link({source, target}));
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::Link({source, target}));
- declareUnit(mProvisionFile, std::move(unit));
+ declareProvision(std::move(provision));
}
void ZoneProvision::start() noexcept
{
- if (fs::exists(mProvisionFile)) {
- config::loadFromJsonFile(mProvisionFile, mProvisioningConfig);
- for (const auto& unit : mProvisioningConfig.units) {
- try {
- if (unit.is()) {
- file(unit.as());
- } else if (unit.is()) {
- mount(unit.as());
- } else if (unit.is()) {
- link(unit.as());
- }
- // mProvisioned must be FILO
- mProvisioned.push_front(unit);
- } catch (const std::exception& ex) {
- LOGE("Provsion error: " << ex.what());
+ for (const auto& provision : mProvisioningConfig.provisions) {
+ try {
+ if (provision.is()) {
+ file(provision.as());
+ } else if (provision.is()) {
+ mount(provision.as());
+ } else if (provision.is()) {
+ link(provision.as());
}
+ // mProvisioned must be FILO
+ mProvisioned.push_front(provision);
+ } catch (const std::exception& ex) {
+ LOGE("Provsion error: " << ex.what());
}
}
}
void ZoneProvision::stop() noexcept
{
- mProvisioned.remove_if([this](const ZoneProvisioning::Unit& unit) -> bool {
+ mProvisioned.remove_if([this](const ZoneProvisioningConfig::Provision& provision) -> bool {
try {
- if (unit.is()) {
- umount(unit.as());
+ if (provision.is()) {
+ umount(provision.as());
}
// leaves files, links, fifo, untouched
return true;
@@ -148,7 +138,7 @@ void ZoneProvision::stop() noexcept
});
}
-void ZoneProvision::file(const ZoneProvisioning::File& config)
+void ZoneProvision::file(const ZoneProvisioningConfig::File& config)
{
bool ret = false;
const fs::path hostPath = fs::path(mRootPath) / fs::path(config.path);
@@ -183,7 +173,7 @@ void ZoneProvision::file(const ZoneProvisioning::File& config)
}
}
-void ZoneProvision::mount(const ZoneProvisioning::Mount& config)
+void ZoneProvision::mount(const ZoneProvisioningConfig::Mount& config)
{
const fs::path hostPath = fs::path(mRootPath) / fs::path(config.target);
bool ret = utils::mount(config.source,
@@ -196,7 +186,7 @@ void ZoneProvision::mount(const ZoneProvisioning::Mount& config)
}
}
-void ZoneProvision::umount(const ZoneProvisioning::Mount& config)
+void ZoneProvision::umount(const ZoneProvisioningConfig::Mount& config)
{
const fs::path hostPath = fs::path(mRootPath) / fs::path(config.target);
bool ret = utils::umount(hostPath.string());
@@ -205,7 +195,7 @@ void ZoneProvision::umount(const ZoneProvisioning::Mount& config)
}
}
-void ZoneProvision::link(const ZoneProvisioning::Link& config)
+void ZoneProvision::link(const ZoneProvisioningConfig::Link& config)
{
const std::string srcHostPath = fs::path(config.source).normalize().string();
for (const std::string& prefix : mValidLinkPrefixes) {
diff --git a/server/zone-provision.hpp b/server/zone-provision.hpp
index 5585c1f..f6933db 100644
--- a/server/zone-provision.hpp
+++ b/server/zone-provision.hpp
@@ -44,12 +44,23 @@ class ZoneProvision {
public:
/**
* ZoneProvision constructor
- * @param zonePath directory where zones are defined (lxc configs, rootfs etc)
+ * @param rootPath zone root path
+ * @param configPath path to config with defaults
+ * @param dbPath path to database
+ * @param dbPrefix database prefix
+ * @param validLinkPrefixes valid link prefixes
*/
- ZoneProvision(const std::string& zonePath,
+ ZoneProvision(const std::string& rootPath,
+ const std::string& configPath,
+ const std::string& dbPath,
+ const std::string& dbPrefix,
const std::vector& validLinkPrefixes);
~ZoneProvision();
+ ZoneProvision(const ZoneProvision&) = delete;
+ ZoneProvision& operator=(const ZoneProvision&) = delete;
+ ZoneProvision(ZoneProvision&&) = default;
+
/**
* Declare file, directory or pipe that will be created while zone startup
*/
@@ -71,25 +82,24 @@ public:
void declareLink(const std::string& source,
const std::string& target);
- /**
- * Get zone root path
- */
- std::string getRootPath() const;
-
void start() noexcept;
void stop() noexcept;
private:
- ZoneProvisioning mProvisioningConfig;
+ ZoneProvisioningConfig mProvisioningConfig;
std::string mRootPath;
- std::string mProvisionFile;
+ std::string mDbPath;
+ std::string mDbPrefix;
std::vector mValidLinkPrefixes;
- std::list mProvisioned;
+ std::list mProvisioned;
+
+ void saveProvisioningConfig();
+ void declareProvision(ZoneProvisioningConfig::Provision&& provision);
- void mount(const ZoneProvisioning::Mount& config);
- void umount(const ZoneProvisioning::Mount& config);
- void file(const ZoneProvisioning::File& config);
- void link(const ZoneProvisioning::Link& config);
+ void mount(const ZoneProvisioningConfig::Mount& config);
+ void umount(const ZoneProvisioningConfig::Mount& config);
+ void file(const ZoneProvisioningConfig::File& config);
+ void link(const ZoneProvisioningConfig::Link& config);
};
diff --git a/server/zone.cpp b/server/zone.cpp
index f35a360..fbbd819 100644
--- a/server/zone.cpp
+++ b/server/zone.cpp
@@ -48,12 +48,14 @@ typedef std::lock_guard Lock;
// TODO: move constants to the config file when default values are implemented there
const int RECONNECT_RETRIES = 15;
const int RECONNECT_DELAY = 1 * 1000;
+const std::string DB_PREFIX = "zone.";
} // namespace
Zone::Zone(const utils::Worker::Pointer& worker,
const std::string& zonesPath,
const std::string& zoneConfigPath,
+ const std::string& dbPath,
const std::string& lxcTemplatePrefix,
const std::string& baseRunMountPointPath)
: mWorker(worker)
@@ -72,8 +74,12 @@ Zone::Zone(const utils::Worker::Pointer& worker,
}
mAdmin.reset(new ZoneAdmin(zonesPath, lxcTemplatePrefix, mConfig));
+
const fs::path zonePath = fs::path(zonesPath) / mAdmin->getId();
- mProvision.reset(new ZoneProvision(zonePath.string(), mConfig.validLinkPrefixes));
+ mRootPath = (zonePath / fs::path("rootfs")).string();
+ const std::string dbPrefix = DB_PREFIX + mAdmin->getId();
+
+ mProvision.reset(new ZoneProvision(mRootPath, zoneConfigPath, dbPath, dbPrefix, mConfig.validLinkPrefixes));
}
Zone::~Zone()
@@ -185,10 +191,9 @@ int Zone::getVT() const
std::string Zone::getRootPath() const
{
- return mProvision->getRootPath();
+ return mRootPath;
}
-
bool Zone::activateVT()
{
Lock lock(mReconnectMutex);
diff --git a/server/zone.hpp b/server/zone.hpp
index 7eb34cf..2eab7f3 100644
--- a/server/zone.hpp
+++ b/server/zone.hpp
@@ -55,6 +55,7 @@ public:
Zone(const utils::Worker::Pointer& worker,
const std::string& zonesPath,
const std::string& zoneConfigPath,
+ const std::string& dbPath,
const std::string& lxcTemplatePrefix,
const std::string& baseRunMountPointPath);
Zone(Zone&&) = default;
@@ -269,6 +270,7 @@ private:
DbusStateChangedCallback mDbusStateChangedCallback;
std::string mDbusAddress;
std::string mRunMountPoint;
+ std::string mRootPath;
void onNameLostCallback();
void reconnectHandler();
diff --git a/server/zones-manager.cpp b/server/zones-manager.cpp
index f65f9e3..99e87ee 100644
--- a/server/zones-manager.cpp
+++ b/server/zones-manager.cpp
@@ -204,6 +204,7 @@ void ZonesManager::createZone(const std::string& zoneConfigPath)
std::unique_ptr zone(new Zone(mWorker->createSubWorker(),
mConfig.zonesPath,
zoneConfigPath,
+ mConfig.dbPath,
mConfig.lxcTemplatePrefix,
mConfig.runMountPointPrefix));
const std::string id = zone->getId();
@@ -254,7 +255,7 @@ void ZonesManager::destroyZone(const std::string& zoneId)
it->second->setDestroyOnExit();
mZones.erase(it);
- if (mZones.size() == 0) {
+ if (mZones.empty()) {
if (!utils::removeFile(utils::createFilePath(mConfig.zonesPath, ENABLED_FILE_NAME))) {
LOGE("Failed to remove enabled file.");
}
diff --git a/server/zones-manager.hpp b/server/zones-manager.hpp
index e074fc9..677b056 100644
--- a/server/zones-manager.hpp
+++ b/server/zones-manager.hpp
@@ -50,7 +50,7 @@ public:
/**
* Create new zone.
*
- * @param zoneConfig config of new zone
+ * @param zoneConfigPath config of new zone
*/
void createZone(const std::string& zoneConfigPath);
diff --git a/tests/unit_tests/client/configs/ut-client/zones/console1-dbus.conf.in b/tests/unit_tests/client/configs/ut-client/zones/console1-dbus.conf.in
index 46fb716..097480d 100644
--- a/tests/unit_tests/client/configs/ut-client/zones/console1-dbus.conf.in
+++ b/tests/unit_tests/client/configs/ut-client/zones/console1-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console1-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*", "/etc/secret2" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/client/configs/ut-client/zones/console2-dbus.conf.in b/tests/unit_tests/client/configs/ut-client/zones/console2-dbus.conf.in
index 260d01f..440772b 100644
--- a/tests/unit_tests/client/configs/ut-client/zones/console2-dbus.conf.in
+++ b/tests/unit_tests/client/configs/ut-client/zones/console2-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console2-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*", "/etc/secret1" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/client/configs/ut-client/zones/console3-dbus.conf.in b/tests/unit_tests/client/configs/ut-client/zones/console3-dbus.conf.in
index e20ffe9..2f28ee1 100644
--- a/tests/unit_tests/client/configs/ut-client/zones/console3-dbus.conf.in
+++ b/tests/unit_tests/client/configs/ut-client/zones/console3-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console3-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/CMakeLists.txt b/tests/unit_tests/server/configs/CMakeLists.txt
index 4a9edbe..596c123 100644
--- a/tests/unit_tests/server/configs/CMakeLists.txt
+++ b/tests/unit_tests/server/configs/CMakeLists.txt
@@ -28,6 +28,8 @@ FILE(GLOB manager_zone_CONF ut-zones-manager/zones/*.conf)
FILE(GLOB zone_CONF ut-zone/*.conf)
FILE(GLOB zone_zone_CONF ut-zone/zones/*.conf)
+FILE(GLOB zone_provision_CONF ut-zone-provision/*.conf)
+
FILE(GLOB admin_zone_CONF ut-zone-admin/zones/*.conf)
FILE(GLOB connection_CONF ut-zone-connection/*.conf)
@@ -97,6 +99,9 @@ INSTALL(FILES ${zone_zone_CONF}
INSTALL(FILES ${zone_zone_CONF_GEN}
DESTINATION ${VSM_TEST_CONFIG_INSTALL_DIR}/server/ut-zone/zones)
+INSTALL(FILES ${zone_provision_CONF}
+ DESTINATION ${VSM_TEST_CONFIG_INSTALL_DIR}/server/ut-zone-provision)
+
INSTALL(FILES ${admin_zone_CONF}
DESTINATION ${VSM_TEST_CONFIG_INSTALL_DIR}/server/ut-zone-admin/zones)
diff --git a/tests/unit_tests/server/configs/ut-server/zones/zone1.conf b/tests/unit_tests/server/configs/ut-server/zones/zone1.conf
index 2c2ccde..432adc6 100644
--- a/tests/unit_tests/server/configs/ut-server/zones/zone1.conf
+++ b/tests/unit_tests/server/configs/ut-server/zones/zone1.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-server/zones/zone2.conf b/tests/unit_tests/server/configs/ut-server/zones/zone2.conf
index 1d500a7..2126b8f 100644
--- a/tests/unit_tests/server/configs/ut-server/zones/zone2.conf
+++ b/tests/unit_tests/server/configs/ut-server/zones/zone2.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-server/zones/zone3.conf b/tests/unit_tests/server/configs/ut-server/zones/zone3.conf
index a9856c7..dfc4a04 100644
--- a/tests/unit_tests/server/configs/ut-server/zones/zone3.conf
+++ b/tests/unit_tests/server/configs/ut-server/zones/zone3.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone-admin/zones/buggy.conf b/tests/unit_tests/server/configs/ut-zone-admin/zones/buggy.conf
index e96dca8..fa7bd6b 100644
--- a/tests/unit_tests/server/configs/ut-zone-admin/zones/buggy.conf
+++ b/tests/unit_tests/server/configs/ut-zone-admin/zones/buggy.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone-admin/zones/missing.conf b/tests/unit_tests/server/configs/ut-zone-admin/zones/missing.conf
index 9a5ec68..5cb9524 100644
--- a/tests/unit_tests/server/configs/ut-zone-admin/zones/missing.conf
+++ b/tests/unit_tests/server/configs/ut-zone-admin/zones/missing.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone-admin/zones/test-no-shutdown.conf b/tests/unit_tests/server/configs/ut-zone-admin/zones/test-no-shutdown.conf
index be05697..7ab5df7 100644
--- a/tests/unit_tests/server/configs/ut-zone-admin/zones/test-no-shutdown.conf
+++ b/tests/unit_tests/server/configs/ut-zone-admin/zones/test-no-shutdown.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone-admin/zones/test.conf b/tests/unit_tests/server/configs/ut-zone-admin/zones/test.conf
index 45213d7..215fa4f 100644
--- a/tests/unit_tests/server/configs/ut-zone-admin/zones/test.conf
+++ b/tests/unit_tests/server/configs/ut-zone-admin/zones/test.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone-provision/test.conf b/tests/unit_tests/server/configs/ut-zone-provision/test.conf
new file mode 100644
index 0000000..504b486
--- /dev/null
+++ b/tests/unit_tests/server/configs/ut-zone-provision/test.conf
@@ -0,0 +1,3 @@
+{
+ "provisions" : []
+}
diff --git a/tests/unit_tests/server/configs/ut-zone/zones/buggy.conf b/tests/unit_tests/server/configs/ut-zone/zones/buggy.conf
index eaf0811..d29993c 100644
--- a/tests/unit_tests/server/configs/ut-zone/zones/buggy.conf
+++ b/tests/unit_tests/server/configs/ut-zone/zones/buggy.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone/zones/test-dbus.conf.in b/tests/unit_tests/server/configs/ut-zone/zones/test-dbus.conf.in
index e4a18fa..77a4180 100644
--- a/tests/unit_tests/server/configs/ut-zone/zones/test-dbus.conf.in
+++ b/tests/unit_tests/server/configs/ut-zone/zones/test-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zone-test-dbus",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zone/zones/test.conf b/tests/unit_tests/server/configs/ut-zone/zones/test.conf
index 4386c8c..9887e1c 100644
--- a/tests/unit_tests/server/configs/ut-zone/zones/test.conf
+++ b/tests/unit_tests/server/configs/ut-zone/zones/test.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [],
"permittedToRecv" : [],
"validLinkPrefixes" : [ "/tmp" ]
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/templates/template.conf.in b/tests/unit_tests/server/configs/ut-zones-manager/templates/template.conf.in
index 7c2f5e4..28879db 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/templates/template.conf.in
+++ b/tests/unit_tests/server/configs/ut-zones-manager/templates/template.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/~NAME~",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console1-dbus.conf.in b/tests/unit_tests/server/configs/ut-zones-manager/zones/console1-dbus.conf.in
index 46fb716..097480d 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console1-dbus.conf.in
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console1-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console1-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*", "/etc/secret2" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console1.conf b/tests/unit_tests/server/configs/ut-zones-manager/zones/console1.conf
index 41071ad..1fd4061 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console1.conf
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console1.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console2-dbus.conf.in b/tests/unit_tests/server/configs/ut-zones-manager/zones/console2-dbus.conf.in
index 260d01f..440772b 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console2-dbus.conf.in
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console2-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console2-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*", "/etc/secret1" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console2.conf b/tests/unit_tests/server/configs/ut-zones-manager/zones/console2.conf
index f152092..3c37313 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console2.conf
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console2.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console3-dbus.conf.in b/tests/unit_tests/server/configs/ut-zones-manager/zones/console3-dbus.conf.in
index e20ffe9..2f28ee1 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console3-dbus.conf.in
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console3-dbus.conf.in
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "/tmp/ut-run/ut-zones-manager-console3-dbus",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/configs/ut-zones-manager/zones/console3.conf b/tests/unit_tests/server/configs/ut-zones-manager/zones/console3.conf
index 4979dd2..8e54fe6 100644
--- a/tests/unit_tests/server/configs/ut-zones-manager/zones/console3.conf
+++ b/tests/unit_tests/server/configs/ut-zones-manager/zones/console3.conf
@@ -11,6 +11,7 @@
"cpuQuotaForeground" : -1,
"cpuQuotaBackground" : 1000,
"runMountPoint" : "",
+ "provisions" : [],
"permittedToSend" : [ "/tmp/.*" ],
"permittedToRecv" : [ "/tmp/.*" ],
"validLinkPrefixes" : []
diff --git a/tests/unit_tests/server/ut-zone-provision.cpp b/tests/unit_tests/server/ut-zone-provision.cpp
index 8d1738f..c488c09 100644
--- a/tests/unit_tests/server/ut-zone-provision.cpp
+++ b/tests/unit_tests/server/ut-zone-provision.cpp
@@ -28,6 +28,7 @@
#include "utils/scoped-dir.hpp"
#include "utils/exception.hpp"
+#include "utils/fs.hpp"
#include "config/manager.hpp"
#include "zone-provision.hpp"
#include "zone-provision-config.hpp"
@@ -47,13 +48,15 @@ namespace fs = boost::filesystem;
namespace {
-const std::string PROVISON_CONFIG_FILE = "provision.conf";
+const std::string TEST_CONFIG_PATH = VSM_TEST_CONFIG_INSTALL_DIR "/server/ut-zone-provision/test.conf";
const std::string ZONE = "ut-zone-provision-test";
const fs::path ZONES_PATH = "/tmp/ut-zones";
const fs::path LXC_TEMPLATES_PATH = VSM_TEST_LXC_TEMPLATES_INSTALL_DIR;
const fs::path ZONE_PATH = ZONES_PATH / fs::path(ZONE);
-const fs::path PROVISION_FILE_PATH = ZONE_PATH / fs::path(PROVISON_CONFIG_FILE);
-const fs::path ROOTFS_PATH = ZONE_PATH / fs::path("rootfs");
+const fs::path SOME_FILE_PATH = ZONE_PATH / "file.txt";
+const fs::path ROOTFS_PATH = ZONE_PATH / "rootfs";
+const fs::path DB_PATH = ZONES_PATH / "vasum.db";
+const std::string DB_PREFIX = "zone";
struct Fixture {
utils::ScopedDir mZonesPathGuard;
@@ -63,6 +66,26 @@ struct Fixture {
: mZonesPathGuard(ZONES_PATH.string())
, mRootfsPath(ROOTFS_PATH.string())
{
+ BOOST_REQUIRE(utils::saveFileContent(SOME_FILE_PATH.string(), "text"));
+ }
+
+ ZoneProvision create(const std::vector& validLinkPrefixes)
+ {
+ return ZoneProvision(ROOTFS_PATH.string(),
+ TEST_CONFIG_PATH,
+ DB_PATH.string(),
+ DB_PREFIX,
+ validLinkPrefixes);
+ }
+
+ void load(ZoneProvisioningConfig& config)
+ {
+ config::loadFromKVStoreWithJsonFile(DB_PATH.string(), TEST_CONFIG_PATH, config, DB_PREFIX);
+ }
+
+ void save(const ZoneProvisioningConfig& config)
+ {
+ config::saveToKVStore(DB_PATH.string(), config, DB_PREFIX);
}
};
@@ -78,22 +101,22 @@ BOOST_AUTO_TEST_CASE(DestructorTest)
{
utils::ScopedDir provisionfs(mountSource.string());
- ZoneProvisioning config;
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::File({VSMFILE_DIRECTORY,
+ ZoneProvisioningConfig config;
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_DIRECTORY,
mountTarget.string(),
0,
0777}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::Mount({mountSource.string(),
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::Mount({mountSource.string(),
mountTarget.string(),
"",
MS_BIND,
""}));
- config.units.push_back(unit);
+ config.provisions.push_back(provision);
+ save(config);
- config::saveToJsonFile(PROVISION_FILE_PATH.string(), config);
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.start();
}
BOOST_CHECK(!fs::exists(mountSource));
@@ -103,35 +126,35 @@ BOOST_AUTO_TEST_CASE(FileTest)
{
//TODO: Test Fifo
const fs::path regularFile = fs::path("/opt/usr/data/ut-regular-file");
- const fs::path copyFile = PROVISION_FILE_PATH;
+ const fs::path copyFile = SOME_FILE_PATH;
- ZoneProvisioning config;
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::File({VSMFILE_DIRECTORY,
+ ZoneProvisioningConfig config;
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_DIRECTORY,
regularFile.parent_path().string(),
0,
0777}));
- config.units.push_back(unit);
+ config.provisions.push_back(provision);
- unit.set(ZoneProvisioning::File({VSMFILE_REGULAR,
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_REGULAR,
regularFile.string(),
O_CREAT,
0777}));
- config.units.push_back(unit);
+ config.provisions.push_back(provision);
- unit.set(ZoneProvisioning::File({VSMFILE_DIRECTORY,
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_DIRECTORY,
copyFile.parent_path().string(),
0,
0777}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::File({VSMFILE_REGULAR,
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_REGULAR,
copyFile.string(),
0,
0777}));
- config.units.push_back(unit);
- config::saveToJsonFile(PROVISION_FILE_PATH.string(), config);
+ config.provisions.push_back(provision);
+ save(config);
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.start();
BOOST_CHECK(fs::exists(ROOTFS_PATH / regularFile.parent_path()));
@@ -152,27 +175,27 @@ BOOST_AUTO_TEST_CASE(MountTest)
utils::ScopedDir provisionfs(mountSource.string());
- ZoneProvisioning config;
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::File({VSMFILE_DIRECTORY,
+ ZoneProvisioningConfig config;
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_DIRECTORY,
mountTarget.string(),
0,
0777}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::Mount({mountSource.string(),
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::Mount({mountSource.string(),
mountTarget.string(),
"",
MS_BIND,
""}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::File({VSMFILE_REGULAR,
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_REGULAR,
(mountTarget / sharedFile).string(),
O_CREAT,
0777}));
- config.units.push_back(unit);
- config::saveToJsonFile(PROVISION_FILE_PATH.string(), config);
+ config.provisions.push_back(provision);
+ save(config);
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.start();
BOOST_CHECK(fs::exists(ROOTFS_PATH / mountTarget));
@@ -184,17 +207,17 @@ BOOST_AUTO_TEST_CASE(MountTest)
BOOST_AUTO_TEST_CASE(LinkTest)
{
- const fs::path linkFile = fs::path("/ut-from-host-provision.conf");
+ const fs::path linkFile = fs::path("/ut-from-host-file.txt");
- ZoneProvisioning config;
- ZoneProvisioning::Unit unit;
+ ZoneProvisioningConfig config;
+ ZoneProvisioningConfig::Provision provision;
- unit.set(ZoneProvisioning::Link({PROVISION_FILE_PATH.string(),
+ provision.set(ZoneProvisioningConfig::Link({SOME_FILE_PATH.string(),
linkFile.string()}));
- config.units.push_back(unit);
- config::saveToJsonFile(PROVISION_FILE_PATH.string(), config);
+ config.provisions.push_back(provision);
+ save(config);
{
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.start();
BOOST_CHECK(!fs::exists(ROOTFS_PATH / linkFile));
@@ -202,7 +225,7 @@ BOOST_AUTO_TEST_CASE(LinkTest)
zoneProvision.stop();
}
{
- ZoneProvision zoneProvision(ZONE_PATH.string(), {"/tmp/"});
+ ZoneProvision zoneProvision = create({"/tmp/"});
zoneProvision.start();
BOOST_CHECK(fs::exists(ROOTFS_PATH / linkFile));
@@ -213,82 +236,81 @@ BOOST_AUTO_TEST_CASE(LinkTest)
BOOST_AUTO_TEST_CASE(DeclareFileTest)
{
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.declareFile(1, "path", 0747, 0777);
zoneProvision.declareFile(2, "path", 0747, 0777);
- ZoneProvisioning config;
- BOOST_REQUIRE_NO_THROW(loadFromJsonFile(PROVISION_FILE_PATH.string(), config));
- BOOST_REQUIRE_EQUAL(config.units.size(), 2);
- BOOST_REQUIRE(config.units[0].is());
- BOOST_REQUIRE(config.units[1].is());
- const ZoneProvisioning::File& unit = config.units[0].as();
- BOOST_CHECK_EQUAL(unit.type, 1);
- BOOST_CHECK_EQUAL(unit.path, "path");
- BOOST_CHECK_EQUAL(unit.flags, 0747);
- BOOST_CHECK_EQUAL(unit.mode, 0777);
+ ZoneProvisioningConfig config;
+ load(config);
+ BOOST_REQUIRE_EQUAL(config.provisions.size(), 2);
+ BOOST_REQUIRE(config.provisions[0].is());
+ BOOST_REQUIRE(config.provisions[1].is());
+ const ZoneProvisioningConfig::File& provision = config.provisions[0].as();
+ BOOST_CHECK_EQUAL(provision.type, 1);
+ BOOST_CHECK_EQUAL(provision.path, "path");
+ BOOST_CHECK_EQUAL(provision.flags, 0747);
+ BOOST_CHECK_EQUAL(provision.mode, 0777);
}
BOOST_AUTO_TEST_CASE(DeclareMountTest)
{
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.declareMount("/fake/path1", "/fake/path2", "tmpfs", 077, "fake");
zoneProvision.declareMount("/fake/path2", "/fake/path2", "tmpfs", 077, "fake");
- ZoneProvisioning config;
- BOOST_REQUIRE_NO_THROW(loadFromJsonFile(PROVISION_FILE_PATH.string(), config));
- BOOST_REQUIRE_EQUAL(config.units.size(), 2);
- BOOST_REQUIRE(config.units[0].is());
- BOOST_REQUIRE(config.units[1].is());
- const ZoneProvisioning::Mount& unit = config.units[0].as();
- BOOST_CHECK_EQUAL(unit.source, "/fake/path1");
- BOOST_CHECK_EQUAL(unit.target, "/fake/path2");
- BOOST_CHECK_EQUAL(unit.type, "tmpfs");
- BOOST_CHECK_EQUAL(unit.flags, 077);
- BOOST_CHECK_EQUAL(unit.data, "fake");
+ ZoneProvisioningConfig config;
+ load(config);
+ BOOST_REQUIRE_EQUAL(config.provisions.size(), 2);
+ BOOST_REQUIRE(config.provisions[0].is());
+ BOOST_REQUIRE(config.provisions[1].is());
+ const ZoneProvisioningConfig::Mount& provision = config.provisions[0].as();
+ BOOST_CHECK_EQUAL(provision.source, "/fake/path1");
+ BOOST_CHECK_EQUAL(provision.target, "/fake/path2");
+ BOOST_CHECK_EQUAL(provision.type, "tmpfs");
+ BOOST_CHECK_EQUAL(provision.flags, 077);
+ BOOST_CHECK_EQUAL(provision.data, "fake");
}
BOOST_AUTO_TEST_CASE(DeclareLinkTest)
{
- ZoneProvision zoneProvision(ZONE_PATH.string(), {});
+ ZoneProvision zoneProvision = create({});
zoneProvision.declareLink("/fake/path1", "/fake/path2");
zoneProvision.declareLink("/fake/path2", "/fake/path2");
- ZoneProvisioning config;
- BOOST_REQUIRE_NO_THROW(loadFromJsonFile(PROVISION_FILE_PATH.string(), config));
- BOOST_REQUIRE_EQUAL(config.units.size(), 2);
- BOOST_REQUIRE(config.units[0].is());
- BOOST_REQUIRE(config.units[1].is());
- const ZoneProvisioning::Link& unit = config.units[0].as();
- BOOST_CHECK_EQUAL(unit.source, "/fake/path1");
- BOOST_CHECK_EQUAL(unit.target, "/fake/path2");
+ ZoneProvisioningConfig config;
+ load(config);
+ BOOST_REQUIRE_EQUAL(config.provisions.size(), 2);
+ BOOST_REQUIRE(config.provisions[0].is());
+ BOOST_REQUIRE(config.provisions[1].is());
+ const ZoneProvisioningConfig::Link& provision = config.provisions[0].as();
+ BOOST_CHECK_EQUAL(provision.source, "/fake/path1");
+ BOOST_CHECK_EQUAL(provision.target, "/fake/path2");
}
BOOST_AUTO_TEST_CASE(ProvisionedAlreadyTest)
{
- const fs::path dir = fs::path("/opt/usr/data/ut-from-host-provision");
- const fs::path linkFile = fs::path("/ut-from-host-provision.conf");
+ const fs::path dir = fs::path("/opt/usr/data/ut-from-host");
+ const fs::path linkFile = fs::path("/ut-from-host-file.txt");
const fs::path regularFile = fs::path("/opt/usr/data/ut-regular-file");
- ZoneProvisioning config;
- ZoneProvisioning::Unit unit;
- unit.set(ZoneProvisioning::File({VSMFILE_DIRECTORY,
+ ZoneProvisioningConfig config;
+ ZoneProvisioningConfig::Provision provision;
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_DIRECTORY,
dir.string(),
0,
0777}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::Link({PROVISION_FILE_PATH.string(),
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::Link({SOME_FILE_PATH.string(),
linkFile.string()}));
- config.units.push_back(unit);
- unit.set(ZoneProvisioning::File({VSMFILE_REGULAR,
+ config.provisions.push_back(provision);
+ provision.set(ZoneProvisioningConfig::File({VSMFILE_REGULAR,
regularFile.string(),
O_CREAT,
0777}));
- config.units.push_back(unit);
-
- config::saveToJsonFile(PROVISION_FILE_PATH.string(), config);
+ config.provisions.push_back(provision);
+ save(config);
- ZoneProvision zoneProvision(ZONE_PATH.string(), {"/tmp/"});
+ ZoneProvision zoneProvision = create({"/tmp/"});
zoneProvision.start();
BOOST_CHECK(fs::exists(ROOTFS_PATH / dir));
diff --git a/tests/unit_tests/server/ut-zone.cpp b/tests/unit_tests/server/ut-zone.cpp
index 80e73da..783fbf8 100644
--- a/tests/unit_tests/server/ut-zone.cpp
+++ b/tests/unit_tests/server/ut-zone.cpp
@@ -51,6 +51,7 @@ const std::string BUGGY_CONFIG_PATH = VSM_TEST_CONFIG_INSTALL_DIR "/server/ut-zo
const std::string MISSING_CONFIG_PATH = "/this/is/a/missing/file/path/config.conf";
const std::string ZONES_PATH = "/tmp/ut-zones";
const std::string LXC_TEMPLATES_PATH = VSM_TEST_LXC_TEMPLATES_INSTALL_DIR;
+const std::string DB_PATH = ZONES_PATH + "/vasum.db";
struct Fixture {
utils::ScopedGlibLoop mLoop;
@@ -66,6 +67,7 @@ struct Fixture {
return std::unique_ptr(new Zone(utils::Worker::create(),
ZONES_PATH,
configPath,
+ DB_PATH,
LXC_TEMPLATES_PATH,
""));
}
--
2.7.4