utils.KillProcess: Use waitpid() to wait for child processes
[ganeti-local] / lib / ssconf.py
index 2189382..225f38c 100644 (file)
@@ -127,10 +127,12 @@ class SimpleStore(object):
   _VALID_KEYS = (
     constants.SS_CLUSTER_NAME,
     constants.SS_FILE_STORAGE_DIR,
+    constants.SS_MASTER_CANDIDATES,
     constants.SS_MASTER_IP,
     constants.SS_MASTER_NETDEV,
     constants.SS_MASTER_NODE,
     constants.SS_NODE_LIST,
+    constants.SS_OFFLINE_NODES,
     )
   _MAX_SIZE = 131072
 
@@ -171,6 +173,25 @@ class SimpleStore(object):
                                       " '%s'" % str(err))
     return data
 
+  def WriteFiles(self, values):
+    """Writes ssconf files used by external scripts.
+
+    @type values: dict
+    @param values: Dictionary of (name, value)
+
+    """
+    ssconf_lock = utils.FileLock(constants.SSCONF_LOCK_FILE)
+
+    # Get lock while writing files
+    ssconf_lock.Exclusive(blocking=True, timeout=SSCONF_LOCK_TIMEOUT)
+    try:
+      for name, value in values.iteritems():
+        if value and not value.endswith("\n"):
+          value += "\n"
+        utils.WriteFile(self.KeyToFilename(name), data=value)
+    finally:
+      ssconf_lock.Unlock()
+
   def GetFileList(self):
     """Return the list of all config files.
 
@@ -191,6 +212,14 @@ class SimpleStore(object):
     """
     return self._ReadFile(constants.SS_FILE_STORAGE_DIR)
 
+  def GetMasterCandidates(self):
+    """Return the list of master candidates.
+
+    """
+    data = self._ReadFile(constants.SS_MASTER_CANDIDATES)
+    nl = data.splitlines(False)
+    return nl
+
   def GetMasterIP(self):
     """Get the IP of the master node for this cluster.
 
@@ -218,33 +247,6 @@ class SimpleStore(object):
     return nl
 
 
-def _SsconfPath(name):
-  if not RE_VALID_SSCONF_NAME.match(name):
-    raise errors.ParameterError("Invalid ssconf name: %s" % name)
-  return "%s/ssconf_%s" % (constants.DATA_DIR, name)
-
-
-def WriteSsconfFiles(values):
-  """Writes legacy ssconf files to be used by external scripts.
-
-  @type values: dict
-  @param values: Dictionary of (name, value)
-
-  """
-  ssconf_lock = utils.FileLock(constants.SSCONF_LOCK_FILE)
-
-  # Get lock while writing files
-  ssconf_lock.Exclusive(blocking=True, timeout=SSCONF_LOCK_TIMEOUT)
-  try:
-    for name, value in values.iteritems():
-      if not value.endswith("\n"):
-        value += "\n"
-      utils.WriteFile(_SsconfPath(name),
-                      data=value)
-  finally:
-    ssconf_lock.Unlock()
-
-
 def GetMasterAndMyself(ss=None):
   """Get the master node and my own hostname.
 
@@ -254,6 +256,11 @@ def GetMasterAndMyself(ss=None):
   The function does not handle any errors, these should be handled in
   the caller (errors.ConfigurationError, errors.ResolverError).
 
+  @param ss: either a sstore.SimpleConfigReader or a
+      sstore.SimpleStore instance
+  @rtype: tuple
+  @return: a tuple (master node name, my own name)
+
   """
   if ss is None:
     ss = SimpleStore()