28 |
28 |
import shutil
|
29 |
29 |
import errno
|
30 |
30 |
import itertools
|
|
31 |
import random
|
31 |
32 |
|
32 |
33 |
from ganeti import constants
|
33 |
34 |
from ganeti import utils
|
... | ... | |
36 |
37 |
from ganeti import opcodes
|
37 |
38 |
from ganeti import compat
|
38 |
39 |
from ganeti import mcpu
|
|
40 |
from ganeti import query
|
39 |
41 |
|
40 |
42 |
import testutils
|
41 |
43 |
|
... | ... | |
1887 |
1889 |
self.assertEqual(self.jdm._waiters, {
|
1888 |
1890 |
job_id: set([job]),
|
1889 |
1891 |
})
|
|
1892 |
self.assertEqual(self.jdm.GetLockInfo([query.LQ_PENDING]), [
|
|
1893 |
("job/28625", None, None, [("job", [job.id])])
|
|
1894 |
])
|
1890 |
1895 |
|
1891 |
1896 |
self._status.append((job_id, constants.JOB_STATUS_CANCELED))
|
1892 |
1897 |
(result, _) = self.jdm.CheckAndRegister(job, job_id, [])
|
... | ... | |
1894 |
1899 |
self.assertFalse(self._status)
|
1895 |
1900 |
self.assertFalse(self._queue)
|
1896 |
1901 |
self.assertFalse(self.jdm.JobWaiting(job))
|
|
1902 |
self.assertFalse(self.jdm.GetLockInfo([query.LQ_PENDING]))
|
1897 |
1903 |
|
1898 |
1904 |
def testRequireCancel(self):
|
1899 |
1905 |
job = self._FakeJob(5278)
|
... | ... | |
1909 |
1915 |
self.assertEqual(self.jdm._waiters, {
|
1910 |
1916 |
job_id: set([job]),
|
1911 |
1917 |
})
|
|
1918 |
self.assertEqual(self.jdm.GetLockInfo([query.LQ_PENDING]), [
|
|
1919 |
("job/9610", None, None, [("job", [job.id])])
|
|
1920 |
])
|
1912 |
1921 |
|
1913 |
1922 |
self._status.append((job_id, constants.JOB_STATUS_CANCELED))
|
1914 |
1923 |
(result, _) = self.jdm.CheckAndRegister(job, job_id, dep_status)
|
... | ... | |
1916 |
1925 |
self.assertFalse(self._status)
|
1917 |
1926 |
self.assertFalse(self._queue)
|
1918 |
1927 |
self.assertFalse(self.jdm.JobWaiting(job))
|
|
1928 |
self.assertFalse(self.jdm.GetLockInfo([query.LQ_PENDING]))
|
1919 |
1929 |
|
1920 |
1930 |
def testRequireError(self):
|
1921 |
1931 |
job = self._FakeJob(21459)
|
... | ... | |
1938 |
1948 |
self.assertFalse(self._status)
|
1939 |
1949 |
self.assertFalse(self._queue)
|
1940 |
1950 |
self.assertFalse(self.jdm.JobWaiting(job))
|
|
1951 |
self.assertFalse(self.jdm.GetLockInfo([query.LQ_PENDING]))
|
1941 |
1952 |
|
1942 |
1953 |
def testRequireMultiple(self):
|
1943 |
1954 |
dep_status = list(constants.JOBS_FINALIZED)
|
... | ... | |
1955 |
1966 |
self.assertEqual(self.jdm._waiters, {
|
1956 |
1967 |
job_id: set([job]),
|
1957 |
1968 |
})
|
|
1969 |
self.assertEqual(self.jdm.GetLockInfo([query.LQ_PENDING]), [
|
|
1970 |
("job/14609", None, None, [("job", [job.id])])
|
|
1971 |
])
|
1958 |
1972 |
|
1959 |
1973 |
self._status.append((job_id, end_status))
|
1960 |
1974 |
(result, _) = self.jdm.CheckAndRegister(job, job_id, dep_status)
|
... | ... | |
1962 |
1976 |
self.assertFalse(self._status)
|
1963 |
1977 |
self.assertFalse(self._queue)
|
1964 |
1978 |
self.assertFalse(self.jdm.JobWaiting(job))
|
|
1979 |
self.assertFalse(self.jdm.GetLockInfo([query.LQ_PENDING]))
|
1965 |
1980 |
|
1966 |
1981 |
def testNotify(self):
|
1967 |
1982 |
job = self._FakeJob(8227)
|
... | ... | |
2050 |
2065 |
self.assertFalse(self._status)
|
2051 |
2066 |
self.assertFalse(self._queue)
|
2052 |
2067 |
|
|
2068 |
def testMultipleWaiting(self):
|
|
2069 |
# Use a deterministic random generator
|
|
2070 |
rnd = random.Random(21402)
|
|
2071 |
|
|
2072 |
job_ids = map(str, rnd.sample(range(1, 10000), 150))
|
|
2073 |
|
|
2074 |
waiters = dict((job_ids.pop(),
|
|
2075 |
set(map(self._FakeJob,
|
|
2076 |
[job_ids.pop()
|
|
2077 |
for _ in range(rnd.randint(1, 20))])))
|
|
2078 |
for _ in range(10))
|
|
2079 |
|
|
2080 |
# Ensure there are no duplicate job IDs
|
|
2081 |
assert not utils.FindDuplicates(waiters.keys() +
|
|
2082 |
[job.id
|
|
2083 |
for jobs in waiters.values()
|
|
2084 |
for job in jobs])
|
|
2085 |
|
|
2086 |
# Register all jobs as waiters
|
|
2087 |
for job_id, job in [(job_id, job)
|
|
2088 |
for (job_id, jobs) in waiters.items()
|
|
2089 |
for job in jobs]:
|
|
2090 |
self._status.append((job_id, constants.JOB_STATUS_QUEUED))
|
|
2091 |
(result, _) = self.jdm.CheckAndRegister(job, job_id,
|
|
2092 |
[constants.JOB_STATUS_SUCCESS])
|
|
2093 |
self.assertEqual(result, self.jdm.WAIT)
|
|
2094 |
self.assertFalse(self._status)
|
|
2095 |
self.assertFalse(self._queue)
|
|
2096 |
self.assertTrue(self.jdm.JobWaiting(job))
|
|
2097 |
|
|
2098 |
self.assertEqual(self.jdm._waiters, waiters)
|
|
2099 |
|
|
2100 |
def _MakeSet((name, mode, owner_names, pending)):
|
|
2101 |
return (name, mode, owner_names,
|
|
2102 |
[(pendmode, set(pend)) for (pendmode, pend) in pending])
|
|
2103 |
|
|
2104 |
def _CheckLockInfo():
|
|
2105 |
info = self.jdm.GetLockInfo([query.LQ_PENDING])
|
|
2106 |
self.assertEqual(sorted(map(_MakeSet, info)), sorted([
|
|
2107 |
("job/%s" % job_id, None, None,
|
|
2108 |
[("job", set([job.id for job in jobs]))])
|
|
2109 |
for job_id, jobs in waiters.items()
|
|
2110 |
if jobs
|
|
2111 |
]))
|
|
2112 |
|
|
2113 |
_CheckLockInfo()
|
|
2114 |
|
|
2115 |
# Notify in random order
|
|
2116 |
for job_id in rnd.sample(waiters, len(waiters)):
|
|
2117 |
# Remove from pending waiter list
|
|
2118 |
jobs = waiters.pop(job_id)
|
|
2119 |
for job in jobs:
|
|
2120 |
self._status.append((job_id, constants.JOB_STATUS_SUCCESS))
|
|
2121 |
(result, _) = self.jdm.CheckAndRegister(job, job_id,
|
|
2122 |
[constants.JOB_STATUS_SUCCESS])
|
|
2123 |
self.assertEqual(result, self.jdm.CONTINUE)
|
|
2124 |
self.assertFalse(self._status)
|
|
2125 |
self.assertFalse(self._queue)
|
|
2126 |
self.assertFalse(self.jdm.JobWaiting(job))
|
|
2127 |
|
|
2128 |
_CheckLockInfo()
|
|
2129 |
|
|
2130 |
self.assertFalse(self.jdm.GetLockInfo([query.LQ_PENDING]))
|
|
2131 |
|
|
2132 |
assert not waiters
|
|
2133 |
|
2053 |
2134 |
def testSelfDependency(self):
|
2054 |
2135 |
job = self._FakeJob(18937)
|
2055 |
2136 |
|
... | ... | |
2068 |
2149 |
(result, _) = jdm.CheckAndRegister(job, job_id, [])
|
2069 |
2150 |
self.assertEqual(result, self.jdm.ERROR)
|
2070 |
2151 |
self.assertFalse(jdm.JobWaiting(job))
|
|
2152 |
self.assertFalse(jdm.GetLockInfo([query.LQ_PENDING]))
|
2071 |
2153 |
|
2072 |
2154 |
|
2073 |
2155 |
if __name__ == "__main__":
|