diff --git a/lib/constants.py b/lib/constants.py
index 38a329119183718a2dafbcf5c85a6b9751f25e5b..91ce86ba99db540dd34e9618670bd6de345c15ec 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -279,6 +279,7 @@ EXIT_NOTCLUSTER = 5
 EXIT_NOTMASTER = 11
 EXIT_NODESETUP_ERROR = 12
 EXIT_CONFIRMATION = 13 # need user confirmation
+EXIT_NOTCANDIDATE = 14
 
 # tags
 TAG_CLUSTER = "cluster"
diff --git a/lib/ssconf.py b/lib/ssconf.py
index 874b208bfedf2ebcfa1c2ca01f9fc4050f0a219d..8ee84c112a7ae9da85f72b15350cb932100f6302 100644
--- a/lib/ssconf.py
+++ b/lib/ssconf.py
@@ -290,3 +290,29 @@ def CheckMaster(debug, ss=None):
     if debug:
       sys.stderr.write("Not master, exiting.\n")
     sys.exit(constants.EXIT_NOTMASTER)
+
+
+def CheckMasterCandidate(debug, ss=None):
+  """Checks the node setup.
+
+  If this is a master candidate, the function will return. Otherwise it will
+  exit with an exit code based on the node status.
+
+  """
+  try:
+    if ss is None:
+      ss = SimpleStore()
+    myself = utils.HostInfo().name
+    candidates = ss.GetMasterCandidates()
+  except errors.ConfigurationError, err:
+    print "Cluster configuration incomplete: '%s'" % str(err)
+    sys.exit(constants.EXIT_NODESETUP_ERROR)
+  except errors.ResolverError, err:
+    sys.stderr.write("Cannot resolve my own name (%s)\n" % err.args[0])
+    sys.exit(constants.EXIT_NODESETUP_ERROR)
+
+  if myself not in candidates:
+    if debug:
+      sys.stderr.write("Not master candidate, exiting.\n")
+    sys.exit(constants.EXIT_NOTCANDIDATE)
+