Remove XEN_CMD from constants, adjust to PowercycleNode
[ganeti-local] / lib / hypervisor / hv_lxc.py
index d7deee8..819df79 100644 (file)
@@ -1,7 +1,7 @@
 #
 #
 
 #
 #
 
-# Copyright (C) 2010 Google Inc.
+# Copyright (C) 2010, 2013 Google Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -149,25 +149,27 @@ class LXCHypervisor(hv_base.BaseHypervisor):
     cgroup = cls._GetCgroupMountPoint()
     try:
       memory = int(utils.ReadFile(utils.PathJoin(cgroup, 'lxc',
     cgroup = cls._GetCgroupMountPoint()
     try:
       memory = int(utils.ReadFile(utils.PathJoin(cgroup, 'lxc',
-                                           instance_name,
-                                           "memory.limit_in_bytes")))
+                                                 instance_name,
+                                                 "memory.limit_in_bytes")))
     except EnvironmentError:
       # memory resource controller may be disabled, ignore
       memory = 0
 
     return memory
 
     except EnvironmentError:
       # memory resource controller may be disabled, ignore
       memory = 0
 
     return memory
 
-  def ListInstances(self):
+  def ListInstances(self, hvparams=None):
     """Get the list of running instances.
 
     """
     """Get the list of running instances.
 
     """
-    return [ iinfo[0] for iinfo in self.GetAllInstancesInfo() ]
+    return [iinfo[0] for iinfo in self.GetAllInstancesInfo()]
 
 
-  def GetInstanceInfo(self, instance_name):
+  def GetInstanceInfo(self, instance_name, hvparams=None):
     """Get instance properties.
 
     @type instance_name: string
     @param instance_name: the instance name
     """Get instance properties.
 
     @type instance_name: string
     @param instance_name: the instance name
+    @type hvparams: dict of strings
+    @param hvparams: hvparams to be used with this instance
     @rtype: tuple of strings
     @return: (name, id, memory, vcpus, stat, times)
 
     @rtype: tuple of strings
     @return: (name, id, memory, vcpus, stat, times)
 
@@ -189,9 +191,11 @@ class LXCHypervisor(hv_base.BaseHypervisor):
     memory = self._GetCgroupMemoryLimit(instance_name) / (1024 ** 2)
     return (instance_name, 0, memory, len(cpu_list), 0, 0)
 
     memory = self._GetCgroupMemoryLimit(instance_name) / (1024 ** 2)
     return (instance_name, 0, memory, len(cpu_list), 0, 0)
 
-  def GetAllInstancesInfo(self):
+  def GetAllInstancesInfo(self, hvparams=None):
     """Get properties of all instances.
 
     """Get properties of all instances.
 
+    @type hvparams: dict of strings
+    @param hvparams: hypervisor parameter
     @return: [(name, id, memory, vcpus, stat, times),...]
 
     """
     @return: [(name, id, memory, vcpus, stat, times),...]
 
     """
@@ -249,12 +253,12 @@ class LXCHypervisor(hv_base.BaseHypervisor):
     # Conditionally enable, memory resource controller might be disabled
     cgroup = self._GetCgroupMountPoint()
     if os.path.exists(utils.PathJoin(cgroup, 'memory.limit_in_bytes')):
     # Conditionally enable, memory resource controller might be disabled
     cgroup = self._GetCgroupMountPoint()
     if os.path.exists(utils.PathJoin(cgroup, 'memory.limit_in_bytes')):
-        out.append("lxc.cgroup.memory.limit_in_bytes = %dM" %
-                    instance.beparams[constants.BE_MAXMEM])
+      out.append("lxc.cgroup.memory.limit_in_bytes = %dM" %
+                 instance.beparams[constants.BE_MAXMEM])
 
     if os.path.exists(utils.PathJoin(cgroup, 'memory.memsw.limit_in_bytes')):
 
     if os.path.exists(utils.PathJoin(cgroup, 'memory.memsw.limit_in_bytes')):
-        out.append("lxc.cgroup.memory.memsw.limit_in_bytes = %dM" %
-                    instance.beparams[constants.BE_MAXMEM])
+      out.append("lxc.cgroup.memory.memsw.limit_in_bytes = %dM" %
+                 instance.beparams[constants.BE_MAXMEM])
 
     # Device control
     # deny direct device access
 
     # Device control
     # deny direct device access
@@ -355,7 +359,7 @@ class LXCHypervisor(hv_base.BaseHypervisor):
                         result.output)
 
     if not os.path.ismount(root_dir):
                         result.output)
 
     if not os.path.ismount(root_dir):
-        return
+      return
 
     for mpath in self._GetMountSubdirs(root_dir):
       result = utils.RunCmd(["umount", mpath])
 
     for mpath in self._GetMountSubdirs(root_dir):
       result = utils.RunCmd(["umount", mpath])
@@ -393,11 +397,14 @@ class LXCHypervisor(hv_base.BaseHypervisor):
     # Currently lxc instances don't have memory limits
     pass
 
     # Currently lxc instances don't have memory limits
     pass
 
-  def GetNodeInfo(self):
+  def GetNodeInfo(self, hvparams=None):
     """Return information about the node.
 
     This is just a wrapper over the base GetLinuxNodeInfo method.
 
     """Return information about the node.
 
     This is just a wrapper over the base GetLinuxNodeInfo method.
 
+    @type hvparams: dict of strings
+    @param hvparams: hypervisor parameters, not used in this class
+
     @return: a dict with the following keys (values in MiB):
           - memory_total: the total memory size on the node
           - memory_free: the available memory on the node for instances
     @return: a dict with the following keys (values in MiB):
           - memory_total: the total memory size on the node
           - memory_free: the available memory on the node for instances
@@ -417,23 +424,37 @@ class LXCHypervisor(hv_base.BaseHypervisor):
                                    user=constants.SSH_CONSOLE_USER,
                                    command=["lxc-console", "-n", instance.name])
 
                                    user=constants.SSH_CONSOLE_USER,
                                    command=["lxc-console", "-n", instance.name])
 
-  def Verify(self):
+  def Verify(self, hvparams=None):
     """Verify the hypervisor.
 
     For the LXC manager, it just checks the existence of the base dir.
 
     """Verify the hypervisor.
 
     For the LXC manager, it just checks the existence of the base dir.
 
+    @type hvparams: dict of strings
+    @param hvparams: hypervisor parameters to be verified against; not used here
+
     @return: Problem description if something is wrong, C{None} otherwise
 
     """
     @return: Problem description if something is wrong, C{None} otherwise
 
     """
-    if os.path.exists(self._ROOT_DIR):
-      return None
-    else:
-      return "The required directory '%s' does not exist" % self._ROOT_DIR
+    msgs = []
+
+    if not os.path.exists(self._ROOT_DIR):
+      msgs.append("The required directory '%s' does not exist" %
+                  self._ROOT_DIR)
+
+    try:
+      self._GetCgroupMountPoint()
+    except errors.HypervisorError, err:
+      msgs.append(str(err))
+
+    return self._FormatVerifyResults(msgs)
 
   @classmethod
 
   @classmethod
-  def PowercycleNode(cls):
+  def PowercycleNode(cls, hvparams=None):
     """LXC powercycle, just a wrapper over Linux powercycle.
 
     """LXC powercycle, just a wrapper over Linux powercycle.
 
+    @type hvparams: dict of strings
+    @param hvparams: hypervisor params to be used on this node
+
     """
     cls.LinuxPowercycle()
 
     """
     cls.LinuxPowercycle()