Infrastructure for specifying instance status change reason
[ganeti-local] / lib / vcluster.py
index bf25281..407c352 100644 (file)
@@ -32,10 +32,17 @@ import os
 from ganeti import compat
 
 
 from ganeti import compat
 
 
+ETC_HOSTS = "/etc/hosts"
+
 _VIRT_PATH_PREFIX = "/###-VIRTUAL-PATH-###,"
 _ROOTDIR_ENVNAME = "GANETI_ROOTDIR"
 _HOSTNAME_ENVNAME = "GANETI_HOSTNAME"
 
 _VIRT_PATH_PREFIX = "/###-VIRTUAL-PATH-###,"
 _ROOTDIR_ENVNAME = "GANETI_ROOTDIR"
 _HOSTNAME_ENVNAME = "GANETI_HOSTNAME"
 
+#: List of paths which shouldn't be virtualized
+_VPATH_WHITELIST = compat.UniqueFrozenset([
+  ETC_HOSTS,
+  ])
+
 
 def _GetRootDirectory(envname):
   """Retrieves root directory from an environment variable.
 
 def _GetRootDirectory(envname):
   """Retrieves root directory from an environment variable.
@@ -135,7 +142,7 @@ def GetVirtualHostname():
   return _VIRT_HOSTNAME
 
 
   return _VIRT_HOSTNAME
 
 
-def _MakeNodeRoot(base, node_name):
+def MakeNodeRoot(base, node_name):
   """Appends a node name to the base directory.
 
   """
   """Appends a node name to the base directory.
 
   """
@@ -155,7 +162,7 @@ def ExchangeNodeRoot(node_name, filename,
   """
   if _basedir:
     pure = _RemoveNodePrefix(filename, _noderoot=_noderoot)
   """
   if _basedir:
     pure = _RemoveNodePrefix(filename, _noderoot=_noderoot)
-    result = "%s/%s" % (_MakeNodeRoot(_basedir, node_name), pure)
+    result = "%s/%s" % (MakeNodeRoot(_basedir, node_name), pure)
   else:
     result = filename
 
   else:
     result = filename
 
@@ -168,7 +175,7 @@ def EnvironmentForHost(hostname, _basedir=_VIRT_BASEDIR):
   """
   if _basedir:
     return {
   """
   if _basedir:
     return {
-      _ROOTDIR_ENVNAME: _MakeNodeRoot(_basedir, hostname),
+      _ROOTDIR_ENVNAME: MakeNodeRoot(_basedir, hostname),
       _HOSTNAME_ENVNAME: hostname,
       }
   else:
       _HOSTNAME_ENVNAME: hostname,
       }
   else:
@@ -236,7 +243,7 @@ def MakeVirtualPath(path, _noderoot=_VIRT_NODEROOT):
   """
   assert os.path.isabs(path)
 
   """
   assert os.path.isabs(path)
 
-  if _noderoot:
+  if _noderoot and path not in _VPATH_WHITELIST:
     return _VIRT_PATH_PREFIX + _RemoveNodePrefix(path, _noderoot=_noderoot)
   else:
     return path
     return _VIRT_PATH_PREFIX + _RemoveNodePrefix(path, _noderoot=_noderoot)
   else:
     return path
@@ -252,7 +259,7 @@ def LocalizeVirtualPath(path, _noderoot=_VIRT_NODEROOT):
   """
   assert os.path.isabs(path)
 
   """
   assert os.path.isabs(path)
 
-  if _noderoot:
+  if _noderoot and path not in _VPATH_WHITELIST:
     if path.startswith(_VIRT_PATH_PREFIX):
       return AddNodePrefix(path[len(_VIRT_PATH_PREFIX):], _noderoot=_noderoot)
     else:
     if path.startswith(_VIRT_PATH_PREFIX):
       return AddNodePrefix(path[len(_VIRT_PATH_PREFIX):], _noderoot=_noderoot)
     else: