From c03987e5527e77e598789655973e129ca1f3b203 Mon Sep 17 00:00:00 2001 From: tomdds Date: Wed, 13 Nov 2019 17:08:26 -0500 Subject: [PATCH 1/9] Add locust and pyquery dev deps for load testing --- Pipfile | 2 + Pipfile.lock | 408 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 295 insertions(+), 115 deletions(-) diff --git a/Pipfile b/Pipfile index 6456afb1..8e13e70f 100644 --- a/Pipfile +++ b/Pipfile @@ -50,6 +50,8 @@ detect-secrets = "*" beautifulsoup4 = "*" mypy = "*" rope = "*" +pyquery = "*" +locustio = "*" [requires] python_version = "3.7.3" diff --git a/Pipfile.lock b/Pipfile.lock index 815fc74d..d24c8e1d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6d2ab855267daac877ae7464de9dba5b62b7d89288992f87d8fc6ff0c0d2520f" + "sha256": "9ff049f8e866d03eb0ef15a65164fd36aa86c503ff0efc597acaf062a41154f4" }, "pipfile-spec": 6, "requires": { @@ -25,17 +25,17 @@ }, "alembic": { "hashes": [ - "sha256:9f907d7e8b286a1cfb22db9084f9ce4fde7ad7956bb496dc7c952e10ac90e36a" + "sha256:49277bb7242192bbb9eac58fed4fe02ec6c3a2a4b4345d2171197459266482b2" ], "index": "pypi", - "version": "==1.2.1" + "version": "==1.3.1" }, "amqp": { "hashes": [ - "sha256:19a917e260178b8d410122712bac69cb3e6db010d68f6101e7307508aded5e68", - "sha256:19d851b879a471fcfdcf01df9936cff924f422baa77653289f7095dedd5fb26a" + "sha256:6e649ca13a7df3faacdc8bbb280aa9a6602d22fd9d545336077e573a1f4ff3b8", + "sha256:77f1aef9410698d20eaeac5b73a87817365f457a507d82edf292e12cbb83b08d" ], - "version": "==2.5.1" + "version": "==2.5.2" }, "apache-libcloud": { "hashes": [ @@ -109,11 +109,11 @@ }, "celery": { "hashes": [ - "sha256:821d11967f0f3f8fe24bd61ecfc7b6acbb5a926b719f1e8c4d5ff7bc09e18d81", - "sha256:ae4541fb3af5182bd4af749fee9b89c4858f2792d34bb5d034967e662cf9b55c" + "sha256:65f4d67fc1037edacecbf39fcf956da68b984cf2a6d89bd73a8a5a80e35e3dd7", + "sha256:8a59d80235b876881d9893751f2a87936165fc1347efee66095620b3cadf533b" ], "index": "pypi", - "version": "==4.4.0rc3" + "version": "==4.4.0rc4" }, "certifi": { "hashes": [ @@ -124,40 +124,41 @@ }, "cffi": { "hashes": [ - "sha256:00d890313797d9fe4420506613384b43099ad7d2b905c0752dbcc3a6f14d80fa", - "sha256:0cf9e550ac6c5e57b713437e2f4ac2d7fd0cd10336525a27224f5fc1ec2ee59a", - "sha256:0ea23c9c0cdd6778146a50d867d6405693ac3b80a68829966c98dd5e1bbae400", - "sha256:193697c2918ecdb3865acf6557cddf5076bb39f1f654975e087b67efdff83365", - "sha256:1ae14b542bf3b35e5229439c35653d2ef7d8316c1fffb980f9b7647e544baa98", - "sha256:1e389e069450609c6ffa37f21f40cce36f9be7643bbe5051ab1de99d5a779526", - "sha256:263242b6ace7f9cd4ea401428d2d45066b49a700852334fd55311bde36dcda14", - "sha256:33142ae9807665fa6511cfa9857132b2c3ee6ddffb012b3f0933fc11e1e830d5", - "sha256:364f8404034ae1b232335d8c7f7b57deac566f148f7222cef78cf8ae28ef764e", - "sha256:47368f69fe6529f8f49a5d146ddee713fc9057e31d61e8b6dc86a6a5e38cecc1", - "sha256:4895640844f17bec32943995dc8c96989226974dfeb9dd121cc45d36e0d0c434", - "sha256:558b3afef987cf4b17abd849e7bedf64ee12b28175d564d05b628a0f9355599b", - "sha256:5ba86e1d80d458b338bda676fd9f9d68cb4e7a03819632969cf6d46b01a26730", - "sha256:63424daa6955e6b4c70dc2755897f5be1d719eabe71b2625948b222775ed5c43", - "sha256:6381a7d8b1ebd0bc27c3bc85bc1bfadbb6e6f756b4d4db0aa1425c3719ba26b4", - "sha256:6381ab708158c4e1639da1f2a7679a9bbe3e5a776fc6d1fd808076f0e3145331", - "sha256:6fd58366747debfa5e6163ada468a90788411f10c92597d3b0a912d07e580c36", - "sha256:728ec653964655d65408949b07f9b2219df78badd601d6c49e28d604efe40599", - "sha256:7cfcfda59ef1f95b9f729c56fe8a4041899f96b72685d36ef16a3440a0f85da8", - "sha256:819f8d5197c2684524637f940445c06e003c4a541f9983fd30d6deaa2a5487d8", - "sha256:825ecffd9574557590e3225560a8a9d751f6ffe4a49e3c40918c9969b93395fa", - "sha256:8a2bcae2258d00fcfc96a9bde4a6177bc4274fe033f79311c5dd3d3148c26518", - "sha256:9009e917d8f5ef780c2626e29b6bc126f4cb2a4d43ca67aa2b40f2a5d6385e78", - "sha256:9c77564a51d4d914ed5af096cd9843d90c45b784b511723bd46a8a9d09cf16fc", - "sha256:a19089fa74ed19c4fe96502a291cfdb89223a9705b1d73b3005df4256976142e", - "sha256:a40ed527bffa2b7ebe07acc5a3f782da072e262ca994b4f2085100b5a444bbb2", - "sha256:b8f09f21544b9899defb09afbdaeb200e6a87a2b8e604892940044cf94444644", - "sha256:bb75ba21d5716abc41af16eac1145ab2e471deedde1f22c6f99bd9f995504df0", - "sha256:e22a00c0c81ffcecaf07c2bfb3672fa372c50e2bd1024ffee0da191c1b27fc71", - "sha256:e55b5a746fb77f10c83e8af081979351722f6ea48facea79d470b3731c7b2891", - "sha256:ec2fa3ee81707a5232bf2dfbd6623fdb278e070d596effc7e2d788f2ada71a05", - "sha256:fd82eb4694be712fcae03c717ca2e0fc720657ac226b80bbb597e971fc6928c2" + "sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42", + "sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04", + "sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5", + "sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54", + "sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba", + "sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57", + "sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396", + "sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12", + "sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97", + "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43", + "sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db", + "sha256:42194f54c11abc8583417a7cf4eaff544ce0de8187abaf5d29029c91b1725ad3", + "sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b", + "sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579", + "sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346", + "sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159", + "sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652", + "sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e", + "sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a", + "sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506", + "sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f", + "sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d", + "sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c", + "sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20", + "sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858", + "sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc", + "sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a", + "sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3", + "sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e", + "sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410", + "sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25", + "sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b", + "sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d" ], - "version": "==1.13.1" + "version": "==1.13.2" }, "chardet": { "hashes": [ @@ -275,10 +276,10 @@ }, "kombu": { "hashes": [ - "sha256:31edb84947996fdda065b6560c128d5673bb913ff34aa19e7b84755217a24deb", - "sha256:c9078124ce2616b29cf6607f0ac3db894c59154252dee6392cdbbe15e5c4b566" + "sha256:1760b54b1d15a547c9a26d3598a1c8cdaf2436386ac1f5561934bc8a3cbbbd86", + "sha256:e7465aa85a1db889116819f08c5de29520d2fa103324dcdca5e90af345f01771" ], - "version": "==4.6.5" + "version": "==4.6.6" }, "lockfile": { "hashes": [ @@ -392,11 +393,13 @@ "sha256:84156313f258eafff716b2961644a4483a9be44a5d43551d554844d15d4d224e", "sha256:8578d6b8192e4c805e85f187bc530d0f52ba86c39172e61cd51f68fddd648103", "sha256:890167d5091279a27e2505ff0e1fb273f8c48c41d35c5b92adbf4af80e6b2ed6", + "sha256:98e10634792ac0e9e7a92a76b4991b44c2325d3e7798270a808407355e7bb0a1", "sha256:9aadff9032e967865f9778485571e93908d27dab21d0fdfdec0ca779bb6f8ad9", "sha256:9f24f383a298a0c0f9b3113b982e21751a8ecde6615494a3f1470eb4a9d70e9e", "sha256:a73021b44813b5c84eda4a3af5826dd72356a900bac9bd9dd1f0f81ee1c22c2f", "sha256:afd96845e12638d2c44d213d4810a08f4dc4a563f9a98204b7428e567014b1cd", "sha256:b73ddf033d8cd4cc9dfed6324b1ad2a89ba52c410ef6877998422fcb9c23e3a8", + "sha256:b8f490f5fad1767a1331df1259763b3bad7d7af12a75b950c2843ba319b2415f", "sha256:dbc5cd56fff1a6152ca59445178652756f4e509f672e49ccdf3d79c1043113a4", "sha256:eac8a3499754790187bb00574ab980df13e754777d346f85e0ff6df929bcd964", "sha256:eaed1c65f461a959284649e37b5051224f4db6ebdc84e40b5e65f2986f101a08" @@ -427,10 +430,10 @@ }, "python-dateutil": { "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "version": "==2.8.0" + "version": "==2.8.1" }, "python-editor": { "hashes": [ @@ -491,24 +494,24 @@ }, "requests-oauthlib": { "hashes": [ - "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57", - "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140" + "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", + "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a" ], - "version": "==1.2.0" + "version": "==1.3.0" }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" ], - "version": "==1.12.0" + "version": "==1.13.0" }, "sqlalchemy": { "hashes": [ - "sha256:0f0768b5db594517e1f5e1572c73d14cf295140756431270d89496dc13d5e46c" + "sha256:afa5541e9dea8ad0014251bc9d56171ca3d8b130c9627c6cb3681cff30be3f8a" ], "index": "pypi", - "version": "==1.3.10" + "version": "==1.3.11" }, "unipath": { "hashes": [ @@ -520,10 +523,10 @@ }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", + "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" ], - "version": "==1.25.6" + "version": "==1.25.7" }, "vine": { "hashes": [ @@ -587,10 +590,10 @@ }, "astroid": { "hashes": [ - "sha256:09a3fba616519311f1af8a461f804b68f0370e100c9264a035aa7846d7852e33", - "sha256:5a79c9b4bd6c4be777424593f957c996e20beb5f74e0bc332f47713c6f675efe" + "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", + "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42" ], - "version": "==2.3.2" + "version": "==2.3.3" }, "atomicwrites": { "hashes": [ @@ -675,33 +678,44 @@ }, "coverage": { "hashes": [ - "sha256:17a417c691de3fc88de027832267313e5ed2b2ea3956745b562c4c389e44d05b", - "sha256:24307e67ebd9dc06fcbab9b7fef87412a97746c1baabb04ed8a93d5c2ccfe5ba", - "sha256:2a5d44a9d8426bd3699123864e63f008dc8dea9df22d5216a141a25d4670f22c", - "sha256:3726b8f5461e103a40e380f52b4b4ccdf2eda55d5d72f037cee43627992b4462", - "sha256:39dd15bbc4880a64399e180925bbc21c0c316a3065f6455d2512039f5cb59b94", - "sha256:3bb121f5dd156aab4fba2ebad6b0ad605bc5dc305931140dc614b101aa9d81ed", - "sha256:3bfdea9226eaed97736c973a7d6d0bbf9e1c1f1c7391c8e9c2bb2d0dbae49156", - "sha256:43be906a16239c1aa9f3742e3e6b0a5dd24781a13ce401f063262e9b4e93b69f", - "sha256:4a54cac1b39b2925041a41bcd1f191898fe401618627d7c3abf127c32a1c6dd1", - "sha256:4e58d65b90d6f26b3ccca7cf0fe573ef847347b8734af596a087a21eebb681f5", - "sha256:50229727d9baf0cd7f5ee6b194bf9dea708e9a20823d93f9e04d710b0a60e757", - "sha256:5141cdb010e9cd6939e37b8c2769d535cb535d80ef94f927c8a306f2e05a4736", - "sha256:748ba2b950425b9aef9d1bde2d6af7023585505016bd634e578f76ada4a30465", - "sha256:75e635bc6730c88b04421b25a0afc47b9b80efc1ed57630839196eb475722e50", - "sha256:78556f51dbfb33f18794eee29a4a8542fd2e301aa0d072653930793974dced03", - "sha256:7de17133509210ecc256535bab2f9a5547f3016c44f984fe12b4c10d81a4623f", - "sha256:83bf376555898fe2dc50d111a34b0152b504e454ed1e13cdcda6e5d50ba0ed5b", - "sha256:87730b5e4c3a42674fe8f0ecbb0d556c59c7e12b11a65c2178f2787252a80dfd", - "sha256:9bb7819c020c20c6200764879f0b10b323d6d4719aa7b0ae316c9e35730f9e2d", - "sha256:9c825788acb13d49ac20455433f3b862029aa497e97faba8c998555a042a6b91", - "sha256:b2bb4941c8838fc9ea2fca3c52e6dd865d39bbbc014bde249161bf8fcccf2152", - "sha256:c1b44c6c680f137910cb0f5481a2ae9899787ca7019f110a3708d9e99df941be", - "sha256:c52c2bc67bd3ff8db685f7c5f03e34a95bddd58a535630161f28d1c485d61e22", - "sha256:d6845e46338695c571759be1c770b013c477111e785b26151ec9feb6cd063543", - "sha256:e292b32dfc80d9f271af2d52df95455248322156e764763c4bfb2385b2e33533" + "sha256:2358e685d0253125da42a48396038d4c7b4cd1448c00bbc4bda0cb8c43c2a870", + "sha256:25017cf384eeed2e6caf72efd3ec4124e32a8b7a4387600499104387975400c7", + "sha256:2e2de9423ff8b14303a97eafddd16c479fbcc9a0b8b0be3b7c3843a3e0cf6d69", + "sha256:324ed908e4e40a6e2451056fe502470ad4e79495cb7a03ecab94e6309c3e117e", + "sha256:34f865a0cf6255b694a46e4383a7131c61ea72c5b4c4f81d20e522fb1e440b4b", + "sha256:3a2bcc464b60a18f1f7167b95b2773ede93bf3722bfa59e0802717f652b6cc25", + "sha256:48d70865266d649b6602e2ba94820d7972ef470d3b72a8fd41a3d17321feed3a", + "sha256:50cf23523ab3a724c6905d3b60f87fa8250d9bae3995e09f49f63effa2b54f15", + "sha256:54c84a68abd8c4c5b71878b35eb85321df41f3d144c78181867d5b026ec74994", + "sha256:5b59d661ee7f3200aedd7b71882b7927ea7ed522df75e3853f316a79ad872a2e", + "sha256:5ffb39624bc573177888a21fb301ccee46838c600b27d58c3e9dae495f44d34a", + "sha256:699b3072b7f0e69ed175a88fa8b2ec7eefc4f34d490c54ed9a52feff21a15fdc", + "sha256:79ef4a2bb862110bd585174e551a783bee5c3aa461734a2ac7429193be357589", + "sha256:8210a6f93c4a8c6d460b402e20e38399529b99200c3318542faf6a520c9b6a5c", + "sha256:8d30c10cfd0a6fdf0a2d5023de00ef7b329cd6ead2310c9e53eab79c209acb70", + "sha256:97ac79ff28f2cda6ac00a803ee582b965951755f61ab43377482bfba450b619a", + "sha256:9fe4aacacff9028ed167db108bf013510654f148d83c4857fed61d2ce0588bf2", + "sha256:a5b6395d5957d638f8b1870561607e3c39b1a236ea6cff9eafe5b9bb1db913f2", + "sha256:ab32c5fad6905986a7e34e3acf01180a69bb60c2aa7331815b46e51c776a1943", + "sha256:ad67f0cfdfecbd49b9da46a7e488e6dc32a69388740b85c36a4ef4b33082cbad", + "sha256:aedad67c30326a1af324f45833a40b97180664912deb29942459ddbe9fa0ce19", + "sha256:b077cd0e70f41366ac1f9d09275258fa1906758a5d4f31cacc18b10dfcf90784", + "sha256:b8ea210810d3c14aec7561f8fe0d3eec582d1088100aaa0bb8153d53d867d20f", + "sha256:bf572722326ce6704e863447a070039a827072b7179352570859be899b9e6551", + "sha256:c0df57e189dacd2606cae6386acf127d01d85b2bf49acd9a65543b5d6c359ddc", + "sha256:d523e75f2a8a0b4a6a8be1287c0e0e3a561b8832b05ddd987d4cd7c62f3ad3bc", + "sha256:e10593c60c5f0bfd8b241bf9f27ef2191a3005b73dde8ada0424f642543a1e59", + "sha256:e9128444c83bc260aea988bf1ca6278a33ba730955bf94720468c656b61353eb", + "sha256:f7162f2e3711f3a08a8a741f92e1f63afd58d0713177979f2cf9723dd50161cf" ], - "version": "==5.0a8" + "version": "==5.0b1" + }, + "cssselect": { + "hashes": [ + "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf", + "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc" + ], + "version": "==1.1.0" }, "decorator": { "hashes": [ @@ -734,10 +748,10 @@ }, "faker": { "hashes": [ - "sha256:5902379d8df308a204fc11c4f621590ee83975805a6c7b2228203b9defa45250", - "sha256:5e8c755c619f332d5ec28b7586389665f136bcf528e165eb925e87c06a63eda7" + "sha256:48c03580720e0b46538d528b1296e4e5b24a809dcaf33a7dddec719489a9edb8", + "sha256:6327c665c0d8721280b3036d9c9e851c60092bc1f30c8394cc433f8723e2bda5" ], - "version": "==2.0.3" + "version": "==2.0.4" }, "flask": { "hashes": [ @@ -747,6 +761,57 @@ "index": "pypi", "version": "==1.1.1" }, + "gevent": { + "hashes": [ + "sha256:1900f284d5a0486f71f8cb87bc4cda9c6117121fcbf5a4075d2a5380dccb47f6", + "sha256:206c6ddba2391af77cac8f1512556631f0da7bba3f63d2dd90e82a76d6be7922", + "sha256:2658cf03ff58e5cf82995687a45fd4668ed1e3c9fa498c804ad033b87307d9b1", + "sha256:45f7c22d68a1025ea027f0788dac8c481d0929de409ec9f81299bf48da0fcee7", + "sha256:4bb0a53c56041727c7c3e08f2c40af3b5ac6668b8a7a1f34b52488492a6cbd2f", + "sha256:7024bc3bcd2dc53c84a9c7f8b9dc9d3e970b13e80597b4c8cca32aed4a015c23", + "sha256:8d07e77ae14f9b29eb6bf5414b41d72ffd19b6b2cf88a2fb22d8b9eef847c2d7", + "sha256:95d83077d78d6232a59b40310a85bd786257e379c129f95aed2ac4676f57d022", + "sha256:9c6de6aa9365929d6747b6bf376aaf880553b1ca08c61fc8eef4ed4e31a7e34a", + "sha256:a250e1dc58fb2947491a53f039e48d4f36d921e534f751fe3917783b9d764c02", + "sha256:b45eb451132963b33bb05d84c7549c763f94eea6425cf43b7c22038cc03c245d", + "sha256:c515c4581aee2553f66ae6336b54372f4229a159b3a76d1ccb4e53147569f38f", + "sha256:c9e2520985e2cfde4c6858a541c5a731152c62c333ed843fb070691f819eb2d0" + ], + "version": "==1.5a2" + }, + "geventhttpclient-wheels": { + "hashes": [ + "sha256:1f835affa65fb0c38b111ff3529e2c7382d1154e5dc99008951f2342e24ec21d", + "sha256:205fd8fa5c658bd9fc2974b6c7a250dba7a313e054fbc5c8138d8418b0922c7d", + "sha256:3331dbeebb2531611ffd461b670d527cc1bbb98eff6ff95179a10635d914710c", + "sha256:3893dd20d123920ac91bc3cf31c74651f666c05a786e47fac8379228bf175b7e", + "sha256:39e3f60b8919bb241eb0377ab485df985684783742377dd225a88d8e7e41d955", + "sha256:413591068784eb3d2c2c7af1a57bd4d6bf26fb8225a865ae4210b46d8f487c79", + "sha256:4197d34725aa57b3b7ad48d568dec7d5e7536e2fce4179e4c6f31c8ed091fac5", + "sha256:4a883168a7f21ec0e71f6eed290dc3a87079f00da49f0b929a5b86fe5d57e4f7", + "sha256:584b993b03f7dec1545452cb0fcf9640d871af97ab1881139c991e018da97c37", + "sha256:618e4a67eb1e74196dbff0c27781ff6285e5bd16c3df230e05aae6b95a689b17", + "sha256:73a0815a97fd3dd4d0b5676012aa3e7273970174114405c3ae2f4373a1847549", + "sha256:7c78f21b9d5b4f80c17374087a16ec79d37a2918ec532553804c104ce462ccb0", + "sha256:804a901598ad046ee6925c11f987c5e81f1010599027d4bb67f4732800aae3c8", + "sha256:81e3752ea98bb673d49827727869ac637d5297928b4bc0ee41db1e1ac9ba909e", + "sha256:86c261e5ef3414d76945e00df2abaa0ae4a3c3a073cb90c5712f5c8f8fd52586", + "sha256:87769bd8c5f475ab1f23ef09705a53d6c86e8e45489edb0564b99b266a59cd73", + "sha256:996c5c7de11a9ef1c99ce649d700cd57a44c1d02a9e305e6743d09abfc21681f", + "sha256:9ab6bf060bc6cdd7baa61bf7cc044cc6c14eae8675dc3052d0c2c6d7742b5bd3", + "sha256:a779f2b8e372e7af4dae8cea70875ec40b200a38e0a53e15721b273e8b45e01b", + "sha256:a8651ef9fb8a3f2b169320bab59c11518aa51d778fb19fbf3faea4ef0485f61b", + "sha256:ae2999e1605050d81eb8b340eb63ce0f9721a7c6ce1455c47aad1440df7bd4a2", + "sha256:bd1f984ab5a52e3d6f5d54fd407a41e889dd4499f5991d234ebdc1f8907e2fb3", + "sha256:bf069512623970283bfb1c6bc3148b470116f7978bc7e57a3c7aea1f42113ca0", + "sha256:bf803c2fc7138b97a033e8d0fea8cae64783c5c4b9ca41b5101002c622b52cbd", + "sha256:c30da2ced7ca0dc5354bcecc42d5d5e8b6f8a0351186d9bf883ceead58913247", + "sha256:e158ea62cca96f8efbb24f40e8ef8a2cd625f1c42b0fb2c93df90f14a6ddf3d1", + "sha256:e493bd3eaa41bc4dd255bc390a01c92fc00a2961a9c18b550c58dbdde8dd35e4", + "sha256:fb229d67618d0dd90b5bf3c75c418804bf4cbabadd79159b6dc9b8ab6e0991c2" + ], + "version": "==1.3.1.dev2" + }, "gitdb2": { "hashes": [ "sha256:1b6df1433567a51a4a9c1a5a0de977aa351a405cc56d7d35f3388bad1f630350", @@ -761,6 +826,31 @@ ], "version": "==3.0.4" }, + "greenlet": { + "hashes": [ + "sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0", + "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28", + "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8", + "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304", + "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0", + "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214", + "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043", + "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6", + "sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625", + "sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc", + "sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638", + "sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163", + "sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4", + "sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490", + "sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248", + "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939", + "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87", + "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720", + "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656" + ], + "markers": "platform_python_implementation == 'CPython'", + "version": "==0.4.15" + }, "honcho": { "hashes": [ "sha256:af5806bf13e3b20acdcb9ff8c0beb91eee6fe07393c3448dfad89667e6ac7576", @@ -859,6 +949,45 @@ ], "version": "==1.4.3" }, + "locustio": { + "hashes": [ + "sha256:274248aeb64c067b40c97a9897f8f188ff67ca13ad78d34b8744915b5abb3989", + "sha256:ae6253b619992b6536b8432cebbc8f59533ac60ff153a14dca34ed02d0f6ae82" + ], + "index": "pypi", + "version": "==0.12.2" + }, + "lxml": { + "hashes": [ + "sha256:02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4", + "sha256:096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc", + "sha256:0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1", + "sha256:1409b14bf83a7d729f92e2a7fbfe7ec929d4883ca071b06e95c539ceedb6497c", + "sha256:17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046", + "sha256:17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36", + "sha256:1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5", + "sha256:2e8f77db25b0a96af679e64ff9bf9dddb27d379c9900c3272f3041c4d1327c9d", + "sha256:4dffd405390a45ecb95ab5ab1c1b847553c18b0ef8ed01e10c1c8b1a76452916", + "sha256:6b899931a5648862c7b88c795eddff7588fb585e81cecce20f8d9da16eff96e0", + "sha256:726c17f3e0d7a7200718c9a890ccfeab391c9133e363a577a44717c85c71db27", + "sha256:760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc", + "sha256:796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7", + "sha256:891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38", + "sha256:9277562f175d2334744ad297568677056861070399cec56ff06abbe2564d1232", + "sha256:a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5", + "sha256:a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832", + "sha256:ae88588d687bd476be588010cbbe551e9c2872b816f2da8f01f6f1fda74e1ef0", + "sha256:b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a", + "sha256:be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f", + "sha256:c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9", + "sha256:c7fccd08b14aa437fe096c71c645c0f9be0655a9b1a4b7cffc77bcb23b3d61d2", + "sha256:c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692", + "sha256:d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84", + "sha256:e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79", + "sha256:fe489d486cd00b739be826e8c1be188ddb74c7a1ca784d93d06fda882a6a1681" + ], + "version": "==4.4.1" + }, "markupsafe": { "hashes": [ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", @@ -906,6 +1035,12 @@ ], "version": "==7.2.0" }, + "msgpack-python": { + "hashes": [ + "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b" + ], + "version": "==0.5.6" + }, "mypy": { "hashes": [ "sha256:1521c186a3d200c399bd5573c828ea2db1362af7209b2adb1bb8532cea2fb36f", @@ -1018,6 +1153,14 @@ "index": "pypi", "version": "==2.4.3" }, + "pyquery": { + "hashes": [ + "sha256:710eac327b87f15f74a95c3378c6ba62ef6fcfb0a6d009a7d33349c9f7e65835", + "sha256:8fcf77c72e3d602ce10a0bd4e65f57f0945c18e15627e49130c27172d4939d98" + ], + "index": "pypi", + "version": "==1.4.1" + }, "pytest": { "hashes": [ "sha256:7e258ee50338f4e46957f9e09a0f10fb1c2d05493fa901d113a8dafd0790de4e", @@ -1066,10 +1209,10 @@ }, "python-dateutil": { "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "version": "==2.8.0" + "version": "==2.8.1" }, "pyyaml": { "hashes": [ @@ -1090,21 +1233,56 @@ "index": "pypi", "version": "==5.1.2" }, + "pyzmq": { + "hashes": [ + "sha256:01636e95a88d60118479041c6aaaaf5419c6485b7b1d37c9c4dd424b7b9f1121", + "sha256:021dba0d1436516092c624359e5da51472b11ba8edffa334218912f7e8b65467", + "sha256:0463bd941b6aead494d4035f7eebd70035293dd6caf8425993e85ad41de13fa3", + "sha256:05fd51edd81eed798fccafdd49c936b6c166ffae7b32482e4d6d6a2e196af4e6", + "sha256:1fadc8fbdf3d22753c36d4172169d184ee6654f8d6539e7af25029643363c490", + "sha256:22efa0596cf245a78a99060fe5682c4cd00c58bb7614271129215c889062db80", + "sha256:260c70b7c018905ec3659d0f04db735ac830fe27236e43b9dc0532cf7c9873ef", + "sha256:2762c45e289732d4450406cedca35a9d4d71e449131ba2f491e0bf473e3d2ff2", + "sha256:2fc6cada8dc53521c1189596f1898d45c5f68603194d3a6453d6db4b27f4e12e", + "sha256:343b9710a61f2b167673bea1974e70b5dccfe64b5ed10626798f08c1f7227e72", + "sha256:41bf96d5f554598a0632c3ec28e3026f1d6591a50f580df38eff0b8067efb9e7", + "sha256:51c2579e5daab2d039957713174061a0ba3a2c12235e9a493155287d172c1ccd", + "sha256:856b2cdf7a1e2cbb84928e1e8db0ea4018709b39804103d3a409e5584f553f57", + "sha256:85b869abc894672de9aecdf032158ea8ad01e2f0c3b09ef60e3687fb79418096", + "sha256:9055ed3f443edae7dc80f253fc54257f8455fc3062a7832c60887409e27c9f82", + "sha256:93f44739db69234c013a16990e43db1aa0af3cf5a4b8b377d028ff24515fbeb3", + "sha256:98fa3e75ccb22c0dc99654e3dd9ff693b956861459e8c8e8734dd6247b89eb29", + "sha256:9a22c94d2e93af8bebd4fcf5fa38830f5e3b1ff0d4424e2912b07651eb1bafb4", + "sha256:a7d3f4b4bbb5d7866ae727763268b5c15797cbd7b63ea17f3b0ec1067da8994b", + "sha256:b0117e8b87e29c3a195b10a5c42910b2ad10b139e7fa319d1d6f2e18c50e69b1", + "sha256:b645a49376547b3816433a7e2d2a99135c8e651e50497e7ecac3bd126e4bea16", + "sha256:cf0765822e78cf9e45451647a346d443f66792aba906bc340f4e0ac7870c169c", + "sha256:dc398e1e047efb18bfab7a8989346c6921a847feae2cad69fedf6ca12fb99e2c", + "sha256:dd5995ae2e80044e33b5077fb4bc2b0c1788ac6feaf15a6b87a00c14b4bdd682", + "sha256:e03fe5e07e70f245dc9013a9d48ae8cc4b10c33a1968039c5a3b64b5d01d083d", + "sha256:ea09a306144dff2795e48439883349819bef2c53c0ee62a3c2fae429451843bb", + "sha256:f4e37f33da282c3c319849877e34f97f0a3acec09622ec61b7333205bdd13b52", + "sha256:fa4bad0d1d173dee3e8ef3c3eb6b2bb6c723fc7a661eeecc1ecb2fa99860dd45" + ], + "version": "==18.1.0" + }, "regex": { "hashes": [ - "sha256:1e9f9bc44ca195baf0040b1938e6801d2f3409661c15fe57f8164c678cfc663f", - "sha256:587b62d48ca359d2d4f02d486f1f0aa9a20fbaf23a9d4198c4bed72ab2f6c849", - "sha256:835ccdcdc612821edf132c20aef3eaaecfb884c9454fdc480d5887562594ac61", - "sha256:93f6c9da57e704e128d90736430c5c59dd733327882b371b0cae8833106c2a21", - "sha256:a46f27d267665016acb3ec8c6046ec5eae8cf80befe85ba47f43c6f5ec636dcd", - "sha256:c5c8999b3a341b21ac2c6ec704cfcccbc50f1fedd61b6a8ee915ca7fd4b0a557", - "sha256:d4d1829cf97632673aa49f378b0a2c3925acd795148c5ace8ef854217abbee89", - "sha256:d96479257e8e4d1d7800adb26bf9c5ca5bab1648a1eddcac84d107b73dc68327", - "sha256:f20f4912daf443220436759858f96fefbfc6c6ba9e67835fd6e4e9b73582791a", - "sha256:f2b37b5b2c2a9d56d9e88efef200ec09c36c7f323f9d58d0b985a90923df386d", - "sha256:fe765b809a1f7ce642c2edeee351e7ebd84391640031ba4b60af8d91a9045890" + "sha256:15454b37c5a278f46f7aa2d9339bda450c300617ca2fca6558d05d870245edc7", + "sha256:1ad40708c255943a227e778b022c6497c129ad614bb7a2a2f916e12e8a359ee7", + "sha256:5e00f65cc507d13ab4dfa92c1232d004fa202c1d43a32a13940ab8a5afe2fb96", + "sha256:604dc563a02a74d70ae1f55208ddc9bfb6d9f470f6d1a5054c4bd5ae58744ab1", + "sha256:720e34a539a76a1fedcebe4397290604cc2bdf6f81eca44adb9fb2ea071c0c69", + "sha256:7caf47e4a9ac6ef08cabd3442cc4ca3386db141fb3c8b2a7e202d0470028e910", + "sha256:7faf534c1841c09d8fefa60ccde7b9903c9b528853ecf41628689793290ca143", + "sha256:b4e0406d822aa4993ac45072a584d57aa4931cf8288b5455bbf30c1d59dbad59", + "sha256:c31eaf28c6fe75ea329add0022efeed249e37861c19681960f99bbc7db981fb2", + "sha256:c7393597191fc2043c744db021643549061e12abe0b3ff5c429d806de7b93b66", + "sha256:d2b302f8cdd82c8f48e9de749d1d17f85ce9a0f082880b9a4859f66b07037dc6", + "sha256:e3d8dd0ec0ea280cf89026b0898971f5750a7bd92cb62c51af5a52abd020054a", + "sha256:ec032cbfed59bd5a4b8eab943c310acfaaa81394e14f44454ad5c9eba4f24a74" ], - "version": "==2019.8.19" + "version": "==2019.11.1" }, "requests": { "hashes": [ @@ -1133,10 +1311,10 @@ }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" ], - "version": "==1.12.0" + "version": "==1.13.0" }, "smmap2": { "hashes": [ @@ -1147,10 +1325,10 @@ }, "soupsieve": { "hashes": [ - "sha256:605f89ad5fdbfefe30cdc293303665eff2d188865d4dbe4eb510bba1edfbfce3", - "sha256:b91d676b330a0ebd5b21719cb6e9b57c57d433671f65b9c28dd3461d9a1ed0b6" + "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5", + "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda" ], - "version": "==1.9.4" + "version": "==1.9.5" }, "stevedore": { "hashes": [ @@ -1216,10 +1394,10 @@ }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", + "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" ], - "version": "==1.25.6" + "version": "==1.25.7" }, "watchdog": { "hashes": [ From 217a3bce0996c4937d7c4bcd669cdf57343a47c0 Mon Sep 17 00:00:00 2001 From: tomdds Date: Wed, 13 Nov 2019 17:10:21 -0500 Subject: [PATCH 2/9] Basic load test file to query and create portfolios, apps and environments --- tests/locustfile.py | 158 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 tests/locustfile.py diff --git a/tests/locustfile.py b/tests/locustfile.py new file mode 100644 index 00000000..b50114a4 --- /dev/null +++ b/tests/locustfile.py @@ -0,0 +1,158 @@ +import os +from random import choice, choices, randint +from urllib.parse import urlparse + +from locust import HttpLocust, TaskSequence, seq_task + +from pyquery import PyQuery as pq + +username = os.getenv("ATAT_BA_USERNAME", "") +password = os.getenv("ATAT_BA_PASSWORD", "") + +LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" + + +def login(l): + l.client.get("/login-dev", auth=(username, password)) + + +def logout(l): + l.client.get("/logout") + + +def get_index(l): + l.client.get("/") + + +def get_portfolios(l): + response = l.client.get("/portfolios") + d = pq(response.text) + portfolio_links = [ + p.attr("href") + for p in d( + ".global-panel-container .atat-table tbody tr td:first-child a" + ).items() + ] + force_new_portfolio = randint(0, 10) > 9 + if len(portfolio_links) == 0 or force_new_portfolio: + portfolio_links += [create_portfolio(l)] + + l.locust.portfolio_links = portfolio_links + + +def get_portfolio(l): + portfolio_link = choice(l.locust.portfolio_links) + response = l.client.get(portfolio_link) + d = pq(response.text) + application_links = [ + p.attr("href") + for p in d(".application-list .accordion__actions a:first-child").items() + ] + if len(application_links) > 0: + portfolio_id = portfolio_link.split("/")[-2] + update_app_registry(l, portfolio_id, application_links) + + +def update_app_registry(l, portfolio_id, app_links): + if not hasattr(l.locust, "app_links"): + l.locust.app_links = {} + l.locust.app_links[portfolio_id] = app_links + + +def get_app(l): + app_link = pick_app(l) + force_new_app = randint(0, 10) > 9 + if app_link is not None and not force_new_app: + l.client.get(app_link) + else: + portfolio_id = choice(l.locust.portfolio_links).split("/")[-2] + update_app_registry(l, portfolio_id, create_new_app(l, portfolio_id)) + + +def pick_app(l): + if hasattr(l.locust, "app_links") and len(l.locust.app_links.items()) > 0: + return choice(choice(list(l.locust.app_links.values()))) + + +def create_new_app(l, portfolio_id): + create_app_body = { + "name": f"Load Test Created - {''.join(choices(LETTERS, k=5))}", + "description": "Description", + } + + create_app_url = f"/portfolios/{portfolio_id}/applications/new" + + create_app_response = l.client.post(create_app_url, create_app_body) + + application_id = create_app_response.url.split("/")[-3] + + create_environments_body = { + "environment_names-0": "Development", + "environment_names-1": "Testing", + "environment_names-2": "Staging", + "environment_names-3": "Production", + } + + create_environments_url = ( + f"/applications/{application_id}/new/step_2?portfolio_id={portfolio_id}" + ) + + l.client.post(create_environments_url, create_environments_body) + + return f"/applications/{application_id}/settings" + + +def create_portfolio(l): + new_portfolio_body = { + "name": f"Load Test Created - {''.join(choices(LETTERS, k=5))}", + "defense_component": "Army, Department of the", + "description": "Test", + "app_migration": "none", + "native_apps": "yes", + "complexity": "storage", + "complexity_other": "", + "dev_team": "civilians", + "dev_team_other": "", + "team_experience": "none", + } + + response = l.client.post("/portfolios", new_portfolio_body) + + return urlparse(response.url).path + + +class UserBehavior(TaskSequence): + def on_start(self): + self.client.verify = False + login(self) + + @seq_task(1) + def home(l): + get_index(l) + + @seq_task(2) + def portfolios(l): + get_portfolios(l) + + @seq_task(3) + def pick_a_portfolio(l): + get_portfolio(l) + + @seq_task(4) + def pick_an_app(l): + get_app(l) + + def on_stop(self): + logout(self) + + +class WebsiteUser(HttpLocust): + task_set = UserBehavior + min_wait = 3000 + max_wait = 9000 + + +if __name__ == "__main__": + # if run as the main file, will spin up a single locust + # and run through the sequence as it + WebsiteUser().run() From d1ef106ea35f07cc0762323c110dbd3420adc290 Mon Sep 17 00:00:00 2001 From: tomdds Date: Thu, 14 Nov 2019 11:53:32 -0500 Subject: [PATCH 3/9] Dockerize locust and tweak script for configurability --- load-test/Dockerfile | 7 +++++++ {tests => load-test}/locustfile.py | 15 ++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 load-test/Dockerfile rename {tests => load-test}/locustfile.py (90%) diff --git a/load-test/Dockerfile b/load-test/Dockerfile new file mode 100644 index 00000000..344dd107 --- /dev/null +++ b/load-test/Dockerfile @@ -0,0 +1,7 @@ +FROM locustio/locust +USER root +RUN apk update && apk --no-cache add g++ gcc libxslt-dev +RUN pip install pyquery +USER locust +ADD locustfile.py locustfile.py + diff --git a/tests/locustfile.py b/load-test/locustfile.py similarity index 90% rename from tests/locustfile.py rename to load-test/locustfile.py index b50114a4..1a4d73ca 100644 --- a/tests/locustfile.py +++ b/load-test/locustfile.py @@ -6,14 +6,19 @@ from locust import HttpLocust, TaskSequence, seq_task from pyquery import PyQuery as pq -username = os.getenv("ATAT_BA_USERNAME", "") -password = os.getenv("ATAT_BA_PASSWORD", "") +# Provide username/password for basic auth +USERNAME = os.getenv("ATAT_BA_USERNAME", "") +PASSWORD = os.getenv("ATAT_BA_PASSWORD", "") +# Ability to disable SSL verification for bad cert situations +DISABLE_VERIFY = os.getenv("DISABLE_VERIFY", "true").lower() == "true" + +# Alpha numerics for random entity names LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" def login(l): - l.client.get("/login-dev", auth=(username, password)) + l.client.get("/login-dev", auth=(USERNAME, PASSWORD)) def logout(l): @@ -123,7 +128,7 @@ def create_portfolio(l): class UserBehavior(TaskSequence): def on_start(self): - self.client.verify = False + self.client.verify = not DISABLE_VERIFY login(self) @seq_task(1) @@ -154,5 +159,5 @@ class WebsiteUser(HttpLocust): if __name__ == "__main__": # if run as the main file, will spin up a single locust - # and run through the sequence as it WebsiteUser().run() + From c5c667a4364a1fe97e9d0c04a229c39e836c9719 Mon Sep 17 00:00:00 2001 From: tomdds Date: Thu, 14 Nov 2019 12:52:59 -0500 Subject: [PATCH 4/9] Remove load-test dependencies from main project --- Pipfile | 2 - Pipfile.lock | 183 ++------------------------------------------------- 2 files changed, 7 insertions(+), 178 deletions(-) diff --git a/Pipfile b/Pipfile index 8e13e70f..6456afb1 100644 --- a/Pipfile +++ b/Pipfile @@ -50,8 +50,6 @@ detect-secrets = "*" beautifulsoup4 = "*" mypy = "*" rope = "*" -pyquery = "*" -locustio = "*" [requires] python_version = "3.7.3" diff --git a/Pipfile.lock b/Pipfile.lock index d24c8e1d..9c5233bb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9ff049f8e866d03eb0ef15a65164fd36aa86c503ff0efc597acaf062a41154f4" + "sha256": "6d2ab855267daac877ae7464de9dba5b62b7d89288992f87d8fc6ff0c0d2520f" }, "pipfile-spec": 6, "requires": { @@ -710,13 +710,6 @@ ], "version": "==5.0b1" }, - "cssselect": { - "hashes": [ - "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf", - "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc" - ], - "version": "==1.1.0" - }, "decorator": { "hashes": [ "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce", @@ -761,57 +754,6 @@ "index": "pypi", "version": "==1.1.1" }, - "gevent": { - "hashes": [ - "sha256:1900f284d5a0486f71f8cb87bc4cda9c6117121fcbf5a4075d2a5380dccb47f6", - "sha256:206c6ddba2391af77cac8f1512556631f0da7bba3f63d2dd90e82a76d6be7922", - "sha256:2658cf03ff58e5cf82995687a45fd4668ed1e3c9fa498c804ad033b87307d9b1", - "sha256:45f7c22d68a1025ea027f0788dac8c481d0929de409ec9f81299bf48da0fcee7", - "sha256:4bb0a53c56041727c7c3e08f2c40af3b5ac6668b8a7a1f34b52488492a6cbd2f", - "sha256:7024bc3bcd2dc53c84a9c7f8b9dc9d3e970b13e80597b4c8cca32aed4a015c23", - "sha256:8d07e77ae14f9b29eb6bf5414b41d72ffd19b6b2cf88a2fb22d8b9eef847c2d7", - "sha256:95d83077d78d6232a59b40310a85bd786257e379c129f95aed2ac4676f57d022", - "sha256:9c6de6aa9365929d6747b6bf376aaf880553b1ca08c61fc8eef4ed4e31a7e34a", - "sha256:a250e1dc58fb2947491a53f039e48d4f36d921e534f751fe3917783b9d764c02", - "sha256:b45eb451132963b33bb05d84c7549c763f94eea6425cf43b7c22038cc03c245d", - "sha256:c515c4581aee2553f66ae6336b54372f4229a159b3a76d1ccb4e53147569f38f", - "sha256:c9e2520985e2cfde4c6858a541c5a731152c62c333ed843fb070691f819eb2d0" - ], - "version": "==1.5a2" - }, - "geventhttpclient-wheels": { - "hashes": [ - "sha256:1f835affa65fb0c38b111ff3529e2c7382d1154e5dc99008951f2342e24ec21d", - "sha256:205fd8fa5c658bd9fc2974b6c7a250dba7a313e054fbc5c8138d8418b0922c7d", - "sha256:3331dbeebb2531611ffd461b670d527cc1bbb98eff6ff95179a10635d914710c", - "sha256:3893dd20d123920ac91bc3cf31c74651f666c05a786e47fac8379228bf175b7e", - "sha256:39e3f60b8919bb241eb0377ab485df985684783742377dd225a88d8e7e41d955", - "sha256:413591068784eb3d2c2c7af1a57bd4d6bf26fb8225a865ae4210b46d8f487c79", - "sha256:4197d34725aa57b3b7ad48d568dec7d5e7536e2fce4179e4c6f31c8ed091fac5", - "sha256:4a883168a7f21ec0e71f6eed290dc3a87079f00da49f0b929a5b86fe5d57e4f7", - "sha256:584b993b03f7dec1545452cb0fcf9640d871af97ab1881139c991e018da97c37", - "sha256:618e4a67eb1e74196dbff0c27781ff6285e5bd16c3df230e05aae6b95a689b17", - "sha256:73a0815a97fd3dd4d0b5676012aa3e7273970174114405c3ae2f4373a1847549", - "sha256:7c78f21b9d5b4f80c17374087a16ec79d37a2918ec532553804c104ce462ccb0", - "sha256:804a901598ad046ee6925c11f987c5e81f1010599027d4bb67f4732800aae3c8", - "sha256:81e3752ea98bb673d49827727869ac637d5297928b4bc0ee41db1e1ac9ba909e", - "sha256:86c261e5ef3414d76945e00df2abaa0ae4a3c3a073cb90c5712f5c8f8fd52586", - "sha256:87769bd8c5f475ab1f23ef09705a53d6c86e8e45489edb0564b99b266a59cd73", - "sha256:996c5c7de11a9ef1c99ce649d700cd57a44c1d02a9e305e6743d09abfc21681f", - "sha256:9ab6bf060bc6cdd7baa61bf7cc044cc6c14eae8675dc3052d0c2c6d7742b5bd3", - "sha256:a779f2b8e372e7af4dae8cea70875ec40b200a38e0a53e15721b273e8b45e01b", - "sha256:a8651ef9fb8a3f2b169320bab59c11518aa51d778fb19fbf3faea4ef0485f61b", - "sha256:ae2999e1605050d81eb8b340eb63ce0f9721a7c6ce1455c47aad1440df7bd4a2", - "sha256:bd1f984ab5a52e3d6f5d54fd407a41e889dd4499f5991d234ebdc1f8907e2fb3", - "sha256:bf069512623970283bfb1c6bc3148b470116f7978bc7e57a3c7aea1f42113ca0", - "sha256:bf803c2fc7138b97a033e8d0fea8cae64783c5c4b9ca41b5101002c622b52cbd", - "sha256:c30da2ced7ca0dc5354bcecc42d5d5e8b6f8a0351186d9bf883ceead58913247", - "sha256:e158ea62cca96f8efbb24f40e8ef8a2cd625f1c42b0fb2c93df90f14a6ddf3d1", - "sha256:e493bd3eaa41bc4dd255bc390a01c92fc00a2961a9c18b550c58dbdde8dd35e4", - "sha256:fb229d67618d0dd90b5bf3c75c418804bf4cbabadd79159b6dc9b8ab6e0991c2" - ], - "version": "==1.3.1.dev2" - }, "gitdb2": { "hashes": [ "sha256:1b6df1433567a51a4a9c1a5a0de977aa351a405cc56d7d35f3388bad1f630350", @@ -821,35 +763,10 @@ }, "gitpython": { "hashes": [ - "sha256:3237caca1139d0a7aa072f6735f5fd2520de52195e0fa1d8b83a9b212a2498b2", - "sha256:a7d6bef0775f66ba47f25911d285bcd692ce9053837ff48a120c2b8cf3a71389" + "sha256:9c2398ffc3dcb3c40b27324b316f08a4f93ad646d5a6328cafbb871aa79f5e42", + "sha256:c155c6a2653593ccb300462f6ef533583a913e17857cfef8fc617c246b6dc245" ], - "version": "==3.0.4" - }, - "greenlet": { - "hashes": [ - "sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0", - "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28", - "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8", - "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304", - "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0", - "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214", - "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043", - "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6", - "sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625", - "sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc", - "sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638", - "sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163", - "sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4", - "sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490", - "sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248", - "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939", - "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87", - "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720", - "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656" - ], - "markers": "platform_python_implementation == 'CPython'", - "version": "==0.4.15" + "version": "==3.0.5" }, "honcho": { "hashes": [ @@ -949,45 +866,6 @@ ], "version": "==1.4.3" }, - "locustio": { - "hashes": [ - "sha256:274248aeb64c067b40c97a9897f8f188ff67ca13ad78d34b8744915b5abb3989", - "sha256:ae6253b619992b6536b8432cebbc8f59533ac60ff153a14dca34ed02d0f6ae82" - ], - "index": "pypi", - "version": "==0.12.2" - }, - "lxml": { - "hashes": [ - "sha256:02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4", - "sha256:096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc", - "sha256:0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1", - "sha256:1409b14bf83a7d729f92e2a7fbfe7ec929d4883ca071b06e95c539ceedb6497c", - "sha256:17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046", - "sha256:17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36", - "sha256:1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5", - "sha256:2e8f77db25b0a96af679e64ff9bf9dddb27d379c9900c3272f3041c4d1327c9d", - "sha256:4dffd405390a45ecb95ab5ab1c1b847553c18b0ef8ed01e10c1c8b1a76452916", - "sha256:6b899931a5648862c7b88c795eddff7588fb585e81cecce20f8d9da16eff96e0", - "sha256:726c17f3e0d7a7200718c9a890ccfeab391c9133e363a577a44717c85c71db27", - "sha256:760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc", - "sha256:796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7", - "sha256:891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38", - "sha256:9277562f175d2334744ad297568677056861070399cec56ff06abbe2564d1232", - "sha256:a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5", - "sha256:a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832", - "sha256:ae88588d687bd476be588010cbbe551e9c2872b816f2da8f01f6f1fda74e1ef0", - "sha256:b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a", - "sha256:be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f", - "sha256:c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9", - "sha256:c7fccd08b14aa437fe096c71c645c0f9be0655a9b1a4b7cffc77bcb23b3d61d2", - "sha256:c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692", - "sha256:d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84", - "sha256:e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79", - "sha256:fe489d486cd00b739be826e8c1be188ddb74c7a1ca784d93d06fda882a6a1681" - ], - "version": "==4.4.1" - }, "markupsafe": { "hashes": [ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", @@ -1035,12 +913,6 @@ ], "version": "==7.2.0" }, - "msgpack-python": { - "hashes": [ - "sha256:378cc8a6d3545b532dfd149da715abae4fda2a3adb6d74e525d0d5e51f46909b" - ], - "version": "==0.5.6" - }, "mypy": { "hashes": [ "sha256:1521c186a3d200c399bd5573c828ea2db1362af7209b2adb1bb8532cea2fb36f", @@ -1147,19 +1019,11 @@ }, "pylint": { "hashes": [ - "sha256:7b76045426c650d2b0f02fc47c14d7934d17898779da95288a74c2a7ec440702", - "sha256:856476331f3e26598017290fd65bebe81c960e806776f324093a46b76fb2d1c0" + "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd", + "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4" ], "index": "pypi", - "version": "==2.4.3" - }, - "pyquery": { - "hashes": [ - "sha256:710eac327b87f15f74a95c3378c6ba62ef6fcfb0a6d009a7d33349c9f7e65835", - "sha256:8fcf77c72e3d602ce10a0bd4e65f57f0945c18e15627e49130c27172d4939d98" - ], - "index": "pypi", - "version": "==1.4.1" + "version": "==2.4.4" }, "pytest": { "hashes": [ @@ -1233,39 +1097,6 @@ "index": "pypi", "version": "==5.1.2" }, - "pyzmq": { - "hashes": [ - "sha256:01636e95a88d60118479041c6aaaaf5419c6485b7b1d37c9c4dd424b7b9f1121", - "sha256:021dba0d1436516092c624359e5da51472b11ba8edffa334218912f7e8b65467", - "sha256:0463bd941b6aead494d4035f7eebd70035293dd6caf8425993e85ad41de13fa3", - "sha256:05fd51edd81eed798fccafdd49c936b6c166ffae7b32482e4d6d6a2e196af4e6", - "sha256:1fadc8fbdf3d22753c36d4172169d184ee6654f8d6539e7af25029643363c490", - "sha256:22efa0596cf245a78a99060fe5682c4cd00c58bb7614271129215c889062db80", - "sha256:260c70b7c018905ec3659d0f04db735ac830fe27236e43b9dc0532cf7c9873ef", - "sha256:2762c45e289732d4450406cedca35a9d4d71e449131ba2f491e0bf473e3d2ff2", - "sha256:2fc6cada8dc53521c1189596f1898d45c5f68603194d3a6453d6db4b27f4e12e", - "sha256:343b9710a61f2b167673bea1974e70b5dccfe64b5ed10626798f08c1f7227e72", - "sha256:41bf96d5f554598a0632c3ec28e3026f1d6591a50f580df38eff0b8067efb9e7", - "sha256:51c2579e5daab2d039957713174061a0ba3a2c12235e9a493155287d172c1ccd", - "sha256:856b2cdf7a1e2cbb84928e1e8db0ea4018709b39804103d3a409e5584f553f57", - "sha256:85b869abc894672de9aecdf032158ea8ad01e2f0c3b09ef60e3687fb79418096", - "sha256:9055ed3f443edae7dc80f253fc54257f8455fc3062a7832c60887409e27c9f82", - "sha256:93f44739db69234c013a16990e43db1aa0af3cf5a4b8b377d028ff24515fbeb3", - "sha256:98fa3e75ccb22c0dc99654e3dd9ff693b956861459e8c8e8734dd6247b89eb29", - "sha256:9a22c94d2e93af8bebd4fcf5fa38830f5e3b1ff0d4424e2912b07651eb1bafb4", - "sha256:a7d3f4b4bbb5d7866ae727763268b5c15797cbd7b63ea17f3b0ec1067da8994b", - "sha256:b0117e8b87e29c3a195b10a5c42910b2ad10b139e7fa319d1d6f2e18c50e69b1", - "sha256:b645a49376547b3816433a7e2d2a99135c8e651e50497e7ecac3bd126e4bea16", - "sha256:cf0765822e78cf9e45451647a346d443f66792aba906bc340f4e0ac7870c169c", - "sha256:dc398e1e047efb18bfab7a8989346c6921a847feae2cad69fedf6ca12fb99e2c", - "sha256:dd5995ae2e80044e33b5077fb4bc2b0c1788ac6feaf15a6b87a00c14b4bdd682", - "sha256:e03fe5e07e70f245dc9013a9d48ae8cc4b10c33a1968039c5a3b64b5d01d083d", - "sha256:ea09a306144dff2795e48439883349819bef2c53c0ee62a3c2fae429451843bb", - "sha256:f4e37f33da282c3c319849877e34f97f0a3acec09622ec61b7333205bdd13b52", - "sha256:fa4bad0d1d173dee3e8ef3c3eb6b2bb6c723fc7a661eeecc1ecb2fa99860dd45" - ], - "version": "==18.1.0" - }, "regex": { "hashes": [ "sha256:15454b37c5a278f46f7aa2d9339bda450c300617ca2fca6558d05d870245edc7", From 03d816884b8de11e67d249c6885810eaefe42b3d Mon Sep 17 00:00:00 2001 From: tomdds Date: Fri, 15 Nov 2019 15:10:24 -0500 Subject: [PATCH 5/9] Expose locust port, add csrf support, and fix app_links --- load-test/Dockerfile | 2 +- load-test/locustfile.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/load-test/Dockerfile b/load-test/Dockerfile index 344dd107..e694d910 100644 --- a/load-test/Dockerfile +++ b/load-test/Dockerfile @@ -4,4 +4,4 @@ RUN apk update && apk --no-cache add g++ gcc libxslt-dev RUN pip install pyquery USER locust ADD locustfile.py locustfile.py - +EXPOSE 8089 diff --git a/load-test/locustfile.py b/load-test/locustfile.py index 1a4d73ca..4fbd64c7 100644 --- a/load-test/locustfile.py +++ b/load-test/locustfile.py @@ -29,6 +29,11 @@ def get_index(l): l.client.get("/") +def get_csrf_token(response): + d = pq(response.text) + return d("#csrf_token").val() + + def get_portfolios(l): response = l.client.get("/portfolios") d = pq(response.text) @@ -71,7 +76,7 @@ def get_app(l): l.client.get(app_link) else: portfolio_id = choice(l.locust.portfolio_links).split("/")[-2] - update_app_registry(l, portfolio_id, create_new_app(l, portfolio_id)) + update_app_registry(l, portfolio_id, [create_new_app(l, portfolio_id)]) def pick_app(l): @@ -80,24 +85,26 @@ def pick_app(l): def create_new_app(l, portfolio_id): + create_app_url = f"/portfolios/{portfolio_id}/applications/new" + new_app_form = l.client.get(create_app_url) + create_app_body = { "name": f"Load Test Created - {''.join(choices(LETTERS, k=5))}", "description": "Description", + "csrf_token": get_csrf_token(new_app_form), } - create_app_url = f"/portfolios/{portfolio_id}/applications/new" - create_app_response = l.client.post(create_app_url, create_app_body) - application_id = create_app_response.url.split("/")[-3] - create_environments_body = { "environment_names-0": "Development", "environment_names-1": "Testing", "environment_names-2": "Staging", "environment_names-3": "Production", + "csrf_token": get_csrf_token(create_app_response), } + application_id = create_app_response.url.split("/")[-3] create_environments_url = ( f"/applications/{application_id}/new/step_2?portfolio_id={portfolio_id}" ) @@ -108,6 +115,7 @@ def create_new_app(l, portfolio_id): def create_portfolio(l): + new_portfolio_form = l.client.get("/portfolios/new") new_portfolio_body = { "name": f"Load Test Created - {''.join(choices(LETTERS, k=5))}", "defense_component": "Army, Department of the", @@ -119,6 +127,7 @@ def create_portfolio(l): "dev_team": "civilians", "dev_team_other": "", "team_experience": "none", + "csrf_token": get_csrf_token(new_portfolio_form), } response = l.client.post("/portfolios", new_portfolio_body) From 9b64d26961ce2b07004f3e6de4c5491af2256abf Mon Sep 17 00:00:00 2001 From: tomdds Date: Mon, 18 Nov 2019 13:47:17 -0500 Subject: [PATCH 6/9] Extract new entity creation percentages to constants --- load-test/locustfile.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/load-test/locustfile.py b/load-test/locustfile.py index 4fbd64c7..4f08d4ee 100644 --- a/load-test/locustfile.py +++ b/load-test/locustfile.py @@ -1,5 +1,5 @@ import os -from random import choice, choices, randint +from random import choice, choices, randrange from urllib.parse import urlparse from locust import HttpLocust, TaskSequence, seq_task @@ -16,6 +16,9 @@ DISABLE_VERIFY = os.getenv("DISABLE_VERIFY", "true").lower() == "true" # Alpha numerics for random entity names LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" +NEW_PORTFOLIO_CHANCE = 10 +NEW_APPLICATION_CHANCE = 10 + def login(l): l.client.get("/login-dev", auth=(USERNAME, PASSWORD)) @@ -43,7 +46,7 @@ def get_portfolios(l): ".global-panel-container .atat-table tbody tr td:first-child a" ).items() ] - force_new_portfolio = randint(0, 10) > 9 + force_new_portfolio = randrange(0, 100) < NEW_PORTFOLIO_CHANCE if len(portfolio_links) == 0 or force_new_portfolio: portfolio_links += [create_portfolio(l)] @@ -71,7 +74,7 @@ def update_app_registry(l, portfolio_id, app_links): def get_app(l): app_link = pick_app(l) - force_new_app = randint(0, 10) > 9 + force_new_app = randrange(0, 100) < NEW_APPLICATION_CHANCE if app_link is not None and not force_new_app: l.client.get(app_link) else: From 84e5fa9bd1a6a200782db230d011f2cc647dc8cb Mon Sep 17 00:00:00 2001 From: tomdds Date: Mon, 18 Nov 2019 13:47:42 -0500 Subject: [PATCH 7/9] Improve id extraction for apps and portfolios --- load-test/locustfile.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/load-test/locustfile.py b/load-test/locustfile.py index 4f08d4ee..967ecbb5 100644 --- a/load-test/locustfile.py +++ b/load-test/locustfile.py @@ -1,4 +1,5 @@ import os +import re from random import choice, choices, randrange from urllib.parse import urlparse @@ -37,6 +38,19 @@ def get_csrf_token(response): return d("#csrf_token").val() +def extract_id(path): + entity_id_matcher = re.compile( + ".*\/?(?:portfolios|applications)\/([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}).*", + re.I, + ) + + entity_id_match = entity_id_matcher.match(path) + + assert entity_id_match is not None, f"Could not find id in {path}" + if entity_id_match: + return entity_id_match.group(1) + + def get_portfolios(l): response = l.client.get("/portfolios") d = pq(response.text) @@ -62,7 +76,7 @@ def get_portfolio(l): for p in d(".application-list .accordion__actions a:first-child").items() ] if len(application_links) > 0: - portfolio_id = portfolio_link.split("/")[-2] + portfolio_id = extract_id(portfolio_link) update_app_registry(l, portfolio_id, application_links) @@ -78,7 +92,7 @@ def get_app(l): if app_link is not None and not force_new_app: l.client.get(app_link) else: - portfolio_id = choice(l.locust.portfolio_links).split("/")[-2] + portfolio_id = extract_id(choice(l.locust.portfolio_links)) update_app_registry(l, portfolio_id, [create_new_app(l, portfolio_id)]) @@ -98,6 +112,7 @@ def create_new_app(l, portfolio_id): } create_app_response = l.client.post(create_app_url, create_app_body) + application_id = extract_id(create_app_response.url) create_environments_body = { "environment_names-0": "Development", @@ -107,7 +122,6 @@ def create_new_app(l, portfolio_id): "csrf_token": get_csrf_token(create_app_response), } - application_id = create_app_response.url.split("/")[-3] create_environments_url = ( f"/applications/{application_id}/new/step_2?portfolio_id={portfolio_id}" ) From a4c106ee0f3b7c2920885db831678e80cffb648a Mon Sep 17 00:00:00 2001 From: tomdds Date: Mon, 18 Nov 2019 14:30:34 -0500 Subject: [PATCH 8/9] Add referer headers to load tests for csrf --- load-test/locustfile.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/load-test/locustfile.py b/load-test/locustfile.py index 967ecbb5..0ed2bd63 100644 --- a/load-test/locustfile.py +++ b/load-test/locustfile.py @@ -111,7 +111,11 @@ def create_new_app(l, portfolio_id): "csrf_token": get_csrf_token(new_app_form), } - create_app_response = l.client.post(create_app_url, create_app_body) + create_app_response = l.client.post( + create_app_url, + create_app_body, + headers={"Referer": l.parent.host + create_app_url}, + ) application_id = extract_id(create_app_response.url) create_environments_body = { @@ -122,11 +126,13 @@ def create_new_app(l, portfolio_id): "csrf_token": get_csrf_token(create_app_response), } - create_environments_url = ( - f"/applications/{application_id}/new/step_2?portfolio_id={portfolio_id}" - ) + create_environments_url = f"/applications/{application_id}/new/step_2" - l.client.post(create_environments_url, create_environments_body) + l.client.post( + create_environments_url + f"?portfolio_id={portfolio_id}", + create_environments_body, + headers={"Referer": l.parent.host + create_environments_url}, + ) return f"/applications/{application_id}/settings" @@ -147,7 +153,11 @@ def create_portfolio(l): "csrf_token": get_csrf_token(new_portfolio_form), } - response = l.client.post("/portfolios", new_portfolio_body) + response = l.client.post( + "/portfolios", + new_portfolio_body, + headers={"Referer": l.parent.host + "/portfolios"}, + ) return urlparse(response.url).path From e08c5b278efe34135e9da691511209106fea4ead Mon Sep 17 00:00:00 2001 From: tomdds Date: Mon, 18 Nov 2019 15:13:23 -0500 Subject: [PATCH 9/9] Add load testing readme --- load-test/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 load-test/README.md diff --git a/load-test/README.md b/load-test/README.md new file mode 100644 index 00000000..790cb4e0 --- /dev/null +++ b/load-test/README.md @@ -0,0 +1,44 @@ +# Load Testing + +We're using [Locust.io](https://locust.io/) for our load tests. The tests can be run locally or in a VM. + +## Available Option (Env Vars) + +`TARGET_URL` - The host address that locust should load test against +* If you're running the app locally http://docker.for.mac.localhost:8000 + * This is for running on a mac, you may need to use other methods to get the container to communicate with localhost on other systems +* Staging - https://staging.atat.code.mil +* Prod - https://azure.atat.code.mil + +`DISABLE_VERIFY` - False by default, set to true to prevent SSL verification + +`ATAT_BA_USERNAME` + `ATAT_BA_PASSWORD` - Username and password for the basic auth on the staging and production sites + +## To Run Locally +1. Build the docker container: + + `docker build . -t pwatat.azurecr.io/loadtest/locust` +2. Run the container: + + ` + docker run --rm -p 8089:8089 \ + -e TARGET_URL=https://staging.atat.code.mil \ + -e DISABLE_VERIFY=false \ + -e ATAT_BA_USERNAME= \ + -e ATAT_BA_PASSWORD= \ + --name locust pwatat.azurecr.io/loadtest/locust:latest + ` + +## To Update Image +1. Build the docker container: + + `docker build . -t pwatat.azurecr.io/loadtest/locust` +2. Push to our container registry + + `docker push pwatat.azurecr.io/loadtest/locust` + + * If you get an authorization failed message, you may need to re-authorize with this command first: + + `az acr login --name pwatat` +3. Restart the `atat-load-test` app service in the azure portal + * Note the load test service is running on a free tier VM, so it will likely be paused. Start it up and press restart to referesh before beginning your load testing.