+ _WaitForNodeDaemon(master_name)
+
+
+def _WaitForNodeDaemon(node_name):
+ """Wait for node daemon to become responsive.
+
+ """
+ def _CheckNodeDaemon():
+ result = rpc.RpcRunner.call_version([node_name])[node_name]
+ if result.fail_msg:
+ raise utils.RetryAgain()
+
+ try:
+ utils.Retry(_CheckNodeDaemon, 1.0, _DAEMON_READY_TIMEOUT)
+ except utils.RetryTimeout:
+ 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
+
+ """
+ file_storage_dir = os.path.normpath(file_storage_dir)
+
+ if not os.path.isabs(file_storage_dir):
+ raise errors.OpPrereqError("File storage directory '%s' is not an absolute"
+ " path" % file_storage_dir, 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)