{"action":"created","issue":{"url":"https://api.github.com/repos/privacyidea/privacyidea/issues/1116","repository_url":"https://api.github.com/repos/privacyidea/privacyidea","labels_url":"https://api.github.com/repos/privacyidea/privacyidea/issues/1116/labels{/name}","comments_url":"https://api.github.com/repos/privacyidea/privacyidea/issues/1116/comments","events_url":"https://api.github.com/repos/privacyidea/privacyidea/issues/1116/events","html_url":"https://github.com/privacyidea/privacyidea/pull/1116","id":336595415,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk4MDA5ODAx","number":1116,"title":"Add lib functions for periodic tasks","user":{"login":"fredreichbier","id":28243,"node_id":"MDQ6VXNlcjI4MjQz","avatar_url":"https://avatars2.githubusercontent.com/u/28243?v=4","gravatar_id":"","url":"https://api.github.com/users/fredreichbier","html_url":"https://github.com/fredreichbier","followers_url":"https://api.github.com/users/fredreichbier/followers","following_url":"https://api.github.com/users/fredreichbier/following{/other_user}","gists_url":"https://api.github.com/users/fredreichbier/gists{/gist_id}","starred_url":"https://api.github.com/users/fredreichbier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fredreichbier/subscriptions","organizations_url":"https://api.github.com/users/fredreichbier/orgs","repos_url":"https://api.github.com/users/fredreichbier/repos","events_url":"https://api.github.com/users/fredreichbier/events{/privacy}","received_events_url":"https://api.github.com/users/fredreichbier/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":1,"created_at":"2018-06-28T12:13:54Z","updated_at":"2018-07-17T07:08:11Z","closed_at":null,"author_association":"MEMBER","pull_request":{"url":"https://api.github.com/repos/privacyidea/privacyidea/pulls/1116","html_url":"https://github.com/privacyidea/privacyidea/pull/1116","diff_url":"https://github.com/privacyidea/privacyidea/pull/1116.diff","patch_url":"https://github.com/privacyidea/privacyidea/pull/1116.patch"},"body":"This implements some library functions for periodic tasks.\r\n\r\nSome issues with this:\r\n* Ubuntu 14.04 only has croniter 0.3.4, which causes some problems. We could possibly add a workaround for that. Ubuntu 16.04 has croniter 0.3.8, which is fine.\r\n* I'm not 100% sure about the timezone handling. I decided to store timestamps without timezone information in the database because apparently, not all database backends support it. So I decided to always store UTC timestamps.\r\n\r\nI'm happy about any comments and suggestions :-)\n<a href='#crh-start'></a><a href='#crh-data-%7B%22processed%22%3A%20%5B%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23issuecomment-401340878%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202909346%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202910121%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202910521%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202911706%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202911709%22%2C%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202912648%22%5D%2C%20%22comments%22%3A%20%7B%22General%20Comment%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23issuecomment-401340878%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%23%20%5BCodecov%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dh1%29%20Report%5Cn%3E%20Merging%20%5B%231116%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Ddesc%29%20into%20%5Bmaster%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/commit/4929d4e0a7a11cbc564a88d034f7903665ba8024%3Fsrc%3Dpr%26el%3Ddesc%29%20will%20%2A%2Aincrease%2A%2A%20coverage%20by%20%600.15%25%60.%5Cn%3E%20The%20diff%20coverage%20is%20%6097.43%25%60.%5Cn%5Cn%5B%21%5BImpacted%20file%20tree%20graph%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/graphs/tree.svg%3Fheight%3D150%26width%3D650%26token%3D7nHLZki60B%26src%3Dpr%29%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dtree%29%5Cn%5Cn%60%60%60diff%5Cn%40%40%20%20%20%20%20%20%20%20%20%20%20%20Coverage%20Diff%20%20%20%20%20%20%20%20%20%20%20%20%20%40%40%5Cn%23%23%20%20%20%20%20%20%20%20%20%20%20master%20%20%20%20%231116%20%20%20%20%20%20%2B/-%20%20%20%23%23%5Cn%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%2B%20Coverage%20%20%20%2095.7%25%20%20%2095.85%25%20%20%20%2B0.15%25%20%20%20%20%20%5Cn%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%20%20Files%20%20%20%20%20%20%20%20%20133%20%20%20%20%20%20134%20%20%20%20%20%20%20%2B1%20%20%20%20%20%5Cn%20%20Lines%20%20%20%20%20%20%2016540%20%20%20%2017264%20%20%20%20%20%2B724%20%20%20%20%20%5Cn%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%2B%20Hits%20%20%20%20%20%20%20%2015830%20%20%20%2016549%20%20%20%20%20%2B719%20%20%20%20%20%5Cn-%20Misses%20%20%20%20%20%20%20%20710%20%20%20%20%20%20715%20%20%20%20%20%20%20%2B5%5Cn%60%60%60%5Cn%5Cn%5Cn%7C%20%5BImpacted%20Files%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dtree%29%20%7C%20Coverage%20%5Cu0394%20%7C%20%7C%5Cn%7C---%7C---%7C---%7C%5Cn%7C%20%5Bprivacyidea/models.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbW9kZWxzLnB5%29%20%7C%20%6099.27%25%20%3C100%25%3E%20%28%2B0.41%25%29%60%20%7C%20%3Aarrow_up%3A%20%7C%5Cn%7C%20%5Bprivacyidea/lib/periodictask.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbGliL3BlcmlvZGljdGFzay5weQ%3D%3D%29%20%7C%20%6097.1%25%20%3C97.1%25%3E%20%28%5Cu00f8%29%60%20%7C%20%7C%5Cn%7C%20%5Bprivacyidea/lib/tokens/u2f.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbGliL3Rva2Vucy91MmYucHk%3D%29%20%7C%20%6093.33%25%20%3C0%25%3E%20%28-2.5%25%29%60%20%7C%20%3Aarrow_down%3A%20%7C%5Cn%7C%20%5Bprivacyidea/lib/importotp.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbGliL2ltcG9ydG90cC5weQ%3D%3D%29%20%7C%20%6093.14%25%20%3C0%25%3E%20%28-0.08%25%29%60%20%7C%20%3Aarrow_down%3A%20%7C%5Cn%7C%20%5Bprivacyidea/lib/token.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbGliL3Rva2VuLnB5%29%20%7C%20%6094.61%25%20%3C0%25%3E%20%28%2B0.06%25%29%60%20%7C%20%3Aarrow_up%3A%20%7C%5Cn%7C%20%5Bprivacyidea/lib/error.py%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116/diff%3Fsrc%3Dpr%26el%3Dtree%23diff-cHJpdmFjeWlkZWEvbGliL2Vycm9yLnB5%29%20%7C%20%6091.83%25%20%3C0%25%3E%20%28%2B1.02%25%29%60%20%7C%20%3Aarrow_up%3A%20%7C%5Cn%5Cn------%5Cn%5Cn%5BContinue%20to%20review%20full%20report%20at%20Codecov%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dcontinue%29.%5Cn%3E%20%2A%2ALegend%2A%2A%20-%20%5BClick%20here%20to%20learn%20more%5D%28https%3A//docs.codecov.io/docs/codecov-delta%29%5Cn%3E%20%60%5Cu0394%20%3D%20absolute%20%3Crelative%3E%20%28impact%29%60%2C%20%60%5Cu00f8%20%3D%20not%20affected%60%2C%20%60%3F%20%3D%20missing%20data%60%5Cn%3E%20Powered%20by%20%5BCodecov%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dfooter%29.%20Last%20update%20%5B4929d4e...3538ec9%5D%28https%3A//codecov.io/gh/privacyidea/privacyidea/pull/1116%3Fsrc%3Dpr%26el%3Dlastupdated%29.%20Read%20the%20%5Bcomment%20docs%5D%28https%3A//docs.codecov.io/docs/pull-request-comments%29.%5Cn%22%2C%20%22created_at%22%3A%20%222018-06-29T12%3A34%3A12Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars2.githubusercontent.com/in/254%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/apps/codecov%22%7D%7D%5D%2C%20%22title%22%3A%20%22General%20Comment%22%7D%2C%20%22Pull%203538ec92f68bc116406f344d9e663d27d01aa3ac%20privacyidea/lib/periodictask.py%2052%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202909346%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22At%20one%20point%20a%20task%20has%20to%20run%20for%20the%20first%20time.%5Cr%5Cncould%20this%20cause%20problems%20to%20throw%20an%20exception%2C%20if%20the%20task%20did%20not%20run%20before%20%28first-runner%29%22%2C%20%22created_at%22%3A%20%222018-07-17T06%3A46%3A29Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars1.githubusercontent.com/u/1908620%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/cornelinux%22%7D%7D%2C%20%7B%22body%22%3A%20%22You%27re%20right%2C%20I%20forgot%20to%20mention%20this%3A%20In%20order%20to%20calculate%20the%20timestamp%20of%20the%20next%20run%2C%20we%20always%20need%20the%20last%20run%20as%20a%20reference%20point.%5Cr%5CnMy%20current%20approach%20%28I%20have%20implemented%20this%20locally%20already%29%20is%20to%20add%20a%20%60%60last_run%60%60%20when%20a%20new%20periodic%20task%20is%20created%20whose%20time%20is%20the%20time%20of%20the%20task%20creation.%20This%20is%20not%20so%20nice%2C%20because%20the%20task%20has%20not%20actually%20run%20at%20that%20time%20--%20but%20calculating%20the%20next%20scheduled%20run%20works%20fine%20then.%22%2C%20%22created_at%22%3A%20%222018-07-17T06%3A50%3A42Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars2.githubusercontent.com/u/28243%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/fredreichbier%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-none%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222018-07-17T06%3A59%3A02Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars1.githubusercontent.com/u/1908620%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/cornelinux%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20privacyidea/lib/periodictask.py%3AL1-184%22%7D%2C%20%22Pull%203538ec92f68bc116406f344d9e663d27d01aa3ac%20privacyidea/lib/periodictask.py%20155%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202910521%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Is%20there%20a%20way%20of%20getting%20the%20list%20of%20available%20nodes%3F%5Cr%5Cn%5Cr%5CnOtherwise%20we%20might%20want%20to%20make%20the%20%60%60node%60%60%20parameter%20optional.%5Cr%5Cn%22%2C%20%22created_at%22%3A%20%222018-07-17T06%3A53%3A09Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars1.githubusercontent.com/u/1908620%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/cornelinux%22%7D%7D%2C%20%7B%22body%22%3A%20%22Hah%20you%27re%20right%2C%20currently%20there%20is%20no%20way%20to%20obtain%20the%20available%20nodes.%20And%20I%27m%20currently%20not%20sure%20how%20we%20would%20obtain%20such%20a%20list%3F%5Cr%5Cn%5Cr%5CnHowever%2C%20the%20%60%60get_scheduled_periodic_tasks%60%60%20function%20is%20intended%20to%20be%20called%20by%20the%20local%20cron%20runner%20to%20find%20out%20which%20tasks%20are%20scheduled%20to%20run%20on%20the%20local%20node.%20And%20at%20this%20point%2C%20the%20cron%20runner%20should%20know%20its%20local%20node%20name%2C%20and%20the%20other%20node%20names%20are%20not%20relevant%20then.%22%2C%20%22created_at%22%3A%20%222018-07-17T07%3A03%3A43Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars2.githubusercontent.com/u/28243%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/fredreichbier%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20privacyidea/lib/periodictask.py%3AL1-184%22%7D%2C%20%22Pull%203538ec92f68bc116406f344d9e663d27d01aa3ac%20privacyidea/lib/periodictask.py%2085%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/privacyidea/privacyidea/pull/1116%23discussion_r202911709%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-complete%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222018-07-17T06%3A59%3A03Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars1.githubusercontent.com/u/1908620%3Fv%3D4%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/cornelinux%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20privacyidea/lib/periodictask.py%3AL1-184%22%7D%7D%7D'></a>\n<a href='https://www.codereviewhub.com/'><img src='http://www.codereviewhub.com/site/github-bar.png' height=40></a>\n- [ ] <a href='#crh-comment-General Comment'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/privacyidea/privacyidea/pull/1116#issuecomment-401340878'>General Comment</a></b>\n- <a href='https://github.com/apps/codecov'><img border=0 src='https://avatars2.githubusercontent.com/in/254?v=4' height=16 width=16></a> # [Codecov](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=h1) Report\n> Merging [#1116](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=desc) into [master](https://codecov.io/gh/privacyidea/privacyidea/commit/4929d4e0a7a11cbc564a88d034f7903665ba8024?src=pr&el=desc) will **increase** coverage by `0.15%`.\n> The diff coverage is `97.43%`.\n[![Impacted file tree graph](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/graphs/tree.svg?height=150&width=650&token=7nHLZki60B&src=pr)](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=tree)\n```diff\n@@            Coverage Diff             @@\n##           master    #1116      +/-   ##\n==========================================\n+ Coverage    95.7%   95.85%   +0.15%\n==========================================\nFiles         133      134       +1\nLines       16540    17264     +724\n==========================================\n+ Hits        15830    16549     +719\n- Misses        710      715       +5\n```\n| [Impacted Files](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [privacyidea/models.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbW9kZWxzLnB5) | `99.27% <100%> (+0.41%)` | :arrow_up: |\n| [privacyidea/lib/periodictask.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbGliL3BlcmlvZGljdGFzay5weQ==) | `97.1% <97.1%> (ø)` | |\n| [privacyidea/lib/tokens/u2f.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbGliL3Rva2Vucy91MmYucHk=) | `93.33% <0%> (-2.5%)` | :arrow_down: |\n| [privacyidea/lib/importotp.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbGliL2ltcG9ydG90cC5weQ==) | `93.14% <0%> (-0.08%)` | :arrow_down: |\n| [privacyidea/lib/token.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbGliL3Rva2VuLnB5) | `94.61% <0%> (+0.06%)` | :arrow_up: |\n| [privacyidea/lib/error.py](https://codecov.io/gh/privacyidea/privacyidea/pull/1116/diff?src=pr&el=tree#diff-cHJpdmFjeWlkZWEvbGliL2Vycm9yLnB5) | `91.83% <0%> (+1.02%)` | :arrow_up: |\n------\n[Continue to review full report at Codecov](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=footer). Last update [4929d4e...3538ec9](https://codecov.io/gh/privacyidea/privacyidea/pull/1116?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n- [ ] <a href='#crh-comment-Pull 3538ec92f68bc116406f344d9e663d27d01aa3ac privacyidea/lib/periodictask.py 155'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/privacyidea/privacyidea/pull/1116#discussion_r202910521'>File: privacyidea/lib/periodictask.py:L1-184</a></b>\n- <a href='https://github.com/cornelinux'><img border=0 src='https://avatars1.githubusercontent.com/u/1908620?v=4' height=16 width=16></a> Is there a way of getting the list of available nodes?\nOtherwise we might want to make the ``node`` parameter optional.\n- <a href='https://github.com/fredreichbier'><img border=0 src='https://avatars2.githubusercontent.com/u/28243?v=4' height=16 width=16></a> Hah you're right, currently there is no way to obtain the available nodes. And I'm currently not sure how we would obtain such a list?\nHowever, the ``get_scheduled_periodic_tasks`` function is intended to be called by the local cron runner to find out which tasks are scheduled to run on the local node. And at this point, the cron runner should know its local node name, and the other node names are not relevant then.\n- [x] <a href='#crh-comment-Pull 3538ec92f68bc116406f344d9e663d27d01aa3ac privacyidea/lib/periodictask.py 52'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/privacyidea/privacyidea/pull/1116#discussion_r202909346'>File: privacyidea/lib/periodictask.py:L1-184</a></b>\n- <a href='https://github.com/cornelinux'><img border=0 src='https://avatars1.githubusercontent.com/u/1908620?v=4' height=16 width=16></a> At one point a task has to run for the first time.\ncould this cause problems to throw an exception, if the task did not run before (first-runner)\n- <a href='https://github.com/fredreichbier'><img border=0 src='https://avatars2.githubusercontent.com/u/28243?v=4' height=16 width=16></a> You're right, I forgot to mention this: In order to calculate the timestamp of the next run, we always need the last run as a reference point.\nMy current approach (I have implemented this locally already) is to add a ``last_run`` when a new periodic task is created whose time is the time of the task creation. This is not so nice, because the task has not actually run at that time -- but calculating the next scheduled run works fine then.\n\n\n<a href='https://www.codereviewhub.com/privacyidea/privacyidea/pull/1116?mark_as_completed=1'><img src='http://www.codereviewhub.com/site/github-mark-as-completed.png' height=26></a>&nbsp;<a href='https://www.codereviewhub.com/privacyidea/privacyidea/pull/1116?approve=1'><img src='http://www.codereviewhub.com/site/github-approve.png' height=26></a>&nbsp;<a href='https://github.com/privacyidea/privacyidea/pull/1116'><img src='http://www.codereviewhub.com/site/github-refresh.png' height=26></a>\n<a href='#crh-end'></a>"},"comment":{"url":"https://api.github.com/repos/privacyidea/privacyidea/issues/comments/405482131","html_url":"https://github.com/privacyidea/privacyidea/pull/1116#issuecomment-405482131","issue_url":"https://api.github.com/repos/privacyidea/privacyidea/issues/1116","id":405482131,"node_id":"MDEyOklzc3VlQ29tbWVudDQwNTQ4MjEzMQ==","user":{"login":"fredreichbier","id":28243,"node_id":"MDQ6VXNlcjI4MjQz","avatar_url":"https://avatars2.githubusercontent.com/u/28243?v=4","gravatar_id":"","url":"https://api.github.com/users/fredreichbier","html_url":"https://github.com/fredreichbier","followers_url":"https://api.github.com/users/fredreichbier/followers","following_url":"https://api.github.com/users/fredreichbier/following{/other_user}","gists_url":"https://api.github.com/users/fredreichbier/gists{/gist_id}","starred_url":"https://api.github.com/users/fredreichbier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fredreichbier/subscriptions","organizations_url":"https://api.github.com/users/fredreichbier/orgs","repos_url":"https://api.github.com/users/fredreichbier/repos","events_url":"https://api.github.com/users/fredreichbier/events{/privacy}","received_events_url":"https://api.github.com/users/fredreichbier/received_events","type":"User","site_admin":false},"created_at":"2018-07-17T07:08:11Z","updated_at":"2018-07-17T07:08:11Z","author_association":"MEMBER","body":"Oh yes, I think I missed this up until now. Right now, I don't know how a node could know the names of other privacyIDEA nodes -- because a privacyIDEA node itself does not know if it is running in a redundant setup or not?\r\n\r\nHm, personally I would prefer to postpone this issue because it doesn't interfere with the actual functionality. In a first step, we could let the user manually enter the nodes on which a task should run."}}
{"actor":{"display_login":"fredreichbier"}}