+ raise errors.OpExecError("Node daemon on %s didn't answer queries within"
+ " %s seconds" % (node_name, _DAEMON_READY_TIMEOUT))
+
+
+def _WaitForMasterDaemon():
+ """Wait for master daemon to become responsive.
+
+ """
+ def _CheckMasterDaemon():
+ try:
+ cl = luxi.Client()
+ (cluster_name, ) = cl.QueryConfigValues(["cluster_name"])
+ except Exception:
+ raise utils.RetryAgain()
+
+ logging.debug("Received cluster name %s from master", cluster_name)
+
+ try:
+ utils.Retry(_CheckMasterDaemon, 1.0, _DAEMON_READY_TIMEOUT)
+ except utils.RetryTimeout:
+ raise errors.OpExecError("Master daemon didn't answer queries within"
+ " %s seconds" % _DAEMON_READY_TIMEOUT)
+
+
+def _InitFileStorage(file_storage_dir):
+ """Initialize if needed the file storage.
+
+ @param file_storage_dir: the user-supplied value
+ @return: either empty string (if file storage was disabled at build
+ time) or the normalized path to the storage directory
+
+ """
+ if not constants.ENABLE_FILE_STORAGE:
+ return ""
+
+ file_storage_dir = os.path.normpath(file_storage_dir)
+
+ if not os.path.isabs(file_storage_dir):
+ raise errors.OpPrereqError("The file storage directory you passed is"
+ " not an absolute path.", errors.ECODE_INVAL)
+
+ if not os.path.exists(file_storage_dir):
+ try:
+ os.makedirs(file_storage_dir, 0750)
+ except OSError, err:
+ raise errors.OpPrereqError("Cannot create file storage directory"
+ " '%s': %s" % (file_storage_dir, err),
+ errors.ECODE_ENVIRON)
+
+ if not os.path.isdir(file_storage_dir):
+ raise errors.OpPrereqError("The file storage directory '%s' is not"
+ " a directory." % file_storage_dir,
+ errors.ECODE_ENVIRON)
+ return file_storage_dir