from ganeti import compat
from ganeti import pathutils
from ganeti import vcluster
+from ganeti import ht
_BOOT_ID_PATH = "/proc/sys/kernel/random/boot_id"
lock = None
+def SetWatcherPause(until, _filename=pathutils.WATCHER_PAUSEFILE):
+ """Creates or removes the watcher pause file.
+
+ @type until: None or number
+ @param until: Unix timestamp saying until when the watcher shouldn't run
+
+ """
+ if until is None:
+ logging.info("Received request to no longer pause watcher")
+ utils.RemoveFile(_filename)
+ else:
+ logging.info("Received request to pause watcher until %s", until)
+
+ if not ht.TNumber(until):
+ _Fail("Duration must be numeric")
+
+ utils.WriteFile(_filename, data="%d\n" % (until, ), mode=0644)
+
+
class HooksRunner(object):
"""Hook runner.
("hvname", None, "Hypervisor name"),
("hvfull", None, "Parameters to be validated"),
], None, None, "Validate hypervisor params"),
+ ("set_watcher_pause", MULTI, None, constants.RPC_TMO_URGENT, [
+ ("until", None, None),
+ ], None, None, "Set watcher pause end"),
]
CALLS = {
(values,) = params
return ssconf.WriteSsconfFiles(values)
+ @staticmethod
+ def perspective_set_watcher_pause(params):
+ """Set watcher pause.
+
+ """
+ (until, ) = params
+ return backend.SetWatcherPause(until)
+
# os -----------------------
@staticmethod
self.fail("Did not raise exception")
+class TestSetWatcherPause(unittest.TestCase):
+ def setUp(self):
+ self.tmpdir = tempfile.mkdtemp()
+ self.filename = utils.PathJoin(self.tmpdir, "pause")
+
+ def tearDown(self):
+ shutil.rmtree(self.tmpdir)
+
+ def testUnsetNonExisting(self):
+ self.assertFalse(os.path.exists(self.filename))
+ backend.SetWatcherPause(None, _filename=self.filename)
+ self.assertFalse(os.path.exists(self.filename))
+
+ def testSetNonNumeric(self):
+ for i in ["", [], {}, "Hello World", "0", "1.0"]:
+ self.assertFalse(os.path.exists(self.filename))
+
+ try:
+ backend.SetWatcherPause(i, _filename=self.filename)
+ except backend.RPCFail, err:
+ self.assertEqual(str(err), "Duration must be numeric")
+ else:
+ self.fail("Did not raise exception")
+
+ self.assertFalse(os.path.exists(self.filename))
+
+ def testSet(self):
+ self.assertFalse(os.path.exists(self.filename))
+
+ for i in range(10):
+ backend.SetWatcherPause(i, _filename=self.filename)
+ self.assertEqual(utils.ReadFile(self.filename), "%s\n" % i)
+ self.assertEqual(os.stat(self.filename).st_mode & 0777, 0644)
+
+
if __name__ == "__main__":
testutils.GanetiTestProgram()