diff --git a/.travis.yml b/.travis.yml index c9c2e37..7fe9ece 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,3 +28,11 @@ notifications: email: on_success: never on_failure: always +deploy: + provider: pypi + user: dreamlab-paas-pypi + password: + secure: qS19xJEZJL2wLwDpBTxwkrrX4P4kIhdYtphULK9ASotO2YpziFwpBPk8UAVfygkaD2rnDB0PKB9kaIXtbi7ZeTF3xA//QDLG6XrdmkSaQnuc5OGmVmqGKy2R5j5VbR8kjXPoaeZ93INsb8FI7TZcWsCt+CShNLQ25aYlW7kecHm2XbWHzETnPaRVJ+Osus0waOpuk38g8ECtsJTopI8mJQWplsJCKyIoBJ67rxs7nUqcMXLA61ZBWqTOAMkw0ZK0YJYHqtn51/S27NrIQGaZG5AwPu6HcWjqC7g9hhQwb2iDi4C+EHM9ozMz+HKqIlJw2pEyA8VFznpeKaVu9LC/hJwFavWuKC+Y1DYB+WzMagf4NsYQNBh+zYX/12QEXs6K5plwRBnd1lA6k2sfzlIS/xDAoNrJwLAu1/OMe6wIrNkbfi36vxJAJ+mqFqRsdCAC2TBjyI6BnTZa6paPlnRBILd1qhyOOfC7QAqLFLSrCXh97q5kM8n7UlCqus9mfVFkWtfTMYS4b+9Bhq0QZElgKWsCm6pTpVbvxNZBEsq8SZ0uAY6b03/0wImm6m00/uUBlcVBGP6tmuWG1kyGb38v2v6QDZyX0m1D8gKAfshLauWcr7Pm6/i7TwB5hz6uMnJ0fBxCw2kgb7r4KqwEwd2ZfgDh9fgDpe751QHjVP7hj0c= + on: + tags: true + branch: master diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 016abc0..fedc0d4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,23 @@ Changelog ========= + +0.9.0 (2022-06-06) +------------------ + +* Fixed: upgrade urllib3 +* Feature: support for application credentials + +0.8.2 (2021-03-28) +------------------ + +* Fixed: upgrade dependencies (aiohttp) + +0.8.1 (2019-04-03) +------------------ + +* Fixed: upgrade dependencies (urllib3: CVE-2018-20060) + 0.8.0 (2018-08-19) ------------------ diff --git a/Pipfile b/Pipfile index d3c527d..088e8d6 100644 --- a/Pipfile +++ b/Pipfile @@ -14,7 +14,8 @@ name = "pypi" tox = "*" aiohttp = "*" simple-rest-client = "*" - +python-dateutil = "*" +simplejson = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index 92176cc..6427c07 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,20 +1,7 @@ { "_meta": { "hash": { - "sha256": "6568d5ca0c4fb8774a364585fbdc7f433997aba048a30aea74b5e4405a14680b" - }, - "host-environment-markers": { - "implementation_name": "cpython", - "implementation_version": "3.6.1", - "os_name": "posix", - "platform_machine": "x86_64", - "platform_python_implementation": "CPython", - "platform_release": "4.4.0-101-generic", - "platform_system": "Linux", - "platform_version": "#124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017", - "python_full_version": "3.6.1", - "python_version": "3.6", - "sys_platform": "linux" + "sha256": "02521c73a33685f47bfe66456d1afb01dee6cb44cc00f7bc9544bb87bdbe4f0a" }, "pipfile-spec": 6, "requires": { @@ -31,111 +18,196 @@ "default": { "aiohttp": { "hashes": [ - "sha256:3d45689bab5782993c4b0ef736a7fa717e2ab8dbe1af762e1d4707ea23138026", - "sha256:89abd841563e30a9c69a1e0844a397592390b86789691ca4c9c017eff36e3769", - "sha256:ceaa3057c6ee1a0ff7eca51315266e9cbae723b439d63d195479198db2d19b6c", - "sha256:461e48ef04939e6f197f7bf18c88ec1e54032d70f8cc55cf8c981be9c079d833", - "sha256:f60d7000b6f4ea75c0df463d0e4d9d1557272c63f4a73963925a2d88917ec0ec", - "sha256:200ac902b46b36e27e674e1c4eb2444feaa14c8b4b86b1c2a7bda8309dafd32a", - "sha256:514b64521f54420c9fb7e81167fa437192cb233ff81a6a4d5d9e10f00262544c", - "sha256:8284f3652055b929b4ea24528a9a4fe716b9c3bb5bf2fac7169cef6b563755e5", - "sha256:b8a9b6e0830ddfd5fa76e13cda7586cc40505ea039d9dce9615e4615fb50122d", - "sha256:44671200fd8e2a7cf9f7c08ec959a1123fd4183d930927e73a032855ac611d96", - "sha256:a5ddd28a9f77283a10b8f1c2da01026111497b5c51bb04a8de3a997f3d438d33", - "sha256:2b9c7379ed147dd4d9e24784765f2acf1249d4ddbd69dfe6cc5a35639865e98d", - "sha256:32277f9378672e45e09ba0dc222cd17326ba1a62e3086103fba772d4c5d3e4b9", - "sha256:813c8181118a121233839f8f9e84f9e6640e70b8ff3fe0a778b53931b1b39895", - "sha256:6569b8850103595be10fcfa1fa911b01f876651921f52d769017b21d822e5dc3" + "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0", + "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6", + "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf", + "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9", + "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e", + "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0", + "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329", + "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2", + "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40", + "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a", + "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4", + "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de", + "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9", + "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9", + "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb", + "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076", + "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de", + "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907", + "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d", + "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536", + "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d", + "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54", + "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc", + "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212", + "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9", + "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d", + "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b", + "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7", + "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81", + "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c", + "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895", + "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297", + "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb", + "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe", + "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242", + "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0", + "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2" ], - "version": "==3.0.4" + "index": "pypi", + "version": "==3.7.4" + }, + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" }, "async-timeout": { "hashes": [ - "sha256:d3a195a827b0f4068d1616ae2da04aac62e365d14f2b13dbc071f9feed9db4e2", - "sha256:c17d8ac2d735d59aa62737d76f2787a6c938f5a944ecf768a8c0ab70b0dea566" + "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", + "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" ], - "version": "==2.0.0" + "version": "==3.0.1" }, "attrs": { "hashes": [ - "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450", - "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9" + "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", + "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" ], - "version": "==17.4.0" + "version": "==21.2.0" }, "certifi": { "hashes": [ - "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296", - "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d" + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" ], - "version": "==2018.1.18" + "version": "==2021.5.30" }, "chardet": { "hashes": [ - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691", - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae" + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" ], "version": "==3.0.4" }, + "distlib": { + "hashes": [ + "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736", + "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c" + ], + "version": "==0.3.2" + }, + "filelock": { + "hashes": [ + "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", + "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + ], + "version": "==3.0.12" + }, "idna": { "hashes": [ - "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4", - "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f" + "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" ], - "version": "==2.6" + "version": "==2.10" }, "idna-ssl": { "hashes": [ - "sha256:1227e44039bd31e02adaeafdbba61281596d623d222643fb021f87f2144ea147" + "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c" + ], + "markers": "python_version < '3.7'", + "version": "==1.1.0" + }, + "importlib-metadata": { + "hashes": [ + "sha256:960d52ba7c21377c990412aca380bf3642d734c2eaab78a2c39319f67c6a5786", + "sha256:e592faad8de1bda9fe920cf41e15261e7131bcf266c30306eec00e8e225c1dd5" ], - "version": "==1.0.0" + "markers": "python_version < '3.8'", + "version": "==4.4.0" + }, + "importlib-resources": { + "hashes": [ + "sha256:54161657e8ffc76596c4ede7080ca68cb02962a2e074a2586b695a93a925d36e", + "sha256:e962bff7440364183203d179d7ae9ad90cb1f2b74dcb84300e88ecc42dca3351" + ], + "markers": "python_version < '3.7'", + "version": "==5.1.4" }, "json-encoder": { "hashes": [ - "sha256:ca5c9aa211ac79d13f125c7d0554ae55a0c872cebc81a61fc4d228e9cc83efd8", - "sha256:26e9711008a44e379d0689108738f2365e653dc17961bdbe701f61ad165beab5" + "sha256:26e9711008a44e379d0689108738f2365e653dc17961bdbe701f61ad165beab5", + "sha256:ca5c9aa211ac79d13f125c7d0554ae55a0c872cebc81a61fc4d228e9cc83efd8" ], "version": "==0.4.4" }, "multidict": { "hashes": [ - "sha256:0fd4d255adcbab3341d64a2fff5acce23409e57bb94e626485dea3db70ddc35e", - "sha256:93f1af99bbe75c854370460a60823d6726f9af2196818a64346000d02e074ed7", - "sha256:65546242d0c481c0daf0ef20c1be81c075fb763c5f4346f18f748b422fc40f32", - "sha256:0462372fc74e4c061335118a4a5992b9a618d6c584b028ef03cf3e9b88a960e2", - "sha256:63663541d395ffe4d51a3c021467d0a7b46c965b63fa1646cb46e2e2f1f36415", - "sha256:84a1cb5320f1494cd444ca3bd09ddba2e0af0cb210f9263bcf17357ab22671a1", - "sha256:241c11614f64535e213ea143efa8b7e598793256601fc795e77075bdfa54f5d6", - "sha256:ea8a18ea02bf84981ec93faded773a866554666f13955c92139127892c4bb45c", - "sha256:b46ec31bb7729eaa678a3bb1c999460902df1e295fcc093b9aa5f2c7e68d5803", - "sha256:608f7eef60e6558418d7da6551dd3d07ccc1290ecc85755d781bd8100322ea5b", - "sha256:068e91060e3e211441b1a31f5e65de88fc346490e1fae583c35a75a5295c8ef7", - "sha256:288e8f94fb6f586e7386c1f22c979ce3ec866ab23371fa8fef1dd526cd4dfde1", - "sha256:503ae54582601b0ff647731fee5efcdff5db1f4da0350febb31b628236a5f0b5", - "sha256:6d5f6f26f9025756035c473167b39c5a72e4e519a2286c9399d21f6682e4e5bc", - "sha256:e13265feabb1fa26f9cd49cbafd9b5de70ad768093ddb092af477c9823f44f0e", - "sha256:50de6f3786ba868ffb7d78d4bcacf0928321f9892366b2f4a0426bba644e3f25", - "sha256:16c78b10e897a512aa34ab1969982e42246e53077ae903c1b334926e1ea832d1", - "sha256:e04b5bf8581718cf84c1c60bda40221d926ceb06f942ebabfc3baf467a1e34be", - "sha256:d99819e9e15e1295a31a757360cab65bc96162870f90c29432564bd8e8999aca", - "sha256:cd172509bfc9144395204dd2c0eb305ae5e89f8ad1714ffd7d793607c53c3244", - "sha256:3508bea4974ee30fabcf7c8852fca7d9d54d496eaa068bee8311e0ac4df4ade3", - "sha256:fb4412490324705dcd2172baa8a3ea58ae23c5f982476805cad58ae929fe2a52" - ], - "version": "==4.1.0" + "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", + "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93", + "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632", + "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656", + "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79", + "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7", + "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d", + "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5", + "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224", + "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26", + "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea", + "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348", + "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6", + "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76", + "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1", + "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f", + "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952", + "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a", + "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37", + "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9", + "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359", + "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8", + "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da", + "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3", + "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d", + "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf", + "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841", + "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d", + "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93", + "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f", + "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647", + "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635", + "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456", + "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda", + "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5", + "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", + "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" + ], + "version": "==5.1.0" }, "pluggy": { "hashes": [ - "sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff" + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], - "version": "==0.6.0" + "version": "==0.13.1" }, "py": { "hashes": [ - "sha256:8cca5c229d225f8c1e3085be4fcf306090b00850fefad892f9d96c7b6e2f310f", - "sha256:ca18943e28235417756316bfada6cd96b23ce60dd532642690dcfdaba988a76d" + "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", + "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" ], - "version": "==1.5.2" + "version": "==1.10.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + ], + "index": "pypi", + "version": "==2.8.0" }, "python-status": { "hashes": [ @@ -145,71 +217,139 @@ }, "requests": { "hashes": [ - "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", - "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e" + "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" ], - "version": "==2.18.4" + "version": "==2.25.1" }, "simple-rest-client": { "hashes": [ - "sha256:2eb7570c36c154749d7317364baede0d2a624314c2855b6c281e6055cbdceff7", - "sha256:87b44bb2c522d2f89802b3e63ec4bccda976cae8129df719ab8fde6ad172310d" + "sha256:e55b607ee241d4626ee3541e360a001fcbd9d2f511694346c7ddb8d7479196a7", + "sha256:ff7085defb46e56119bdabd600e2550d0c053faffd2bfa5a3adc7387d8cb93d3" + ], + "index": "pypi", + "version": "==0.5.4" + }, + "simplejson": { + "hashes": [ + "sha256:067a7177ddfa32e1483ba5169ebea1bc2ea27f224853211ca669325648ca5642", + "sha256:2fc546e6af49fb45b93bbe878dea4c48edc34083729c0abd09981fe55bdf7f91", + "sha256:354fa32b02885e6dae925f1b5bbf842c333c1e11ea5453ddd67309dc31fdb40a", + "sha256:37e685986cf6f8144607f90340cff72d36acf654f3653a6c47b84c5c38d00df7", + "sha256:3af610ee72efbe644e19d5eaad575c73fb83026192114e5f6719f4901097fce2", + "sha256:3b919fc9cf508f13b929a9b274c40786036b31ad28657819b3b9ba44ba651f50", + "sha256:3dd289368bbd064974d9a5961101f080e939cbe051e6689a193c99fb6e9ac89b", + "sha256:6c3258ffff58712818a233b9737fe4be943d306c40cf63d14ddc82ba563f483a", + "sha256:75e3f0b12c28945c08f54350d91e624f8dd580ab74fd4f1bbea54bc6b0165610", + "sha256:b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5", + "sha256:ee9625fc8ee164902dfbb0ff932b26df112da9f871c32f0f9c1bcf20c350fe2a", + "sha256:fb2530b53c28f0d4d84990e945c2ebb470edb469d63e389bf02ff409012fe7c5" ], - "version": "==0.5.0" + "index": "pypi", + "version": "==3.16.0" }, "singledispatch": { "hashes": [ - "sha256:833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8", - "sha256:5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c" + "sha256:0d428477703d8386eb6aeed6e522c9f22d49f4363cdf4ed6a2ba3dc276053e20", + "sha256:d5bb9405a4b8de48e36709238e8b91b4f6f300f81a5132ba2531a9a738eca391" ], - "version": "==3.4.0.3" + "version": "==3.6.2" }, "six": { "hashes": [ - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb", - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "version": "==1.16.0" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "version": "==1.11.0" + "version": "==0.10.2" }, "tox": { "hashes": [ - "sha256:8af30fd835a11f3ff8e95176ccba5a4e60779df4d96a9dfefa1a1704af263225", - "sha256:752f5ec561c6c08c5ecb167d3b20f4f4ffc158c0ab78855701a75f5cef05f4b8" + "sha256:1b166b93d2ce66bb7b253ba944d2be89e0c9d432d49eeb9da2988b4902a4684e", + "sha256:665cbdd99f5c196dd80d1d8db8c8cf5d48b1ae1f778bccd1bdf14d5aaf4ca0fc" + ], + "index": "pypi", + "version": "==3.9.0" + }, + "typing-extensions": { + "hashes": [ + "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", + "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", + "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" ], - "version": "==2.9.1" + "markers": "python_version < '3.8'", + "version": "==3.10.0.0" }, "urllib3": { "hashes": [ - "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", - "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" + "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", + "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" ], - "version": "==1.22" + "index": "pypi", + "version": "==1.26.5" }, "virtualenv": { "hashes": [ - "sha256:39d88b533b422825d644087a21e78c45cf5af0ef7a99a1fc9fbb7b481e5c85b0", - "sha256:02f8102c2436bb03b3ee6dede1919d1dac8a427541652e5ec95171ec8adbc93a" + "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467", + "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76" ], - "markers": "python_version != '3.2'", - "version": "==15.1.0" + "version": "==20.4.7" }, "yarl": { "hashes": [ - "sha256:d9ca55a5a297408f08e5401c23ad22bd9f580dab899212f0d5dc1830f0909404", - "sha256:17e57a495efea42bcfca08b49e16c6d89e003acd54c99c903ea1cb3de0ba1248", - "sha256:3353fae45d93cc3e7e41bfcb1b633acc37db821d368e660b03068dbfcf68f8c8", - "sha256:51a084ff8756811101f8b5031a14d1c2dd26c666976e1b18579c6b1c8761a102", - "sha256:045dbba18c9142278113d5dc62622978a6f718ba662392d406141c59b540c514", - "sha256:213e8f54b4a942532d6ac32314c69a147d3b82fa1725ca05061b7c1a19a1d9b1", - "sha256:7236eba4911a5556b497235828e7a4bc5d90957efa63b7c4b3e744d2d2cf1b94", - "sha256:e9a6a319c4bbfb57618f207e86a7c519ab0f637be3d2366e4cdac271577834b8", - "sha256:6e75753065c310befab71c5077a59b7cb638d2146b1cfbb1c3b8f08b51362714", - "sha256:64727a2593fdba5d6ef69e94eba793a196deeda7152c7bd3a64edda6b1f95f6e", - "sha256:5580f22ac1298261cd24e8e584180d83e2cca9a6167113466d2d16cb2aa1f7b1", - "sha256:e072edbd1c5628c0b8f97d00cf6c9fcd6a4ee2b5ded10d463fcb6eaa066cf40c", - "sha256:a69dd7e262cdb265ac7d5e929d55f2f3d07baaadd158c8f19caebf8dde08dfe8" - ], - "version": "==1.1.1" + "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", + "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", + "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", + "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", + "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", + "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", + "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", + "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", + "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", + "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", + "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", + "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", + "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", + "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", + "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", + "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", + "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", + "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", + "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", + "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", + "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", + "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", + "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", + "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", + "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", + "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", + "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", + "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", + "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", + "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", + "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", + "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", + "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", + "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", + "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", + "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", + "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" + ], + "version": "==1.6.3" + }, + "zipp": { + "hashes": [ + "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", + "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + ], + "markers": "python_version < '3.10'", + "version": "==3.4.1" } }, "develop": {} diff --git a/README.rst b/README.rst index 5d265ad..c781cca 100644 --- a/README.rst +++ b/README.rst @@ -35,7 +35,7 @@ Usage from asyncopenstackclient import NovaClient, GlanceClient, CinderClient, AuthPassword # you can either pass credentials explicitly (as shown below) - # or use enviormental variables from OpenStack RC file + # or use environmental variables from OpenStack RC file # https://docs.openstack.org/mitaka/cli-reference/common/cli_set_environment_variables_using_openstack_rc.html auth = AuthPassword( auth_url='https://keystone:5999/v3' @@ -44,6 +44,15 @@ Usage user_domain_name='default', project_domain_name='foo.bar' ) + + # alternatively you can also use application_credentials to authenticate with the OpenStack Keystone API + # https://docs.openstack.org/keystone/queens/user/application_credentials.html + alternative_auth = AuthPassword( + auth_url='https://keystone:5999/v3' + application_credential_id="ID", + application_credential_secret="SECRET" + ) + nova = NovaClient(session=auth) glance = GlanceClient(session=auth) cinder = CinderClient(session=auth) diff --git a/requirements.txt b/requirements.txt index 4d46847..e82bef9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ aiohttp>=3 -simplejson==3.13.2 -simple-rest-client==0.5.2 -python-dateutil==2.7.2 +simplejson==3.16.0 +simple-rest-client==0.5.4 +python-dateutil==2.8.0 diff --git a/setup.py b/setup.py index db73e8c..a7ec955 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(name): setup( name="AsyncOpenStackClient", - version="0.8.0", + version="0.9.0", author='Dreamlab - PaaS KRK', author_email='paas-support@dreamlab.pl', url='https://github.com/DreamLab/AsyncOpenStackClient', diff --git a/src/asyncopenstackclient/auth.py b/src/asyncopenstackclient/auth.py index 806c328..a96fc12 100644 --- a/src/asyncopenstackclient/auth.py +++ b/src/asyncopenstackclient/auth.py @@ -15,6 +15,8 @@ def __init__(self): self._project_id = None self._project_name = None self._region_name = None + self._application_credential_id = None + self._application_credential_secret = None async def authenticate(self): raise NotImplementedError @@ -51,10 +53,20 @@ def os_project_name(self): def os_region_name(self): return self._region_name or os.environ.get('OS_REGION_NAME') + @property + def os_application_credential_id(self): + return self._application_credential_id or os.environ.get('OS_APPLICATION_CREDENTIAL_ID') + + @property + def os_application_credential_secret(self): + return self._application_credential_secret or os.environ.get('OS_APPLICATION_CREDENTIAL_SECRET') + class AuthPassword(AuthModel): - def __init__(self, auth_url=None, username=None, password=None, project_name=None, user_domain_name=None, project_domain_name=None): + def __init__(self, auth_url=None, username=None, password=None, project_name=None, + user_domain_name=None, project_domain_name=None, + application_credential_id=None, application_credential_secret=None): super().__init__() self._auth_url = auth_url self._username = username @@ -62,6 +74,8 @@ def __init__(self, auth_url=None, username=None, password=None, project_name=Non self._project_name = project_name self._user_domain_name = user_domain_name self._project_domain_name = project_domain_name + self._application_credential_id = application_credential_id + self._application_credential_secret = application_credential_secret self._auth_endpoint = self.os_auth_url + '/auth/tokens' self.token = None @@ -69,33 +83,53 @@ def __init__(self, auth_url=None, username=None, password=None, project_name=Non self.headers = { 'Content-Type': 'application/json' } - self._auth_payload = { - 'auth': { - 'identity': { - 'methods': ['password'], - 'password': { - 'user': { - 'domain': { - 'name': self.os_user_domain_name - }, - 'name': self.os_username, - 'password': self.os_password - } - } - }, - 'scope': { - "project": { - "domain": { - "name": self.os_project_domain_name + + self._auth_payload = {'auth': {}} + for key_from_property in (self._identity, self._scope): + self._auth_payload['auth'].update(key_from_property) + + def is_token_valid(self): + return self.token_expires_at - time() > 0 + + @property + def _identity(self): + if self.os_application_credential_id and self.os_application_credential_secret: + return {"identity": { + "methods": ["application_credential"], + "application_credential": { + "id": self.os_application_credential_id, + "secret": self.os_application_credential_secret + } + } + } + else: + return {"identity": { + 'methods': ['password'], + 'password': { + 'user': { + 'domain': { + 'name': self.os_user_domain_name }, - "name": self.os_project_name + 'name': self.os_username, + 'password': self.os_password } } - } - } + }} - def is_token_valid(self): - return self.token_expires_at - time() > 0 + @property + def _scope(self): + if self.os_application_credential_id and self.os_application_credential_secret: + # The scope is automatically determined from the application_credential + return {} + else: + return {"scope": { + "project": { + "domain": { + "name": self.os_project_domain_name + }, + "name": self.os_project_name + } + }} async def get_token(self): async with aiohttp.ClientSession() as session: diff --git a/tests/test_auth.py b/tests/test_auth.py index 18158b2..797556d 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -2,7 +2,7 @@ from aioresponses import aioresponses from aiounittest import AsyncTestCase, futurized from asyncopenstackclient import AuthPassword -from unittest.mock import patch +from unittest.mock import MagicMock, patch class TestAuth(AsyncTestCase): @@ -19,33 +19,63 @@ def tearDown(self): del os.environ[name] async def test_create_object(self): - expected_payload = {'auth': { + expected_payload_password = {'auth': { 'identity': {'methods': ['password'], 'password': {'user': { 'domain': {'name': 'm_user_domain'}, 'name': 'm_user', 'password': 'm_pass' }}}, 'scope': {'project': {'domain': {'name': 'm_project_domain'}, 'name': 'm_project'}} }} - self.assertEqual(self.auth._auth_payload, expected_payload) - self.assertEqual(self.auth._auth_endpoint, 'http://url/auth/tokens') - self.assertTrue('Content-Type' in self.auth.headers) + + expected_payload_application_credential = {'auth': { + 'identity': {'methods': ['application_credential'], + 'application_credential': {'id': 'm_app_id', + 'secret': 'm_app_secret'}} + }} + + auth_args_application_credentials = ('http://url', None, None, None, None, + None, 'm_app_id', 'm_app_secret') + + auth_application_credentials = AuthPassword(*auth_args_application_credentials) + + for auth, expected_payload in ((self.auth, expected_payload_password), + (auth_application_credentials, expected_payload_application_credential)): + self.assertEqual(auth._auth_payload, expected_payload) + self.assertEqual(auth._auth_endpoint, 'http://url/auth/tokens') + self.assertTrue('Content-Type' in auth.headers) async def test_create_object_use_environ(self): - expected_payload = {'auth': { + expected_payload_password = {'auth': { 'identity': {'methods': ['password'], 'password': {'user': {'domain': {'name': 'udm'}, 'name': 'uuu', 'password': 'ppp'}}}, 'scope': {'project': {'domain': {'name': 'udm'}, 'name': 'prj'}} }} - env = { + env_password = { 'OS_AUTH_URL': 'https://keystone/v3', 'OS_PASSWORD': 'ppp', 'OS_USERNAME': 'uuu', 'OS_USER_DOMAIN_NAME': 'udm', 'OS_PROJECT_NAME': 'prj' } - with patch.dict('os.environ', env, clear=True): - auth = AuthPassword() - self.assertEqual(auth._auth_payload, expected_payload) - self.assertEqual(auth._auth_endpoint, 'https://keystone/v3/auth/tokens') - self.assertTrue('Content-Type' in auth.headers) + expected_payload_application_credentials = {'auth': { + 'identity': {'methods': ['application_credential'], + 'application_credential': {'id': 'iid', + 'secret': 'ssecret' + } + } + }} + env_application_credentials = { + 'OS_AUTH_URL': 'https://keystone/v3', + 'OS_APPLICATION_CREDENTIAL_ID': 'iid', + 'OS_APPLICATION_CREDENTIAL_SECRET': 'ssecret', + 'OS_USER_DOMAIN_NAME': 'udm', 'OS_PROJECT_NAME': 'prj' + } + + for env, expected_payload in ((env_password, expected_payload_password), + (env_application_credentials, expected_payload_application_credentials)): + with patch.dict('os.environ', env, clear=True): + auth = AuthPassword() + self.assertEqual(auth._auth_payload, expected_payload) + self.assertEqual(auth._auth_endpoint, 'https://keystone/v3/auth/tokens') + self.assertTrue('Content-Type' in auth.headers) async def test_get_token(self): body = { @@ -107,7 +137,8 @@ async def test_authenticate_first_time(self): 1100 ] - patch('asyncopenstackclient.auth.AuthPassword.get_token', side_effect=mock_get_token_results).start() + get_token_mock = patch('asyncopenstackclient.auth.AuthPassword.get_token', new=MagicMock()).start() + get_token_mock.side_effect = mock_get_token_results patch('asyncopenstackclient.auth.time', side_effect=mock_time_results).start() # first time token should be None and get_token shall be called diff --git a/tox.ini b/tox.ini index e54b736..a29c333 100644 --- a/tox.ini +++ b/tox.ini @@ -55,7 +55,6 @@ deps = coverage skip_install = true usedevelop = false commands = - coverage combine --append coverage report coverage html