squashed to keep the history more readable
commit b4383d81f48f9c58cb53119cb453034c5676657f
Author: Mike McLean <mikem@redhat.com>
Date: Fri Jun 21 09:03:07 2024 -0400
unit tests
commit 151b6ea053fc2e93b104fb3f01749602401fa0ee
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 17:55:35 2024 -0400
unit tests and fixes
commit 15457499665a0c0e0e45b17d19c6d07b6f681ca8
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 17:14:01 2024 -0400
use tag name in waitrepo task for readability
commit a20a21d39d2cb96b02046788de77aa33a7cbc906
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 17:00:45 2024 -0400
cleanup
commit a0058fce436a39de5cde6f11788ca4aaaa3553c0
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 16:44:22 2024 -0400
better approach to repo lookup from task id
commit 057527d71318d4494d80a2f24510e82ac9bc33f8
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 10:42:08 2024 -0400
support priority for requests
commit 882eaf2c4349e6f75db055fa36c80d66ab40526f
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 18 10:16:44 2024 -0400
track user for request
commit 273739e2f43170d80dae9e3796185230fae0607e
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 15:37:16 2024 -0400
update additional fields in repo_done_hook
commit d0a886eb161468675720549ad8a31921cd5c3647
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 15:14:38 2024 -0400
simplify updateRepos
commit 2a3ab6839299dd507835804e6326d93f08aa4040
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 15:03:39 2024 -0400
kojira: adjust cleanup of self.repos
commit dfc5934423b7f8f129ac9c737cc21d1798b33c2d
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 14:03:57 2024 -0400
docs updates
commit 4c5d4c2b50b11844d5dd6c8295b33bcc4453928b
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 09:18:10 2024 -0400
Apply repo_lifetime to custom repos even if current
commit 2b2d63a771244358f4a7d77766374448343d2c4c
Author: Mike McLean <mikem@redhat.com>
Date: Mon Jun 17 09:36:50 2024 -0400
fix migration script
commit 447a3f47270a324463a335d19b8e2c657a99ee9b
Author: Tomas Kopecek <tkopecek@redhat.com>
Date: Fri Jun 7 11:32:14 2024 +0200
migration script
commit f73bbe88eea7caf31c908fdaa5231e39d0f0d0a8
Author: Mike McLean <mikem@redhat.com>
Date: Fri Jun 14 15:30:24 2024 -0400
clean up some TODO items
commit 836c89131d2b125c2761cfbd3917473504d459e4
Author: Mike McLean <mikem@redhat.com>
Date: Fri Jun 14 11:43:13 2024 -0400
update unit tests
commit 4822ec580b96ae63778b71cee2127364bc31d258
Author: Mike McLean <mikem@redhat.com>
Date: Fri Jun 14 11:17:24 2024 -0400
streamline simple case for tag_first/last_change_event
commit 3474384c56a8a2e60288279b459000f3b9c54968
Author: Mike McLean <mikem@redhat.com>
Date: Tue Jun 11 16:11:55 2024 -0400
backwards compatible age checks in kojira
commit e796db0bdc6e70b489179bcddaa899855d64b706
Author: Mike McLean <mikem@redhat.com>
Date: Fri Jun 14 11:49:37 2024 -0400
repowatch unit test fixes
commit 7f17eb741502ab5417f70413f699c99e140f380d
Author: Mike McLean <mikem@redhat.com>
Date: Thu Jun 6 21:35:11 2024 -0400
adjust watch output; die if request fails
commit a0318c44576d6acab459f623c8ff0ab6961bd6b4
Author: Mike McLean <mikem@redhat.com>
Date: Thu Jun 6 20:45:56 2024 -0400
handle problem repos
commit d90ca6f9d41a39da86089a0fad7afdb649fd680b
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 30 22:43:56 2024 -0400
fix typos
commit 29830d1b8125664ddeae5ccb7e6b6e53260cdc47
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 30 16:57:48 2024 -0400
clarify --wait-repo help text
commit 43db92302643b67e7f6f419424d6813e5dca53f3
Author: Mike McLean <mikem@redhat.com>
Date: Tue May 21 17:32:44 2024 -0400
unit tests
commit 27f979fbccc5a286fba9caeec16ca7092fa79813
Author: Mike McLean <mikem@redhat.com>
Date: Tue May 21 17:23:32 2024 -0400
wait-repo compat
commit f3a8f76d9340b1bdddb5f7bab154962e848d4d10
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 16 20:14:59 2024 -0400
fixes
commit 6638b0fd76b31aa49ad0cf79639014ad9ace09f0
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 16 16:41:50 2024 -0400
use old regen-repo code for older hubs
commit 7f2d8ec49fe1d2d511759221a821a146a4ef6837
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 16 16:18:36 2024 -0400
fixes
commit 791df709c10d3c10c9b79f59f4fda435ac3bd285
Author: Mike McLean <mikem@redhat.com>
Date: Thu May 16 12:22:09 2024 -0400
don't trigger regens from scheduler. kojira is enough
commit 75f5e695287b92d53e4f173f57b12b5a7159adaf
Author: Mike McLean <mikem@redhat.com>
Date: Wed May 15 22:54:08 2024 -0400
more docs
commit 0e0f53160bbe09e35409dabce63739eb50813310
Author: Mike McLean <mikem@redhat.com>
Date: Wed May 15 21:49:27 2024 -0400
support MaxRepoTasksMaven
commit 88da9639860cb7c0d92f7c3bc881cd480b4e1620
Author: Mike McLean <mikem@redhat.com>
Date: Wed May 15 16:15:12 2024 -0400
drop unused method
commit 4cdbe6c4d2ba8735312d0cd0095612c159db9cce
Author: Mike McLean <mikem@redhat.com>
Date: Wed May 15 15:48:55 2024 -0400
api for querying repo queue
commit 2367eb21e60865c8e5a2e19f2f840938dbbbc58b
Author: Mike McLean <mikem@redhat.com>
Date: Wed May 15 15:24:44 2024 -0400
flake8
commit 811378d703a68b63c577468b85f4a49a9be2c441
Author: Mike McLean <mikem@redhat.com>
Date: Tue May 14 16:20:59 2024 -0400
record custom opts in repo.json
commit d448b6b3417e95bff2bae3b5a3790877ac834816
Author: Mike McLean <mikem@redhat.com>
Date: Mon May 13 15:32:33 2024 -0400
drop unused RawClauses code
will revisit in a later PR
commit 0422220e05ee3d43e5431a0d741f3632f42a8434
Author: Mike McLean <mikem@redhat.com>
Date: Sat May 11 13:34:12 2024 -0400
clean up BulkUpdateProcessor and add tests
commit 6721f847e655a3794d4f2fce383070cb6ad2d2d1
Author: Mike McLean <mikem@redhat.com>
Date: Fri May 10 17:43:17 2024 -0400
fix unit test after rebase
commit 833286eead2b278a99fe9ef80c13df88ca3af48c
Author: Mike McLean <mikem@redhat.com>
Date: Fri Apr 5 00:23:15 2024 -0400
adjust valid_repo opts checks
commit 7f418d550d8636072292ee05f6e9748b622c2d89
Author: Mike McLean <mikem@redhat.com>
Date: Fri Apr 5 00:03:33 2024 -0400
extend valid_repo unit test and fix a bug
commit eb844ba15894cb7fc2a739908e7d83c80fd82524
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 15:41:08 2024 -0400
test_request_existing_req_invalid
commit 2e290453abf9ac31f51a1853aa123a2a34ad9605
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 15:22:06 2024 -0400
test_request_at_event
commit 2c3389c24f5cabfbbaeb70512a4ba917cf5bd09b
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 11:14:37 2024 -0400
test_request_new_req
commit 2cdeab9b5f5b0bff4c4806ae802e5f5e571bb25e
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 10:56:36 2024 -0400
test_request_existing_req
commit 63c9ddab5f3e50b3537a82f390e9da5a66275a25
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 10:45:22 2024 -0400
test_request_existing_repo
commit 03b5ba5c57ce1ade0cf7990d23ec599c8cb19482
Author: Mike McLean <mikem@redhat.com>
Date: Thu Apr 4 10:04:36 2024 -0400
more stubs
commit 92d16847f2cc2db0d8ee5afcf2d812b9bb6467ec
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 22:44:00 2024 -0400
fix import
commit 1f621685532564a1c1ac373e98bec57c59107e6c
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 22:16:25 2024 -0400
stub test
commit 45eef344e701c910f172d5642676d8f70d44049a
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 22:01:31 2024 -0400
link repo doc in toc
commit bfffe233051c71785c335a82f64bf2abaae50078
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 21:57:35 2024 -0400
unused options
commit 19f5a55faecf8229d60d21fd3e334e9a7f813384
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 16:37:50 2024 -0400
include new setting
commit b7f81bd18016f862d1246ab6c81172fcd9c8b0ed
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 08:21:16 2024 -0400
test + fixes
commit 16564cfb8e2725b395c624139ce3d878a6dd9d53
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 07:44:15 2024 -0400
more kojira unit tests
commit 6b55c51302331ea09a126b9f3efbc71da164c0fb
Author: Mike McLean <mikem@redhat.com>
Date: Wed Apr 3 07:06:20 2024 -0400
fix unit test
commit 0b000c124b17f965c5606d30da792ba47db542cf
Author: Mike McLean <mikem@redhat.com>
Date: Tue Apr 2 22:07:08 2024 -0400
refactor repo delete
commit 0a03623fb018c80c8d38896fc99686cac56307fa
Author: Mike McLean <mikem@redhat.com>
Date: Tue Apr 2 19:13:15 2024 -0400
avoid circular import issue
commit 137d699b7653977f63f30041d9f5f1a88ae08d43
Author: Mike McLean <mikem@redhat.com>
Date: Tue Apr 2 19:03:18 2024 -0400
some kojira cleanup
commit 252e69d6dd17bb407b88b79efbb243ca5e441765
Author: Mike McLean <mikem@redhat.com>
Date: Tue Apr 2 17:21:14 2024 -0400
adjust state transition check
commit 336018081709fd44e7f12933b1ea59e02bff4aed
Author: Mike McLean <mikem@redhat.com>
Date: Tue Apr 2 16:05:45 2024 -0400
update RepoQuery
commit 68bb44848d9024c5520d8e7e2cc262adaa083cd1
Author: Mike McLean <mikem@redhat.com>
Date: Tue Mar 12 11:46:59 2024 -0400
decode query bytes in log
commit 818431fb9b09db162e73f7cb1adcddc8b151c821
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 29 14:47:16 2024 -0400
sanity check requests before reusing
commit 63fee0ba1ea9d41d504bb09aeaea064246c16ff9
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 29 11:41:13 2024 -0400
repo.query api call
commit bcf9a3cf64167612e3cd355aae7c41dd348cb8db
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 29 10:31:58 2024 -0400
reduce some cli code duplication
commit 3e870cfd088c69c4aaaa9a0f938bcce740b3f42c
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 28 18:27:18 2024 -0400
tweak warnings in external repo check
commit 0dfda64b806f2377d9c591105c83a4f05851b17a
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 28 14:43:50 2024 -0400
clean repo queue
commit e5d328faa00c74e087f0b0d20aea7cd79ffb5ee4
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 28 14:05:12 2024 -0400
implement retry limit for repo queue
commit 2185f3c9e32747c9657f2b9eb9ce6e3ca6d06ff8
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 27 22:40:13 2024 -0400
cleanup a few TODOs
commit b45be8c44367bca9819561a0e928999b9a9e2428
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 27 22:22:17 2024 -0400
tweak test
commit 546b161e20d0b310462dda705ae688e25b385cf5
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 27 13:43:06 2024 -0400
more kojira tests
commit f887fdd12e59e36be561c1a89687a523e112b9d4
Author: Mike McLean <mikem@redhat.com>
Date: Tue Mar 26 20:16:11 2024 -0400
unit tests for RepoWatcher
commit e78b41431f3b45ae9e09d9a246982df9bb2c2374
Author: Mike McLean <mikem@redhat.com>
Date: Tue Mar 26 10:53:14 2024 -0400
fix unit tests
commit 64328ecb27e5598ec8977617e67d6dd630bc8db7
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 25 14:03:19 2024 -0400
custom opts sorted out?
commit e3cee8c48bcf585a1a14aa8e56e43aaba2ccd63b
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 25 12:50:34 2024 -0400
allow containment operator
commit bef7bbc3b2a16a6643bedb47be044c202a2bad2d
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 25 11:59:15 2024 -0400
partial
commit 01788dfe386a07960c5c7888350e3917b44a0bab
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 23 13:47:22 2024 -0400
fragment: struggling with repo opt timing
commit 44504bfbde4cf981391ea02127a05c4f0c2fc4a3
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 17:14:57 2024 -0400
fine to have default values in the class
commit 1bfa520dd599acccd45f221f71c64fbefc3b5554
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 17:14:18 2024 -0400
option renamed
commit a5db9d015a25f71fdb5e2dadcae55a8c5b7ec956
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 17:04:32 2024 -0400
flake8
commit c02244f8018b651f309f39eb60f926209454dea2
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 16:59:15 2024 -0400
more config options in repos.py
commit 9bf3edc0cf2c85a23964b79c4489bc9592656f16
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 15:39:52 2024 -0400
use requests by default in regen-repo
commit 78c6e8a4459856fa333763b1977633307fd81cc3
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 13:49:00 2024 -0400
adjust watch_fields
commit eadb2a24b9e0f324ac053c4bdede0865d4ed5bfa
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 12:27:23 2024 -0400
adjust event validation
commit 3140e73cfccdcc25765c6f330073c991a44cbd9a
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 12:01:24 2024 -0400
wait-repo tweaks
commit d1a8174cdd917bbf74882c51f1a7eaf4f02e542a
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 10:35:28 2024 -0400
cli: wait-repo-request command
commit b2d08ac09880a1931b7f40b68d5ca765cd49a3a6
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 10:04:46 2024 -0400
drop complex request options from wait-repo
commit b4ab55f241a693c0c0d08e386f998394a295fc7c
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 09:36:37 2024 -0400
fix call
commit c04417439c4684342ac0d4423b341d363bc80e92
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 22 09:32:48 2024 -0400
typo
commit 29be83b1523d45eb77cfe4959c9d6bc5c940ebbe
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 20 07:28:12 2024 -0400
partial...
commit cd0ba3b6c2c47fe5bac4cf823b886462e092e2b3
Author: Mike McLean <mikem@redhat.com>
Date: Tue Mar 19 23:13:47 2024 -0400
drop event="new" code
commit 7f4f2356eceec03228e4a92b13e5593f956c390d
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 18 21:00:25 2024 -0400
kojira on demand work
squashed because the branch was getting unwieldy
mostly working at this point, but there is a bit out outstanding work
commit e127878460a932cc77c399f69c40f0993c765dc7
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 18 11:20:33 2024 -0400
stale comment
commit d0849d50b865f4f3783ddde5e1e6cf10db56ed39
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 23:58:13 2024 -0400
don't expire at_event repos
commit 8866db0e25b072aa12cc2827c62093b000fa7897
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 23:43:24 2024 -0400
typo
commit e2a5fd639b88c7b88708e782f0b7398296d2f805
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 23:40:08 2024 -0400
repos.py: support at_event
commit 6518f1656976ea2beb2cf732c82db0f159b09d15
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 22:20:35 2024 -0400
update repo symlink logic
commit 50d5e179f56393dd52c7225fc6f053d0095e9599
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 22:20:01 2024 -0400
...
commit 429fc85b391e0b5e637e20859f1094a37a5eab39
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 21:18:44 2024 -0400
block owner opt in makeTask and host.subtask
commit 40fcfe667ef70987444756f6d5554919d89fb1de
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 20:49:37 2024 -0400
db lock for repo queue
commit dfd94fac8fb96328b12bcf2f8f6f7e2d52deea85
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 17:47:39 2024 -0400
...
commit ecd9611e5d84d8a98920c40805616a6376ca652e
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 17:45:38 2024 -0400
move new exports around
commit a2e086df07f7b03dc4505a61f9b213e6e2ff20a5
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:46:29 2024 -0400
drop noisy debug line
commit 497bd773baa274d205df3bba317ee80617cc56a0
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:20:56 2024 -0400
...
commit 457c986894de754a927bc4880687e0f47c29cbdd
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:19:12 2024 -0400
...
commit 3aa0fa4862b37b7d178b1b7bb9a521ea01e7dded
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:18:30 2024 -0400
...
commit 391c2009671dea1270cce01666d04ad2ade0c323
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:15:32 2024 -0400
...
commit f3794e2acc8eef38e0c65fb27d3b2b3a58f53311
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:12:53 2024 -0400
...
commit aea5e1a91f9246cce5f162bbea3d4846e87b9811
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:11:53 2024 -0400
...
commit dc68ed8f0a43c9418c0c813f05a761bc8303c2b0
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:10:34 2024 -0400
typo
commit 73c72c8ed08744a188e4ae977b7ba2d92c75401b
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 16:08:15 2024 -0400
pruning tweaks
commit d3a10f8d5ef77a86db0e64a845f360d9f2cc2e17
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 15:50:57 2024 -0400
kojira: use ordered dict for delete queue
commit f6d7d44bac22840ee3ae1a93375c3b5ad430869c
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 14:59:05 2024 -0400
rework repo expiration and lifetimes a bit
commit 8bb91611c05ccb5d91910718a07494c08665ec22
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 00:27:34 2024 -0400
more kojira rework
commit 368d25a31d61eae8712591183bd2db1ff78f59d1
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 17 00:27:17 2024 -0400
cleanup
commit 292a1e4fdcc4098137156a42072e5bfda2f711df
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 23:51:45 2024 -0400
track update time for repos
commit 01a7469ef7bcd952f45d732e4bb3b5f4bab2338a
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 17:42:42 2024 -0400
factor in implicit joins for fields="*"
commit f9aba4557108b2005cf518e4bf316befa7f29911
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 15:25:34 2024 -0400
partial repo docs
commit 74eae7104849237a4049a78c94b05187a2219f74
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 13:17:36 2024 -0400
remove some obsolete code from kojira
commit d883807967a0d6d67a6e262a119ff5e03b8a947e
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 11:42:48 2024 -0400
...
commit 3bc3aa98913463aa209bba1cecc71fc30f6ef42f
Author: Mike McLean <mikem@redhat.com>
Date: Sat Mar 16 11:12:50 2024 -0400
do_auto_repos
commit da69f05555f05ded973b4ade064ed7e5f7e70acd
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 23 14:56:30 2024 -0500
fakehub: option to override config
commit 13a4ffdf9cd915b6af7b85120d87d50b8f6db5ed
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 15 22:35:50 2024 -0400
tweak logging
commit 01af487cced25c0edaa9e98e5dc7bb7dc9c4d6bd
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 15 22:16:21 2024 -0400
adjust archlist for external repo check
commit eb1c66f57a508f65dcac0e32cfaa3e178ed40bad
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 15 18:45:53 2024 -0400
tweak logging; wait-repo --new
commit 3dab52d497926a6be80a3c98cc29f0cb6478926f
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 15 15:03:23 2024 -0400
typo
commit 503365a79998aa2ee0eb2bd9b412747cdec50ab1
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 14 00:17:24 2024 -0400
...
commit 46ec62e96334690344de18d535f7b9c4fd87d877
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 14 00:16:09 2024 -0400
separate get/set for erepo data
commit 25c2861509cfebcfc38be5fff6c0b382dfcca224
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 09:08:45 2024 -0400
only update erepo data in db if it changed
commit bc5db7494a486ae39b99dba4875547a8e8bc1ee0
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 09:03:03 2024 -0400
...
commit 55b947fe2889dcb3b6112e9e80de926ef0ab70fa
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 08:48:45 2024 -0400
partial work
commit 7e91985a378754ae2ba88e0e2182bdf6302416ef
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 08:22:23 2024 -0400
handle external_repo_data history in cli
commit 0aeae31215af98ea8580307750389873f1e2521e
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 08:15:50 2024 -0400
set_external_repo_data
commit d85e93c0c294770d2384a41a3f2c09b4a64ae3c4
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 13 07:58:18 2024 -0400
support external_repo_data in query_history
commit 88fcf7ac5b8893bd045af017df1eb22a3cce8cb0
Merge: 8449ebfeb eba8de247
Author: Mike McLean <mikem@redhat.com>
Date: Tue Mar 12 00:01:57 2024 -0400
Merge remote-tracking branch 'origin' into kojira-on-demand
commit 8449ebfeb7976f5a5bfea78322c536cf0db6aa54
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 23:56:25 2024 -0400
drop stray file
commit 3d3716454b9f12c1807f8992ecd01cde3d9aade9
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 23:49:20 2024 -0400
flake8
commit f9014b6b689e5a1baf355842cf13905b8c50c3d8
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 23:44:32 2024 -0400
handle deleted tags sanely in tag_last_change_event
commit 7d584e99a1a580039d18210c2cc857eb3419394f
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 14:50:07 2024 -0400
typo
commit 6ac5921ce55ed356ba8c66466ebf56bb424591a9
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 14:49:35 2024 -0400
add external_repo_data table. check ext repo tables for first/last tag change events
commit e107400463679113971daaa400d75ec006f4dca5
Author: Mike McLean <mikem@redhat.com>
Date: Mon Mar 11 12:14:21 2024 -0400
fix newer_than logic in WaitrepoTask
commit 4a1175a35e6ad7c59b3622a6028e2cd68e29bb79
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 23:47:29 2024 -0400
todos
commit c13d9e99d19bc40e59fd136b540b6a8c6e12a50f
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 23:30:59 2024 -0400
AllowNewRepo hub config
commit e3176cda238d3357fed0b905b03dfc0319dab12e
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 23:00:45 2024 -0400
fixes
commit d486960a441fbb517492a61ef2529370035a765a
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 22:48:00 2024 -0400
request min_event never null or in future
commit 4cc0d38b8e4bf1254bb156d085614f83929e1161
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 22:32:45 2024 -0400
...
commit bb0dc41cd6be4c42d4cd033e07210f1184c2c385
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 22:23:52 2024 -0400
default min_event. don't allow future events
commit 1dccf0a56b1e3f83107760111264249527abeb68
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 17:27:11 2024 -0400
use BulkUpdateProcessor in update_end_events
commit 03c791edd3bb49359f2a01eaf53cbb717c53833e
Author: Mike McLean <mikem@redhat.com>
Date: Sun Mar 10 17:26:26 2024 -0400
BulkUpdateProcessor
commit 4bd2a0da1c998ce14fd856e68318551747867e06
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 14:53:53 2024 -0500
update_end_events()
commit b45b13bcba141ea6b30618fb76c1a94593dfe569
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 13:03:33 2024 -0500
record begin/end events in repo_init
commit 6f1adf51d9e24f80369df8b96010c0d6d123b448
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 12:33:40 2024 -0500
QueryView: accept single field value
commit 6b292d9a4b1bda56ff8091fbcb126749f952d045
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 12:28:02 2024 -0500
adjust query fields
commit e9e8e74703de8b6c531944c05d54447f0d7cb13f
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 12:18:12 2024 -0500
QueryView: adjust special field name handling
commit 97d910d70634183a3d5ae804176a5c8691882b7a
Author: Mike McLean <mikem@redhat.com>
Date: Fri Mar 8 11:45:54 2024 -0500
adjust event fields
commit c70d34805227a61ab96176537dae64db3883e58f
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 23:37:29 2024 -0500
honor owner opt to make_task
commit 40601d220179eb9718023002f8811ce5cbd09860
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 23:29:50 2024 -0500
...
commit 6f84ca3aa8c24d4618294027dce7a23620a3e2d7
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 23:24:22 2024 -0500
typo
commit c423b8a4cc5fd4ed5c762e7b5adc06449c72ea70
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 23:22:18 2024 -0500
use kojira user for repo tasks
commit 63dacff462ce064bbdf0b5c6e8ef14b2abe08e0c
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 23:05:12 2024 -0500
hook to fulfill requests when repos are marked ready
commit aa79055c1e404a4c4fa9ac894fe978c8f9827f72
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 01:08:19 2024 -0500
no more data field
commit 7dd029fb94e24004793e2d1232b3225b3cee5c97
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 01:01:41 2024 -0500
use full opts in request entries too
commit 73dc2f232b231467d12355af0ace14284f5422a8
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 00:54:41 2024 -0500
...
commit 414d0a55cf66d93b6fb79e9677f68fd141edc655
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 00:54:01 2024 -0500
propagate opts in repo_init
commit 99c1dde4771164d215f8c9a9acc0dadb678d047b
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 00:20:57 2024 -0500
include opts in query
commit 08289b3444612920856e6a949a379f61cb46b5e7
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 00:15:12 2024 -0500
missing import
commit bc3ca72c084b8e8de678ecbdcf6bbcfe972363e1
Author: Mike McLean <mikem@redhat.com>
Date: Thu Mar 7 00:10:45 2024 -0500
more opts support
commit f7c12cfe5f5b6c6c7895cd5eb4cdeb45757022a1
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 23:59:08 2024 -0500
handle repo opts in request call
commit 02a75f3996d59ae36f046327fca766e8799ef35b
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 22:01:06 2024 -0500
fix import
commit 7fe52dc83a80c0f68580d274bd2e60c57ab2e26d
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 21:58:59 2024 -0500
fix fields
commit f016c3a46d901ca762f5e8824fcd5efad2eede57
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 21:47:40 2024 -0500
move code into kojihub/repos
commit 9953009d3cc6f08cd16cbaa593ae79796ac86fa2
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 21:15:17 2024 -0500
more unit test fixes
commit f5decfaff3f56601262752e8a06b6f97bc4cfb33
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 20:51:07 2024 -0500
unit test
commit b51d4979824abe6ddc402011d21394854f46687e
Author: Mike McLean <mikem@redhat.com>
Date: Wed Mar 6 20:19:06 2024 -0500
flake8
commit aeee5b59df4e9da93db83874f022419c24b37162
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 20 18:05:25 2024 -0500
stub: tracking opts
commit b5c150b52f575c681bdacb4c87e690653edc465a
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 15:11:40 2024 -0500
different approach for raw clauses
commit a9001c97935f3ad90571589688b1f291242bad08
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 14:32:57 2024 -0500
and any necessary values and joins
commit 84a46633b7dc1303e48367b614b99de3730a865d
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 14:17:12 2024 -0500
give hub code a way to raw clauses with QueryView
commit 5d43c18f56563fc14f12d12c57f044125a5b33f9
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 14:09:27 2024 -0500
private vars
commit 91992f2e7b0a6cdd5e7cf8b99f6c37cfb20b08a6
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 14:02:07 2024 -0500
saner data from get_fields
commit 1e581cd5a5f3a6e257c3147a8ea763987984403c
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 13:26:34 2024 -0500
update test and include tag_first_change_event()
commit 3509300b0b1c6bb516b5552f2b1d37008231efae
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 12:42:53 2024 -0500
revert global verbose option
commit 4173e8610b0beed3dcea14849da1f115eb43c293
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 19 07:59:48 2024 -0500
better ordering support in QueryView
commit 359543b95cd524d5f4d8d82854680452ee07fd00
Author: Mike McLean <mikem@redhat.com>
Date: Sun Feb 18 01:19:30 2024 -0500
also include test from multirepo
commit 1ceb8c01f92cfe5029c78688b14f643e1fa8be12
Author: Mike McLean <mikem@redhat.com>
Date: Sun Feb 18 00:18:39 2024 -0500
constraint
commit 064bfc18b3a07edd602192bc4f48ac52adeedc3f
Author: Mike McLean <mikem@redhat.com>
Date: Sun Feb 18 00:00:15 2024 -0500
tagFirstChangeEvent, plus fix
commit 0efbfed21ec3b66841a7e4996e59bc8aaeed352b
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 22:37:08 2024 -0500
fix
commit 3ead49b9ed7f643e7ba2db2077993eb515f10e38
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 21:54:05 2024 -0500
cleanup
commit be2beb37fd35b46a5b4d60f39c8040640dfc7800
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 21:20:29 2024 -0500
rename request field, clean up Watcher args
commit d392a974a1cbba119abc6a9e99e54d45a0cf0d62
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 18:38:21 2024 -0500
...
commit 70ee37dbafc6c4e77a62aac44f11747c0f6bfc25
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 18:37:08 2024 -0500
use tagLastChangeEvent for min_event=last
commit 82d0d77679afc163bb5c36e43f834c109d7e6371
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 18:33:04 2024 -0500
tag_last_change_event: support inheritance
commit c3c87f8ccf4feea321d9bfa54cc1f223431a8d13
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 17:55:10 2024 -0500
waitrepo anon mode (no request)
commit c6994353d8daa4cb615eae4dde0368b97ea33d18
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 09:32:39 2024 -0500
don't reuse a request for a future event
commit 22abfadc57adcf11229336eede6459585a293da6
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 09:16:47 2024 -0500
...
commit c7b899c4a62d667d96e8320b6fa96106972f5859
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 09:10:22 2024 -0500
...
commit a185fd86766c283fd9c18a4d95546a8e36fd21c9
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 09:08:31 2024 -0500
...
commit 87401bddac38ebb658f2e9e4fbe36af2e6010e42
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 09:06:48 2024 -0500
...
commit bb72bd0e2d78f2d21168144a976e772473efeb16
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 08:59:44 2024 -0500
...
commit 4dbeb0edfa55cf39f4c897b3c15345e2daf9dad6
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 08:59:10 2024 -0500
...
commit 994e13d538d580ea9f7499310b8a0e4cd841af07
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 08:57:22 2024 -0500
...
commit 1fee9331e72e4d48eccfd640183563a909181af6
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 08:53:06 2024 -0500
...
commit e74eea41048a5ec6f4a9c52025c2e452f640a808
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 00:57:11 2024 -0500
...
commit ec1a581ba23b292ab840b740dabd1f3e4854fe33
Author: Mike McLean <mikem@redhat.com>
Date: Sat Feb 17 00:48:48 2024 -0500
attempting to wire this up into newRepo and waitrepo task
commit 7eee457230a2b0e6aa9b974e94e4ca516227a196
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 18:58:18 2024 -0500
...
commit 1c719d642da5f5c2ca0b7ce9af170054767423c6
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 18:56:11 2024 -0500
adjust checkRepoRequest return
commit e6e5f15961c7801b1777743b799fbe2c96a08138
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 18:00:27 2024 -0500
handle repo requests in scheduler loop
commit a0dde4e3625110671bcea7abbdab0f0c03142cbc
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 11:06:00 2024 -0500
tweak repo report in taginfo cli
commit 2d860a17caf770507c67a89ac234d17c200c30ab
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 10:46:13 2024 -0500
enable/clarify new repo fields
commit 7204ce3753450981300bf78102fc40f1b41786b4
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 09:38:59 2024 -0500
syntax
commit 96236f4ef93e5babeb0800b5b4a16117a3e8c1df
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 10:20:34 2024 -0500
pull tag_last_change_event and repo fields from multirepo branch
commit a707c19eda9bc6efc22ce004367cbee960fcccb6
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 16 09:26:07 2024 -0500
partial: check_repo_queue
commit a208d128e60bdb4ad531938d55b2c793b65ab24b
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 19:35:03 2024 -0500
...
commit e9a601059fb9ceb89ec9b84680afd6dc276424f9
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 19:22:55 2024 -0500
...
commit 067e385861766d7a355d5671a1e1e73ebd737b97
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 19:14:11 2024 -0500
use RepoView more
commit e5b4a58b65c6f195f724fb135acea6dd18abc3c2
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 17:37:47 2024 -0500
executeOne
commit 45aecfeb0a32c097fc65574296958573e6405009
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 17:29:06 2024 -0500
...
commit 41314dc10c3a1a13f39628de5caedc7486193c7b
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 17:27:40 2024 -0500
only return one req
commit c44ed9e4e3bc349e4107df79847049503a2c75be
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 14:57:11 2024 -0500
...
commit cfd60878ada8196616fd401fb6cbaf7aa2dcc98b
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 11:10:31 2024 -0500
...
commit 11f65335ca9c6167b8f457460a58471c37ae4098
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 15 09:12:34 2024 -0500
testing
commit c05f8f3b3f64c3aeef5ff0296dc181123c756952
Author: Mike McLean <mikem@redhat.com>
Date: Wed Feb 14 22:52:14 2024 -0500
flesh out stub
commit fd9c57c2c95bb5a1bd051d9d1e7e73e2f3fcb9b0
Author: Mike McLean <mikem@redhat.com>
Date: Wed Feb 14 22:26:19 2024 -0500
...
commit d59f38a5adc90607556a1671c85b808209389edd
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 22:19:36 2024 -0500
more fragments
commit 2d1b45c66e1cc3f41f6812b7b6d4bd66c4acf419
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 20:38:04 2024 -0500
XXX DEBUG CODE
commit d8e3a4bd205acb5ec1940fa30e29701f0a358d51
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 20:37:52 2024 -0500
...
commit 0744a29bd303bf9b381aa48e3e5dd98e8b7373ef
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 20:37:40 2024 -0500
...
commit 0726f8d22b227e002f7ddd927829a1e3ec66681f
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 20:27:22 2024 -0500
RepoWatcher stub
commit a74a74ef9688b1d27b528dd8e2de8ff3b63f97ae
Author: Mike McLean <mikem@redhat.com>
Date: Tue Feb 6 00:05:49 2024 -0500
...
commit d68c2902015a4998f59355aa224924e5ace21b0a
Author: Mike McLean <mikem@redhat.com>
Date: Mon Feb 5 08:18:56 2024 -0500
...
commit ff8538344e1bf24d7b94ad45f26fb1548be4782d
Author: Mike McLean <mikem@redhat.com>
Date: Fri Feb 2 00:00:41 2024 -0500
partial
commit f618ed321108e0094ab95e054cb5d53fb2e0dfe1
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 1 23:54:57 2024 -0500
tweak unit test
commit 208a2f441401cefd65a7a92d91b6b76bf5dd97d3
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 1 22:52:37 2024 -0500
comments
commit 8fe5b4f0d773f190c037ab95520623a3d250c069
Author: Mike McLean <mikem@redhat.com>
Date: Thu Feb 1 01:43:28 2024 -0500
repo_queue stub
844 lines
37 KiB
Python
844 lines
37 KiB
Python
from __future__ import absolute_import
|
|
import mock
|
|
import random
|
|
import shutil
|
|
import six
|
|
from six.moves import range
|
|
import unittest
|
|
|
|
from os import path, makedirs
|
|
from tempfile import gettempdir
|
|
from mock import patch, MagicMock, Mock, call
|
|
import requests_mock
|
|
|
|
import koji
|
|
from koji.tasks import BaseTaskHandler, FakeTask, ForkTask, SleepTask, WaitTestTask, scan_mounts, \
|
|
umount_all, safe_rmtree
|
|
|
|
|
|
def get_fake_mounts_file():
|
|
""" Returns contents of /prc/mounts in a file-like object
|
|
"""
|
|
return six.StringIO(six.text_type((
|
|
'sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0\n'
|
|
'proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0\n'
|
|
'devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=238836k,nr_inodes=59709,mode=755 0 0\n'
|
|
'securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0\n'
|
|
'tmpfs /dev/shm\\040(deleted) tmpfs rw,seclabel,nosuid,nodev 0 0\n'
|
|
'devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0\n'
|
|
'tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0\n'
|
|
'tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0\n'
|
|
'pstore /sys/fs/pstore pstore rw,seclabel,nosuid,nodev,noexec,relatime 0 0\n'
|
|
'cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0\n'
|
|
'cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0\n'
|
|
'cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0\n'
|
|
'cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0\n'
|
|
'cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0\n'
|
|
'cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0\n'
|
|
'cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0\n'
|
|
'cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0\n'
|
|
'cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0\n'
|
|
'configfs /sys/kernel/config configfs rw,relatime 0 0\n'
|
|
'hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0\n'
|
|
'mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0\n'
|
|
)))
|
|
|
|
|
|
def get_temp_dir_root():
|
|
return path.join(gettempdir(), 'koji_tests')
|
|
|
|
|
|
def get_tmp_dir_path(folder_starts_with):
|
|
return path.join(get_temp_dir_root(), (
|
|
'{0}{1}'.format(folder_starts_with, random.randint(1, 999999999999))))
|
|
|
|
|
|
class TaskTest(BaseTaskHandler):
|
|
Methods = ['some_method']
|
|
_taskWeight = 5.2
|
|
|
|
def handler(self, *args):
|
|
return 42
|
|
|
|
|
|
class TaskNoWeightTest(BaseTaskHandler):
|
|
Methods = ['some_method']
|
|
|
|
def handler(self, *args):
|
|
return 42
|
|
|
|
|
|
class BadTask(BaseTaskHandler):
|
|
Methods = ['some_method']
|
|
|
|
|
|
class TasksTestCase(unittest.TestCase):
|
|
|
|
def tearDown(self):
|
|
temp_dir_root = get_temp_dir_root()
|
|
|
|
if path.isdir(temp_dir_root):
|
|
shutil.rmtree(get_temp_dir_root())
|
|
|
|
def test_scan_mounts_results(self):
|
|
""" Tests the scan_mounts function with a mocked /proc/mounts file.
|
|
A list containing mount points starting with /dev are expected to be returned
|
|
from the function based on the function input of /dev.
|
|
"""
|
|
fake_mounts_file_contents = get_fake_mounts_file()
|
|
|
|
with patch('koji.tasks.open', return_value=fake_mounts_file_contents, create=True):
|
|
self.assertIn(scan_mounts('/dev'),
|
|
[['/dev/shm', '/dev/pts', '/dev/mqueue', '/dev/hugepages', '/dev']])
|
|
|
|
def test_scan_mounts_no_results(self):
|
|
""" Tests the scan_mounts function with a mocked /proc/mounts file.
|
|
An argument of /nonexistent/path to the function should return an empty list.
|
|
"""
|
|
fake_mounts_file_contents = get_fake_mounts_file()
|
|
|
|
with patch('koji.tasks.open', return_value=fake_mounts_file_contents, create=True):
|
|
self.assertEqual(scan_mounts('/nonexistent/path'), [])
|
|
|
|
# Patching the scan_mounts function instead of the built-in open function
|
|
# because this is only testing umount_all
|
|
@patch('koji.tasks.scan_mounts', side_effect=[['/dev/shm', '/dev/pts', '/dev/mqueue'], []])
|
|
@patch('os.spawnvp', return_value=0)
|
|
def test_umount_all(self, mocked_spawnvp, mocked_scan_mounts):
|
|
""" Tests that umount_all returns nothing when successful.
|
|
"""
|
|
self.assertEqual(umount_all('/test'), None)
|
|
|
|
# Patching the scan_mounts function instead of the built-in open function
|
|
# because this is only testing umount_all
|
|
@patch('koji.tasks.scan_mounts', return_value=['/dev/shm', '/dev/pts', '/dev/mqueue'])
|
|
@patch('os.spawnvp', return_value=1)
|
|
def test_umount_all_failure(self, mocked_spawnvp, mocked_scan_mounts):
|
|
""" Tests that umount_all raises an exception when a mount point can't be unmounted.
|
|
"""
|
|
try:
|
|
umount_all('/dev')
|
|
raise Exception('A GenericError was not raised during the test')
|
|
except koji.GenericError as e:
|
|
self.assertEqual(e.args[0], 'umount failed (exit code 1) for /dev/shm')
|
|
|
|
# Patching the scan_mounts function instead of the built-in open function
|
|
# because this is only testing umount_all
|
|
@patch('koji.tasks.scan_mounts',
|
|
side_effect=[['/dev/shm', '/dev/pts', '/dev/mqueue'], ['/dev/shm', '/dev/mqueue']])
|
|
@patch('os.spawnvp', return_value=0)
|
|
def test_umount_all_unexpected_failure(self, mocked_spawnvp, mocked_scan_mounts):
|
|
""" Tests that umount_all will fail if the command to unmount the mount
|
|
points was successful but a second run of scan_mounts still shows some of the unmount
|
|
mount points still mounted.
|
|
"""
|
|
try:
|
|
umount_all('/dev')
|
|
raise Exception('A GenericError was not raised during the test')
|
|
except koji.GenericError as e:
|
|
self.assertEqual(e.args[0], 'Unmounting incomplete: [\'/dev/shm\', \'/dev/mqueue\']')
|
|
|
|
def test_BaseTaskHandler_handler_not_set(self):
|
|
""" Tests that an exception is thrown when the handler function is not overwritten
|
|
by the child class.
|
|
"""
|
|
obj = BadTask(123, 'some_method', ['random_arg'], None, None,
|
|
(get_tmp_dir_path('BadTask')))
|
|
try:
|
|
obj.handler()
|
|
raise Exception('The NotImplementedError exception was not raised')
|
|
except NotImplementedError as e:
|
|
self.assertEqual(e.__class__.__name__, 'NotImplementedError')
|
|
|
|
def test_BaseTaskHandler_weight_default(self):
|
|
""" Tests that the weight function returns 1.0 when _taskWeight is not set in the child
|
|
class' definition.
|
|
"""
|
|
obj = TaskNoWeightTest(123, 'some_method', ['random_arg'], None, None,
|
|
(get_tmp_dir_path('TaskNoWeightTest')))
|
|
self.assertEqual(obj.weight(), 1.0)
|
|
|
|
def test_BaseTaskHandler_weight_set(self):
|
|
""" Tests that the weight function returns the value of _taskWeight when it is set in the
|
|
child class' definition.
|
|
"""
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None,
|
|
(get_tmp_dir_path('TaskTest')))
|
|
self.assertEqual(obj.weight(), 5.2)
|
|
|
|
def test_BaseTaskHandler_createWorkdir_workdir_not_defined(self):
|
|
""" Tests that the createWorkdir function does nothing when the workdir member
|
|
variable is set to None.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
obj.workdir = None
|
|
obj.createWorkdir()
|
|
self.assertEqual(path.isdir(temp_path), False)
|
|
|
|
# This patch removes the dependence on removeWorkdir functioning
|
|
@patch('{0}.TaskTest.removeWorkdir'.format(__name__))
|
|
def test_BaseTaskHandler_createWorkdir(self, mock_removeWorkDir):
|
|
""" Tests that the createWorkdir function creates a folder based on the path given to the
|
|
workdir member variable.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
obj.createWorkdir()
|
|
self.assertEqual(path.isdir(temp_path), True)
|
|
shutil.rmtree(get_temp_dir_root())
|
|
|
|
def test_BaseTaskHandler_removeWorkdir(self):
|
|
""" Tests that the removeWOrkdir function deletes a folder based on the path given to the
|
|
workdir member variable.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
self.assertEqual(path.isdir(temp_path), True)
|
|
obj.removeWorkdir()
|
|
self.assertEqual(path.isdir(temp_path), False)
|
|
|
|
def test_BaseTaskHandler_wait_all_done(self):
|
|
""" Tests that the wait function returns the subtask results of when
|
|
the taskWait function returns only two finished tasks.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(12345678, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = Mock()
|
|
obj.session.host.taskSetWait.return_value = None
|
|
obj.session.host.taskWait.return_value = [[1551234, 1591234], []]
|
|
taskWaitResults = [
|
|
['1551234', {
|
|
'brootid': 2342345,
|
|
'logs': ['tasks/5678/12345678/root.log',
|
|
'tasks/5678/12345678/state.log',
|
|
'tasks/5678/12345678/build.log'],
|
|
'srpm': 'tasks/5678/12345678/some_package-1.2.3p5-25.src.rpm'
|
|
}],
|
|
|
|
['1591234', {
|
|
'brootid': 1231234,
|
|
'logs': ['tasks/6789/2345678/root.log',
|
|
'tasks/6789/2345678/state.log',
|
|
'tasks/6789/2345678/build.log'],
|
|
'rpms': ['tasks/6789/2345678/some_other_package-doc-1.2.3p5-25.el7.noarch.rpm'],
|
|
'srpms': ['tasks/6789/2345678/some_other_package-1.2.3p5-25.el7.src.rpm']
|
|
}]
|
|
]
|
|
|
|
obj.session.host.taskWaitResults.return_value = taskWaitResults
|
|
self.assertEqual(obj.wait([1551234, 1591234]), dict(taskWaitResults))
|
|
obj.session.host.taskSetWait.assert_called_once_with(12345678, [1551234, 1591234])
|
|
obj.session.host.taskWaitResults.assert_called_once_with(12345678, [1551234, 1591234],
|
|
canfail=None)
|
|
|
|
def test_BaseTaskHandler_wait_some_not_done(self):
|
|
""" Tests that the wait function returns the one finished subtask results of
|
|
when the taskWait function returns one finished task and one unfinished
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(12345678, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = Mock()
|
|
obj.session.host.taskSetWait.return_value = None
|
|
obj.session.host.taskWait.return_value = [[1551234], [1591234]]
|
|
taskWaitResults = [
|
|
['1551234', {
|
|
'brootid': 2342345,
|
|
'logs': ['tasks/5678/12345678/root.log',
|
|
'tasks/5678/12345678/state.log',
|
|
'tasks/5678/12345678/build.log'],
|
|
'srpm': 'tasks/5678/12345678/some_package-1.2.3p5-25.src.rpm'
|
|
}]
|
|
]
|
|
|
|
obj.session.host.taskWaitResults.return_value = taskWaitResults
|
|
self.assertEqual(obj.wait([1551234, 1591234]), dict(taskWaitResults))
|
|
obj.session.host.taskSetWait.assert_called_once_with(12345678, [1551234, 1591234])
|
|
obj.session.host.taskWaitResults.assert_called_once_with(12345678, [1551234], canfail=None)
|
|
|
|
@patch('signal.pause', return_value=None)
|
|
def test_BaseTaskHandler_wait_some_not_done_all_set(self, mock_signal_pause):
|
|
""" Tests that the wait function returns the two subtask results since the
|
|
all kwarg is set to True.
|
|
The taskWait function should first return one finished and one unfinished task,
|
|
then the second time it should return two finished tasks.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(12345678, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = Mock()
|
|
obj.session.host.taskSetWait.return_value = None
|
|
obj.session.host.taskWait.side_effect = [[[1551234], [1591234]], [[1551234, 1591234], []]]
|
|
taskWaitResults = [
|
|
['1551234', {
|
|
'brootid': 2342345,
|
|
'logs': ['tasks/5678/12345678/root.log',
|
|
'tasks/5678/12345678/state.log',
|
|
'tasks/5678/12345678/build.log'],
|
|
'srpm': 'tasks/5678/12345678/some_package-1.2.3p5-25.src.rpm'
|
|
}],
|
|
|
|
['1591234', {
|
|
'brootid': 1231234,
|
|
'logs': ['tasks/6789/2345678/root.log',
|
|
'tasks/6789/2345678/state.log',
|
|
'tasks/6789/2345678/build.log'],
|
|
'rpms': ['tasks/6789/2345678/some_other_package-doc-1.2.3p5-25.el7.noarch.rpm'],
|
|
'srpms': ['tasks/6789/2345678/some_other_package-1.2.3p5-25.el7.src.rpm']
|
|
}]
|
|
]
|
|
|
|
obj.session.getTaskResult.side_effect
|
|
|
|
obj.session.host.taskWaitResults.return_value = taskWaitResults
|
|
self.assertEqual(obj.wait([1551234, 1591234], all=True), dict(taskWaitResults))
|
|
obj.session.host.taskSetWait.assert_called_once_with(12345678, [1551234, 1591234])
|
|
obj.session.host.taskWait.assert_has_calls([call(12345678), call(12345678)])
|
|
mock_signal_pause.assert_called_once_with()
|
|
obj.session.host.taskWaitResults.assert_called_once_with(12345678, [1551234, 1591234],
|
|
canfail=None)
|
|
|
|
def test_BaseTaskHandler_wait_some_not_done_all_set_failany_set_failed_task(self):
|
|
""" Tests that the wait function raises an exception when one of the subtask fails
|
|
when the failany flag is set to True.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(12345678, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = Mock()
|
|
obj.session.host.taskSetWait.return_value = None
|
|
obj.session.host.taskWait.side_effect = [[[1551234], [1591234]], [[1551234, 1591234], []]]
|
|
obj.session.getTaskResult.side_effect = koji.GenericError(
|
|
'Uh oh, we\'ve got a problem here!')
|
|
try:
|
|
obj.wait([1551234, 1591234], all=True, failany=True)
|
|
raise Exception('A GeneralError was not raised.')
|
|
except koji.GenericError as e:
|
|
self.assertEqual(e.args[0], 'Uh oh, we\'ve got a problem here!')
|
|
obj.session.host.taskSetWait.assert_called_once_with(12345678, [1551234, 1591234])
|
|
|
|
@patch('time.time')
|
|
@patch('time.sleep')
|
|
@patch('signal.sigtimedwait')
|
|
@patch('signal.pause')
|
|
def test_BaseTaskHandler_wait_timeout(self, pause, sigtimedwait, sleep, time):
|
|
"""Tests timeout behavior in the wait function"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(95, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = MagicMock()
|
|
obj.session.host.taskWait.return_value = [[], [99, 100, 101]]
|
|
time.side_effect = list(range(0, 4000, 60))
|
|
try:
|
|
obj.wait([99, 100, 101], timeout=3600)
|
|
raise Exception('A GenericError was not raised.')
|
|
except koji.GenericError as e:
|
|
self.assertEqual(e.args[0][:24], 'Subtasks timed out after')
|
|
obj.session.host.taskSetWait.assert_called_once_with(95, [99, 100, 101])
|
|
obj.session.cancelTaskChildren.assert_called_once_with(95)
|
|
obj.session.getTaskResult.assert_not_called()
|
|
pause.assert_not_called()
|
|
|
|
@patch('time.time')
|
|
@patch('time.sleep')
|
|
@patch('signal.sigtimedwait')
|
|
@patch('signal.pause')
|
|
def test_BaseTaskHandler_wait_avoid_timeout(self, pause, sigtimedwait, sleep, time):
|
|
"""Tests that timeout does not happen if tasks finish in time"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(95, 'some_method', ['random_arg'], None, None, temp_path)
|
|
makedirs(temp_path)
|
|
obj.session = MagicMock()
|
|
time.side_effect = list(range(0, 4000, 20))
|
|
# time ticks every 20s for a little over an "hour"
|
|
# code checks time 3x each cycle (twice directly, once via logging)
|
|
# so each cycle is a "minute"
|
|
# report all unfinished for most of an hour
|
|
taskWait_returns = [[[], [99, 100, 101]]] * 50
|
|
# and then report all done
|
|
taskWait_returns.append([[99, 100, 101], []])
|
|
obj.session.host.taskWait.side_effect = taskWait_returns
|
|
obj.wait([99, 100, 101], timeout=3600)
|
|
|
|
obj.session.host.taskSetWait.assert_called_once_with(95, [99, 100, 101])
|
|
obj.session.cancelTaskChildren.assert_not_called()
|
|
pause.assert_not_called()
|
|
|
|
def test_BaseTaskHandler_getUploadDir(self):
|
|
""" Tests that the getUploadDir function returns the appropriate path based
|
|
on the id of the handler.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
self.assertEqual(obj.getUploadDir(), 'tasks/123/123')
|
|
|
|
# This patch removes the dependence on getUploadDir functioning
|
|
@patch('{0}.TaskTest.getUploadDir'.format(__name__), return_value='tasks/123/123')
|
|
def test_BaseTaskHandler_uploadFile(self, mock_getUploadDir):
|
|
""" Tests that the uploadFile function calls the uploadWrapper function
|
|
on the session member variable with the correct input.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
temp_file = path.join(temp_path, 'test.txt')
|
|
with open(temp_file, 'wt') as temp_file_handler:
|
|
temp_file_handler.write('Test')
|
|
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
obj.session = Mock()
|
|
self.assertEqual(obj.uploadFile(temp_file), None)
|
|
obj.session.uploadWrapper.assert_called_once_with(temp_file, 'tasks/123/123', None,
|
|
volume=None)
|
|
|
|
# This patch removes the dependence on getUploadDir functioning
|
|
@patch('{0}.TaskTest.getUploadDir'.format(__name__), return_value='tasks/123/123')
|
|
def test_BaseTaskHandler_uploadFile_no_content(self, mock_getUploadDir):
|
|
""" Tests that the uploadFile function calls the uploadWrapper function
|
|
on the session member variable without including empty files.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
temp_file = path.join(temp_path, 'test.txt')
|
|
temp_file_handler = open(temp_file, 'w')
|
|
temp_file_handler.close()
|
|
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
obj.session = Mock()
|
|
self.assertEqual(obj.uploadFile(temp_file), None)
|
|
obj.session.uploadWrapper.assert_called_once()
|
|
|
|
def test_BaseTaskHandler_uploadTree(self):
|
|
""" Tests that the uploadTree function calls the uploadFile function
|
|
with the correct parameters.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
dummy_dir = path.join(temp_path, 'some_directory')
|
|
makedirs(dummy_dir)
|
|
|
|
dummy_file = path.join(temp_path, 'test.txt')
|
|
with open(dummy_file, 'wt') as temp_file_handler:
|
|
temp_file_handler.write('Test')
|
|
|
|
dummy_file2 = path.join(dummy_dir, 'test2.txt')
|
|
with open(dummy_file2, 'wt') as temp_file_handler2:
|
|
temp_file_handler2.write('Test2')
|
|
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
obj.uploadFile = Mock()
|
|
obj.uploadFile.return_value = None
|
|
self.assertEqual(obj.uploadTree(temp_path), None)
|
|
obj.uploadFile.assert_has_calls([call(dummy_file, '', volume=None),
|
|
call(dummy_file2, 'some_directory', volume=None)])
|
|
|
|
@patch('os.lchown', return_value=None)
|
|
def test_BaseTaskHandler_chownTree(self, mock_lchown):
|
|
""" Tests that the chownTree functions as expected on dummy files created
|
|
in a temp directory
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
dummy_file = path.join(temp_path, 'test.txt')
|
|
dummy_file_handler = open(dummy_file, 'w')
|
|
dummy_file_handler.close()
|
|
|
|
dummy_file2 = path.join(temp_path, 'test2.txt')
|
|
dummy_file_handler2 = open(dummy_file2, 'w')
|
|
dummy_file_handler2.close()
|
|
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
self.assertEqual(obj.chownTree(temp_path, 2, 0), None)
|
|
mock_lchown.assert_has_calls([call(temp_path, 2, 0), call(dummy_file2, 2, 0),
|
|
call(dummy_file, 2, 0)], any_order=True)
|
|
|
|
def test_BaseTaskHandler_localPath_file_exists(self):
|
|
""" Tests the localPath function to ensure that when a file exists,
|
|
it returns that path without trying to download it.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
local_folder = path.join(temp_path, 'local')
|
|
makedirs(local_folder)
|
|
|
|
dummy_file = path.join(local_folder, 'test.txt')
|
|
dummy_file_handler = open(dummy_file, 'w')
|
|
dummy_file_handler.close()
|
|
options = Mock()
|
|
options.topurl = 'https://www.domain.local'
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, options, temp_path)
|
|
self.assertEqual(obj.localPath('test.txt'), dummy_file)
|
|
|
|
@requests_mock.Mocker()
|
|
def test_BaseTaskHandler_localPath_no_file(self, m_requests):
|
|
"""
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
local_folder = path.join(temp_path, 'local')
|
|
makedirs(local_folder)
|
|
|
|
target_file_path = path.join(local_folder, 'test.txt')
|
|
|
|
options = Mock()
|
|
options.topurl = 'https://www.domain.local'
|
|
url = options.topurl + '/test.txt'
|
|
m_requests.register_uri('GET', url, text='Important things\nSome more important things\n')
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, options, temp_path)
|
|
|
|
self.assertEqual(obj.localPath('test.txt'), target_file_path)
|
|
self.assertEqual(m_requests.call_count, 1)
|
|
self.assertEqual(m_requests.request_history[0].url, url)
|
|
|
|
def test_BaseTaskHandler_localPath_no_topurl(self):
|
|
""" Tests that the localPath function returns a path when options.topurl is not defined.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
options = Mock()
|
|
options.topurl = None
|
|
options.topdir = get_temp_dir_root()
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, options, temp_path)
|
|
|
|
self.assertEqual(obj.localPath('test.txt'), path.join(get_temp_dir_root(), 'test.txt'))
|
|
|
|
def test_BaseTaskHandler_find_arch(self):
|
|
""" Tests that the find_arch function returns the input for arch when
|
|
the input is not "noarch".
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
self.assertEqual(obj.find_arch('x86_64', None, None), 'x86_64')
|
|
|
|
def test_BaseTaskHandler_find_arch_noarch_bad_host(self):
|
|
""" Tests that the find_arch function raises an exception when
|
|
the host parameter doesn't contain a value for the arches key.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
host = {'arches': None, 'name': 'test.domain.local'}
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
try:
|
|
obj.find_arch('noarch', host, None)
|
|
raise Exception('The BuildError Exception was not raised')
|
|
except koji.BuildError as e:
|
|
self.assertEqual(e.args[0], 'No arch list for this host: test.domain.local')
|
|
|
|
def test_BaseTaskHandler_find_arch_noarch_bad_tag(self):
|
|
""" Tests that the find_arch function raises an exception when the tag parameter
|
|
doesn't contain a value for the arches key.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
host = {'arches': 'x86_64', 'name': 'test.domain.local'}
|
|
tag = {'arches': None, 'name': 'some_package-1.2-build'}
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
try:
|
|
obj.find_arch('noarch', host, tag)
|
|
raise Exception('The BuildError Exception was not raised')
|
|
except koji.BuildError as e:
|
|
self.assertEqual(e.args[0], 'No arch list for tag: some_package-1.2-build')
|
|
|
|
def test_BaseTaskHandler_find_arch_noarch(self):
|
|
""" Tests that the find_arch function finds a match of x86_64 when the host
|
|
only supports x86_64 and the tag supports x86_64 and aarch64.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
host = {'arches': 'x86_64', 'name': 'test.domain.local'}
|
|
tag = {'arches': 'x86_64 aarch64', 'name': 'some_package-1.2-build'}
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
self.assertEqual(obj.find_arch('noarch', host, tag), 'x86_64')
|
|
|
|
def test_BaseTaskHandler_find_arch__noarch_no_match(self):
|
|
""" Tests that the find_arch function raises an exception when there isn't
|
|
a common arch supported between the host and the tag.
|
|
"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
host = {'arches': 'i386', 'name': 'test.domain.local'}
|
|
tag = {'arches': 'x86_64 aarch64', 'name': 'some_package-1.2-build'}
|
|
obj = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
try:
|
|
obj.find_arch('noarch', host, tag)
|
|
raise Exception('The BuildError Exception was not raised')
|
|
except koji.BuildError as e:
|
|
self.assertEqual(e.args[0],
|
|
('host test.domain.local (i386) does not support any arches '
|
|
'of tag some_package-1.2-build (aarch64, x86_64)'))
|
|
|
|
@patch('koji.util.RepoWatcher')
|
|
def test_getRepo_no_wait_task(self, RepoWatcher):
|
|
""" Tests that the getRepo method does not wait if repo is available"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
repo_dict = {
|
|
'create_event': 13635166,
|
|
'create_ts': 1469039671.5743899,
|
|
'creation_time': '2016-07-20 18:34:31.574386',
|
|
'id': 1630631,
|
|
'state': 1
|
|
}
|
|
|
|
handler = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
handler.session = mock.MagicMock()
|
|
handler.wait = mock.MagicMock()
|
|
watcher = mock.MagicMock()
|
|
watcher.getRepo.return_value = repo_dict
|
|
RepoWatcher.return_value = watcher
|
|
|
|
result = handler.getRepo(8472)
|
|
|
|
handler.session.host.subtask.assert_not_called()
|
|
handler.wait.assert_not_called()
|
|
self.assertEqual(result, repo_dict)
|
|
|
|
@patch('koji.util.RepoWatcher')
|
|
def test_getRepo_last_event(self, RepoWatcher):
|
|
""" Tests that the getRepo method uses min_event='last' when requested"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
repo_dict = {
|
|
'create_event': 13635166,
|
|
'create_ts': 1469039671.5743899,
|
|
'creation_time': '2016-07-20 18:34:31.574386',
|
|
'id': 1630631,
|
|
'state': 1
|
|
}
|
|
|
|
handler = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
handler.session = mock.MagicMock()
|
|
handler.wait = mock.MagicMock()
|
|
watcher = mock.MagicMock()
|
|
watcher.getRepo.return_value = repo_dict
|
|
RepoWatcher.return_value = watcher
|
|
|
|
result = handler.getRepo(8472, wait=True)
|
|
|
|
RepoWatcher.assert_called_once_with(handler.session, 8472, nvrs=None, min_event='last', logger=handler.logger)
|
|
handler.session.host.subtask.assert_not_called()
|
|
handler.wait.assert_not_called()
|
|
self.assertEqual(result, repo_dict)
|
|
|
|
@patch('koji.util.RepoWatcher')
|
|
def test_getRepo_wait_task(self, RepoWatcher):
|
|
""" Tests that the getRepo function waits for subtask if repo not immediately available"""
|
|
temp_path = get_tmp_dir_path('TaskTest')
|
|
makedirs(temp_path)
|
|
|
|
repo_dict = {
|
|
'create_event': 13635166,
|
|
'create_ts': 1469039671.5743899,
|
|
'creation_time': '2016-07-20 18:34:31.574386',
|
|
'id': 1630631,
|
|
'state': 1
|
|
}
|
|
|
|
handler = TaskTest(123, 'some_method', ['random_arg'], None, None, temp_path)
|
|
handler.session = mock.MagicMock()
|
|
handler.session.host.subtask.return_value = 'TASKID'
|
|
handler.wait = mock.MagicMock()
|
|
handler.wait.return_value = {'TASKID': repo_dict}
|
|
watcher = mock.MagicMock()
|
|
watcher.getRepo.return_value = None
|
|
RepoWatcher.return_value = watcher
|
|
|
|
result = handler.getRepo(8472)
|
|
|
|
handler.session.host.subtask.assert_called_once()
|
|
handler.wait.assert_called_once_with('TASKID')
|
|
self.assertEqual(result, repo_dict)
|
|
|
|
def test_FakeTask_handler(self):
|
|
""" Tests that the FakeTest handler can be instantiated and returns 42 when run.
|
|
"""
|
|
obj = FakeTask(123, 'someMethod', ['random_arg'], None, None,
|
|
(get_tmp_dir_path('FakeTask')))
|
|
self.assertEqual(obj.run(), 42)
|
|
|
|
@patch('time.sleep')
|
|
def test_SleepTask_handler(self, mock_sleep):
|
|
""" Tests that the SleepTask handler can be instantiated and runs appropriately
|
|
based on the input.
|
|
"""
|
|
obj = SleepTask(123, 'sleep', [5], None, None, (get_tmp_dir_path('SleepTask')))
|
|
obj.run()
|
|
mock_sleep.assert_called_once_with(5)
|
|
|
|
@patch('os.spawnvp')
|
|
def test_ForkTask_handler(self, mock_spawnvp):
|
|
""" Tests that the ForkTask handler can be instantiated and runs appropriately
|
|
based on the input.
|
|
"""
|
|
obj = ForkTask(123, 'fork', [1, 20], None, None, (get_tmp_dir_path('ForkTask')))
|
|
obj.run()
|
|
mock_spawnvp.assert_called_once_with(1, 'sleep', ['sleep', '20'])
|
|
|
|
@patch('signal.pause', return_value=None)
|
|
@patch('time.sleep')
|
|
def test_WaitTestTask_handler(self, mock_sleep, mock_signal_pause):
|
|
""" Tests that the WaitTestTask handler can be instantiated and runs appropriately
|
|
based on the input.
|
|
Specifically, that forking works and canfail behaves correctly.
|
|
"""
|
|
self.mock_subtask_id = 1
|
|
|
|
def mock_subtask(method, arglist, id, **opts):
|
|
self.assertEqual(method, 'sleep')
|
|
task_id = self.mock_subtask_id
|
|
self.mock_subtask_id += 1
|
|
obj = SleepTask(task_id, 'sleep', arglist, None, None, (get_tmp_dir_path('SleepTask')))
|
|
obj.run()
|
|
return task_id
|
|
|
|
mock_taskWait = [
|
|
[[], [1, 2, 3, 4]],
|
|
[[3, 4], [1, 2]],
|
|
[[1, 2, 3, 4], []],
|
|
]
|
|
|
|
def mock_getTaskResult(task_id):
|
|
if task_id == 4:
|
|
raise koji.GenericError()
|
|
|
|
obj = WaitTestTask(123, 'waittest', [3], None, None, (get_tmp_dir_path('WaitTestTask')))
|
|
obj.session = Mock()
|
|
obj.session.host.subtask.side_effect = mock_subtask
|
|
obj.session.getTaskResult.side_effect = mock_getTaskResult
|
|
obj.session.host.taskWait.side_effect = mock_taskWait
|
|
obj.session.host.taskWaitResults.return_value = [['1', {}], ['2', {}], ['3', {}],
|
|
['4', {}], ]
|
|
obj.run()
|
|
# self.assertEqual(mock_sleep.call_count, 4)
|
|
obj.session.host.taskSetWait.assert_called_once()
|
|
obj.session.host.taskWait.assert_has_calls([call(123), call(123), call(123)])
|
|
# getTaskResult should be called in 2nd round only for task 3, as 4
|
|
# will be skipped as 'canfail'
|
|
obj.session.getTaskResult.assert_has_calls([call(3)])
|
|
|
|
|
|
class TestSafeRmtree(unittest.TestCase):
|
|
@patch('os.path.exists', return_value=True)
|
|
@patch('os.path.isfile', return_value=True)
|
|
@patch('os.path.islink', return_value=False)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_safe_rmtree_file(self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns nothing when
|
|
the path parameter is a file.
|
|
"""
|
|
path = '/mnt/folder/some_file'
|
|
self.assertEqual(safe_rmtree(path, False, True), 0)
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_not_called()
|
|
exists.assert_not_called()
|
|
remove.assert_called_once_with(path)
|
|
rmtree.assert_not_called()
|
|
|
|
@patch('os.path.exists', return_value=True)
|
|
@patch('os.path.isfile', return_value=False)
|
|
@patch('os.path.islink', return_value=True)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_rmtree_link(self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns nothing when
|
|
the path parameter is a link.
|
|
"""
|
|
path = '/mnt/folder/some_link'
|
|
self.assertEqual(safe_rmtree(path, False, True), 0)
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_called_once_with(path)
|
|
exists.assert_not_called()
|
|
remove.assert_called_once_with(path)
|
|
rmtree.assert_not_called()
|
|
|
|
@patch('os.path.exists', return_value=False)
|
|
@patch('os.path.isfile', return_value=False)
|
|
@patch('os.path.islink', return_value=False)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_rmtree_does_not_exist(self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns nothing if the path does not exist.
|
|
"""
|
|
path = '/mnt/folder/some_file'
|
|
self.assertEqual(safe_rmtree(path, False, True), 0)
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_called_once_with(path)
|
|
exists.assert_called_once_with(path)
|
|
remove.assert_not_called()
|
|
rmtree.assert_not_called()
|
|
|
|
@patch('os.path.exists', return_value=True)
|
|
@patch('os.path.isfile', return_value=False)
|
|
@patch('os.path.islink', return_value=False)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_rmtree_directory(self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns nothing when the path is a directory.
|
|
"""
|
|
path = '/mnt/folder'
|
|
self.assertEqual(safe_rmtree(path, False, True), 0)
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_called_once_with(path)
|
|
exists.assert_called_once_with(path)
|
|
remove.assert_not_called()
|
|
rmtree.assert_called_once_with(path)
|
|
|
|
@patch('os.path.exists', return_value=True)
|
|
@patch('os.path.isfile', return_value=False)
|
|
@patch('os.path.islink', return_value=False)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_rmtree_directory_scrub_file_failure(self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns a GeneralException when
|
|
the path parameter is a directory
|
|
and the scrub of the files in the directory fails.
|
|
"""
|
|
rmtree.side_effect = koji.GenericError('xyz')
|
|
path = '/mnt/folder'
|
|
try:
|
|
safe_rmtree(path, False, 1)
|
|
raise Exception('A GenericError was not raised during the test')
|
|
except koji.GenericError as e:
|
|
self.assertEqual(e.args[0], 'xyz')
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_called_once_with(path)
|
|
exists.assert_called_once_with(path)
|
|
remove.assert_not_called()
|
|
rmtree.assert_called_once_with(path)
|
|
|
|
@patch('os.path.exists', return_value=True)
|
|
@patch('os.path.isfile', return_value=False)
|
|
@patch('os.path.islink', return_value=False)
|
|
@patch('os.remove')
|
|
@patch('koji.util.rmtree')
|
|
def test_safe_rmtree_directory_scrub_directory_failure(
|
|
self, rmtree, remove, islink, isfile, exists):
|
|
""" Tests that the koji.util.rmtree function returns a GeneralException when
|
|
the path parameter is a directory
|
|
and the scrub of the directories in the directory fails.
|
|
"""
|
|
rmtree.side_effect = OSError('xyz')
|
|
path = '/mnt/folder'
|
|
try:
|
|
safe_rmtree(path, False, True)
|
|
raise Exception('An OSError was not raised during the test')
|
|
except OSError as e:
|
|
self.assertEqual(e.args[0], 'xyz')
|
|
|
|
isfile.assert_called_once_with(path)
|
|
islink.assert_called_once_with(path)
|
|
exists.assert_called_once_with(path)
|
|
remove.assert_not_called()
|
|
rmtree.assert_called_once_with(path)
|