Rename all not associated with LXC stuff.
[platform/core/security/vasum.git] / server / zone-admin.cpp
index c5e994d..473a11c 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "zone-admin.hpp"
 #include "exception.hpp"
+#include "netdev.hpp"
 
 #include "logger/logger.hpp"
 #include "utils/paths.hpp"
 
 #include <cassert>
 #include <climits>
+#include <thread>
+#include <chrono>
 
 
 namespace vasum {
 
-namespace {
-
-// TODO: this should be in zone's configuration file
-const int SHUTDOWN_WAIT = 10;
-
-} // namespace
-
 const std::uint64_t DEFAULT_CPU_SHARES = 1024;
 const std::uint64_t DEFAULT_VCPU_PERIOD_MS = 100000;
 
 ZoneAdmin::ZoneAdmin(const std::string& zoneId,
                      const std::string& zonesPath,
-                     const std::string& lxcTemplatePrefix,
+                     const std::string& zoneTemplatePrefix,
                      const ZoneConfig& config,
                      const ZoneDynamicConfig& dynamicConfig)
     : mConfig(config),
+      mDynamicConfig(dynamicConfig),
       mZone(zonesPath, zoneId),
       mId(zoneId),
       mDetachOnExit(false),
@@ -63,9 +60,9 @@ ZoneAdmin::ZoneAdmin(const std::string& zoneId,
 
     if (!mZone.isDefined()) {
 
-        const std::string lxcTemplate = utils::getAbsolutePath(config.lxcTemplate,
-                                                               lxcTemplatePrefix);
-        LOGI(mId << ": Creating zone from template: " << lxcTemplate);
+        const std::string zoneTemplate = utils::getAbsolutePath(config.zoneTemplate,
+                                                               zoneTemplatePrefix);
+        LOGI(mId << ": Creating zone from template: " << zoneTemplate);
         utils::CStringArrayBuilder args;
         if (!dynamicConfig.ipv4Gateway.empty()) {
             args.add("--ipv4-gateway");
@@ -80,7 +77,7 @@ ZoneAdmin::ZoneAdmin(const std::string& zoneId,
             args.add("--vt");
             args.add(vt.c_str());
         }
-        if (!mZone.create(lxcTemplate, args.c_array())) {
+        if (!mZone.create(zoneTemplate, args.c_array())) {
             throw ZoneOperationException("Could not create zone");
         }
     }
@@ -137,6 +134,16 @@ void ZoneAdmin::start()
         throw ZoneOperationException("Could not start zone");
     }
 
+    // Wait until the full platform launch with graphical stack.
+    // VT should be activated by a graphical stack.
+    // If we do it with 'zoneToFocus.activateVT' before starting the graphical stack,
+    // graphical stack initialization failed and we finally switch to the black screen.
+    // Skip waiting when graphical stack is not running (unit tests).
+    if (mDynamicConfig.vt > 0) {
+        // TODO, timeout is a temporary solution
+        std::this_thread::sleep_for(std::chrono::milliseconds(4000));
+    }
+
     LOGD(mId << ": Started");
 }
 
@@ -149,7 +156,7 @@ void ZoneAdmin::stop()
         return;
     }
 
-    if (!mZone.shutdown(SHUTDOWN_WAIT)) {
+    if (!mZone.shutdown(mConfig.shutdownTimeout)) {
         // force stop
         if (!mZone.stop()) {
             throw ZoneOperationException("Could not stop zone");
@@ -270,22 +277,47 @@ std::int64_t ZoneAdmin::getSchedulerQuota()
     return std::stoll(ret);
 }
 
-void ZoneAdmin::createNetdevVeth(const std::string& /* zoneDev */,
-                                 const std::string& /* hostDev */)
+void ZoneAdmin::createNetdevVeth(const std::string& zoneDev,
+                                 const std::string& hostDev)
+{
+    netdev::createVeth(mZone.getInitPid(), zoneDev, hostDev);
+}
+
+void ZoneAdmin::createNetdevMacvlan(const std::string& zoneDev,
+                                    const std::string& hostDev,
+                                    const uint32_t& mode)
+{
+    netdev::createMacvlan(mZone.getInitPid(), zoneDev, hostDev, static_cast<macvlan_mode>(mode));
+}
+
+void ZoneAdmin::moveNetdev(const std::string& devId)
+{
+    netdev::movePhys(mZone.getInitPid(), devId);
+}
+
+void ZoneAdmin::destroyNetdev(const std::string& devId)
+{
+    netdev::destroyNetdev(devId, mZone.getInitPid());
+}
+
+void ZoneAdmin::setNetdevAttrs(const std::string& netdev, const NetdevAttrs& attrs)
+{
+    netdev::setAttrs(mZone.getInitPid(), netdev, attrs);
+}
+
+ZoneAdmin::NetdevAttrs ZoneAdmin::getNetdevAttrs(const std::string& netdev)
 {
-    throw ZoneOperationException("Not implemented");
+    return netdev::getAttrs(mZone.getInitPid(), netdev);
 }
 
-void ZoneAdmin::createNetdevMacvlan(const std::string& /* zoneDev */,
-                                    const std::string& /* hostDev */,
-                                    const uint32_t& /* mode */)
+std::vector<std::string> ZoneAdmin::getNetdevList()
 {
-    throw ZoneOperationException("Not implemented");
+    return netdev::listNetdev(mZone.getInitPid());
 }
 
-void ZoneAdmin::moveNetdev(const std::string& /* devId */)
+void ZoneAdmin::deleteNetdevIpAddress(const std::string& netdev, const std::string& ip)
 {
-    throw ZoneOperationException("Not implemented");
+    netdev::deleteIpAddress(mZone.getInitPid(), netdev, ip);
 }
 
 } // namespace vasum