export: add meaningful exit code
[ganeti-local] / lib / ssconf.py
index 2189382..19a95c9 100644 (file)
@@ -126,11 +126,17 @@ class SimpleStore(object):
   _SS_FILEPREFIX = "ssconf_"
   _VALID_KEYS = (
     constants.SS_CLUSTER_NAME,
+    constants.SS_CLUSTER_TAGS,
     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,
+    constants.SS_ONLINE_NODES,
+    constants.SS_INSTANCE_LIST,
+    constants.SS_RELEASE_VERSION,
     )
   _MAX_SIZE = 131072
 
@@ -171,6 +177,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, mode=0444)
+    finally:
+      ssconf_lock.Unlock()
+
   def GetFileList(self):
     """Return the list of all config files.
 
@@ -191,6 +216,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.
 
@@ -217,32 +250,13 @@ class SimpleStore(object):
     nl = data.splitlines(False)
     return nl
 
+  def GetClusterTags(self):
+    """Return the cluster tags.
 
-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()
+    """
+    data = self._ReadFile(constants.SS_CLUSTER_TAGS)
+    nl = data.splitlines(False)
+    return nl
 
 
 def GetMasterAndMyself(ss=None):
@@ -254,6 +268,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()