Revision fcb21ad7 test/ganeti.jqueue_unittest.py
b/test/ganeti.jqueue_unittest.py | ||
---|---|---|
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__": |
Also available in: Unified diff