Compare commits

...

3430 Commits
0.6.0 ... 1.2.1

Author SHA1 Message Date
Min RK
fc6cd33ce0 release 1.2.1 2020-10-30 13:20:43 +01:00
Erik Sundell
b0b8e2d058 Merge pull request #3235 from minrk/changelog-1.2.1
Changelog for 1.2.1
2020-10-30 13:19:52 +01:00
Erik Sundell
6bfa402bfa Apply suggestions from code review 2020-10-30 13:19:18 +01:00
Min RK
b51a0bba92 Changelog for 1.2.1 2020-10-30 13:15:19 +01:00
Erik Sundell
2d3f962a1d Merge pull request #3234 from gesiscss/master
Make external JupyterHub services' oauth_no_confirm configuration work as intentend
2020-10-30 13:07:39 +01:00
Kenan Erdogan
625242136a fix checking if oauth confirm is needed 2020-10-30 10:39:02 +01:00
Min RK
f92560fed0 back to dev 2020-10-29 14:06:20 +01:00
Min RK
8249ef69f0 release jupyterhub 1.2.0 2020-10-29 14:03:34 +01:00
Min RK
c63605425f Merge pull request #3233 from minrk/1.2.0-final
latest changelog since 1.2.0b1
2020-10-29 14:03:01 +01:00
Min RK
5b57900c0b 1.2.0 heading in changelog
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-10-29 14:02:35 +01:00
Erik Sundell
d0afdabd4c order changelog entries systematically 2020-10-29 13:13:02 +01:00
Min RK
618746fa00 latest changelog since 1.2.0b1 2020-10-29 13:02:04 +01:00
Min RK
e7bc6c2ba9 Merge pull request #3229 from minrk/configurable-pagination
make pagination configurable
2020-10-29 10:53:29 +01:00
Min RK
e9f86cd602 make pagination configurable
add some unittests for pagination

reorganize pagination a bit to make it easier to configure
2020-10-29 09:24:34 +01:00
Erik Sundell
6e8517f795 Merge pull request #3232 from consideRatio/pr/travis-badge
Update travis-ci badge in README.md
2020-10-28 23:01:04 +01:00
Erik Sundell
5fa540bea1 Update travis-ci badge in README.md 2020-10-28 22:59:44 +01:00
Min RK
99f597887c Merge pull request #3223 from consideRatio/pr/proxy-api_request-retries
Make api_request to CHP's REST API more reliable
2020-10-28 15:21:23 +01:00
Erik Sundell
352526c36a Merge pull request #3226 from xlotlu/patch-1
Fix typo in documentation
2020-10-28 08:09:11 +01:00
Ionuț Ciocîrlan
cbbed04eed fix typo 2020-10-28 03:00:31 +02:00
Erik Sundell
b2756fb18c Retry on >=500 errors on hub to proxy REST API reqeusts 2020-10-27 16:53:53 +01:00
Erik Sundell
37b88029e4 Revert improved logging attempt 2020-10-27 16:28:56 +01:00
Erik Sundell
4b7413184e Adjust hub to proxy REST API requests' timeouts 2020-10-27 16:23:40 +01:00
Min RK
41ef0da180 Merge pull request #3219 from elgalu/patch-3
Fix #2284 must be sent from authorization page
2020-10-27 15:41:05 +01:00
Erik Sundell
a4a8b3fa2c Fix scope mistake 2020-10-27 13:38:34 +01:00
Erik Sundell
02e5984f34 Let API requests to CHP retry on 429,500,503,504 as well 2020-10-27 12:52:14 +01:00
Erik Sundell
b91c5a489c Rely on HTTPError over pycurl assumed CurlError 2020-10-26 20:39:20 +01:00
Erik Sundell
c47c3b2f9e Make api_request to CHP's REST API more reliable 2020-10-25 02:35:36 +01:00
Min RK
eaa1353dcd typos in use of partition 2020-10-23 14:16:46 +02:00
Leo Gallucci
b9a3b0a66a Fix #2284 must be sent from authorization pageUpdate jupyterhub/apihandlers/auth.py
Co-authored-by: Min RK <benjaminrk@gmail.com>
2020-10-22 11:36:15 +02:00
Leo Gallucci
929b805fae Fix #2284 must be sent from authorization page
Fix #2284 Authorization form must be sent from authorization page
2020-10-21 17:57:14 +02:00
Min RK
082f6516a1 1.2.0b1 2020-10-16 10:14:32 +02:00
Erik Sundell
1aa21f1d6c Merge pull request #3192 from consideRatio/pr/changelog-for-1.2.0b1
changelog for 1.2.0b1
2020-10-15 15:30:30 +02:00
Erik Sundell
cec9702796 changelog for 1.2.0b1 updated 2020-10-15 14:56:43 +02:00
Erik Sundell
f8cbda9c3c Merge pull request #3208 from minrk/traitlets-list-allow-none
avoid specifying default_value=None in Command traits
2020-10-15 14:47:36 +02:00
Min RK
71aee05bc0 use /api/status to test server
workaround 404 issue with /api/spec.yaml in jupyter-server 1.0.4
2020-10-15 13:23:02 +02:00
Erik Sundell
772de55a0d Merge pull request #3209 from minrk/rtd-docs
stop building docs on circleci
2020-10-15 12:14:40 +02:00
Min RK
e6f92238b1 stop building docs on circleci
RTD CI is enabled now
2020-10-15 11:41:11 +02:00
Min RK
db76b52e35 avoid specifying default_value=None in Command traits
causes issues with traitlets dev where 'unspecified' should be Undefined, not specified-None

Best to leave it out if it's really unspecified
2020-10-15 11:38:08 +02:00
Min RK
e6e994e843 add changelog highlights for 1.2.0 2020-10-15 11:01:26 +02:00
Min RK
284e379341 Merge pull request #3204 from kreuzert/exponential_backoff_overflow_exception
Prevent OverflowErrors in exponential_backoff()
2020-10-15 10:39:28 +02:00
Erik Sundell
3ce1cc63af Merge pull request #3207 from kinow/patch-2
[docs] Remove duplicate line in changelog for 1.1.0
2020-10-15 00:34:56 +02:00
Bruno P. Kinoshita
9945a7f7be Update changelog.md
Remove duplicate changelog from 1.1.0
2020-10-15 09:59:04 +13:00
Tim Kreuzer
004c964cc1 Update utils.py 2020-10-13 10:37:31 +02:00
Tim Kreuzer
0f0d6d12d3 Update jupyterhub/utils.py
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-10-13 10:30:05 +02:00
Tim Kreuzer
c97e4d4e2f Update utils.py
Prevent exponential_backoff() to crash with an Vverflow Error
2020-10-12 17:25:25 +02:00
Erik Sundell
53d496aff5 changelog for 1.2.0b1 2020-10-04 07:04:42 +02:00
Min RK
032ae29066 Merge pull request #3184 from rainwoodman/patch-1
Mention the PAM pitfall on fedora.
2020-10-02 10:50:17 +02:00
Yu Feng
21caa57e7b remove sshauthenticator reference. 2020-10-01 09:13:37 -07:00
Yu Feng
37ee104afa Update docs/source/reference/config-sudo.md
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-10-01 09:11:15 -07:00
Erik Sundell
dac75ff996 Merge pull request #3019 from stv0g/remove-unused-imports
Remove unused imports
2020-10-01 13:17:36 +02:00
Erik Sundell
67e06e5a18 Fix order of imports 2020-10-01 12:44:51 +02:00
Erik Sundell
4cbc0bad34 Merge branch 'master' into remove-unused-imports 2020-10-01 12:07:37 +02:00
Erik Sundell
9f8c1decc4 Merge pull request #2891 from rajat404/auto-gen-docs
Generate prometheus metrics docs
2020-10-01 11:40:05 +02:00
Erik Sundell
1244533387 Merge pull request #3185 from rainwoodman/patch-2
Add SELinux configuration for nginx
2020-10-01 11:15:32 +02:00
Erik Sundell
8c30724f17 monitoring docs: fixes following monitoring section relocation 2020-10-01 10:45:11 +02:00
Erik Sundell
50868f5bb5 monitoring docs: relocate monitoring section under technical reference 2020-10-01 10:36:19 +02:00
Erik Sundell
e15b6ad52e Makefile: let make html depend on generated metrics.rst 2020-10-01 10:13:31 +02:00
Rajat Goyal
b194135a0f Generate list of prometheus metrics in reStructuredText rather than markdown 2020-09-30 23:52:29 +05:30
Rajat Goyal
5b8a7fd191 Remove unused dependency 2020-09-30 23:25:22 +05:30
Rajat Goyal
be272ffb2a Formatted text for better readability 2020-09-30 23:14:21 +05:30
Rajat Goyal
8ee60ce0c7 Add metrics documentation generation step in CircleCI & RTD configs
Also rename generated metrics documentation directory `_gen` from `gen`
2020-09-30 22:57:46 +05:30
Rajat Goyal
e553bcb7e2 Unpin dependencies from their patch versions 2020-09-30 22:08:50 +05:30
Rajat Goyal
c0288ec6f6 Update docs/source/monitoring/index.rst
- Fixes typo (eolving -> evolving)
- re-use the word current instead of momentary for comprehensibility
- references JupyterHubs current state with its instead of the for comprehensibility

Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-09-30 22:08:50 +05:30
Rajat Goyal
65b83f5f00 Update docs/source/monitoring/index.rst
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-09-30 22:08:50 +05:30
Rajat Goyal
dcd520179c Made changes in monitoring docs as per the feedback on PR review 2020-09-30 22:08:50 +05:30
Rajat Goyal
c830d964d5 Apply suggestions from code review
Co-authored-by: Min RK <benjaminrk@gmail.com>
2020-09-30 22:08:50 +05:30
rajat404
9e5993f1da Docs: Fix typo; Add generate task as sub-task in html 2020-09-30 22:08:50 +05:30
rajat404
7ed3e0506b Extract doc generation logic in separate method 2020-09-30 22:08:50 +05:30
rajat404
7045e1116c Inspect metrics and generate metric list in docs; Add monitoring section in Docs 2020-09-30 22:08:50 +05:30
Yu Feng
fb56fd406f Add SELinux configuration for nginx
On a Fedora workstation these steps are needed.
2020-09-22 22:08:42 -07:00
Yu Feng
5489395272 Mention the PAM pitfall on fedora. 2020-09-22 21:51:08 -07:00
Yuvi Panda
6ecda96dd6 Merge pull request #3174 from AngelOnFira/upgrade-jquery-dep
Upgraded Jquery dep
2020-09-17 22:42:26 +05:30
Forest Anderson
80ad455fc7 Upgraded jquery dep 2020-09-14 13:01:27 -04:00
Min RK
21eaf0dd9f Merge pull request #3077 from kinow/add-config-reference
Add Configuration Reference section to docs
2020-09-08 16:40:10 +02:00
Min RK
84d2524025 jupyterhub_config.py filename typo 2020-09-08 16:39:51 +02:00
Min RK
959dfb145a Merge pull request #3121 from rkdarst/clear-state-after-post-stop-hook
jupyterhub/user: clear spawner state after post_stop_hook
2020-09-08 16:38:18 +02:00
Min RK
998c18df42 Merge pull request #3133 from ideonate/master
Allow JupyterHub.default_url to be a callable
2020-09-08 16:36:52 +02:00
Richard Darst
88b10aa2f5 jupyterhub/user: Remember to save the state in the database 2020-09-08 13:48:27 +03:00
Dan Lester
d8f5758e08 Fix rst in default_url docstring 2020-09-08 09:55:03 +01:00
Min RK
47e45a4d3f Merge pull request #3136 from pabepadu/add_footer_block
Add a footer block + wrap the admin footer in this block
2020-09-08 09:38:21 +02:00
Min RK
3e31ff4ac7 Merge pull request #3160 from rcthomas/control-service-display
Control service display
2020-09-08 09:37:12 +02:00
Min RK
ff30396a8e Merge pull request #3028 from possiblyMikeB/ui-feedback-onsubmit
UI Feedback on Submit
2020-09-08 09:36:39 +02:00
Min RK
196a7fbc65 Merge pull request #3072 from minrk/purge-expired
synchronize implementation of expiring values
2020-09-08 09:35:25 +02:00
Richard Darst
c66e8bb4c9 jupyterhub/user: remuve extraneous = {}
- Thanks to review from @minrk
2020-09-07 17:21:23 +03:00
Min RK
5595146fe2 Merge pull request #3147 from jgwerner/fix/api-request-error
Get error description from error key vs error_description key
2020-09-07 16:18:21 +02:00
Min RK
76b688e574 Merge pull request #3137 from lydian/sort_on_spawner_last_activity
admin page sorts on spawner last_activity instead of user last_activity
2020-09-07 16:14:12 +02:00
Min RK
f00d0be4d6 Merge pull request #3156 from manics/docker-py38
Update Dockerfile to ubuntu:focal (Python 3.8)
2020-09-07 16:13:18 +02:00
Min RK
f9d815676f verify static files in docker tests 2020-09-07 16:06:48 +02:00
Min RK
94612d09a6 build wheel with setup.py bdist_wheel
pip wheel from scratch may not include files generated during build
2020-09-07 15:03:13 +02:00
Dan Lester
76ed65ed82 default_url takes handler object instead of user 2020-08-31 18:36:57 +01:00
Greg
560bab395b update based on pr suggestion
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:16:57 -04:00
Greg
c68b846eef get error key or error_description key if not available
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:12:18 -04:00
Greg
5896b2c9f7 get error description from error key vs error_description key
Signed-off-by: Greg <werner.greg@gmail.com>
2020-08-27 11:12:18 -04:00
Min RK
0317fd63fa Merge pull request #3103 from kinow/responsive-issues
Hide hamburger button menu in mobile/responsive mode and fix other minor issues
2020-08-27 11:15:50 +02:00
Min RK
7f6886c60f Merge pull request #3104 from cmd-ntrf/rest-api-version
Update version in docs/rest-api.yaml
2020-08-27 11:00:14 +02:00
Min RK
10bdca8901 Merge pull request #3142 from snickell/document-external-service-api-tokens-better
Document external service api_tokens better
2020-08-27 09:52:31 +02:00
Min RK
66cb2c0f3e Merge pull request #3128 from minrk/mix-it-in
Implement singleuser with mixins
2020-08-27 09:51:19 +02:00
Min RK
0152e29946 Merge pull request #3159 from synchronizing/patch-1
Added extra documentation for endpoint /users/{name}/servers/{server_name}.
2020-08-27 09:51:01 +02:00
Min RK
c6f0c07931 Merge pull request #3157 from manics/python-traitlets-latest
Don't allow 'python:3.8 + master dependencies' to fail
2020-08-27 09:45:50 +02:00
Min RK
51ceab9f6f Merge pull request #3149 from betatim/simplifiy-health-checks
Simplify code of the health check handler
2020-08-27 09:44:02 +02:00
Rollin Thomas
46ead8cd9d Add display variable to tests 2020-08-26 21:43:16 -07:00
Rollin Thomas
bfb3d50936 Reformat! 2020-08-26 21:29:28 -07:00
Rollin Thomas
962307475e Add service display to service API model 2020-08-26 19:15:21 -07:00
Rollin Thomas
80f4edcd20 Omit service if it is not OK to display 2020-08-26 18:57:17 -07:00
Rollin Thomas
1ad4035943 Control whether service is listed in UI or not 2020-08-26 18:56:03 -07:00
Felipe Faria
5ab735fea3 Added extra documentation for endpoint /users/{name}/servers/{server_name}. 2020-08-26 19:07:57 -04:00
Simon Li
e79cb0d376 Don't allow 'python:3.8 + master dependencies' to fail 2020-08-26 22:40:57 +01:00
Simon Li
f728cf89c6 Update Dockerfile to ubuntu:focal (Python 3.8) 2020-08-26 22:24:14 +01:00
Tim Head
8f719e21d2 Simplify code of the health check handler 2020-08-26 14:07:30 +02:00
Min RK
29de00ee3c Merge pull request #3140 from chancez/fix_ssl_http_client_master
jupyterhub/utils: Load system default CA certificates in make_ssl_context
2020-08-26 14:05:29 +02:00
Chance Zibolski
52291b0012 jupyterhub/utils: Load system default CA certificates in make_ssl_context
Fixes issues with OAuth flows when internal_ssl is enabled.
When internal_ssl was enabled requests to non-internal endpoints failed
because the system CAs were not being loaded.

This caused failures with public OAuth providers with public CAs since
they would fail to validate.
2020-08-25 09:09:58 -07:00
Georgiana Elena
e58c341290 Merge pull request #3150 from yhal-nesi/master
update prometheus metrics for server spawn when it fails with exception
2020-08-22 00:01:53 +03:00
yhal-nesi
f988a4939e Update jupyterhub/handlers/base.py
Ah makes sense, I was wandering why the tests fail.

Co-authored-by: Georgiana Elena <georgiana.dolocan@gmail.com>
2020-08-22 08:47:15 +12:00
Yuriy Halytskyy
60ee2bfc35 update prometheus metrics for server spawn when it fails with exception 2020-08-20 08:18:39 +12:00
Erik Sundell
42601c52cc Merge pull request #3151 from consideRatio/docs/move-cert-docstring
docs: please docs linter (move_cert docstring)
2020-08-19 14:10:54 +02:00
Erik Sundell
0679586b2c docs: please docs linter properly
We are users of the napoleon sphinx extension, which helps us parse our
Google Style Python Docstrings, and its syntax suggest we should use
indentation when we use more then one string for an entry in an
Arguments: or Returns: list.

For more details, see: https://github.com/jupyterhub/jupyterhub/pull/3151#issuecomment-676186565
2020-08-19 13:49:28 +02:00
Erik Sundell
be4201f7ee docs: please docs linter (move_cert docstring) 2020-08-19 13:14:46 +02:00
Min RK
11a73b5630 Merge pull request #3131 from rkevin-arch/healthcheck-head-request
Allow head requests for the health endpoint
2020-08-18 10:57:09 +02:00
Tim Head
f1efac41bf Merge pull request #3143 from basvandervlies/apache_reverse_proxy_doc
Needed NoEsacpe (NE)  option for apache
2020-08-14 14:54:23 +02:00
Bas van der Vlies
aa6921dd5a Needed NoEsacpe (NE) option for apache
Else %20 is esacped to %25%20 and we acan not rename "Untitled Folder'
or opening files with spaces or other special chars fails.
2020-08-14 11:24:27 +02:00
Seth Nickell
e94da17c3c Document external service api_tokens better
- Explicitly mention min-8-char constraint
- Connect the api_token in the configuration with the one mentioned in auth requests

Co-authored-by: Mike Situ <msitu@ceresimaging.net>
2020-08-13 12:28:17 -10:00
Min RK
e2ee18fa86 Merge pull request #3123 from alexweav/tornado-py38
app.py: Work around incompatibility between Tornado 6 and asyncio proactor event loop in python 3.8 on Windows
2020-08-10 09:18:24 +02:00
Lydian Lee
c5ec8ceba3 admin page sorts on spawner last_activity instead of user last_activity 2020-08-07 16:37:47 -07:00
pabepadu
3458c742cb Add a footer block + wrap the admin footer in this block 2020-08-07 02:19:21 +02:00
Georgiana Elena
d1a85e53dc Merge pull request #3132 from pabepadu/fix_services_dropdown_in_admin_page
Fix the services dropdown on the admin page
2020-08-07 00:13:37 +03:00
Dan Lester
d915cc3ff2 Allow JupyterHub.default_url to be a callable based on user 2020-08-05 11:59:25 +01:00
Georgiana Elena
b11c02c6e0 Merge pull request #3118 from minrk/tag-from-singleuser
only build tagged versions on docker tags
2020-08-05 12:44:23 +03:00
pabepadu
49f3bb53f4 Fix the services dropdown in the admin page 2020-08-05 05:29:21 +02:00
rkevin
9b7a94046b Allow head requests for the health endpoint 2020-08-03 00:20:17 -07:00
Min RK
62ef5ca2fe test with /api/spec.yaml
because /api/status is currently broken in jupyter_server
2020-07-31 12:44:42 +02:00
Min RK
028e0b0b77 include JUPYTERHUB_SINGLEUSER_APP in env_keep
since the child process is the one that inherits it anyway
2020-07-31 12:12:38 +02:00
Min RK
d2a42a69b0 simplify app mixin
get handler classes from instance attributes, rather than arguments

simplifies API
2020-07-31 12:12:11 +02:00
Min RK
1f21f283df Merge pull request #3127 from mriedem/3126-slow-spawn-timeout-warning
Don't log a warning when slow_spawn_timeout is disabled
2020-07-31 12:07:38 +02:00
Alex Weaver
7f35158575 Also apply patch before creating new event loop in atexit, just in case 2020-07-29 11:03:05 -05:00
Min RK
d0da677813 infer default mixins from $JUPYTERHUB_SINGLEUSER_APP
set to e.g. JUPYTERHUB_SINGLEUSER_APP=jupyterlab.labapp.LabApp for JupyterLab
2020-07-24 13:06:35 +02:00
Min RK
a0a02688c5 create singleuser app with mixins
for easier reuse with jupyter_server

mixins have a lot of assumptions about the NotebookApp structure.
Need to make sure these are met by jupyter_server (that's what tests are for!)
2020-07-24 12:57:05 +02:00
Min RK
2372842b8a Merge remote-tracking branch 'origin/master' into mix-it-in
# Conflicts:
#	.travis.yml
2020-07-24 09:53:02 +02:00
Matt Riedemann
7e205a9751 Don't log a warning when slow_spawn_timeout is disabled
When using the `KubeSpawner` it is typical to disable the
`slow_spawn_timeout` by setting it to 0. `zero-to-jupyterhub-k8s`
does this by default [1]. However, this causes an immediate `TimeoutError`
which gets logged as a warning like this:

>User hub-stress-test-123 is slow to start (timeout=0)

This avoids the warning by checking the value and if disabled simply
returns without logging the warning.

[1] https://github.com/jupyterhub/zero-to-jupyterhub-k8s/commit/b4738edc5

Closes #3126
2020-07-23 16:09:19 -05:00
Alex Weaver
e7fab5c304 Format and lint 2020-07-22 15:16:11 -05:00
Alex Weaver
8b8b512d06 Apply asyncio patch 2020-07-22 15:04:16 -05:00
Richard Darst
714072dbd8 jupyterhub/user: clear spawner state after post_stop_hook
- Related issue: #3120.  Closes: #3120.

- I realized that spawner.clear_state() is called before
  spawner.post_stop_hook().  This caused was a bit surprising to me,
  and caused some issues.

- I tried the naive strategy of moving clear_state to later and
  setting the orm_state to `{}` at the point where it used to be
  clear.

- This tries to maintain the exception behavior of clear_state and
  post_stop_hook, but is exactly identical.

- To review:

  - I'm not sure this is a good idea!

  - Carefully consider the implications of this.  I am not at all sure
    about unintended side-effects or what intended semantics are.
2020-07-22 10:06:21 +03:00
Min RK
6e8f39c22d only build tagged versions on docker tags
instead of building 'stable' from master
2020-07-20 10:14:35 +02:00
Erik Sundell
f3c3225124 Merge pull request #3114 from yuvipanda/no-cull-idle
Remove idle culler example
2020-07-14 17:03:12 +02:00
Georgiana Elena
614bfe77d8 Update examples/cull-idle/README.md 2020-07-14 14:22:51 +03:00
YuviPanda
1beea06ce5 Remove idle culler example
Has been moved to its own repo.

See https://github.com/jupyterhub/the-littlest-jupyterhub/pull/559
for more info
2020-07-12 17:14:14 +05:30
Erik Sundell
42adb44153 Merge pull request #3111 from mriedem/log-slow-stop-timeout
Log slow_stop_timeout when hit like slow_spawn_timeout
2020-07-11 02:56:13 +02:00
Matt Riedemann
d5a0202106 Log slow_stop_timeout when hit like slow_spawn_timeout
When `slow_spawn_timeout` is hit the configured timeout value
gets logged [1]. This does the same thing when `slow_stop_timeout`
is hit.

[1] https://github.com/jupyterhub/jupyterhub/blob/1.1.0/jupyterhub/handlers/base.py#L947
2020-07-10 11:38:26 -05:00
Georgiana Elena
3d524f2092 Merge pull request #3109 from kxiao-fn/proper_named_server_deletion
fix for stopping named server deleting default server and tests
2020-07-07 15:41:43 +03:00
Katherine Xiao
409835303e formatting 2020-07-06 17:45:08 -07:00
Katherine Xiao
acc8d15fec fixed test 2020-07-06 17:23:42 -07:00
Katherine Xiao
608cad6404 fix in base.py 2020-07-06 12:53:50 -07:00
Katherine Xiao
571a428375 fix deletion of default server when stopping named server and added corresponding test 2020-07-06 12:48:41 -07:00
Chris Holdgraf
1575adf272 Merge pull request #3107 from consideRatio/docs-logo-rem-unused-stuff
docs: unsqueeze logo, remove unused CSS and templates
2020-07-06 08:00:14 -07:00
Erik Sundell
4bc6d869f3 docs: unsqueeze logo, remove unused CSS and templates 2020-07-05 03:12:18 +02:00
Min RK
e5a6119505 Merge pull request #3090 from minrk/words-matter 2020-07-03 12:27:08 +02:00
Félix-Antoine Fortin
d80dab284d Update version in docs/rest-api.yaml 2020-06-30 08:59:29 -04:00
Bruno P. Kinoshita
9d556728bb Add padding for the span with user name and logout button (responsive mode only) 2020-06-25 23:31:54 +12:00
Bruno P. Kinoshita
4369e2cbfa Adjust jupyterhub logo margin-left in responsive mode 2020-06-25 23:31:54 +12:00
Bruno P. Kinoshita
ef4455bb67 Closes #2182 display hamburger menu only if user variable is present (in responsive mode) 2020-06-25 23:31:54 +12:00
Min RK
76c9111d80 Merge pull request #3089 from kinow/redirect-with-parameters 2020-06-25 11:08:17 +02:00
Bruno P. Kinoshita
946ed844c5 Update jupyterhub/handlers/base.py
Co-authored-by: Min RK <benjaminrk@gmail.com>
2020-06-25 19:41:46 +12:00
Min RK
cceb652039 TODO is TODONE
Co-authored-by: Georgiana Elena <georgiana.dolocan@gmail.com>
2020-06-24 20:19:44 +02:00
Min RK
6e988bf587 call it allowed_users
be clearer since it's users vs groups, etc.
2020-06-24 13:29:42 +02:00
Simon Li
dbc6998375 Merge pull request #3102 from minrk/unpin-telemetry
loosen jupyter-telemetry pin
2020-06-23 14:18:40 +01:00
Bruno P. Kinoshita
1bdc9aa297 Escape/encode parameters with the next URL, add more tests 2020-06-24 00:18:55 +12:00
Bruno P. Kinoshita
73f1211286 Update append_query_parameters to have exclude=["none"] by default,
and avoid using dicts with url_concat, to have consistent tests
as otherwise in Python 3.5 the generated URL's could have parameters
in random order.
2020-06-23 22:06:57 +12:00
Min RK
3fece09dda loosen jupyter-telemetry pin
we don't want strict pinning in package dependencies
2020-06-23 10:13:31 +02:00
Min RK
7ad4b0c7cb update allowed/blocked language in docs
our words matter, let's be more mindful
2020-06-23 10:10:07 +02:00
Min RK
252015f50d Merge pull request #3071 from minrk/userdict-get 2020-06-23 10:03:13 +02:00
Min RK
b3cc235c8a Merge pull request #3087 from fcollonval/patch-1 2020-06-23 10:02:34 +02:00
Min RK
47d7af8f48 Merge pull request #3100 from mriedem/remove-old-print 2020-06-23 09:58:00 +02:00
Matt Riedemann
8528684dc4 Remove old context-less print statement
This was added in PR #2721 and by default results in just printing
out "10" without any context when starting the hub service. This
simply removes the orphan print statement.

I'm open to changing this to a debug log statement with context if
someone finds that useful, e.g.:

`self.log.debug('Effective init_spawners_timeout: %s', init_spawners_timeout)`
2020-06-22 15:35:15 -05:00
Bruno P. Kinoshita
d4ce3aa731 Add unit tests 2020-06-20 22:51:16 +12:00
Min RK
ec710f4d90 test subclass priority when overriding old methods 2020-06-18 11:50:44 +02:00
Bruno P. Kinoshita
14378f4cc2 Include the query string parameters when redirecting to a new URL 2020-06-17 22:37:20 +12:00
Min RK
cc8e780653 rename white/blacklist allowed/blocked
- group_whitelist -> allowed_groups

still todo: handle deprecated signatures in check_whitelist methods while preserving subclass overrides
2020-06-15 14:40:44 +02:00
Frédéric Collonval
5bbf584cb7 Make delete_invalid_users configurable 2020-06-13 15:58:46 +02:00
Erik Sundell
b5defabf49 Merge pull request #3086 from manics/sshspawner
Replace zonca/remotespawner with NERSC/sshspawner
2020-06-13 14:05:05 +02:00
Simon Li
2d1f91e527 Replace zonca/remotespawner with NERSC/sshspawner
https://github.com/zonca/remotespawner is archived, the readme recommends https://github.com/jupyterhub/batchspawner
2020-06-13 11:47:34 +01:00
Tim Head
1653ee77ed Merge pull request #3084 from elgalu/patch-2
Remove already done named servers from roadmap
2020-06-13 09:55:26 +02:00
Leo Gallucci
10f09f4f70 Remove already done named servers from roadmap
Remove already done "UI for managing named servers" from the roadmap
2020-06-12 18:00:00 +02:00
Min RK
b7f277147b Merge pull request #3057 from GeorgianaElena/add_config_warn 2020-06-12 17:21:26 +02:00
Min RK
f3be735eeb Merge pull request #3082 from ChameleonCloud/fix-missing-static-files 2020-06-12 17:19:35 +02:00
Georgiana Elena
3e855eb1be Merge pull request #3083 from minrk/docker-demo-build
build jupyterhub/jupyterhub-demo image on docker hub
2020-06-12 12:10:27 +03:00
Min RK
98dc1f71db build jupyterhub/jupyterhub-demo image on docker hub 2020-06-12 10:03:34 +02:00
Jason Anderson
703703a648 Ensure client dependencies build before wheel
Bug #2852 describes an issue where templates cannot be found by
JupyterHub when using the Docker images built out of this repo. The
issue turned out to be due to missing node_modules at the time of build.

There is a hook in the `package.json` that causes node_modules to be
copied to the static/components directory post-install. If this is not
run, those components are not in the static directory and thus are not
included in the wheel when it is built.

Fix #2905 fixed one problem--the `bower-lite` hook script wasn't copied
to the Docker image, and so the hook couldn't run, but the other issue
is that the client dependencies are never explicitly built. They must be
built prior to the wheel build, and the hook script must have run so
they are copied to the ./static folder, which is included in the wheel
build thanks to [MANIFEST.in][1]

.. note::

   This removes the verbose flag from the wheel build command. The
   reason is that it generates a lot of writes to stdout. It seems that
   wheel can (or always) is switching to non-blocking mode, which can cause
   EAGAIN to be raised, which leads to fun errors like:

     BlockingIOError(.., 'write could not complete without blocking', ..)

   The wheels fail to build if this error is raised. Removing the verbosity
   flag is a quick solution (it drastically reduces writes to STDOUT), but
   comes at the cost of more trouble debugging a failed wheel build. Adding
   the "-v" back in the Dockerfile when debugging a build failure is still
   possible. [Credit: @vbraun][2]

.. note::

   This commit also removes some extraneous COPY operations during the
   Docker build, in particular the /src/jupyterhub/share directory is
   not used unless users have explicitly override their
   jupyterhub_config.py to include it somehow. If the default
   data_files_path behavior is used, JupyterHub should find the proper
   static directory when the application loads.

Fixes: #2852

[1]: https://packaging.python.org/guides/using-manifest-in/
[2]:
https://github.com/travis-ci/travis-ci/issues/4704#issuecomment-348435959
2020-06-11 15:15:56 -05:00
Yuvi Panda
8db8df6d7a Merge pull request #3081 from minrk/env-config-priority 2020-06-11 18:23:37 +05:30
Min RK
744430ba76 Merge pull request #3059 from GeorgianaElena/jh-demo-img 2020-06-11 10:45:01 +02:00
Min RK
45b858c5af Merge pull request #3055 from minrk/document-admin-service 2020-06-11 10:43:23 +02:00
Min RK
d4b5373c05 synchronize implementation of expiring values
- base Expiring class
- ensures expiring values (OAuthCode, OAuthAccessToken, APIToken) are not returned from `find`
- all expire appropriately via purge_expired
2020-06-11 10:40:06 +02:00
Min RK
aba55cc093 implement UserDict.get
behaves more like one would expect (same as try get-key, except: return default)
without relying on cache presence or underlying key type (integer only)
2020-06-11 10:32:55 +02:00
Min RK
5957a37933 Merge pull request #3079 from manics/allow_fail-masterdeps 2020-06-11 10:31:19 +02:00
Min RK
d20a33a0e4 Merge pull request #3078 from gatoniel/patch-1 2020-06-11 10:30:21 +02:00
Min RK
df35268bfe make Spawner.environment config highest priority
so that it can override 'default' env variables like JUPYTERHUB_API_URL

use with caution!
2020-06-11 09:45:18 +02:00
Simon Li
c357d02b56 Allow python:3.8 + master dependencies to fail
Follow-up from https://github.com/jupyterhub/jupyterhub/pull/3076
2020-06-10 14:53:58 +01:00
niklas netter
4eb22821f2 no_proxy does work 2020-06-10 14:51:37 +02:00
niklas netter
b92ea54eda proxy settings might cause authentication errors 2020-06-10 14:16:36 +02:00
Bruno P. Kinoshita
522ef3daea Add Configuration Reference 2020-06-08 23:49:31 +12:00
Tim Head
77edffd695 Merge pull request #3076 from Carreau/traitlets-master
Test with some master dependencies.
2020-06-07 09:33:23 +02:00
Matthias Bussonnier
a8bc4f8a4a Test with some master dependencies.
This does some of the test with the latest traitlets.
We are looking into making a 5.0 release and would like to have some
confidence that it does not break too many things.
2020-06-05 15:05:10 -07:00
Georgiana Elena
66c3760b02 Update jupyterhub/app.py
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-06-03 14:30:51 +03:00
Erik Sundell
fd28e224f2 Merge pull request #3067 from Zsailer/telemetry-dependency
pin jupyter_telemetry dependency
2020-06-01 23:03:30 +02:00
Zsailer
da3fedb5aa pin jupyter_telemetry dependency 2020-06-01 12:41:22 -07:00
GeorgianaElena
e4e4d472b8 Add JupyterHub Demo docker image 2020-05-28 17:35:42 +03:00
GeorgianaElena
bcbc68dd82 Warn if both bind_url and ip/port/base_url are set 2020-05-27 21:05:01 +03:00
Simon Li
c7df0587d2 Merge pull request #3056 from GeorgianaElena/remove_issue_templates
Use the issue templates from the central repo
2020-05-26 15:56:11 +01:00
GeorgianaElena
cd36733858 Remove the issue templates so that the ones from the central repo jupyterhub/.github take effect 2020-05-26 14:49:36 +03:00
Min RK
6bf4f3b2aa document upgrading from api_tokens to services config 2020-05-26 13:40:21 +02:00
Simon Li
12d81ac07a Merge pull request #3054 from jtpio/black-github-link
Update links to the black GitHub repository
2020-05-25 18:49:27 +01:00
Jeremy Tuloup
d60fa9a400 Update links to the black GitHub repository 2020-05-25 16:10:08 +02:00
Min RK
81d423d6c6 Merge pull request #3040 from romainx/#1018 2020-05-19 15:06:37 +02:00
Min RK
069b477ff3 Merge pull request #3013 from twalcari/feature/spawn_query_arguments 2020-05-19 15:06:17 +02:00
Min RK
cf9046ea47 Merge pull request #3046 from ceocoder/patch-1 2020-05-19 14:58:14 +02:00
Min RK
71a25d4514 Merge pull request #3042 from rabsr/2925_start_my_server_fails 2020-05-19 14:57:44 +02:00
Tim Head
2ff7d05b15 Merge pull request #3047 from consideRatio/health-endpoint-debug-log 2020-05-15 14:39:08 +02:00
Tim Head
bdb29df82a Merge pull request #3048 from mhwasil/disable-proxy-buffering 2020-05-15 14:38:28 +02:00
Mohammad Wasil
0dbad9bd99 Disable proxy_buffering to make the progress bar working when using nginx reverse proxy 2020-05-15 13:51:50 +02:00
Erik Sundell
2991d2d1f1 Log successful /health requests on the debug level
They are less relevant than other request and could very well end up
cluttering the logs. It is not uncomming for these requests to be made
every second or every other second.
2020-05-15 11:48:48 +02:00
dp
a36a56b4ff docs: add proxy_http_version 1.1
add proxy_http_version 1.1 as it is required for KeepAlive connections
2020-05-14 16:16:07 -07:00
romainx
0e59ab003a Readme updated according to review 2020-05-11 14:54:32 +02:00
ragar64
d67b71b7ae " #2925 : Changing start my server button link to spawn url once server is stopped" 2020-05-08 21:47:41 +05:30
romainx
8859bf8842 #1018 PAM added in prerequisites 2020-05-08 06:06:42 +02:00
Thijs Walcarius
4e29342711 Test error path when parsing query arguments 2020-05-06 11:27:04 +02:00
Min RK
8a3790b01f Adding pagination in the admin panel (#2929)
Adding pagination in the admin panel
2020-05-06 11:09:54 +02:00
Min RK
0d245fe4e4 move pagination info next to pagination links
at the bottom
2020-05-06 10:47:08 +02:00
Min RK
da34c6cb34 remove hardcoded path from pagination links
allows pagination of other pages
2020-05-06 10:44:53 +02:00
Min RK
9c0e5ba9c2 Merge pull request #2971 from mriedem/issues/2970-singleuser-version-logging
Only log hub / singleuser version mismatch once
2020-05-06 09:23:04 +02:00
Tim Head
289c3bc3c1 Merge pull request #3035 from vilhelmen/server_ver 2020-05-05 10:00:27 +02:00
Yuvi Panda
3adfec0693 Merge pull request #3020 from stv0g/ipv6-spawner-ip
Support kubespawner running on a IPv6 only cluster
2020-05-04 08:14:01 +05:30
Will Starms
137591f458 remove fixed position, causes Z ordering issues with the bottom of the users list 2020-05-01 19:09:19 -05:00
Michael Blackmon
debd297494 restrict submit handler to only operate on targeted form 2020-04-20 11:33:38 -04:00
Michael Blackmon
10bb5ef3c0 wrap button & widget in feedback-container; add js block with onsubmit handler 2020-04-20 11:00:40 -04:00
Michael Blackmon
42e7d1a3fb put submit button & widget in feedback-container; extend template to include script block with form onsubmit handler 2020-04-20 10:59:34 -04:00
Michael Blackmon
5fbd2838c9 add style class for feedback, widget and container 2020-04-20 10:39:57 -04:00
Michael Blackmon
17dde3a2a9 remove margin styling from submit button 2020-04-20 10:38:19 -04:00
Tim Head
8d50554849 Merge pull request #3022 from joshmeek/docs/index_verbage 2020-04-18 21:17:21 +02:00
Tim Head
493eb03345 Merge branch 'master' into docs/index_verbage 2020-04-18 21:04:11 +02:00
Tim Head
1beac49f4a Merge pull request #3015 from jtpio/admin-template 2020-04-18 19:01:39 +02:00
Tim Head
f230be5ede Merge branch 'master' into admin-template 2020-04-18 15:44:05 +02:00
Steffen Vogel
6283e7ec83 support kubespawner running on a IPv6 only cluster 2020-04-17 19:36:56 +02:00
Thijs Walcarius
2438766418 Show error message when spawning via query-arguments failed. Add options_from_query function 2020-04-17 16:47:55 +02:00
Thijs Walcarius
6f2e409fb9 Allow bypassing of spawn form by calling options in query arguments of /spawn 2020-04-17 16:47:55 +02:00
Carol Willing
aa459aeb39 Merge pull request #3021 from rkdarst/fix-docs
Fix docs CI test failure: duplicate object description
2020-04-17 07:35:24 -07:00
Richard Darst
9d6e8e6b6f Temporary patch autodoc-traits to fix build error [temporary]
- This commit should be removed later after autodoc-traits is fixed upstream
2020-04-17 11:43:49 +03:00
Richard Darst
e882e7954c docs: use recommonmark as an extension
- source_parsers deprecated in sphinx 3.0
- Since sphinx 1.4, it can (should) be used as a direct extension:
  https://github.com/readthedocs/recommonmark/pull/43
2020-04-17 11:11:24 +03:00
Richard Darst
c234463a67 sphinx conf.py: update add_stylesheet -> add_css_file
- Seems to be added in 1.0:
  https://www.sphinx-doc.org/en/latest/changes.html#release-1-0-jul-23-2010
2020-04-17 11:11:24 +03:00
Georgiana Elena
391320a590 Merge pull request #3025 from twalcari/patch-1
Fix broken test due to BeautifulSoup 4.9.0 behavior change
2020-04-17 11:10:25 +03:00
Thijs Walcarius
8648285375 Fix broken test due to BeautifulSoup 4.9.0 behavior change
cfr. https://bugs.launchpad.net/beautifulsoup/+bug/1871335
2020-04-17 10:00:25 +02:00
Josh Meek
485c7b72c2 Fix use of auxiliary verb on index.rst 2020-04-16 09:36:52 -04:00
Steffen Vogel
e93cc83d58 remove unused imports 2020-04-16 12:12:22 +02:00
Jeremy Tuloup
39b9f592b6 Fix user_row endblock in admin template 2020-04-08 17:22:25 +02:00
Tim Head
1f515464fe Merge pull request #3010 from GeorgianaElena/pip_for_docs
Use pip instead of conda for building the docs on RTD
2020-04-02 13:50:27 +02:00
GeorgianaElena
854d0cbb86 Add package requirements to docs build 2020-04-02 10:32:11 +03:00
GeorgianaElena
87212a7414 Remove comment referencing conda environment 2020-04-02 08:55:04 +03:00
GeorgianaElena
2338035df2 Use latest rtd docker image 2020-04-01 14:25:08 +03:00
GeorgianaElena
ea132ff88d Downgrade bootprint 2020-04-01 14:23:35 +03:00
GeorgianaElena
78c14c05f3 Switch to pip on rtd 2020-04-01 14:23:35 +03:00
Erik Sundell
1d2b36e9b0 Merge pull request #3001 from GeorgianaElena/update_issue_templates
Update issue templates
2020-03-26 19:16:40 +01:00
Georgiana Elena
a929ff84c7 Update .github/ISSUE_TEMPLATE/config.yml
Co-Authored-By: Simon Li <orpheus+devel@gmail.com>
2020-03-26 20:03:02 +02:00
GeorgianaElena
0d5bbc16cf Hide comments 2020-03-26 18:30:50 +02:00
GeorgianaElena
ee1fd5a469 Have less issue templates 2020-03-26 18:14:26 +02:00
GeorgianaElena
a702f36524 Update issue templates 2020-03-26 18:14:26 +02:00
GeorgianaElena
59edc6d369 Redirect support questions to Discourse 2020-03-26 18:14:26 +02:00
Georgiana Elena
907b77788d Merge pull request #2978 from danlester/master
SpawnHandler POST with user form options displays the spawn-pending page
2020-03-26 17:13:08 +02:00
Georgiana Elena
914a3eaba5 Merge pull request #2997 from thuvh/fix_typo_installation_guide_hard
fix docs firewall instructions
2020-03-26 16:32:09 +02:00
Hoai-Thu Vuong
b1f048f2ef fix wrong name on firewall 2020-03-24 00:03:26 +07:00
Carol Willing
53d76ad3a2 Merge pull request #2995 from jupyterhub/choldgraf-patch-1
updating docs theme
2020-03-23 08:49:26 -07:00
Chris Holdgraf
7af70b92e9 Update conf.py 2020-03-23 08:29:52 -07:00
Chris Holdgraf
3425eca4ff updating docs theme 2020-03-23 08:10:49 -07:00
Carol Willing
9e0bf9cd9f Merge pull request #2944 from minrk/one-to-one
make spawner:server relationship explicitly one to one
2020-03-22 09:22:46 -07:00
Carol Willing
3118918098 Update jupyterhub/app.py
Minor comment edit
2020-03-22 09:09:49 -07:00
Carol Willing
6a995c822c Merge pull request #2972 from mriedem/contributor-docs
Update contributor docs
2020-03-22 09:04:29 -07:00
Matt Riedemann
a09f535e8f Log hub/singleuser version mismatch once per combo
In case there are multiple singleuser notebooks at different
versions we want to log each of those mismatches as a warning
so this changes the global _version_mismatch_warning_logged flag
from a bool to a dict keyed by the hub/singleuser version mismatch
combination. A test wrinkle is added for that scenario.

Part of #2970
2020-03-16 11:10:13 -04:00
Dan Lester
a60ac53c87 black formatting 2020-03-12 12:44:34 +00:00
Min RK
d2c81bc1d0 Merge pull request #2966 from mriedem/issues/2965-doc-user-options
api-ref: document user_options for server resource
2020-03-12 13:04:25 +01:00
Dan Lester
3908c6d041 SpawnHandler POST with user form options displays the spawn-pending page just like the GET handler always did 2020-03-10 16:17:01 +00:00
Matt Riedemann
c50e1f9852 Update contributor doc wording around sqlite
sqlite3 should be available from the python standard library
so there shouldn't be a need to install native packages.
2020-03-09 15:11:45 -04:00
Matt Riedemann
6954e03bb4 Update contributor docs
As a new contributor to jupyterhub it took awhile to get
up and running locally mainly because I didn't have sqlite
installed but also because I was flipping between README,
CONTRIBUTING and the actual contributing docs which are all
a little bit different.

This does a few things:

- Updates the contributor sphinx docs to mention that how
  one chooses to isolate their development environment is
  up to them with a link to the detailed forum thread on
  that topic.
- Updates the contributor sphinx docs to mention sqlite and
  database setup in general. While in here some trailing
  whitespaces are cleaned up.
- Leave a comment in CONTRIBUTING.md about the redundant
  information in the docs on getting a development environment
  setup. Long-term we should really get those merged so there
  is a single authoritative document on how to get a dev env
  setup for contributing to jupyterhub.
- Link to the jupyterhub gitter channel for asking questions.
2020-03-04 13:09:48 -05:00
Matt Riedemann
08eee9309e Only log hub / singleuser version mismatch once
If your jupyterhub and jupyterhub-singleuser instances
are running at different minor or greater versions a
warning gets logged per active server which can be a lot
when you have hundreds of active servers.

This adds a flag to that version mismatch logging logic
such that the warning is only logged once per restart
of the hub server.

Closes issue #2970
2020-03-04 11:40:23 -05:00
Juan Cruz-Benito
6ed41b38ed Improving pagination for last pages, show always the last page 2020-03-03 14:50:06 +01:00
Matt Riedemann
6b521e0b86 api-ref: document user_options for server resource
APIHandler.server_model unconditionally returns the Spawner's
user_options dict but it wasn't mentioned in the API reference
so it's added here. The description is taken from the docstring
on Spawner.user_options.

Closes issue #2965
2020-03-02 12:12:29 -05:00
Tim Head
1bdc66c75b Merge pull request #2960 from jtpio/named-servers-enter
Start named servers by pressing the Enter key
2020-03-02 10:11:32 +01:00
Jeremy Tuloup
e30b2ca875 Remove unused variables in home.js 2020-03-02 10:02:38 +01:00
Juan Cruz-Benito
1f3ed58570 Fixing pagination numbers. We begin at page 1 not 0 2020-02-28 18:03:29 +01:00
Juan Cruz-Benito
6a31b640c1 Removing more f-strings 2020-02-28 17:56:13 +01:00
Juan Cruz-Benito
ed97150311 Fixing check 2020-02-28 17:53:54 +01:00
Juan Cruz-Benito
78eb77f157 Enforcing checks of page number 2020-02-28 17:47:12 +01:00
Juan Cruz-Benito
f152288d76 Replacing f strings 2020-02-28 17:46:50 +01:00
Juan Cruz-Benito
492c5072b7 Removing print statements 🤦‍♂️ 2020-02-28 17:31:19 +01:00
Juan Cruz-Benito
534e251f97 Adding links generation inside the Pagination class 2020-02-28 17:15:19 +01:00
Jeremy Tuloup
cfcd85a188 Start named servers by pressing the Enter key 2020-02-28 15:24:37 +01:00
Erik Sundell
fd3b5ebbad Merge pull request #2959 from jtpio/patch-1
Add .vscode to gitignore
2020-02-28 15:05:34 +01:00
Jeremy Tuloup
1a2d5913eb Add .vscode to gitignore 2020-02-28 14:55:41 +01:00
Juan Cruz-Benito
8f46d89ac0 Adding info method to pagination and related items in admin template 2020-02-28 13:19:53 +01:00
Juan Cruz-Benito
e82c06cf93 Removing display_msg and record name since it can be coded directly as they're needed in the templates 2020-02-28 12:31:53 +01:00
Juan Cruz-Benito
392525571f Documenting get_page_args method 2020-02-28 12:14:59 +01:00
Juan Cruz-Benito
53927f0490 Pre-commit fixes 2020-02-28 12:05:50 +01:00
Juan Cruz-Benito
ede71db11a Moving Pagination class to its own file 2020-02-28 12:04:53 +01:00
Juan Cruz-Benito
a2e2b1d512 As pointed out in the PR, Pagination isn't a Handler 2020-02-28 12:01:56 +01:00
Tim Head
cff18992ad Merge pull request #2953 from minrk/auth-bearer
preserve auth type when logging obfuscated auth header
2020-02-28 11:48:10 +01:00
Tim Head
b2c0b5024c Merge pull request #2956 from manics/pin-sphinx-theme
[MRG] Pin sphinx theme
2020-02-28 11:28:21 +01:00
Simon Li
996483de94 Pin sphinx theme (https://github.com/jupyterhub/binderhub/pull/1070)
Closes https://github.com/jupyterhub/jupyterhub/issues/2955
2020-02-27 17:35:52 +00:00
Min RK
f4b7b85b02 preserve auth type when logging obfuscated auth header
Authorization header has the form "<type> <credentials>"

rather than checking for "token" only, preserve type value, which could be Bearer, Basic, etc.
2020-02-27 13:49:47 +01:00
Min RK
b4391d0f79 Merge pull request #2952 from kinow/fix-spawn-url
Keep the URL fragments after spawning an application
2020-02-26 14:05:45 +01:00
Juan Cruz-Benito
f49cc1fcf0 Improving description of potential parameters 2020-02-26 10:40:44 +01:00
Juan Cruz-Benito
18205fbf4a Fixing black formatting issues 2020-02-26 10:36:36 +01:00
Bruno P. Kinoshita
2f6ea71106 Add not_running.js to modify button spawn_url 2020-02-26 09:28:12 +13:00
Juan Cruz-Benito
7b6ac158cc Removing python-paginate package and adding minimal Pagination class to enable a pagination API for AdminHandler 2020-02-25 19:11:09 +01:00
Juan Cruz-Benito
facf52f117 Removing unneeded pass of request to the template 2020-02-25 17:03:01 +01:00
Juan Cruz-Benito
f36796dd85 Merge branch 'master' into add_pagination_admin 2020-02-25 17:01:01 +01:00
Min RK
0427f8090f Merge pull request #2773 from kinow/fix-ssl-url-message
Handle the protocol when ssl is enabled and log the right URL
2020-02-25 13:35:32 +01:00
Tim Head
da86eaad97 Merge pull request #2951 from kinow/typos-2
[doc] Fix couple typos in the documentation
2020-02-24 09:21:31 +01:00
Bruno P. Kinoshita
3b05135f11 Fix couple typos 2020-02-24 20:48:42 +13:00
Bruno P. Kinoshita
76afec8adb Update app.bind_url and proxy.public_url when (external) SSL is enabled 2020-02-24 15:51:09 +13:00
Tim Head
06da90ac76 Merge pull request #2950 from alexdriedger/patch-2
Docs: Fixed grammar on landing page
2020-02-23 09:11:43 +01:00
Alex Driedger
7e3caf7f48 Fixed grammar on landing page 2020-02-22 16:37:34 -08:00
Tim Head
e08552eb99 Merge pull request #2941 from minrk/allow-implicit-spawn
Allow implicit spawn via javascript redirect
2020-02-22 07:27:17 +01:00
Tim Head
5fb403af4b Merge pull request #2946 from minrk/user-redirect-faq
add general faq
2020-02-22 07:24:24 +01:00
Min RK
84acdd5a7f handle uselist=False in our relationship expiry 2020-02-21 14:10:36 +01:00
Min RK
3e6abb7a5e add general faq
and put a first q about user-redirect
2020-02-21 13:52:03 +01:00
Min RK
0315f986db Merge pull request #2940 from kinow/add-more-docs-for-cookies
[doc] Add more docs about Cookies used for authentication in JupyterHub
2020-02-21 10:18:29 +01:00
Min RK
7735c7ddd4 make spawner:server backref explicitly one-to-one
using backref(uselist=False), single_parent=True
2020-02-21 10:09:08 +01:00
Bruno P. Kinoshita
239a4c63a2 Add note that not all proxy implementations use an auth token 2020-02-21 10:35:30 +13:00
Bruno P. Kinoshita
f5bd5b7751 Incorporate review feedback 2020-02-21 10:32:11 +13:00
Bruno P. Kinoshita
287b0302d9 Add more docs about authentication and cookies, using text posted by MinRK on Discourse 2020-02-21 10:22:10 +13:00
Tim Head
44e23aad78 Merge pull request #2936 from minrk/make-it-fast-break-everything-maybe
make init_spawners check O(running servers) not O(total users)
2020-02-20 17:06:24 +01:00
Tim Head
606775f72d Remove unused variable 2020-02-20 16:56:03 +01:00
Min RK
9a6308f8d9 docs: use metachannel for faster environment solve (#2943)
docs: use metachannel for faster environment solve
2020-02-20 15:55:36 +01:00
Min RK
0c4db2d99f docs: use metachannel for faster environment solve
rtd is having memory issues with conda-forge, which should hopefully be fixed by metachannel

this should also make things quicker for anyone
2020-02-20 15:54:43 +01:00
Min RK
938970817c update docs environments (#2942)
update docs environments
2020-02-20 15:36:10 +01:00
Min RK
d2a1b8e349 update docs environments
- python 3.7
- node 12
- sync recommonmark 0.6
2020-02-20 15:32:55 +01:00
Min RK
4477506345 Merge pull request #2930 from JohnPaton/patch-1
Add favicon to the base page template
2020-02-20 14:23:06 +01:00
Min RK
0787489e1b maybe_future needs a future! 2020-02-20 12:53:15 +01:00
Min RK
436757dd55 handle implicit spawn with a javascript redirect
less dangerous than using a Location redirect, so remove conflicts

delay is a user-configurable timer (0 = no implicit spawn, default)
2020-02-20 12:43:39 +01:00
Min RK
a0b6d8ec6f add allow_implicit_spawn setting
- warn that there are known issues associated with enabling it
- it is inherently incompatible with named servers
2020-02-20 12:12:55 +01:00
Min RK
b92efcd7b0 spawner test assumed app.users is populated 2020-02-20 09:37:08 +01:00
Erik Sundell
3e17b47ec3 Merge pull request #2939 from kinow/fix-services-link
[doc] Use fixed commit plus line number in github link
2020-02-19 01:09:51 +01:00
Bruno P. Kinoshita
31c0788bd9 Move cookies to the end of the list (ssl, proxy, and then cookies) 2020-02-19 12:56:02 +13:00
Bruno P. Kinoshita
dec3244758 Use fixed commit plus line number in github link 2020-02-19 12:39:23 +13:00
Erik Sundell
91e385efa7 Merge pull request #2938 from kinow/fix-link-to-ssl-doc
[doc] Fix link to SSL encryption from troubleshooting page
2020-02-18 22:55:07 +01:00
Bruno P. Kinoshita
13313abb37 Fix link to SSL encryption from troubleshooting page 2020-02-19 10:46:49 +13:00
Min RK
79a51dfdce make init_spawners check O(running servers) not O(total users)
query on Server objects instead of User objects

avoids lots of ORM work on startup since there are typically a small number of running servers
relative to the total number of users

this also means that the users dict is not fully populated. Is that okay? I hope so.
2020-02-18 17:10:19 +01:00
JohnPaton
a999ac8f07 Use only rel="icon"
This is the officially recommended method from MDN
https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML
2020-02-14 16:51:27 +01:00
John Paton
a3e3f24d2d Add favicon to the base page template
This was missing before. Giving it its own named block will let users customize it if they wish.
2020-02-14 16:35:48 +01:00
Juan Cruz-Benito
b2b85eb548 Improving comments 2020-02-14 11:47:43 +01:00
Juan Cruz-Benito
95c5ebb090 Fixing pre-commit errors 2020-02-14 11:14:07 +01:00
Juan Cruz-Benito
3d0da4f25a Adding python-paginate package and using it to paginate admin panel 2020-02-13 18:35:17 +01:00
Tim Head
bc7bb5076f Merge pull request #2914 from jgwerner/trouble-shooting
[MRG] Add troubleshooting topics
2020-02-13 08:06:20 +01:00
Greg
a80561bfc8 updates based on pr comments
Signed-off-by: Greg <werner.greg@gmail.com>
2020-02-05 16:13:15 -05:00
Erik Sundell
22f86ad76c Merge pull request #2917 from minrk/doc-remove
rest api: fix schema for remove parameter in rest api
2020-01-31 17:31:31 +01:00
Min RK
0ae9cfa42f fix schema for remove parameter in rest api
it wasn't showing up properly since it's a *property* of the body, not the body itself
2020-01-31 17:18:30 +01:00
Min RK
ff8c4ca8a3 update bootprint to v4 2020-01-31 17:16:57 +01:00
Greg
ed4ed4de9d simplify text
Signed-off-by: Greg <werner.greg@gmail.com>
2020-01-29 12:49:52 -05:00
Greg
d177b99f3a add trouble shooting topics
Signed-off-by: Greg <werner.greg@gmail.com>
2020-01-29 12:42:42 -05:00
Erik Sundell
65de8c4916 Merge pull request #2904 from reneluria/patch-doc
Several fixes to the doc
2020-01-24 17:25:36 +01:00
Min RK
178f9d4c51 Merge pull request #2905 from consideRatio/solve-docker-template-issue
Add what we need with some margin to Dockerfile's build stage
2020-01-23 09:57:12 +01:00
Min RK
9433564c5b bump reorder-imports hook (#2899)
bump reorder-imports hook
2020-01-23 09:54:46 +01:00
Erik Sundell
5deba0c4ba Copy all files to Dockerfile's build stage
Not exactly all though as some will be ignored by the .dockerignore
file. This change ensures we don't get future issues caused by a failure
to update what needs to be copied to the build stage and not like we've
had recently.
2020-01-23 07:20:53 +01:00
Erik Sundell
5234d4c7ae Add bower-lite script to Dockerfile
This fixes #2852 by adding a script part of package.json. But is this
enough? Should we perhaps look in MANIFEST.in and copy some more files
listed there?

This is all thanks to people coming together and helping out figuring
out the issue in https://github.com/jupyterhub/jupyterhub/issues/2852.
Thank you @shingo78 for spotting that we missed bower-lite and its role
and all others who reported and helped debug this!
2020-01-23 07:20:40 +01:00
Erik Sundell
1bea28026e Merge pull request #2907 from consideRatio/fix-generate-config-bug
Fix --generate-config bug when specifying a filename
2020-01-23 07:19:11 +01:00
Erik Sundell
9a5c8ff058 Fix --generate-config bug when specifying a filename
This commit fixes #2906 that was introduced due to #2824. See analysis
of issue in
https://github.com/jupyterhub/jupyterhub/issues/2906#issuecomment-577303510.
2020-01-22 19:30:16 +01:00
Rene Luria
2b183c9773 Several fixes to the doc
* sudo for configurable-http-proxy install
* fix sudo command for apt source
* fix $connection_upgrade variable in nginx configuration
2020-01-21 17:02:23 +01:00
Tim Head
5dee864afd fix: 'Non-ASCII character '\xc3' (#2901)
fix: 'Non-ASCII character '\xc3'
2020-01-20 09:15:56 +01:00
Greg
6fdf931515 update prometheus_log_method comments
Signed-off-by: Greg <werner.greg@gmail.com>
2020-01-17 12:32:50 -05:00
Greg
d126baa443 remove diaeresis
Signed-off-by: Greg <werner.greg@gmail.com>
2020-01-17 09:43:46 -05:00
Min RK
d1e2d593ff back to dev 2020-01-17 12:55:42 +01:00
Min RK
3663d7c8fc release 1.1.0 2020-01-17 12:54:06 +01:00
Min RK
a30e6b539f changelog for 1.1.0 (#2898)
changelog for 1.1.0
2020-01-17 12:54:04 +01:00
Min RK
800b6a6bc5 bump reorder-imports
removes (hopefully) unnecessarily specified language version
2020-01-17 12:48:17 +01:00
Min RK
ca3982337e changelog for 1.1.0 2020-01-17 12:40:38 +01:00
Min RK
159b3553a9 Merge pull request #2881 from minrk/auth-state-earlier
trigger auth_state_hook prior to options form, add auth_state to template namespace
2020-01-17 12:35:33 +01:00
Min RK
6821e63b71 Merge pull request #2897 from consideRatio/combine-py38-and-bionic-ci-test
Optimize CI jobs and default to bionic
2020-01-17 12:32:10 +01:00
Erik Sundell
c1c13930f7 Optimize CI jobs and default to bionic 2020-01-17 12:19:39 +01:00
Min RK
58f18bffff _render_form is async 2020-01-17 12:08:20 +01:00
Min RK
b80906b8c8 make auth_state available to page templates 2020-01-17 10:55:07 +01:00
Min RK
07aa077eae Merge pull request #2882 from ociule/master
LocalProcessSpawner should work on windows by using psutil.pid_exists
2020-01-17 09:47:37 +01:00
Min RK
3f74c30288 Merge pull request #2887 from krinsman/master
Fix implementation of default server name
2020-01-16 19:05:30 +01:00
Min RK
141cb04b27 fix assertion in custom user_redirect_hook
custom hook means overrides server_name insertion
2020-01-16 18:05:53 +01:00
Min RK
8769864f24 missing imports in test_named_servers 2020-01-14 22:16:06 +01:00
Min RK
8ee72dd80f define default_server_name fixture 2020-01-14 22:15:14 +01:00
William Krinsman
455475724a Attempt to add tests documenting default named server feature. 2020-01-14 10:20:18 -08:00
William Krinsman
794be0de8e Fix implementation of default server name 2020-01-14 10:02:50 -08:00
Ovidiu Ciule
1f633e188d Updated doc 2020-01-14 14:40:07 +01:00
Ovidiu Ciule
df0745985b Made _signal more readable 2020-01-14 14:38:00 +01:00
Ovidiu Ciule
cad027f3fc Use psutil on windows only. 2020-01-14 14:37:44 +01:00
Min RK
61a844b413 Merge pull request #2889 from minrk/openssl-error
catch connection error for ssl failures
2020-01-14 11:26:44 +01:00
Min RK
319b404ef4 misread which error propagates up
it's a ConnectionError (requests, not stdlib)
2020-01-14 11:05:19 +01:00
Min RK
19fb7eb7cc catch openssl error for ssl failures
python 3.8 with more recent openssl seems to raise a different error
2020-01-14 10:48:48 +01:00
Georgiana Elena
cb3b0ce266 Merge pull request #2842 from mangecoeur/master
Added guide 'install jupyterlab the hard way' #2110
2020-01-10 15:34:33 +02:00
Ovidiu Ciule
82d8e9c433 Reordered commits 2020-01-10 14:30:15 +01:00
mangecoeur
86ee4cad59 add newline 2020-01-10 14:28:13 +01:00
mangecoeur
add9666fcd Update installation-guide-hard.md
Updated capitalisation of names. Addressed revisions.

Fleshed out the prerequists and explanation of access control.

Added part of configuration section to set JupyterLab as the default interface.

corrected need for sudo

Added warning to reverse-proxy section to recommend use of HTTPS and firewall.
2020-01-10 12:28:00 +01:00
mangecoeur
c93687eaad Update docs/source/installation-guide-hard.md
Co-Authored-By: Georgiana Elena <GeorgianaElena@users.noreply.github.com>
2020-01-10 11:32:27 +01:00
mangecoeur
d848873685 Update docs/source/installation-guide-hard.md
Co-Authored-By: Georgiana Elena <GeorgianaElena@users.noreply.github.com>
2020-01-10 11:32:18 +01:00
mangecoeur
c27576a41f Update docs/source/installation-guide-hard.md
Co-Authored-By: Georgiana Elena <GeorgianaElena@users.noreply.github.com>
2020-01-10 11:31:59 +01:00
Ovidiu Ciule
6d3ed95b84 Added missing dependency psutil. Already used in proxy.py#L690 2020-01-10 11:14:51 +01:00
Ovidiu Ciule
ff7cd082ff Just use psutil.pid_exists, which uses os.kill(pid, 0) on Linux as
before and win-specific code on win
2020-01-10 11:09:10 +01:00
Ovidiu Ciule
3582ecc9cc Added _is_single_user_process_alive to allow subclasses to reimplement
this without reimplementing the whole poll method.
2020-01-09 16:39:44 +01:00
Min RK
5f626268ef trigger auth_state_hook prior to options form
- allow auth_state_hook to be async
- trigger it prior to start and options_form serving, rather than on home page
2020-01-09 13:04:45 +01:00
Min RK
6227f92b5f fixup allow_failures (#2880)
fixup allow_failures
2020-01-09 12:45:09 +01:00
Min RK
020ba08635 fixup allow_failures
jobs format doesn't create jobs under allow_failures

the old syntax used to do that. Instead, it uses key, value matches
2020-01-09 12:33:57 +01:00
Min RK
2ad175816a Pass tests on Python 3.8 (#2879)
Pass tests on Python 3.8
2020-01-09 12:28:09 +01:00
Min RK
3d46083dcc Stop allowing failures on Python 3.8
and simplify matrix without cross-references
2020-01-09 11:50:07 +01:00
Min RK
dad1417b23 loosen assertion for process exit
Python 3.8 captures exit codes differently.
All we care about is that it exited.
2020-01-09 11:18:26 +01:00
Min RK
9a3c2409d1 Update README's badges (#2867)
Update README's badges
2020-01-09 11:02:25 +01:00
Richard Darst
0efb16793e Bugfix: pam_normalize_username didn't return username
- A trivial bug caused by my last change to #2397 - made possible by
  the fact we didn't have a way to reliable test PAM stuff.
- Thanks to @narnish for noticing.
- Closes: #2875
2020-01-02 17:04:21 +02:00
Erik Sundell
68ad36e945 Try dist:bionic with py3.8 2019-12-28 18:51:10 +01:00
Erik Sundell
989ed216a7 Add travis-ci job names 2019-12-28 18:51:10 +01:00
Erik Sundell
319113024d Rework .travis.yml 2019-12-28 18:51:10 +01:00
Erik Sundell
399f7e7b80 Remove deprecated part in .travis.yml 2019-12-28 18:51:10 +01:00
Erik Sundell
b4a6e5c2fe Test docs only in CircleCI 2019-12-28 18:51:10 +01:00
Erik Sundell
1949ab892a Make TravisCI single out allowed-failuers 2019-12-28 18:51:10 +01:00
Erik Sundell
1ec34b256c Fixup .travis.yml
- We now default to ubuntu bionic (18.04) and try once with ubuntu xenial
(16.04).
- We now always test Python 3.8 but allow it to fail, as compared to not
allowing it to fail and only testing it on tagged commits. This is a
bugfix I'd say.
- We now no longer test Python 3.5 and Python 3.6 dedicatedly without
any custom configuration like usage of subdomain, which allows us to
reduce the number of build jobs in a way I think makes a great sense to
compromise.
2019-12-28 18:51:10 +01:00
Erik Sundell
3c12a99415 Update README's badges
Some notes:
- Added a conda-forge and DockerHub badge
- Added logo's and made us conform with the team-compass badges section
as can be found here:
  https://jupyterhub-team-compass.readthedocs.io/en/latest/building-blocks/readme-badges.html
- Concluded that our CircleCI badge is good because it let's us overview
the repo's build systems, but that it is bad because it is only is about
documentation preview in PRs which isn't useful in a README's header in
a way.
- Noted there was a CircleCI token in the badge, that I believe is meant
to be used with private repo access rather than public repo access. I'm
not sure we need that but I made it a markdown/html comment for now.
- Decided to not manually add a line break between badges. I figured it
could make sense to break manually before the social badges instead of
automatically letting it wrap at some point, but we don't really know
the size of the window viewing so it felt like a bad idea to hardcode
that.
2019-12-28 14:56:56 +01:00
Richard Darst
a8ced3a7ad Dockerfile: Copy share/ to the final image
- When the Dockerfile was turned into a multi-stage build, it seems
  the share/ directory was not copied to the final image.  This
  resulted in certain components (static/components/, static/css/)
  being missing, which resulted in the JupyterHub share directory not
  being findable (in jupyterhub/_data.py).  This led to all kinds of
  weird havoc, like templates not being findable (#2852).
- I am still unsure if this is the right fix, please check this well.
- Closes: #2852
2019-12-28 13:14:00 +01:00
Richard Darst
1af7deaeb3 Dockerfile: add build-essential to builder image
- While debugging another problem, I noticed some failures to build
  the C extensions in the logs.  Adding build-essential should fix
  that (also as mentioned in the logs themselves).
- Extensions failed for tornado, sqlalchemy, and pyrsistent(pvectorc)
  and can be found by searching the previous output for "fail".
2019-12-28 13:12:11 +01:00
Erik Sundell
861a7c5c5e back to dev 2019-12-26 18:20:06 +01:00
Erik Sundell
1d02915f26 release 1.1.0b1 2019-12-26 18:17:16 +01:00
Erik Sundell
90009f3c01 Set date and beta note in changelog 2019-12-26 18:05:17 +01:00
Erik Sundell
dbce653b5e Merge pull request #2830 from consideRatio/changelog-for-1.1
Changelog for 1.1.0
2019-12-18 14:46:40 +01:00
Georgiana Elena
b4443b1251 Merge pull request #2854 from minrk/startup-total-time
HUB_STARTUP_DURATION_SECONDS measures total startup time
2019-12-18 11:12:24 +02:00
Min RK
155c76b299 Merge branch 'master' into changelog-for-1.1 2019-12-18 10:07:52 +01:00
Min RK
553be3e1d4 add latest PRs 2019-12-18 09:56:39 +01:00
Min RK
e1e0a31afc add summary of 1.1 changes 2019-12-18 09:56:11 +01:00
Min RK
d78466507d HUB_STARTUP_DURATION_SECONDS measures total startup time
which is the main metric of interest for measuring disruptions due to restarts
2019-12-18 09:22:34 +01:00
Min RK
d9955a052d Merge pull request #2849 from gabber12/fix-ready
Cleanup if spawner stop fails
2019-12-18 09:06:18 +01:00
Min RK
2e40da09ea Merge pull request #2853 from jgwerner/dockerfile-updates
chore: Dockerfile updates
2019-12-18 09:05:38 +01:00
Greg
490cf2dd82 switch from container to base
Signed-off-by: Greg <werner.greg@gmail.com>
2019-12-16 12:59:50 -05:00
Greg
b0343ef8d8 update base version and add build stage alias
Signed-off-by: Greg <werner.greg@gmail.com>
2019-12-16 12:45:53 -05:00
mangecoeur
fb64b4f0a8 change title and small corrections 2019-12-13 10:41:42 +01:00
Shubham Sharma
5a747baeca Cleanup if spawner stop fails 2019-12-13 02:11:52 +05:30
Erik Sundell
c4ce7faea6 Update changelog 2019-12-11 23:34:23 +01:00
mangecoeur
3a810c4fc0 Added guide 'install jupyterlab the hard way' 2019-12-06 16:44:59 +01:00
Min RK
abb93ad799 Merge pull request #2840 from minrk/dockerfile-simplify
simplify Dockerfile
2019-12-05 15:34:11 +01:00
Min RK
f31101432e be consistent about $BASE_IMAGE arg 2019-12-03 15:36:57 +01:00
Min RK
a2c98d016e Greatly simplify Dockerfile
- use apt to get Python, nodejs
- use npm to get configurable-http-proxy
2019-12-03 14:53:12 +01:00
Min RK
5581a2ba7e changelog: recategorize a few PRs 2019-12-03 14:49:55 +01:00
Min RK
1fe01ae173 pin a couple versions in Dockerfile 2019-12-03 14:33:56 +01:00
Min RK
24706a1759 Merge pull request #2839 from minrk/dockerfile-quotes
docker: fix onbuild image arg
2019-12-03 14:32:54 +01:00
Min RK
182ac00e93 update 1.1 changelog
latest commit is now 92173c605
2019-12-03 14:31:30 +01:00
Min RK
ca81af2ae5 fix BASE_IMAGE arg in onbuild
BASE_IMAGE is a single arg, not two separate ones
2019-12-03 14:20:59 +01:00
Min RK
92173c6053 Add prometheus metric to measure hub startup time (#2799)
Add prometheus metric to measure hub startup time
2019-12-03 13:19:51 +01:00
Min RK
33e1a090d8 Merge pull request #2812 from jgwerner/update-tests-docs
docs: Update docs to run tests
2019-12-03 13:19:26 +01:00
Min RK
e407808f47 remove redundant pip package list in docs environment.yml (#2838)
remove redundant pip package list in docs environment.yml
2019-12-03 13:18:56 +01:00
Erik Sundell
7b53330b20 Prelim changelog for 1.1.0 2019-12-03 10:58:57 +01:00
Min RK
da02b024d6 remove redundant pip package list in docs environment.yml
instead rely on `-r requirements.txt`

should avoid "ERROR: Double requirement given" messages from pip
2019-12-03 10:24:44 +01:00
Min RK
5502367832 Merge pull request #2555 from rcthomas/auth-state-to-spawner
Add Spawner.auth_state_hook
2019-12-03 10:11:40 +01:00
Min RK
ddc61d2b62 Merge pull request #2828 from bitnik/patch-4
add block for scripts included in head
2019-12-03 10:10:06 +01:00
Min RK
dc049a88eb Merge pull request #2763 from rcthomas/link-services
Link services
2019-12-03 10:08:59 +01:00
Min RK
2b7a02697c Merge branch 'master' into hub-startup-times 2019-12-03 10:08:06 +01:00
Min RK
4e8acc71c6 updating to pandas docs theme (#2820)
updating to pandas docs theme
2019-12-03 10:03:27 +01:00
Min RK
3bc0c18974 Merge pull request #2798 from rajat404/proxy-poll-times
Add prometheus metric to measure proxy route poll times
2019-12-03 10:03:02 +01:00
rajat404
3004f04a34 Expose spawner initialization duration metric to prometheus 2019-12-01 19:37:04 +05:30
rajat404
e3f1fd0a16 Include Spawner initialization time in hub startup time 2019-12-01 19:32:14 +05:30
rajat404
8367606012 Add prometheus metric to measure hub startup time 2019-12-01 18:58:19 +05:30
Kenan Erdogan
6956ffd2a9 add block for scripts included in head 2019-11-22 10:56:49 +01:00
Chris Holdgraf
0b3ffe1a99 extra heading # to institutional faq for sidebar 2019-11-21 12:08:32 -08:00
Chris Holdgraf
e44ee6ed8a reordering requirements 2019-11-21 08:05:13 -08:00
Chris Holdgraf
45a4362bb3 fixing EOL 2019-11-21 08:04:20 -08:00
Chris Holdgraf
8e7df7ae7b index descriptions 2019-11-21 08:04:20 -08:00
Chris Holdgraf
676a0da5ff fixing links 2019-11-21 08:04:20 -08:00
Chris Holdgraf
e802df9668 updating hub logo 2019-11-21 08:04:20 -08:00
Chris Holdgraf
c8e4d68978 updating to pandas docs theme 2019-11-21 08:04:20 -08:00
Tim Head
5ee2994504 adding institutional faq (#2800)
adding institutional faq
2019-11-21 15:29:46 +01:00
Chris Holdgraf
c194cb079e single machine not vm in docs 2019-11-19 09:49:14 -08:00
Chris Holdgraf
1910bfacbd Update docs/source/getting-started/institutional-faq.md
Co-Authored-By: Tim Head <betatim@gmail.com>
2019-11-19 09:48:00 -08:00
Chris Holdgraf
e16ca97e1c Update docs/source/getting-started/institutional-faq.md
Co-Authored-By: Tim Head <betatim@gmail.com>
2019-11-19 09:45:06 -08:00
Min RK
4bcfd52bc7 Merge pull request #2816 from jgwerner/refactor_dockerfile
chore: Refactor Dockerfile
2019-11-19 14:58:19 +01:00
Tim Head
29df06f0b5 Merge pull request #2826 from consideRatio/inline-comment
Add inline comment to test
2019-11-18 20:01:03 +01:00
Erik Sundell
9ec4e6d1d1 Add inline comment to test 2019-11-18 18:56:08 +01:00
Tim Head
ce34c12349 Merge pull request #2824 from consideRatio/raise-error-on-missing-config
Raise error on missing specified config
2019-11-18 18:42:13 +01:00
Tim Head
7b5a5541cb chore: Update python versions in travis matrix (#2811)
chore: Update python versions in travis matrix
2019-11-18 09:30:34 +01:00
Greg
731faf29c8 revert to specify xenial with 3.7
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-17 21:16:09 -05:00
Erik Sundell
bef561511f Please reorder-python-imports 2019-11-17 14:38:40 +01:00
Erik Sundell
f0b5446ec3 Raise error on missing specified config
Closes #2819 by exiting JupyterHub directly with an error if a config
file has been specified for the config_file traitlet, for example
through the -f or --config flag, but isn't available on the file
system.
2019-11-17 14:32:40 +01:00
Erik Sundell
629e829f8a Test raise error on missing specified config 2019-11-17 14:32:17 +01:00
Chris Holdgraf
7c434adcb2 adding more organizations to institutional faq 2019-11-14 18:21:55 -08:00
Chris Holdgraf
3641abc70f more content for institutional faq 2019-11-14 18:14:15 -08:00
Chris Holdgraf
da790617e3 Update docs/source/getting-started/institutional-faq.md
Co-Authored-By: Tim Head <betatim@gmail.com>
2019-11-14 18:14:15 -08:00
Chris Holdgraf
35ba762c9c fleshing out institutional faq 2019-11-14 18:14:15 -08:00
Chris Holdgraf
42d9c31db7 adding institutional faq 2019-11-14 18:14:15 -08:00
Tim Head
703af1dd1e Merge pull request #2810 from jgwerner/pre-commit-config
chore: Bump package versions used in pre-commit config
2019-11-11 09:51:16 +01:00
Greg
1dd09094a5 commit files updated by black to avoid exiting out from build
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-10 11:52:53 -05:00
Greg
b8c9717862 add missing maintainer label
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-10 11:22:19 -05:00
Greg
06f89cb5ed remove lang layer
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-10 10:47:45 -05:00
Greg
b5602028e5 more updates
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-10 10:46:54 -05:00
Greg
b1e45cde1e dockerfile cleanup
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-10 10:03:48 -05:00
Greg
ca117c251c pre-commit updates 2019-11-09 20:15:43 -05:00
Rollin Thomas
e815210cc7 Make usable via config without subclassing 2019-11-08 13:45:08 -08:00
Rollin Thomas
f37864cfd3 Call hook in handler 2019-11-08 13:45:08 -08:00
Rollin Thomas
d05d92c03a Doesn't need this 2019-11-08 13:45:08 -08:00
Greg
948f4c44fd update docs
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-08 13:00:44 -05:00
Greg
5db76e6dcd remove async test setting
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-08 12:42:40 -05:00
Greg
c944c0e54a update python versions in matrix
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-08 12:14:13 -05:00
Greg
dd7fe85770 revert to 3.6
Signed-off-by: Greg <werner.greg@gmail.com>
2019-11-08 11:28:54 -05:00
Greg
b9c1831183 bump package versions used in pre-commit 2019-11-08 11:26:49 -05:00
Min RK
5bbb292ef5 Merge pull request #2794 from rkdarst/cull-idle-local-bind-vars
cull_idle_servers.py: rebind max_age and inactive_limit locally
2019-11-05 10:32:14 +01:00
Min RK
e589b5d82a Merge pull request #2795 from bnuhero/master
The proxy's REST API listens on port `8001`
2019-11-05 10:31:44 +01:00
Min RK
465fb0a686 Merge pull request #2803 from choldgraf/docs_theme
adding docs preview to circleci
2019-11-05 10:31:19 +01:00
Chris Holdgraf
9702c1756f adding docs preview to circleci 2019-10-31 16:48:17 -07:00
Georgiana Elena
9990100f89 Merge pull request #2788 from rajat404/master
Add prometheus metric to measure proxy route deletion times
2019-10-30 16:49:06 +02:00
rajat404
a611298f43 Add prometheus metric to measure proxy route poll times 2019-10-29 19:39:49 +05:30
Min RK
6a872b371e Merge pull request #2790 from yuvipanda/feat/custom-redirect
Allow admins to customize /user-redirect/ behavior
2019-10-28 22:09:43 +01:00
Raymond Liu
1e298fb053 The proxy's REST API listens on port 8001
By default, the proxy's REST API listens on port `8001` instead of `8081`.  The hub service listens on port `8081`.
2019-10-26 14:32:57 +08:00
YuviPanda
51e1a15d63 Reword docstring to appease linter 2019-10-25 11:11:18 -07:00
Yuvi Panda
46e6d95364 Fix typo
Co-Authored-By: Min RK <benjaminrk@gmail.com>
2019-10-25 10:20:29 -07:00
Richard Darst
52c099193d cull_idle_servers.py: rebind max_age and inactive_limit locally
- In the cull script, the max_age and inactive_limit are used from the
  outer scope.  In the case that you add extra logic, one may want to
  modify these values.
- In that case, you either have to rename them locally, or access the
  outer scope with "nonlocal", the first of which is too much work,
  the second of which has a high chance of introducing bugs (as it did
  for me).
- This change introduces a fix for everyone.  It doesn't change basic
  functionality, but makes local modifications simpler.
2019-10-25 14:36:16 +03:00
YuviPanda
9d5784efb9 Pass in base_url rather than app object
- Limits what we consider public API
- Still allows for redirects outside JupyterHub
2019-10-24 09:01:23 -07:00
Min RK
2847c3a90c Merge pull request #2755 from danielballan/expose-user-options-in-rest-api
Expose spawner.user_options in REST API.
2019-10-24 11:11:51 +02:00
YuviPanda
d66f0635a3 Add path and app as parameters 2019-10-22 11:27:41 -07:00
Min RK
244ad7d38c run black 2019-10-22 09:23:04 +02:00
YuviPanda
7fbf1826ea Don't use fstrings yet
We support older versions of python still
2019-10-21 15:17:29 -07:00
YuviPanda
b4a760234e Tweak user_redirect_hook API
- Pass in user object & request object only explicitly.
  Much better interface that is harder to break by internal
  refactoring. We can always add more  parameters if needed?
2019-10-21 14:29:59 -07:00
Min RK
72a38a599d Merge pull request #2789 from tirkarthi/fix-deprecation-warning
Fix deprecation warnings
2019-10-21 14:49:36 +02:00
Min RK
8134d3bfbc Merge pull request #2776 from vilhelmen/server_ver
Display server version on admin page
2019-10-21 14:47:58 +02:00
YuviPanda
3df4afe7af Add test for user_redirect_hook 2019-10-20 11:58:45 -07:00
YuviPanda
400c64b4ef Allow admins to customize /user-redirect/ behavior
/user-redirect/ is used to help link to a particular url
in the logged in user's authenticated notebook. For example,
if I'm logged in as user 'yuvipanda' and hit the URL
/hub/user-redirect/git-pull, it'll redirect me to
/user/yuvipanda/git-pull. This is extremely useful in
connecting hub links to notebook server extensions, such
as nbgitpuller.

Admins might want to customize how this redirection is done -
for example, redirect users to different running servers
based on the nbgitpuller repository they are linking from.
Adding a hook here helps accomplish that.
2019-10-20 11:33:24 -07:00
Rajat Goyal
44dccb292f Apply suggestions from code review: Re-raise error after measuring time; Catch Exception class
Co-Authored-By: Min RK <benjaminrk@gmail.com>
2019-10-20 16:00:33 +05:30
Karthikeyan Singaravelan
0070e68702 Use logger.warning since logger.warn is deprecated. 2019-10-19 20:25:36 +05:30
Karthikeyan Singaravelan
f3b1b5c7a6 Fix DeprecationWarning in escape sequences. 2019-10-19 20:25:07 +05:30
rajat404
175c8d0585 Add prometheus metric to measure proxy route deletion times 2019-10-19 11:47:55 +05:30
R. C. Thomas
bc425a78bb Keep admin-enabled services in the list 2019-10-17 18:27:47 -07:00
R. C. Thomas
e0c4f9fc23 No services accessible if user is None
Co-Authored-By: Min RK <benjaminrk@gmail.com>
2019-10-17 18:23:34 -07:00
Will Starms
2cac46fdb2 Remove server_tokens setting
Revert this if we decide this is a security issue, but we report the version through the API as well
2019-10-17 13:43:28 -05:00
Carol Willing
66f8d6a626 Merge pull request #2767 from minrk/oauth-whitelist
add `service.oauth_no_confirm` configuration
2019-10-17 11:07:30 +01:00
Min RK
f163559f4a Merge pull request #2774 from kinow/update-setupegg
Remove unused  setupegg.py
2019-10-17 11:10:38 +02:00
Bruno P. Kinoshita
a615f783a3 Remove unused setupegg.py 2019-10-17 22:07:46 +13:00
Min RK
3cafc7e49f remove versionadded from Service docstring
sphinx doesn't seem to like this here
2019-10-17 10:03:39 +02:00
Min RK
12ee42e8ae Merge pull request #2785 from rpwagner/master
chown jupyterhub dir in user home
2019-10-17 09:54:38 +02:00
Min RK
9e5c837d3d Merge pull request #2772 from gesiscss/master
fix named server checks
2019-10-17 09:45:37 +02:00
Min RK
91be46784e Merge pull request #2783 from GeorgianaElena/log_proxy_type
Log proxy class
2019-10-17 09:42:13 +02:00
Rick Wagner
60a1c93801 chown jupyterhub dir in user home 2019-10-16 16:45:25 -07:00
GeorgianaElena
3a0a581782 Log proxy class 2019-10-16 15:32:03 +03:00
Georgiana Elena
5cbf9399b2 Merge pull request #2782 from kinow/todo-contributing
Add docs for fixtures in CONTRIBUTING.md
2019-10-16 11:04:25 +03:00
Bruno P. Kinoshita
d942f52eeb Add docs for fixtures in CONTRIBUTING.md 2019-10-16 20:58:11 +13:00
Will Starms
8c1620e6c5 server version display
also tests
2019-10-15 19:23:08 -05:00
Tim Head
9fdab027da Merge pull request #2775 from kinow/fix-header-typo
Fix header project name typo
2019-10-12 11:11:24 +02:00
Bruno P. Kinoshita
bc32450005 Fix header project name typo 2019-10-12 13:54:01 +13:00
Kenan Erdogan
cc95d30dc1 fix test_named_server_spawn_form: add named_servers fixture 2019-10-11 16:10:09 +02:00
Kenan Erdogan
25ef67e8e0 fix: in SpawnHandler check if named servers are allowed before launching a named server, check also limit of named servers 2019-10-11 16:09:28 +02:00
Min RK
2ad1159f69 Apply suggestions from code review
Co-Authored-By: Carol Willing <carolcode@willingconsulting.com>
2019-10-10 10:49:55 +02:00
Min RK
561f4d0889 add service.oauth_no_confirm configuration
allows services to be explicitly blessed to skip the extra oauth confirmation page

added in 1.0

This confirmation page is unhelpful for many admin-managed services,
and is mainly intended for cross-user access.

The default behavior is unchanged, but services can now opt-out of confirmation
(as is done already for the user's own servers).

Use with caution, as this eliminates users' ability to confirm that a service
should be able to authenticate them.
2019-10-08 15:28:47 +02:00
Rollin Thomas
cd0b3e05e2 Add service links 2019-10-05 10:59:59 -07:00
Dan Allan
cdba57e96a Update expected test result to include user_options. 2019-10-01 20:13:05 -04:00
Dan Allan
f13bd59f6f Expose spawner.user_options in REST API. 2019-10-01 16:13:29 -04:00
Min RK
89b0c421d5 Merge pull request #2594 from vilhelmen/server_str_sanitization
WIP: Named server string sanitization and fixes
2019-09-27 12:44:11 +02:00
Min RK
83ddee10ed Merge pull request #2752 from consideRatio/log-version-on-startup
Log JupyterHub version on startup
2019-09-27 12:05:52 +02:00
Erik Sundell
8a03b73086 Log JupyterHub version on startup 2019-09-27 09:32:51 +02:00
Min RK
333b62f1fc Merge pull request #2751 from rkdarst/less_logging_2
Reduce verbosity for "Failing suspected API request to not-running server" (new)
2019-09-27 09:10:40 +02:00
Richard Darst
231d14e95d Reduce verbosity for "Failing suspected API request to not-running server"
- API requests to non-running servers are not uncommon when you cull
  servers and people leave tabs open and active. It returns with 503
  and logs all headers, which can take up half of our total log lines
- This avoids logging headers for all 502 and 503 return statuses.
  #2747 presented an alternative (more complex) implementation, but this
  turned out to be appropriate.
- Closes: #2747
2019-09-26 17:33:38 +03:00
Min RK
9817610dc3 Merge pull request #2687 from rgerkin/uid-track
Added support for consistent UIDs at user creation time
2019-09-26 15:35:39 +02:00
Erik Sundell
aaf365c907 Merge pull request #2750 from minrk/check-routes-first
wait for proxy before accepting requests
2019-09-26 15:34:00 +02:00
Min RK
0f93571ca5 verify proxy is accessible before listening on the hub
lighter weight than check_routes
2019-09-26 14:58:26 +02:00
Carol Willing
5b13f96162 Merge pull request #2744 from willingc/doc-build
Add missing package for json schema doc build
2019-09-24 13:22:18 -07:00
Carol Willing
b41a383eae fix trailing space in file 2019-09-24 12:20:42 -07:00
Carol Willing
1701149fd7 add missing package for json schema 2019-09-24 12:04:11 -07:00
Min RK
5f8664723e Merge pull request #2740 from kinow/remove-deprecated-tornado-asyncio-call
Remove tornado deprecated/unnecessary AsyncIOMainLoop().install() call
2019-09-24 15:51:50 +02:00
Min RK
18ce8eb5a6 Merge pull request #2739 from kinow/fix-deprecated
Fix deprecated call and true comparison
2019-09-24 15:51:30 +02:00
Min RK
d51d39728a Errant indentation 2019-09-24 14:40:34 +02:00
Min RK
2255de7847 Merge pull request #2743 from minrk/urllib3
blacklist urllib3 versions with encoding bug
2019-09-24 12:29:32 +02:00
Min RK
a8c0609eb9 blacklist urllib3 versions with encoding bug
I *think* this should only affect testing, not production
2019-09-24 11:32:23 +02:00
Min RK
66f29e0f5a Merge pull request #2735 from krinsman/master
Non empty default server names (useful for profiles?)
2019-09-24 11:09:57 +02:00
Min RK
ca00c0eab0 Merge pull request #2698 from Zsailer/eventlog-tests
Instrument JupyterHub to record events with jupyter_telemetry [Part II]
2019-09-24 11:08:45 +02:00
Min RK
54baa0c31a Merge pull request #2721 from minrk/async-init-spawners
Add JupyterHub.init_spawners_timeout
2019-09-24 11:08:16 +02:00
Bruno P. Kinoshita
5d3dc509bd Remove tornado deprecated/unnecessary call (>5) 2019-09-23 13:18:00 +12:00
Bruno P. Kinoshita
9cf22e4106 Replace deprecated calls 2019-09-22 23:07:53 +12:00
Zachary Sailer
898fea9fdc Minor typos found by @minrk 2019-09-19 11:23:41 -07:00
Min RK
f79495e6bf fix relative links for spawn 2019-09-19 16:12:29 +02:00
Min RK
f474b31c94 Merge branch 'master' into server_str_sanitization 2019-09-19 16:11:16 +02:00
Min RK
fafbe86b55 Merge pull request #2684 from GeorgianaElena/display_pre_spawn_start_exc
Handle pre_spawn_start possible exceptions
2019-09-19 15:53:08 +02:00
Min RK
82ad2dfbc6 Merge pull request #2705 from InfuseAI/clear-jupyterhub-user-when-logout
Reset _jupyterhub_user after login cookie cleared
2019-09-19 15:51:54 +02:00
Min RK
ac32ae496e run pre-commit hook 2019-09-19 15:51:02 +02:00
Min RK
949d8d0bfa avoid disabling existing loggers when invoking alembic
causes some weird behavior, such as event log not working
2019-09-19 15:46:09 +02:00
Min RK
7fd3271c9b rely on app fixture to get configured app
re-run init_eventlog to ensure event logging is hooked up
2019-09-19 15:16:51 +02:00
Georgiana Elena
6267b752ae Merge pull request #2736 from eslavich/remove-duplicate-spawner-traitlets
Remove duplicate hub and authenticator traitlets from Spawner
2019-09-19 14:42:40 +03:00
William Krinsman
7fcd6ad450 Added configurable default server name attribute to better match behavior described for user-redirect in urls.md in the docs 2019-09-18 15:49:35 -07:00
Ed Slavich
dcde9f6222 Remove duplicate hub and authenticator traitlets from Spawner 2019-09-18 18:34:05 -04:00
Carol Willing
2e8ddeb114 Merge pull request #2725 from willingc/update-templates
Update issue template
2019-09-08 20:17:37 +02:00
Carol Willing
e07aaa603a fix typo found by @blink1073 review 2019-09-08 15:59:58 +02:00
Carol Willing
0bcd6adde6 Edit bug report 2019-09-08 12:39:11 +02:00
Carol Willing
444029699a update the issue template 2019-09-08 12:30:44 +02:00
Carol Willing
b9bdc99c1d move pull request template 2019-09-08 12:14:59 +02:00
Min RK
c896fe05fd Merge pull request #2712 from chicocvenancio/master
ORM: allow removed MySQL variables to not exist
2019-09-07 15:09:29 +02:00
Min RK
424803bcd7 Merge pull request #2714 from bitnik/patch-3
Add New Server: change redirecting to relative to home page in js
2019-09-07 15:08:51 +02:00
Min RK
9024cf1614 Merge pull request #2723 from willingc/use-autodoc
Use autodoc-traits sphinx extension
2019-09-07 15:08:08 +02:00
Carol Willing
a239a25ae0 fix case 2019-09-07 02:19:19 +02:00
Carol Willing
36a1ad0078 remove sphinxext directory 2019-09-06 17:42:32 +02:00
Carol Willing
6d696758e4 use autodoc-traits extension for docbuild 2019-09-06 17:41:34 +02:00
Kenan Erdogan
2545cd9bb3 change redirecting to relative to home page in js 2019-09-02 19:04:59 +02:00
Chico Venancio
096b159c23 ORM: allow MySQL variables to not exist
In current versions of MySQL and MariaDB `innodb_file_format`
and `innodb_large_prefix` have been removed. This allows them to not
exist and makes sure the format for the rows are `Dynamic` (default
for current versions).
2019-08-30 13:00:56 -03:00
Min RK
74958d9397 catch some CancelledErrors
which can occur during app shutdown
2019-08-28 19:02:58 +02:00
Min RK
9db18439af Add JupyterHub.init_spawners_timeout
If init_spawners takes too long (default: 10 seconds) to complete,
app start will be allowed to continue while finishing in the background.

Adds new `check` pending state for the initial check.

Checking lots of spawners can take a long time,
so allowing this to be async limits the impact on startup time
at the expense of starting the Hub in a not-quite-fully-ready state.
2019-08-28 19:01:42 +02:00
Aaron Huang
2b6ad596d2 Remove user after login cookie cleared
Signed-off-by: Aaron Huang <aaroms9733@gmail.com>
2019-08-27 22:09:18 +08:00
Tim Head
917786f2f5 Merge pull request #2704 from katsar0v/master
Create a warning when creating a service implicitly from service_tokens
2019-08-24 17:12:30 +02:00
Katsarov
a800496f6c create a warning when creating a service implicitly from service_tokens 2019-08-24 11:58:37 +02:00
Tim Head
a92fee8a82 Merge pull request #2702 from rlukin/master
Fix mistypos
2019-08-23 22:04:18 +02:00
Richard C Gerkin
7b1c4aedcf Don't catch AttributeError 2019-08-23 08:19:32 -07:00
Roman Lukin
572e008f1d Fix mistypos 2019-08-23 16:14:11 +03:00
Georgiana Elena
0379727cc0 Merge pull request #2679 from katsar0v/master
Documentation update: hint for using services instead of service tokens.
2019-08-23 11:35:12 +03:00
Zsailer
c9d52bea43 verify test data was emitted 2019-08-22 12:19:46 -07:00
Zsailer
263c5e838e rename test fixture 2019-08-22 11:28:57 -07:00
Zsailer
439e4381f0 add tests for eventlog 2019-08-22 11:05:10 -07:00
Zsailer
c34bcabcb9 add docs for event-logging 2019-08-22 11:05:10 -07:00
yuvipanda
2b1bfa0ba7 Depend on the jupyter_telemetry package 2019-08-22 11:05:10 -07:00
yuvipanda
aea2eefa77 Add lots of documentation to event schema
Move it to YAML, since jupyter_telemetry supports these
natively.
2019-08-22 11:05:10 -07:00
yuvipanda
dcde4020c2 Use EventLog class from jupyter_telemetry
Full circle, since the code in jupyter_telemetry
came from here: https://github.com/jupyter/telemetry/pull/6
2019-08-22 11:05:10 -07:00
yuvipanda
1225ff47be Use dunder formatting for capsule 2019-08-22 11:05:10 -07:00
yuvipanda
5aaa5263fa Emitted schemas must be whitelisted by admins
Privacy by default!
2019-08-22 11:05:10 -07:00
yuvipanda
eca4f33afc Don't use f strings yet
jupyterhub still supports Python 3.5
2019-08-22 11:05:10 -07:00
yuvipanda
1e578a25d3 Add jsonschema and python-json-logger as dependencies
They're pure python, and should be ok
2019-08-22 11:05:10 -07:00
yuvipanda
41b2e6e401 Add eventlogging infrastructure
- Introduce the EventLog class from BinderHub for emitting
  structured event data
- Instrument server starts and stops to emit events
- Defaults to not saving any events anywhere
2019-08-22 11:05:10 -07:00
Richard C Gerkin
ced45d101a Update jupyterhub/auth.py
Co-Authored-By: Min RK <benjaminrk@gmail.com>
2019-08-22 09:33:15 -07:00
GeorgianaElena
03693c379e Removed unnecesary check 2019-08-22 15:53:40 +03:00
GeorgianaElena
0058ed803d Address feedback 2019-08-22 15:06:08 +03:00
Georgiana Elena
7d9a93ab5f Merge pull request #2696 from mattjshannon/community-link-in-readme
Add Jupyter community link
2019-08-22 14:19:57 +03:00
GeorgianaElena
8a61eb1738 Test pre_spawn_start exception 2019-08-22 14:11:08 +03:00
GeorgianaElena
cbbead3780 Fix uncaught exception in pre_spawn_start 2019-08-22 14:11:08 +03:00
Min RK
146aec7e0c Merge pull request #2695 from GeorgianaElena/fix_failing_tests
Fix failing travis tests
2019-08-22 11:24:55 +02:00
GeorgianaElena
f7e5904c5b No need to start mysql service 2019-08-22 10:04:11 +03:00
Matt Shannon
077727595c Add Jupyter community link 2019-08-21 13:05:04 -07:00
GeorgianaElena
4bfc69dc80 Pin mysql-connector-python to 8.0.11 on travis 2019-08-21 22:01:43 +03:00
GeorgianaElena
8d7f55ce92 Fix postgres test 2019-08-21 13:59:25 +03:00
Rick Gerkin
cda7f73cfa Added support for consistent UIDs at user creation time 2019-08-16 04:59:51 +00:00
Georgiana Elena
915664ede2 Merge pull request #2682 from rcthomas/fix-not-running-with-named-servers
Add `server_name` to `spawn_url`
2019-08-13 13:28:31 +03:00
Rollin Thomas
037730761c Reformat 2019-08-12 10:06:22 -07:00
Rollin Thomas
1d1e108e09 Add server_name to spawn_url 2019-08-12 09:14:25 -07:00
Katsarov
6e71e617ed update the pending deprecation message in api_tokens to recommend services, not service_tokens 2019-08-10 21:22:40 +02:00
Tim Head
9e0bb5cc71 Replace header logo: jupyter -> jupyterhub (#2672)
Replace header logo: jupyter -> jupyterhub
2019-08-08 23:48:28 +02:00
Erik Sundell
5fa268dab1 Apply black autoformatting 2019-08-07 00:37:30 +02:00
Tim Head
1a26c1fb81 Merge pull request #2670 from GeorgianaElena/redirect_admin_to_login
/hub/admin redirect to login
2019-08-05 22:03:38 +02:00
Erik Sundell
2cc0eb885a Replace header logo: jupyter -> jupyterhub 2019-08-05 13:54:37 +02:00
GeorgianaElena
749b9e0997 /hub/admin redirect to login 2019-08-05 14:42:48 +03:00
Georgiana Elena
669dbfd449 Merge pull request #2662 from kinow/patch-1
Update spawn-form example
2019-08-01 14:21:04 +03:00
Bruno P. Kinoshita
444f0ba00c Update spawn-form example 2019-07-26 14:29:29 +12:00
Tim Head
e46e724a70 Merge pull request #2658 from cmd-ntrf/fix_services_flask_doc
Update flask hub authentication services example in doc
2019-07-24 21:37:20 +02:00
Félix-Antoine Fortin
2e67a534cf Update flask hub authentication services example in doc
The flask example in the documentation was still using the
input argument `cookie_cache_max_age` when instantiating
`HubAuth` object. `cookie_cache_max_age` is deprecated since
JupyterHub 0.8 and should be replaced by `cache_max_age`.
2019-07-24 09:33:23 -04:00
Min RK
24c0829289 Merge pull request #2648 from nicorikken/feature/debug-403-error
fix: spawn redirect for users whose names need escaping
2019-07-22 14:49:57 +02:00
Min RK
60f5ce0ff8 Merge pull request #2640 from nicorikken/feature/user-url-encoding
Escape usernames in the frontend
2019-07-22 14:12:39 +02:00
Tim Head
0325be3e13 Merge pull request #2649 from bitnik/patch-2
close `<div class="container">` tag in home.html
2019-07-17 20:29:21 +02:00
Nico Rikken
b37b13a939 chore: satisfy black checker 2019-07-17 11:05:35 +02:00
Kenan Erdogan
37642408a4 close <div class="container"> tag in home.html 2019-07-17 10:44:44 +02:00
Nico Rikken
9d2823e84b fix: user.escaped_name in base.py urls 2019-07-17 09:37:10 +02:00
Nico Rikken
ae7974564c fix: use user.escaped_name in page urls 2019-07-17 09:37:00 +02:00
Nico Rikken
30c69f94c8 fix: spawn redirect for users with backslash
The 302 redirect served after the spawn POST was not escaping the backslash.
2019-07-17 08:28:43 +02:00
Carol Willing
47cf1915ff Merge pull request #2646 from ilee38/fix-typos-tech-reference
fix typos on technical reference documentation
2019-07-16 16:43:19 -07:00
Carol Willing
9f32fc1854 Merge pull request #2647 from Carreau/fix-theme
Some theme updates; no double NEXT/PREV buttons.
2019-07-16 16:41:31 -07:00
Matthias Bussonnier
8a2eba1156 Some theme updates; no double NEXT/PREV buttons.
- Install pip in the docs conda env (or conda complains).
- Do not override page.html, the next/previous buttons are now handled by
  alabaster_jupyterhub (this actually remove the duplicated next/prev
  buttons)
- use alabaster_jupyterhub when building locally, this make it easy for
  new contributor to get the _exact_ same appearance than on
  readthedocs.
2019-07-16 13:48:37 -07:00
Iram Lee
254687e841 fix typos on technical reference documentation 2019-07-16 14:33:54 -05:00
Carol Willing
aa59b1fca3 Merge pull request #2613 from rkdarst/cull_idle_state_hint
cull-idle: Include a hint on how to add custom culling logic
2019-07-16 10:29:28 -07:00
Nico Rikken
88bff9d03d chore: include proposed docstring fix 2019-07-16 19:25:36 +02:00
Carol Willing
3ca0f32ad3 Merge pull request #2645 from jcrist/update-hadoop-links
Update links for Hadoop-related subprojects
2019-07-16 10:23:09 -07:00
Nico Rikken
6a2876a9fa chore: satisfy Black 2019-07-16 19:23:06 +02:00
Jim Crist
fad6900779 Update a few links [ci skip]
These projects recently moved under the JupyterHub organization,
updated the links accordingly.
2019-07-16 12:06:19 -05:00
Nico Rikken
d8d58b2ebd chore: undo escape() functions 2019-07-16 18:52:31 +02:00
Nico Rikken
859dc34ea6 chore: rename to json_escaped_name and unittests 2019-07-16 18:45:48 +02:00
Nico Rikken
8a37d2daec chore: cleanup comments 2019-07-16 17:13:19 +02:00
Nico Rikken
41db9fe116 chore: cleanup debugging code 2019-07-16 16:47:06 +02:00
Nico Rikken
8dce5a87bc revert try ginfing spawn url 2019-07-16 16:46:00 +02:00
Min RK
266e82755a Merge pull request #2632 from bartolone/master
corrected docker network create instructions in dockerfiles README
2019-07-16 16:22:31 +02:00
Nico Rikken
b237ab9e7b feat: try fixing the spawn url 2019-07-16 14:39:19 +02:00
Nico Rikken
7c78e6c326 chore: try non-escaping user
Now the user was double-escaped, resulting in escaped % signs
2019-07-16 14:28:28 +02:00
Nico Rikken
f1ed6c95f0 chore: reverse url changes 2019-07-16 14:04:51 +02:00
Min RK
2f0ce2a431 Merge pull request #2631 from danlester/master
Fixed docs and testing code to use refactored SimpleLocalProcessSpawner
2019-07-16 13:47:32 +02:00
Min RK
adf3779d02 Merge pull request #2626 from lumbric/patch-1
Update doc: do not suggest depricated config key
2019-07-16 13:46:30 +02:00
Nico Rikken
73309b5741 feat: adopt unicode_escaped_name property 2019-07-16 13:33:49 +02:00
Min RK
2320d59bd1 Merge pull request #2637 from GeorgianaElena/master
Fix total_users prometheus metric
2019-07-16 13:30:27 +02:00
Nico Rikken
1915ecd0c2 feat: try unicoding in user model 2019-07-16 13:07:18 +02:00
Nico Rikken
d050242d0f chore: try splitting value coding 2019-07-16 12:55:26 +02:00
Nico Rikken
3d6d60b64e fix: passthrough in template 2019-07-16 12:34:07 +02:00
Nico Rikken
fc90be8424 fix: user user.name instead of user 2019-07-16 12:17:32 +02:00
Nico Rikken
1555abb2bf feat: unicode escaping method 2019-07-16 11:43:49 +02:00
Nico Rikken
8c8968c2b0 chore: correct handler
Probably this has introduced more errors
2019-07-16 11:06:13 +02:00
Nico Rikken
69d0a47734 chore: try conversion in template
Custom property in users.py didn't work, so try it in the templated file.
2019-07-16 11:04:35 +02:00
Nico Rikken
5ae1fdf621 chore: try custom property 2019-07-16 10:53:14 +02:00
Nico Rikken
c24f6b0a6a chore: add logging code 2019-07-16 10:39:29 +02:00
Nico Rikken
11e32588d7 chore: use most likely fix for custom username property 2019-07-16 10:17:26 +02:00
Nico Rikken
34e44f2eed feat: user function in page render function 2019-07-16 10:01:11 +02:00
Nico Rikken
c0464b2e47 feat: unicode_escape feature 2019-07-16 09:41:11 +02:00
Nico Rikken
d686ae1ae7 json_encode for Tornado framework 2019-07-13 10:49:06 +02:00
Nico Rikken
0dc3593661 Escape user variable to frontend 2019-07-13 10:25:32 +02:00
Nico Rikken
dc40cfe80e encodeURIComponent() instead of escape() 2019-07-13 09:35:41 +02:00
Nico Rikken
d541c17974 Escape usernames in the frontend
To cope with special characters like backslash, to address issue
https://github.com/jupyterhub/jupyterhub/issues/2128
2019-07-13 08:55:33 +02:00
GeorgianaElena
09cc8569b3 Set total_users at startup 2019-07-10 17:19:43 +03:00
Yuvi Panda
3089d441b4 Merge pull request #2629 from GeorgianaElena/master
Fix running_servers prometheus metric
2019-07-10 04:42:14 -07:00
GeorgianaElena
19806899f2 Set running_servers at startup 2019-07-10 11:16:34 +03:00
Yuvi Panda
553e31235e Merge pull request #2628 from jtpio/test-config
Update the config used for testing
2019-07-09 05:44:38 -07:00
Jake Bartolone
55323ec206 corrected docker network create instructions in dockerfiles README 2019-07-05 12:54:09 -05:00
Dan Lester
49a5f3a654 Fixed docs and testing code to use refactored SimpleLocalProcessSpawner 2019-07-05 10:53:47 +01:00
GeorgianaElena
97c27774b1 fixed running_servers count 2019-07-04 13:23:32 +03:00
Jeremy Tuloup
de11909a04 Update config used for testing 2019-07-04 11:56:34 +02:00
lumbric
2f15d5128e Update doc: do not suggest depricated config key
According to changelog JupyterHub.bind_url has been added in 0.9.0.
2019-07-03 12:05:41 +02:00
Tim Head
276ef26161 Merge pull request #2625 from remram44/patch-1
Add missing words
2019-07-02 07:18:26 +02:00
Remi Rampin
d5d315df08 Add missing words
Copied from https://jupyterhub.readthedocs.io/en/latest/reference/services.html
2019-07-01 20:40:02 -04:00
Tim Head
f7f82b8214 add activity_resolution config (#2605)
add activity_resolution config
2019-06-19 08:14:09 +02:00
Min RK
ddece49abb Merge pull request #2588 from cmd-ntrf/services_hubauth_ssl
Define default values for HubAuth ssl traitlets
2019-06-17 11:15:59 +02:00
Min RK
02192ee2d5 Merge pull request #2609 from kinow/use-tornado-addslash
Replace existing redirect code by Tornado's addslash decorator
2019-06-17 11:14:47 +02:00
Richard Darst
a6b7e303df cull-idle: Include a hint on how to add custom culling logic
- cull_idle_servers.py gets the full server state, so is capable of
  doing any kind of arbitrary logic on the profile in order to be more
  flexible in culling.
- This patch does not change anything, but gives an embedded
  (commented out) example of how you can easily add custom logic to
  the script.
- This was added as a tempate/demo for #2598.
2019-06-16 20:13:27 +03:00
Bruno P. Kinoshita
5e5a976ea6 Replace existing redirect code by Tornado's addslash decorator 2019-06-12 15:27:23 +12:00
Min RK
c20c07ec87 Merge pull request #2570 from consideRatio/announcements-css
Make announcements visible without custom HTML
2019-06-07 12:54:45 +02:00
Min RK
bac34e394b Merge pull request #2577 from InfuseAI/remove-stop-my-server-after-server-stopped
Hide Stop My Server red button after server stopped.
2019-06-07 11:53:06 +02:00
Min RK
2ce223c811 Merge pull request #2560 from adelcast/dev/adelcast/shutdown
Jupyterhub: use previous exit strategy for Windows
2019-06-07 11:49:34 +02:00
Min RK
e107c84162 Merge pull request #2590 from sbrunk/openapi-compliance
Change API description to be a valid OpenAPI spec
2019-06-07 11:47:48 +02:00
Min RK
1cea503292 add activity_resolution config
limits last_activity update interval to 30 seconds by default to avoid a db commit on every authenticated request
2019-06-07 11:44:57 +02:00
yuvipanda
e9bc25cce0 Run all tests for jupyter_server regardless of failure 2019-06-04 14:42:49 +02:00
yuvipanda
8f7e25f9a1 Don't make pip uninstall wait for human input 2019-06-04 14:24:30 +02:00
yuvipanda
399def182b Actually run jupyter_server test on Travis 2019-06-04 13:57:26 +02:00
yuvipanda
f830b2a417 Try to test notebook package is still uninstalled 2019-06-04 13:45:57 +02:00
yuvipanda
cab1bca6fb Use jupyter_server if notebook package isn't available 2019-06-04 13:42:52 +02:00
yuvipanda
5eb7a14a33 [WIP] Add support for Jupyter Server 2019-06-04 13:30:28 +02:00
Will Starms
19da170435 Correct empty string redirect to default 2019-05-31 17:49:24 -05:00
Sören Brunk
30cfdcaa83 Change API description to a valid OpenAPI spec
* Add missing responses (doesn't include all possible responses yet)
* Refactor invalid multi in body parameters into a single parameter
* Change form type into valid formData
* Fix use of required fields
* Apply a few other minor fixes
2019-05-28 18:04:17 +02:00
Félix-Antoine Fortin
e9c78422b5 Define default values for HubAuth ssl traitlets
The default values are taken from environment variables defined by Spawner.get_env.
2019-05-27 14:12:39 -04:00
Tim Head
844817297e Merge pull request #2584 from minrk/check-error
re-raise exceptions in launch_instance_async
2019-05-24 17:17:56 +02:00
Min RK
b624116be7 re-raise exceptions in launch_instance_async
avoids asyncio tracebacks in e.g. `jupyterhub --version`
2019-05-24 13:29:34 +02:00
Aaron Huang
38cf95523f Update script 2019-05-21 17:12:01 +08:00
Yuvi Panda
d6d8590acb Merge pull request #2565 from iblis17/patch-1
Update link of `changelog`
2019-05-21 00:37:45 -07:00
Erik Sundell
da460064ae Make announcements visible without custom HTML
Fixes https://github.com/jupyterhub/jupyterhub/issues/2566 to some
degree by making the announcement stand out using twitter-bootstrap
classes `alert` and `alert-warning`. Perhaps we could theme twitter
bootstrap or this alert specifically with jupyter related colors as well
though?
2019-05-16 18:31:10 +02:00
Erik Sundell
8a6de3006c Merge pull request #2564 from julienchastang/typo
typo
2019-05-15 08:11:29 +02:00
Iblis Lin
9e35ba5bef Update link of changelog 2019-05-15 11:29:35 +08:00
Julien Chastang
c83777ccdc typo 2019-05-14 16:54:08 -06:00
Alejandro Del Castillo
aaad55e076 Jupyterhub: use previous exit strategy for Windows
Windows doesn't have support for signal handling so it can't use the
signal handling capabilities of asyncio. Use the previous atexit
strategy on the Windows case instead.

Signed-off-by: Alejandro Del Castillo <alejandro.delcastillo@ni.com>
2019-05-13 10:07:50 -05:00
Min RK
c1e359bd38 Merge pull request #2546 from remyleone/dict_literal
Dict rewritten as literal
2019-05-13 10:54:15 +02:00
Min RK
53f5dbd902 Merge pull request #2558 from NikeNano/spawn_options
Update to simplify the language related to spawner options
2019-05-10 11:39:56 +02:00
NikeNano
9e7b0c0bfd update to simplyfi the language related to spawner options 2019-05-10 09:52:17 +02:00
Tim Head
0aca778a9e Merge pull request #2548 from IamViditAgarwal/add_elucidata_use_case
Adding the use case of the Elucidata: How Jupyter Notebook is used in…
2019-05-06 14:05:32 +02:00
viditagarwal
83af28c137 Adding the use case of the Elucidata: How Jupyter Notebook is used inside the Elucidata with Jupyterhub 2019-05-06 16:49:41 +05:30
Rémy Léone
bfbf2c0521 Dict rewritten as literal 2019-05-03 16:41:43 +02:00
Min RK
09edf38a35 back to dev 2019-05-03 16:16:19 +02:00
Min RK
e4d4e059bd Merge pull request #2545 from minrk/changelog-1.0
releasing 1.0
2019-05-03 16:12:51 +02:00
Min RK
2967383654 release 1.0.0 2019-05-03 13:50:45 +02:00
Min RK
85f5ae1a37 Merge pull request #2544 from minrk/autodoc-link-targets
[autodoc] move config sample to annotation
2019-05-03 13:49:31 +02:00
Min RK
ecafe4add9 [autodoc] move config sample to annotation
preserves link targets, which mangling the directive header does not
2019-05-03 13:00:25 +02:00
Min RK
9462511aa5 Merge pull request #2543 from minrk/pin-mysql-connector
pin mysql-connector-python on travis
2019-05-03 10:55:34 +02:00
Min RK
31736eea9a pin mysql-connector-python on travis
avoids bug in latest connector decoding: https://bugs.mysql.com/bug.php?id=94944
2019-05-03 10:33:28 +02:00
Min RK
f97ef7eaac Merge pull request #2534 from distortedsignal/refactor-logout-handler
Refactor Logout Handler
2019-05-03 10:11:43 +02:00
Min RK
2065099338 Merge pull request #2524 from minrk/fix-db-redact
test postgres with url-encoded password
2019-05-03 09:48:57 +02:00
Carol Willing
d4df579fa6 Merge pull request #2538 from labarba/patch-1
Update gallery-jhub-deployments.md
2019-05-02 12:14:58 -04:00
Lorena A. Barba
4378603e83 Update gallery-jhub-deployments.md 2019-04-26 07:32:35 -04:00
Min RK
40db4edc6d remove todo
order should be preserved between multiple steps
2019-04-25 13:51:27 +02:00
Min RK
ccf13979e9 Merge pull request #2536 from jcrist/add-jhub-hadoop-links
Add a few links for JupyterHub on Hadoop
2019-04-25 10:23:01 +02:00
Jim Crist
76f134c393 Add a few links for JupyterHub on Hadoop [skip ci]
- JupyterHub on Hadoop Guide: https://github.com/jcrist/jupyterhub-on-hadoop
- YarnSpawner: https://github.com/jcrist/yarnspawner
- KerberosAuthenticator: https://github.com/jcrist/kerberosauthenticator
2019-04-24 14:40:50 -05:00
Tom Kelley
77d4c1f23d Changes after CR Comments
Big thanks to Erik, Tim, and Min for the great comments!

Change names to be more clear, add function doc comments,
change scoping on some functions, add handle_logout to let
people take custom logout actions, extract
render_logout_page from get method, add TODO.
2019-04-23 09:59:56 -07:00
Min RK
5856f46e1d Merge pull request #2519 from dfeich/asyncio_signal_cleanup
asyncio signal handling and loop cleanup by task cancelling
2019-04-23 15:13:08 +02:00
Min RK
edfd1eb6cf Merge pull request #2526 from minrk/debug-entrypoints
demote entrypoint-loading warning to debug-level
2019-04-23 15:12:21 +02:00
Tom Kelley
1ae6678360 Refactor Logout Handler
AS A developer of a Logout handler
I WANT to be able to call a function to kill spawners and
do other backend logout stuff and a separate function to
forward the user along the logout chain.

I believe this PR adds (moderately private) methods to the
Logout Handler to do just that.
2019-04-22 12:14:55 -07:00
Min RK
7794eea3fb demote entrypoint-loading warning to debug-level 2019-04-16 15:30:04 +02:00
Derek Feichtinger
f51e6a1ca0 move event_loop closing to shutdown_cancel_tasks 2019-04-16 13:04:11 +02:00
Min RK
ab00a19be1 test postgres with url-encoded username+password 2019-04-16 12:57:49 +02:00
Min RK
7742bfdda5 Merge pull request #2514 from minrk/user-redirect-test
fix flaky test_user_redirect
2019-04-16 12:52:24 +02:00
Erik Sundell
f3878d8216 Merge pull request #2518 from leportella/add-new-jhub-fluxogram
Add new introduction to jhub on docs
2019-04-15 21:13:25 +02:00
Tim Head
d17cb637fe Merge pull request #2520 from parente/vul-reporting
Add vulnerability reporting info to docs
2019-04-15 16:38:58 +02:00
Peter Parente
5b63efe63c Add a newline for the linter 2019-04-15 07:52:55 -04:00
Peter Parente
54816b0a7c Add vulnerability reporting info
https://discourse.jupyter.org/t/responsible-vulnerability-reporting/655
2019-04-14 22:10:58 -04:00
Leticia Portella
41fc73db42 Add new introduction to jhub on docs 2019-04-13 20:55:36 +01:00
Derek Feichtinger
984d6be542 asyncio signal handling and loop cleanup by task cancelling
Also:
- No longer exits with 143 (128+15) on SIGTERM, but with 0
- Allows SIGUSR1 in addition to SIGINFO for dumping status
2019-04-13 20:17:53 +02:00
Min RK
d7d8459edb 1.0.0b2 2019-04-09 10:45:31 +02:00
Min RK
39a7116d16 npm run fmt
with latest prettier
2019-04-09 10:45:31 +02:00
Min RK
d27c970cc4 rev js dependencies 2019-04-09 10:45:31 +02:00
Min RK
cf56dbb97b latest changes in changelog 2019-04-09 10:36:33 +02:00
Min RK
a4ccfe4e11 Merge pull request #2511 from ryogesh/do-not-show-db-password
Redact DB password before logging connection string
2019-04-09 10:19:48 +02:00
Min RK
f1871bbe24 Merge pull request #2510 from minrk/fix-delete-named
ensure spawner for named servers is fully deleted
2019-04-09 10:17:07 +02:00
bdmon
1cc9153a91 Redact DB password before logging connection string 2019-04-09 09:26:54 +02:00
Tim Head
4258254c39 Merge pull request #2509 from minrk/sec-doc
Add security-reporting to docs
2019-04-05 17:33:44 +02:00
Min RK
f3aee9bd16 ensure spawner for named servers is fully deleted
if spawner wasn't running, the wrapper could have been left in the user.spawners dict
2019-04-05 16:50:55 +02:00
Min RK
5cb8ccf8b2 Merge pull request #2494 from minrk/retry-better
include retry link after failed spawn
2019-04-05 15:29:40 +02:00
Tim Head
1d63e417ca Merge pull request #2508 from minrk/discourse-link
add discourse link to communication doc
2019-04-05 12:06:02 +02:00
Min RK
ee0020e8fa add security-reporting to docs 2019-04-05 11:51:02 +02:00
Min RK
2d83575a24 add discourse link to communication docs 2019-04-05 11:46:44 +02:00
Min RK
33c168530e Merge pull request #2496 from minrk/all-users-admin
ensure default server exists in the db at user creation
2019-04-05 10:29:20 +02:00
Min RK
5d4d34b24d Merge pull request #2498 from minrk/oauthlib-3
allow oauthlib 3
2019-04-05 10:25:59 +02:00
Min RK
49cc794937 include exception in template vars
for custom templates
2019-04-05 10:25:40 +02:00
Min RK
7f9e77ce5b Allow Spawners to customize spawn-failed message
by raising an exception with a `jupyterhub_message` attribute.
This will be a string displayed as escaped HTML (HTML is not allowed).
2019-04-05 10:22:47 +02:00
Min RK
6fa3b429db include retry link after failed spawn 2019-04-01 17:05:58 +02:00
Min RK
e89836c035 Merge pull request #2495 from minrk/service-oauth-state-typo
typo raising error on missing oauth state
2019-04-01 17:05:44 +02:00
Min RK
784b5cb6f0 ensure default server exists in the db at user creation
avoids issues in e.g. all_spawners being empty
2019-04-01 17:05:23 +02:00
Min RK
daaa763c3b allow oauthlib 3
requires updating our is_absolute_uri check
2019-04-01 17:04:59 +02:00
Min RK
2b18c64081 Merge pull request #2497 from minrk/mysql-connector-python
[travis] trade mysql-connector for mysql-connector-python
2019-04-01 17:04:30 +02:00
Min RK
785addc245 mysql-connector-python in test_db 2019-04-01 16:47:46 +02:00
Min RK
b4758db017 specify native auth plugin for mysql testing
sha2 plugin isn't available on travis
2019-04-01 16:31:36 +02:00
Min RK
10fbfee157 travis: install mysql-connector-python
instead of mysql-connector, which is deprecated
2019-04-01 15:06:43 +02:00
Min RK
c58a251dbd typo raising error on missing oauth state
need to specify a status code
2019-04-01 14:53:35 +02:00
Min RK
27be5e4847 Changelog for 0.9.6
replace 0.9.5 which has only a partial fix

issue is now confirmed to affect all browsers
2019-04-01 12:30:16 +02:00
Min RK
be97a0c95b Further login redirect validation 2019-04-01 12:29:29 +02:00
Min RK
689a312756 Merge pull request #2490 from mathematicalmichael/patch-1
Fix 1.0 date in changelog
2019-03-29 17:08:49 +01:00
Michael Pilosov
1484869ee3 Update changelog.md
fix date
2019-03-29 08:16:55 -06:00
Min RK
74a457f6b5 guard against using get_page with full urls
since that was hard to debug
2019-03-28 17:02:41 +01:00
Min RK
137a044f96 fix flaky test_user_redirect
when re-fetching the same url, use `requests.get`, not `get_page`
2019-03-28 17:01:00 +01:00
Min RK
a090632a48 Merge pull request #2488 from minrk/post_push
Docker hook fixes
2019-03-28 16:02:50 +01:00
Min RK
451a16c57e changelog for 0.9.5 2019-03-28 13:34:22 +01:00
Min RK
6e14e86a1a protect against some browsers' buggy handling of backslash as slash 2019-03-28 13:33:23 +01:00
Min RK
a142f543ba [docker] tag stable releases with :latest 2019-03-28 13:06:18 +01:00
Min RK
0bb3996c30 [docker] fix unbound variable in post_push hook for stable releases 2019-03-28 13:05:05 +01:00
Min RK
2a23e8afea 1.0.0b1 2019-03-27 15:58:07 +01:00
Min RK
071e375d5f Merge pull request #2440 from minrk/changelog-1.0
changelog for 1.0
2019-03-27 14:45:11 +01:00
Min RK
ca2d0a58b9 add documentation for Hub page urls
with screenshots!
2019-03-27 12:03:26 +01:00
Min RK
1cfeee8808 Merge pull request #2484 from rcthomas/master
Fix server name parsing in UserUrlHandler
2019-03-27 10:40:09 +01:00
Rollin Thomas
6ff421061d Strip leading / and get server name 2019-03-26 08:17:39 -07:00
Min RK
2d049c39fc Merge pull request #2485 from bitnik/patch-1
fix dev-requirements file extension in contributing.md
2019-03-26 13:51:58 +01:00
Kenan Erdogan
5535804acb fix dev-requirements file extension in contributing.md 2019-03-26 13:45:25 +01:00
Rollin Thomas
0901fa255f Remove log testing messages 2019-03-25 15:05:45 -07:00
Rollin Thomas
3e5b272b80 Server name is second element 2019-03-25 14:50:39 -07:00
Rollin Thomas
693446dba9 Log messages 2019-03-25 13:35:29 -07:00
Min RK
12d6a744df documentation for named server UI 2019-03-25 14:14:01 +01:00
Min RK
45dcb3bd17 recommonmark 0.5
update several links (html targets don't work anymore)

had to add rest-api redirect so link would resolve,
since there isn't a ref for files in _static
2019-03-25 14:08:37 +01:00
Min RK
6de9414c2f Merge branch 'master' into changelog-1.0 2019-03-25 11:20:05 +01:00
Min RK
b1f8c31c80 More changes 2019-03-25 11:19:57 +01:00
Min RK
8032f874af Merge pull request #2434 from rkdarst/separate-proxy-docs
Add documentation on running the proxy separate from the hub [wip]
2019-03-25 10:01:23 +01:00
Min RK
c869bc34af Merge pull request #2460 from rcthomas/master
Fix to use `get_current_user()`
2019-03-25 10:00:20 +01:00
Rollin Thomas
d1c06ab603 Fix to use get_current_user() 2019-03-07 20:02:35 -08:00
Carol Willing
7653f75310 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:44:13 +01:00
Carol Willing
de4ea150c0 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:44:04 +01:00
Carol Willing
0fdb0df176 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:43:38 +01:00
Carol Willing
6cefdba515 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:43:31 +01:00
Carol Willing
b3bd236e15 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:43:23 +01:00
Carol Willing
79a06fd9ac Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:43:13 +01:00
Carol Willing
3249574744 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:42:58 +01:00
Carol Willing
7e04d1d756 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:42:51 +01:00
Carol Willing
d63083bc17 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:42:45 +01:00
Carol Willing
b93ec84822 Update docs/source/changelog.md
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 16:42:27 +01:00
Carol Willing
b1606f21e6 Merge pull request #2446 from minrk/persist-user-options
persist user_options
2019-03-07 07:09:52 -08:00
Min RK
437eb18dd2 Note that user_options shall be JSON+bytes
and document persistence, and no-side effects
2019-03-07 15:35:39 +01:00
Min RK
82c889861d limit special handling to bytes in user_options
uploaded form data can be bytes, which we base64-encode

don't persist any other unsupported data types, persist None instead
2019-03-07 15:30:00 +01:00
Carol Willing
6ba45ee389 Merge pull request #2457 from minrk/gitignore
ignore pip-wheel-metadata
2019-03-07 06:14:50 -08:00
Carol Willing
af0082a16b Merge pull request #2435 from minrk/named-options-form
Rework handling of /hub/user/:name
2019-03-07 05:52:48 -08:00
Min RK
4bdca83c94 ignore pip-wheel-metadata
a new temp file pip is creating
2019-03-07 10:38:14 +01:00
Min RK
4183d45ab3 create _upgrade_094 database for testing upgrades from 0.9.4 2019-03-07 10:37:16 +01:00
Min RK
674ae9b4fc Merge pull request #2455 from javabrett/javabrett-patch-1
Added -p 8000:8000 to jupyterhub Docker quick start command.
2019-03-07 10:35:37 +01:00
Min RK
ff283ae636 address review
and fix a mis-applied GitHub suggestion

suggestions can only replace one line
2019-03-07 10:33:37 +01:00
Carol Willing
76eabb2de8 comment
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:30:36 +01:00
Carol Willing
2fbcb16190 docstring formatting
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:27:54 +01:00
Carol Willing
5d5ebb2583 docstring clarification
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:27:20 +01:00
Carol Willing
49b9a9f017 spacing
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:26:53 +01:00
Carol Willing
aa60d948bb docstring formatting
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:26:19 +01:00
Carol Willing
37d4d0e140 Update jupyterhub/handlers/pages.py
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:25:28 +01:00
Carol Willing
e86622b921 quote options_form
Co-Authored-By: minrk <benjaminrk@gmail.com>
2019-03-07 10:24:01 +01:00
Min RK
0d86c4ecf5 allow arbitrary data types in JSONDicts in the db
via json default encoder and object hooks
2019-03-06 13:48:12 +01:00
Min RK
249f39cf46 Merge pull request #2447 from mpetroff/patch-1
Allow for proper logging of IP addresses when using separate TLS termination
2019-03-06 13:21:45 +01:00
Matthew Petroff
8f3532e191 Make list of trusted downstream IP addresses configurable. 2019-03-05 17:56:09 -05:00
Min RK
27d0f62cd2 Merge pull request #2444 from rkdarst/contributing-docs
Contributing: hint on pre-commiting commits that are already there
2019-03-05 09:42:16 +01:00
Matthew Petroff
a31dadacb2 Trust localhost X-headers.
Trusting localhost X-headers allows for properly logging IP addresses while
using separate TLS termination. Otherwise, they're recorded as 127.0.0.1.
2019-02-28 13:58:07 -05:00
Min RK
59fa95acf4 add 0.9.4 to list of old jupyterhub database versions to test 2019-02-28 14:42:14 +01:00
Min RK
32c3fb01d4 handle long upgrade (spawner table doesn't exist) 2019-02-28 14:41:02 +01:00
Min RK
ddc852d658 persist user_options
remember user_options from the previous run

this allows user options set via spawn form to be re-used when restarting e.g. a named server via the api
2019-02-28 14:27:47 +01:00
Brett Randall
01bc8584a2 Added -p 8000:8000 to jupyterhub Docker quick start command. 2019-02-28 11:27:54 +11:00
Richard Darst
6524f38125 Contributing: hint on pre-commiting commits that are already there 2019-02-27 19:38:04 +02:00
Richard Darst
50c16239d2 Fix extraneous bullet point at end of separate-proxy.mb 2019-02-27 19:29:36 +02:00
Richard Darst
bfdec8f22e Fix file ending, pre-commit check 2019-02-27 19:27:20 +02:00
Min RK
25aa892f86 Merge pull request #2443 from rcthomas/erase-link-on-stop
Hide/unhide link
2019-02-27 18:11:52 +01:00
Rollin Thomas
5dedfe2629 Hide/unhide link 2019-02-27 08:49:34 -08:00
Tim Head
699b317d54 Merge pull request #2438 from minrk/check-lists
suppress deprecation warnings when testing deprecations
2019-02-27 17:05:19 +01:00
Tim Head
b1622ec745 Merge pull request #2439 from minrk/catch-entrypoints
catch errors loading entrypoints when generating config
2019-02-27 16:55:52 +01:00
Min RK
3cbcddad83 [WIP] changelog for 1.0 2019-02-27 16:47:56 +01:00
Min RK
35d888e91e make sure new spawner methods are documented 2019-02-27 16:47:46 +01:00
Min RK
20be7f98f7 [doc] enable autostructify 2019-02-27 16:47:32 +01:00
Min RK
a39d8aca30 catch errors loading entrypoints when generating config
avoids an entrypoint with missing dependencies preventing help output / config file generation
2019-02-27 15:56:27 +01:00
Min RK
453ae6e97b one more wait through spawn-pending 2019-02-27 15:31:10 +01:00
Min RK
89c85aca37 if no referer is given, assume the worst
only way to avoid redirect loops if referers are not set (e.g. python requests)
2019-02-27 15:21:22 +01:00
Min RK
87c276f425 suppress deprecation warnings when testing deprecations 2019-02-27 15:09:48 +01:00
Richard Darst
4ec92f9f14 Add the separate-proxy documentation 2019-02-27 12:21:21 +02:00
Min RK
8d01b0356b test spawn-pending page 2019-02-27 11:15:15 +01:00
Min RK
81a43a588b enable debug logging in mocksu
for tests
2019-02-27 11:13:34 +01:00
Min RK
8ea5a957a6 only start ?redirects counter if we are starting from a /user/:name -> /hub/user/:name redirect 2019-02-27 11:13:10 +01:00
Min RK
fee81c7d33 handle spawn-pending in user-redirect tests 2019-02-27 09:57:58 +01:00
Min RK
0dd291ae5c one more time for the consistent test_login_redirect cases 2019-02-26 15:47:21 +01:00
Min RK
db3f62b79a try harder to make a useful error message when API requests are made to a not-running server
include link to spawn page
2019-02-26 11:57:36 +01:00
Min RK
f8add6ae6d fix local-redirect check for subdomains 2019-02-26 11:56:28 +01:00
Min RK
d1f115d951 wait for spawner to start before talking to it 2019-02-25 16:55:53 +01:00
Min RK
fab5c33796 handle spawn-pending redirects in some tests
avoids issues with assuming that spawn is quick
2019-02-25 16:10:51 +01:00
Min RK
4ab525ab5f test spawn form with named server 2019-02-25 15:57:32 +01:00
Min RK
1185619bf6 update tests for changed redirects
- handle 503 on not running /hub/user/:name
- handle new spawn-redirect page
2019-02-25 15:43:50 +01:00
Min RK
4b1d80203e redact cookie headers in error logs 2019-02-25 14:49:13 +01:00
Min RK
d8cabdb90f Merge pull request #2433 from Carreau/document_admin_group
document admin_group
2019-02-25 14:32:38 +01:00
Min RK
947b9b1a9e rework handing of /user/:name
- /user/:name no longer triggers implicit spawn at any point
- add /spawn-pending/:user/:server handler for pending page. This page has no side effects.
- spawn links point to /spawn/:user/:server to finish hooking up links for named servers and options_form handling
2019-02-25 14:21:34 +01:00
Min RK
6f63ac7831 simplify start-server links as pure links to /spawn/:user/:server
instead of API requests

this gets better progress-page loading and options form rendering
2019-02-25 13:45:02 +01:00
Min RK
0c028c7186 import parsing of Accept header
used to determine if a request expects JSON or not
2019-02-25 13:44:10 +01:00
Min RK
1498707ac9 nicer repr of Server objects
we had a nice repr on orm.Server, let's bring it back
2019-02-25 13:42:48 +01:00
Min RK
de20c3f3a7 accept default argument in get_next_url
allows different defaults for different contexts
2019-02-25 13:41:38 +01:00
Richard Darst
0df552e2a1 Add documentation on running the proxy separate from the hub.
- It took me a bit longer than I would have liked for me to figure out
  how to run the proxy separate from the hub.  When I had to do this a
  second time for a different hub, it also took me too long.
- This adds a page dedicated to running the proxy separate from the
  hub, since it is relatively easy and has a high usability
  improvement.
- Currently work in progress.
2019-02-22 16:30:14 +02:00
Matthias Bussonnier
b4c53a29a9 document admin_group 2019-02-21 21:53:29 -08:00
Matthias Bussonnier
ca67757269 Merge pull request #2432 from Carreau/entrypointsplural
Entrypoints is plural
2019-02-21 17:21:22 -08:00
Matthias Bussonnier
aaa4deeed0 Entrypoints is plural
Of course both package exists...
2019-02-21 17:19:59 -08:00
Matthias Bussonnier
bda8671807 Merge pull request #2431 from Carreau/fix-docs-builds
Entrypoint is necessary to build the API docs of most authenticators
2019-02-21 17:05:54 -08:00
Matthias Bussonnier
4d75c16335 Entrypoint is necessary to build the API docs of most authenticators 2019-02-21 11:28:02 -08:00
Min RK
b5f6547e64 Merge remote-tracking branch 'origin/master' into named-options-form 2019-02-21 13:25:20 +01:00
Carol Willing
17aee17c5f Merge pull request #2418 from minrk/autoformat
Adopt black, pre-commit
2019-02-21 02:50:04 -08:00
Min RK
2f99104f57 a couple fixups after autoformatting 2019-02-19 17:04:37 +01:00
Min RK
80519f4fd0 consistency in CONTRIBUTING.md 2019-02-19 17:01:09 +01:00
Min RK
1531e94cc7 pre-commit is a dev requirement 2019-02-19 17:00:13 +01:00
Min RK
43c3ac78fc run lint test early 2019-02-19 17:00:13 +01:00
Min RK
9cc6aa9b6d describe pre-commit setup in CONTRIBUTING.md 2019-02-19 17:00:13 +01:00
Min RK
031cb6076a run pre-commit on travis
to verify that autoformatting has been run

include hopefully helpful message if it fails
2019-02-19 17:00:13 +01:00
Min RK
5e60582ef3 run autoformat
apologies to anyone finding this commit via git blame or log

run the autoformatting by

    pre-commit run --all-files
2019-02-19 17:00:10 +01:00
Min RK
ca198e0363 add pre-commit config
various simple fixes (space, newlines), plus two big ones:

- reorder imports
- run black
2019-02-19 16:59:11 +01:00
Min RK
d14a4bbe2c add black configuration 2019-02-19 16:59:11 +01:00
Min RK
ada8582768 pass flake8 on examples
define flake8 builtins for config files (c, get_config)
2019-02-19 16:59:11 +01:00
Min RK
856923b35f Merge pull request #2308 from vilhelmen/post_auth_hook
post_auth_hook processor
2019-02-19 16:56:27 +01:00
Min RK
39902a7140 async fixes in post_auth_hook 2019-02-19 16:07:32 +01:00
Will Starms
8524556b33 Add croutine support, force dict return
Also fix weird typo in example code
2019-02-15 15:37:23 +01:00
Will Starms
7c36ac93ba post_auth_hook processor
Does what it sounds like, allows an arbitrary function to be called right before the return in `get_authenticated_user`
2019-02-15 15:36:03 +01:00
Min RK
fec3d959f2 Merge pull request #2268 from vilhelmen/auth_data_sharing
Share authenticated dict with auth functions
2019-02-15 15:33:36 +01:00
Min RK
52d8f74eb1 Merge pull request #2397 from rkdarst/pam_normalize_username
pam_normalize_username option: round-trip usernames through PAM to normalize
2019-02-15 15:17:28 +01:00
Min RK
701b93d226 check_group_whitelist is optional 2019-02-15 15:09:56 +01:00
Min RK
bb83bb47d8 auth: apply adaptation to deprecated signature in init
applies/warns in init, ensures compatibility with a wrapper

rather than warning/calling differently at call time, which won't take effect everywhere
2019-02-15 13:22:06 +01:00
Min RK
1ba47d4a3d Merge branch 'master' into auth_data_sharing 2019-02-15 13:03:09 +01:00
Min RK
8c76f2b30c Merge pull request #2414 from minrk/threads
add an additional case for idle ThreadPoolExecutor threads
2019-02-15 11:16:30 +01:00
Min RK
a7c3ea0906 Merge pull request #2346 from minrk/push-activity
push last_activity to the hub
2019-02-15 11:16:12 +01:00
Min RK
fa2cb33b27 Merge pull request #2415 from consideRatio/async-options-form
Allow callable options_form to return an empty form
2019-02-15 10:49:32 +01:00
Erik Sundell
32706963ae Add test for falsy callable options_form 2019-02-14 16:50:07 +01:00
Erik Sundell
fb4c920996 Allow callable options_form to return an empty form
Closes #2390

This is meant to allow us dynamically decide to bypass the option form
even though it is a async function that in itself evaluates truthy.
2019-02-14 16:49:27 +01:00
Min RK
370ec4f5c7 remove unused sp
we need to ensure the spawners exist,
but we do that when we set last_activity
2019-02-14 16:01:51 +01:00
Min RK
5e77e448bd add an additional case for idle ThreadPoolExecutor threads
this is what they look like in Python 3.7
2019-02-12 16:00:07 +01:00
Min RK
7c46fe74a5 Merge pull request #2413 from minrk/redirect
add missing trailing slash in / -> /hub/ redirect
2019-02-12 15:04:47 +01:00
Min RK
dcdb8d8a89 add missing trailing slash in / -> /hub/ redirect 2019-02-11 17:29:45 +01:00
Min RK
087dd0fcd2 Merge pull request #2330 from Deepakdubey90/jupyterhub-oracle-integration
Modified JSON-DICT Implementation from TEXT to Text
2019-02-11 16:41:47 +01:00
Min RK
33a139861b notmybestwork: avoid updating user activity with server api access
this isn't the most important metric (server.last_activity is),
but avoid *probable* server api access incrementing user.last_activity
2019-02-11 16:18:37 +01:00
Min RK
d8d1b6c149 test activity api 2019-02-11 16:17:23 +01:00
Min RK
a2f5a0bea9 tolerate mocks for user.name
lots of testing uses mock Users, so tolerate the absence of user.escaped_name
2019-02-11 15:34:46 +01:00
Min RK
0063752a7f push activity to hub via api
servers publish activity on a regular interval (default: 5m)
2019-02-11 15:03:17 +01:00
Min RK
297f6988bd debug logs at beginning/end of user.stop 2019-02-11 15:03:17 +01:00
Richard Darst
a6d217d113 pam_normalize_username: add docs 2019-02-07 01:35:18 +02:00
Min RK
e51ea3f2be s/TEXT/Text/ 2019-02-06 14:02:08 +01:00
Min RK
bf36f9fc9a use Text instead of TEXT
TEXT is wrong on Oracle, LargeBinary is wrong everywhere else.

Text seems to be the high-level type that maps to the right thing both places.
This results in no change on supported implementations, as Text == TEXT there.
2019-02-06 13:47:40 +01:00
Min RK
b196dd2bea add activity spec to rest api 2019-02-06 13:15:42 +01:00
Min RK
10191f43fe add alabaster_jupyterhub to docs/requirements.txt 2019-02-06 13:15:11 +01:00
Min RK
342f40c8d7 Merge pull request #2404 from minrk/deprecations
fix some deprecation warnings in tests
2019-02-05 13:49:12 +01:00
Min RK
895bc378df Merge branch 'master' into deprecations 2019-02-05 13:06:28 +01:00
Min RK
00cafc8392 Merge pull request #2342 from minrk/expire-auth
allow auth to expire
2019-02-05 13:05:00 +01:00
Min RK
a6d0c36594 allow bypassing proxy in api_request
needed when testing that the proxy is down
2019-02-05 12:40:55 +01:00
Min RK
71a8573fdb fix some deprecation warnings in tests
Calling HasTraits(attr=value) doesn't work for non-traits

1. remove one redundant assignment for a non-trait
2. make one attribute a trait
2019-02-05 11:38:42 +01:00
Min RK
2715607361 make api requests via public url
to ensure cookies are properly set
2019-02-05 11:27:49 +01:00
Min RK
f2bfe6cd96 set Referer when testing cookie-authenticated api requests
Referer is checked for cookie-authenticated requests
2019-02-04 16:10:09 +01:00
Min RK
9008d5eea4 import mock from stdlib 2019-02-04 15:46:12 +01:00
Min RK
d340fc056e import mock from stdlib 2019-02-04 15:45:47 +01:00
Min RK
f3e1b95147 Merge pull request #2402 from consideRatio/readme-badge
Opinionated update of badges
2019-02-04 15:42:48 +01:00
Min RK
b5aa53fe7b only refresh auth of Users 2019-02-04 12:57:10 +01:00
Min RK
96c16bfb85 missing escape in normalize_timestamp 2019-02-04 12:56:53 +01:00
Richard Darst
d33226f3c2 Don't use super() when normalizing username using PAM
- We don't need the extra normalization of that function.
- Also add in username_map support here.  It probably isn't needed
  most of the time with PAM, but it keeps things consistent and is
  easier than documenting an exception.
2019-02-03 00:37:06 +02:00
Erik Sundell
78fe52bfb8 Remove google group badge 2019-02-02 14:59:28 +01:00
Erik Sundell
383cd6e73d Add github/discourse/gitter badges 2019-02-02 14:59:16 +01:00
Erik Sundell
25fa0f739f Remove 0.7.2 docs badge 2019-02-02 14:58:45 +01:00
Min RK
919b6a8d6c Merge pull request #2375 from dtaniwaki/limit-nb-num-per-user
Limit max named server per user
2019-01-31 13:33:14 +00:00
Richard Darst
92223b1dde pam_normalize_username option: round-trip usernames through PAM to normalize 2019-01-28 13:43:29 +02:00
Daisuke Taniwaki
9a0f7286bc Add tests for named server limit 2019-01-19 16:27:30 +09:00
Daisuke Taniwaki
71f2b73c36 Update error message of named server limit 2019-01-19 15:48:35 +09:00
Daisuke Taniwaki
b34bdd2846 Limit max named server per user 2019-01-19 15:48:35 +09:00
Min RK
392e432071 Merge pull request #2377 from minrk/travis-upgrade
add upgrade to pip install
2019-01-16 16:40:10 +01:00
Min RK
09e48546ab pin oauthlib < 3
while we work out why 3 doesn't work anymore
2019-01-16 15:54:58 +01:00
Min RK
77ecdbe12a add upgrade to pip install
to ensure version compatibility
2019-01-08 14:38:39 +01:00
Min RK
1431c5a21a test coverage for auth expiry 2019-01-04 11:54:20 +01:00
Min RK
8c63f669a9 consolidate some test utilities in utils
instead of in test_api, test_pages

since they are used in a few places

also add user, username fixtures for generating test users
2019-01-04 11:03:20 +01:00
Min RK
c009b39795 auth_refresh_age is on Authenticator 2019-01-03 12:36:47 +01:00
Min RK
dfd808b90e Merge pull request #2344 from adelcast/dev/adelcast/quotes_fix
Spawner.py: do not quote Popen args
2019-01-03 11:58:34 +01:00
Min RK
75e46fc111 Merge pull request #2370 from dnelson86/patch-1
Update docs: deployments
2019-01-03 11:57:43 +01:00
Min RK
337a0118c0 Merge pull request #2365 from rcthomas/change-id-to-class-named-servers
Change id selector to class selector for named servers
2019-01-03 11:56:34 +01:00
Dylan Nelson
2ee355d6a4 Update docs: deployments
Add IllustrisTNG public data release deployment.

Also add link for MIT, and delete jcloud.io (seems to no longer exist).
2018-12-30 15:04:21 +01:00
Min RK
4fa0876d91 implement refresh_pre_spawn
- redirect to login if vanlig user spawn
- fail with 400 otherwise
2018-12-21 15:32:58 +01:00
Alejandro del Castillo
46d4e2898d get_args: only quote if necessary
Traitlets require quotes around literals, to avoid interpreting them as
as datatypes other than string. However, quotes are problematic on the
notebook_dir case. On Windows, Popen will mis-interpret the quotes and
escape them, which trips the process spawn. To avoid problems, only
quote if necessary.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-12-20 17:24:47 -06:00
Rollin Thomas
4e410473cb Fix to find element 2018-12-20 13:35:36 -08:00
Rollin Thomas
fdddd7d58c Change select from id to class for multiple choice 2018-12-20 13:03:36 -08:00
Min RK
563106c0d2 allow auth to expire
adds Authenticator.auth_refresh_age and Authenticator.refresh_pre_spawn config

- auth_refresh_age allows auth to expire (default: 5 minutes) before calling Authenticator.refresh_user.
- refresh_pre_spawn forces refresh prior to spawn (in case of auth tokens, etc.)
2018-12-14 15:27:38 +01:00
Min RK
b6d8db5259 Merge pull request #2322 from ausecocloud/master
UserTokenListAPIHandler support Authenticator.authenticate returning a dict
2018-12-14 12:43:46 +01:00
Min RK
5e67bd773f Merge pull request #2205 from willingc/bump-dep
bump bootstrap version
2018-12-14 12:43:16 +01:00
Min RK
aaab44090d bootstrap 3.4.0 2018-12-14 10:58:21 +01:00
Min RK
7b154fcc45 Merge branch 'master' into master 2018-12-14 10:51:47 +01:00
Min RK
d2779061b0 Merge pull request #2358 from minrk/rm-pytest-tornado
switch from pytest-tornado to pytest-asyncio
2018-12-14 10:44:24 +01:00
Min RK
3e20642b31 Merge pull request #2359 from minrk/deprecated-event.listen
use non-deprecated event to register foreign_keys connection listener
2018-12-14 10:44:09 +01:00
Min RK
a46032b549 use non-deprecated event to register foreign_keys connection listener 2018-12-12 15:41:09 +01:00
Min RK
8ca8225cef Python 3.5-friendly async context manager 2018-12-12 13:45:36 +01:00
Min RK
0e6cf6a485 Merge pull request #2353 from vilhelmen/pam_admin_groups_fix
Fix PAMAuthenticator is_admin
2018-12-12 13:43:38 +01:00
Min RK
37cdba370f update tests for pytest-asyncio
- remove gen_test marker
- use async def
- find/replace yield->await approximately one million times
2018-12-12 13:06:10 +01:00
Min RK
d5f87fe09f update fixtures for pytest-asyncio
instead of pytest-tornado

verify that we don't make any async generator tests
which would pass silently without running any tests
2018-12-12 12:49:54 +01:00
Min RK
2930fa9cc9 Merge pull request #2355 from chang-zhijie/master
accept token in Authorization header in services, not just url
2018-12-11 15:34:48 +01:00
chang-zhijie
53c3201c17 store tokens passed via url or header, not only url. 2018-12-11 17:00:16 +08:00
Will Starms
4229d68d23 Fix bad tester/code 2018-12-06 15:32:49 -06:00
Tim Head
8b0bdc71bc Merge pull request #2347 from minrk/one-flakey-flake
Don’t mix no_patience and bad_spawn
2018-12-04 17:54:31 +01:00
Min RK
47e66580db Don’t mix no_patience and bad_spawn
this introduces a race between the early RuntimeError being tested
and the no_patience causing handlers to return early if async start isn’t complete.

With tornado coroutines, an early RuntimeError could be guaranteed to resolve promptly, but asyncio isn’t as consistent,
possibly causing some of the recent flaky tests.
2018-12-04 15:02:53 +01:00
Tim Head
c360777ee0 Merge pull request #2345 from jupyterhub/willingc-patch-1
Update incorrect anchor
2018-12-04 08:08:03 +01:00
Carol Willing
05874e9f81 Update incorrect anchor
Closes #2338
2018-12-03 20:33:22 -08:00
Tim Head
c3e1d5313d Merge pull request #2343 from clemens-tolboom/patch-1
Fix markdown link into rst
2018-12-03 22:09:54 +01:00
Clemens Tolboom
4b36dce29f Fix markdown link into rst 2018-12-03 19:05:50 +01:00
Chia-liang Kao
d84ad44b74 actually spawn with server_name 2018-12-02 21:28:05 +08:00
Chia-liang Kao
b60468d2b6 _render_form requires server_name as well 2018-12-02 21:07:45 +08:00
Chia-liang Kao
35d041a701 fix regex 2018-12-02 20:14:50 +08:00
Chia-liang Kao
045ba0671b Support named server with option form 2018-12-02 16:07:38 +08:00
Min RK
bbc2847530 Merge pull request #2297 from minrk/check-url-startup
handle partial launches on startup
2018-11-30 15:11:27 +01:00
Min RK
887f2a2c24 it's spawner.name 2018-11-29 17:14:29 +01:00
Min RK
2b265b2529 Check if a Spawner is running at the given URL on startup
avoids assuming partial spawns that may have resulted in running processes but not actually available servers
are treated as fully working servers.
2018-11-28 12:44:58 +01:00
Min RK
f0da8a75b0 Merge pull request #2333 from kinow/remove-auth-unused-dependency
Remove unused import
2018-11-28 12:43:29 +01:00
Bruno P. Kinoshita
9aa2110409 Remove unused dependency 2018-11-28 14:41:48 +13:00
pydeepak
047bd4e7cc Fixed incorrect import 2018-11-27 08:42:28 +05:30
pydeepak
10d781c570 Modified Json Implementation from Text to LargeBinary. 2018-11-27 08:39:46 +05:30
Gerhard Weis
c2aa7f1748 call base handler self.authenticate instead of accessing authenticator directly 2018-11-27 06:41:36 +10:00
Min RK
4ace113965 Merge pull request #2326 from minrk/document-api-options
Document specifying spawn options via api
2018-11-26 14:26:16 +01:00
Min RK
69933e240f document specifying options via rest api 2018-11-23 16:06:38 +01:00
Gerhard Weis
9ac6ed344c UserTokenListAPIHandler should support Authenticator.authenticate returning a dict 2018-11-22 14:33:48 +10:00
Min RK
c9c0d3723b Merge pull request #2309 from adelcast/dev/adelcast/refresh_user
refresh_user: add handler parameter
2018-11-16 14:52:55 +01:00
Min RK
c09876cbe2 Merge pull request #2315 from adelcast/dev/adelcast/move_pwd
LocalSpawner: move pwd module import inside functions
2018-11-16 14:52:38 +01:00
Min RK
6bb4d27a3f Merge pull request #2313 from adelcast/dev/adelcast/entry_points
setuptools entrypoints instead of scripts
2018-11-16 14:45:10 +01:00
Min RK
48c3a3a834 Merge pull request #2307 from vilhelmen/getpwnam_dedupe
getgrnam/getpwnam/getgrouplist refactor
2018-11-16 14:44:12 +01:00
Alejandro del Castillo
24dcb4b783 LocalSpawner: move pwd module import inside functions
Windows doesn't have a pwd module. To avoid an import error on Windows,
move import statement inside functions that use pwd.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-11-15 16:08:30 -06:00
Will Starms
22d6f48bb8 Make functions private 2018-11-15 15:20:34 -06:00
Alejandro del Castillo
df98fb012e refresh_user: add handler parameter
The current request handler might be needed to determine if the auth
data needs to be refreshed.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-11-15 13:21:24 -06:00
Min RK
ea44ab0c85 Merge pull request #2312 from choldgraf/roadmap
[MRG] moving the roadmap to this repo
2018-11-15 19:55:35 +01:00
Alejandro del Castillo
b1759c8882 setup.py: add automatic script generation
Use setuptools console_scripts functionality to create top level jupyter
& jupyterhub-single user entry point scripts on *nix, and executables on
Windows.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-11-15 09:53:29 -06:00
Min RK
c633d87f1e Merge pull request #2296 from pelson/logo_in_page_template
Add a logo block, and update the docs regarding base.html.
2018-11-15 12:44:15 +01:00
Min RK
680e829824 Merge pull request #2303 from minrk/check-in-cache
HubAuth: allow caching None responses
2018-11-15 12:26:38 +01:00
Chris Holdgraf
891a352f42 updating circle for docs and adding a roadmap 2018-11-14 21:20:26 -08:00
Will Starms
df829e8927 Move getpwnam/grnam/grouplist to LocalAuthenticator
Also fix up an old test of mine
2018-11-13 14:48:12 -06:00
Will Starms
f2ae3af90e Switch to existing getpwnam function
To be honest, `getgrouplist`, `getpwnam`, and `getgrnam` should be static methods in LocalAuthenticator
2018-11-13 13:53:54 -06:00
Will Starms
62b991649b Share authenticated dict with auth functions
Adds a compatibility fix to be removed at a future date for the check_x functions.
2018-11-13 11:44:49 -06:00
Min RK
767dce29f4 Merge pull request #2301 from DataVictorEngineer/patch-1
Apache reverse proxy customization for jupyterhub
2018-11-12 14:41:19 +01:00
Min RK
7f1c91d8f4 Clear the auth cache when testing the same url twice with different results 2018-11-12 14:35:47 +01:00
Min RK
3a0bacde3a HubAuth: allow caching None responses
when a token doesn't identify a user, the response is None.
These results are cached, but the cache checked for `is None`,
causing failed-auth responses to effectively not be cached.
2018-11-12 12:56:41 +01:00
DataVictorEngineer
7f12418e4c Apache reverse proxy customization for jupyterhub
This is the modification to run the Jupyterhub using the custom url: http://127.0.0.1:8000/jhub/.
2018-11-11 22:45:30 +02:00
Min RK
40013f7292 Merge pull request #2298 from katsar0v/master
improve condition when failing api request, check if user exists, aft…
2018-11-09 20:56:07 +01:00
Kristiyan
2070c8c102 improve condition when failing api request, check if user exists, afterwards check if user is not active 2018-11-09 18:17:40 +01:00
Min RK
eb19a73044 add Spawner.get_url
for retrieving the spawner url. Occurs on startup.

Default is a no-op and no Spawner needs to implement this.
2018-11-09 13:22:08 +01:00
Phil Elson
87ce499840 Add a logo block, and update the docs regarding base.html. 2018-11-09 06:36:17 +00:00
Min RK
9a3dbedc52 Merge pull request #2290 from katsar0v/master
add configuration for shutting down all user spawners on logout
2018-11-08 14:50:47 +01:00
Min RK
0cebb4c9d7 disable pytest minversion check
because it doesn't work with current pytest
2018-11-08 14:36:00 +01:00
Yuvi Panda
fc25b0e10d Merge pull request #2289 from minrk/move-simple
make simplespawner importable
2018-11-07 10:44:17 -08:00
Min RK
006b89746a use stop_single_user wrapper to stop user servers
rather than lower-level spawner.stop
2018-11-06 14:31:42 +01:00
Min RK
1f7838ba5f ensure async-requests is awaitable
so we can use await, not just yield
2018-11-06 14:30:51 +01:00
Min RK
e5e6876cef test shutdown_on_logout 2018-11-06 14:30:26 +01:00
Kristiyan
2686615304 add configuration for shutting down all user spawners on logout 2018-11-05 11:47:46 +01:00
Min RK
e512847652 use simplespawner as base for testing 2018-11-05 11:01:21 +01:00
Min RK
4fb158933e no-op move_certs in simplespawner 2018-11-05 11:01:06 +01:00
Min RK
575af23e23 register simplespawner in setup.py 2018-11-05 10:57:10 +01:00
Min RK
52c468d89c make home_dir a traitlet
so the property is only evaluated once and overrideable via hooks
2018-11-05 10:57:02 +01:00
Min RK
80e241c86f move simplespawner into jupyterhub.spawner 2018-11-05 10:55:40 +01:00
Min RK
c8199c6303 Merge pull request #2244 from vilhelmen/pam_admin_groups
admin_groups for PAMAuthenticator
2018-11-05 10:49:38 +01:00
Min RK
090f68bb21 Merge pull request #2264 from minrk/better-local-error
explain create_system_users when system users do not exist
2018-11-05 10:47:14 +01:00
Tim Head
5b4f0d4304 Merge pull request #2282 from yuvipanda/real-async-pre-spawn-hook
Document that pre_spawn_hook maybe a coroutine
2018-11-03 08:38:42 +01:00
yuvipanda
1efb8c765b Document that pre_spawn_hook maybe a coroutine 2018-11-02 17:19:16 -07:00
Will Starms
1c0d0daef8 admin_groups for PAMAuthenticator
Hoist admin status determination from authentication to a secondary function called by get_authenticated_user
Create mock objects for struct_group and struct_passwd, migrate existing mock group objects to it
Remove old admin mock stuff for authenticate
2018-10-30 11:26:37 -05:00
Min RK
302573e860 Merge pull request #2224 from tuhina2020/jupyter_2105
add metrics_authentication decorator to /metrics API #2105
2018-10-26 10:47:36 +02:00
Min RK
5e58fc60d4 Merge pull request #2260 from madmax2012/master
[docker] Bumped Miniconda to 4.5.11
2018-10-26 10:47:12 +02:00
Min RK
1322926d9b explain create_system_user when system users do not exist 2018-10-26 10:05:23 +02:00
Max Mensing
a64fa15fee Bumped Miniconda to 4.5.11 2018-10-24 09:36:55 +02:00
Min RK
71c620f38f Merge branch 'master' into jupyter_2105 2018-10-23 10:10:31 +02:00
Min RK
65d9ac3c61 Merge pull request #2257 from tmshn/health-check
Added health check endpoint
2018-10-23 09:52:14 +02:00
tmshn
f752e6df1e Added health check endpoint 2018-10-20 15:41:52 +09:00
Carol Willing
19bcb9cea0 Merge pull request #2255 from minrk/parallel-coverage
unpin coverage
2018-10-19 10:28:53 -07:00
Min RK
7b22330583 unpin coverage
need run.parallel = True in coveragerc to fix database errors with coverage 5

exclude the resulting .coverage.host.pid files in gitignore
2018-10-19 14:03:13 +02:00
Min RK
1be2b3721a Merge pull request #2243 from vilhelmen/write_error_log_fix
Try to create exception str before logging
2018-10-19 10:27:16 +02:00
Min RK
e53488cd64 Merge pull request #2253 from Carreau/sudo-selinux
Cleanup the sudo/selinux section
2018-10-19 09:33:47 +02:00
Min RK
fe5ca1a67e Merge branch 'master' into jupyter_2105 2018-10-19 09:31:45 +02:00
Matthias Bussonnier
0670423a3d Cleanup the sudo/selinux section 2018-10-18 14:03:00 -07:00
Min RK
e9620df5b5 Merge pull request #2249 from adibaba/master
Added Paderborn University
2018-10-18 10:39:36 +02:00
tuhina2020
2a425f4344 fix tests for unauthorised call to metrics API 2018-10-18 12:42:24 +05:30
Adrian Wilke
ee63002f21 Added Paderborn University 2018-10-17 21:28:38 +02:00
Min RK
2d94b2999f Merge pull request #2055 from LLNL/end-to-end-ssl
End-to-end SSL
2018-10-17 13:27:03 +02:00
Min RK
7a055e65db Catch and print errors stopping hub
in case it failed to fully start
2018-10-17 13:05:20 +02:00
Min RK
e385214121 empty groups, too 2018-10-17 13:04:42 +02:00
Min RK
b0116ee539 avoid cleaning users when we are testing resume 2018-10-17 11:02:06 +02:00
Min RK
301fed30b2 Delete users in MockHub
avoids pollution from one test module to the next
2018-10-17 10:38:19 +02:00
tuhina2020
e449b9c193 fix the condiiton for authentation 2018-10-17 10:39:00 +05:30
Will Starms
bafcf6bd23 Try to create exception str before logging
The str() method of an InterfaceError can raise when trying to iterate over an integer, causing the logger to act up.
2018-10-16 14:00:03 -05:00
Min RK
15788bec67 ensure user's own subdomain is in trusted alt names 2018-10-16 15:57:45 +02:00
Min RK
e921354544 run internal-ssl tests with external http
to cover any protocol mismatches
2018-10-16 15:57:45 +02:00
Min RK
eb7648abc2 consolidate trusted alt names
- trust subdomain_host by default
- JupyterHub.trusted_alt_names is inherited by Spawners by default. Do we need Spawner.ssl_alt_names to be separately configurable?
2018-10-16 15:46:50 +02:00
Min RK
9a45f4a8c9 add user- prefix to user cert dirs
avoids possible conflict e.g. if a user had the name 'hub-internal'
2018-10-16 15:45:49 +02:00
Min RK
1f3165859f avoid unnecessarily recreating proxy certs 2018-10-16 15:45:20 +02:00
Min RK
2d6e7186aa Merge pull request #2240 from GeorgianaElena/master
Small improvement of test coverage
2018-10-16 13:58:29 +02:00
GeorgianaElena
efde40cbbd Small improvement of test coverage 2018-10-16 12:40:18 +03:00
Min RK
f3c2a15e53 ensure AsyncIOMainLoop is registered in tests 2018-10-15 16:29:00 +02:00
Min RK
d64853a6f5 fix ssl tmpdir in tests
must be module-scoped, not session-scoped, or it will get reused inconsistently
2018-10-15 15:35:21 +02:00
Min RK
b72d887dd7 register cleanup before start
avoids leaving lingering proxy if app fails to start
2018-10-15 15:33:59 +02:00
Min RK
49ebf969c1 Merge pull request #2237 from spacetelescope/master
Add handler to spawner so you can access query params in form
2018-10-15 13:56:41 +02:00
tuhina2020
1a6b16d493 fix metrics_authentication method 2018-10-15 11:27:11 +05:30
Carol Willing
6fd7e27e95 Merge pull request #2234 from minrk/proxy-entrypoint
add entrypoint for configuring proxies
2018-10-12 10:49:34 -07:00
Min RK
28c6377db7 avoid modifying headers in-place
can have consequences if args are re-used
2018-10-12 17:05:59 +02:00
Min RK
67f21bb518 ssl tests can use configproxy 2018-10-12 16:26:42 +02:00
Min RK
7c0e113fbc Revert "Set change-origin so certs behind proxy work"
This reverts commit bcebf0ee7b.

Setting change-origin introduces CORS problems
2018-10-12 16:24:10 +02:00
Min RK
bc3ace60dc Merge branch 'master' into end-to-end-ssl 2018-10-12 16:17:26 +02:00
Min RK
ce2310b1ae update proxy docs to mention entrypoints 2018-10-12 11:11:13 +02:00
Min RK
6979a11bfa Merge pull request #2236 from mpolidori/master
Fix missing spaces in if statement in bootstrap-script and README
2018-10-12 11:10:10 +02:00
mpolidori
10a4ac4809 Update README.md 2018-10-12 00:50:30 -04:00
mpolidori
34341e7aac Update bootstrap.sh 2018-10-12 00:48:49 -04:00
tuhina2020
ac7ff491e1 Add tests for metrics API 2018-10-12 09:26:52 +05:30
Min RK
abd3bc13d2 add entrypoint for proxy implementations 2018-10-11 16:54:25 +02:00
Jacob Matuskey
ebed5c2f4b Add handler to spawner here so you can access query params in form rendering 2018-10-10 20:25:14 -04:00
Thomas Mendoza
bcebf0ee7b Set change-origin so certs behind proxy work 2018-10-09 16:25:23 -07:00
Min RK
95ee2cb709 Merge pull request #2220 from tuhina2020/master
Add server_stop_duration_seconds prometheus metric #14
2018-10-09 11:23:18 +02:00
Min RK
9faecccc9c Merge pull request #2223 from DeepHorizons/process_options_form
Let the options_from_form function be async
2018-10-08 16:03:59 +02:00
Min RK
49babdcae9 Merge branch 'master' into 2220 2018-10-08 16:02:27 +02:00
Min RK
ef3b29bc5d Merge pull request #2226 from minrk/pin-coverage
pin coverage due to bug in coveragepy 5 prerelease
2018-10-08 13:34:40 +02:00
Min RK
a2da7a5080 pin coverage due to bug in coveragepy 5 prerelease 2018-10-08 13:22:37 +02:00
Min RK
f37e44a6f7 Merge pull request #2225 from kuriakinzeng/master
correcting time.pref_counter to time.perf_counter in proxy.py
2018-10-08 13:01:43 +02:00
Kuriakin Zeng
d45b2a7c70 change time.pref_counter to time.perf_counter in proxy.py as pref_counter is invalid 2018-10-07 21:53:35 +08:00
tuhina2020
b0b7e8d25d add metrics_authentication decorator to /metrics API 2018-10-07 13:38:32 +05:30
Joshua Milas
7eba029d1f Let the options_from_form function be async
This commit lets users who interact with spawners and use options_form
to use an async function to process the form.
2018-10-05 23:18:27 -04:00
Thomas Mendoza
82d12b3eeb Merge branch 'end-to-end-ssl' of github.com:LLNL/jupyterhub into end-to-end-ssl 2018-10-05 16:02:31 -07:00
Thomas Mendoza
dd07495624 Fix public_url call with ssl testing enabled 2018-10-05 15:59:10 -07:00
tuhina2020
8783df8d8d binary statuses for SERVER_STOP_DURATION_SECONDS metric 2018-10-06 00:01:03 +05:30
Min RK
d4cce8cdff Merge pull request #2219 from kshitija08/metric_addition
Adding CHECK_ROUTES_DURATION_SECONDS metric #2183
2018-10-05 14:18:02 +02:00
Min RK
8a17afb6e3 Merge pull request #2221 from minrk/html5lib
add html5lib to test requirements
2018-10-05 14:12:33 +02:00
Min RK
2bbfde40f0 add html5lib
this is needed for bs4.
I'm not sure why it was there before, but not anymore
2018-10-05 14:03:27 +02:00
Min RK
7cf230ec1f Merge pull request #2218 from Carreau/no-backticks-commands-substitution
Use $() for command substitution instead of backticks/quotes.
2018-10-05 14:01:56 +02:00
tuhina2020
c5e2789324 Add SERVER_STOP_SECONDS metric 2018-10-05 10:33:58 +05:30
kshitija08
5d96076587 metrics.py 2018-10-05 10:25:07 +05:30
Matthias Bussonnier
2e872069fb Use $() for command substitution instead of backticks/quotes.
One of the example was using quotes instead of backticks.
Backticks are the "older" way of doing things, which has a number of
disadvantes:

    http://mywiki.wooledge.org/BashFAQ/082

Here I'm more worried about readability as depending on font and "smart"
editor helping on the web, many people may confuse ` with ', it could
end up modifying formatting on makrdown powered website... etc...
2018-10-04 13:44:16 -07:00
kshitija08
ae51870db5 user.py 2018-10-04 20:29:30 +05:30
kshitija08
7409ccad66 base.py 2018-10-03 22:02:10 +05:30
Min RK
cff066a7be Merge pull request #2210 from nils-werner/service-sys-executable
Replace python with sys.executable in most service examples
2018-10-03 10:43:56 +02:00
Min RK
a198124894 ssl tests need CHP master for now 2018-10-02 18:40:01 +02:00
Min RK
58f6659e40 implement .move_certs in dummy MockSpawner 2018-10-02 18:16:47 +02:00
Min RK
bd16299ffb Merge pull request #2207 from GeorgianaElena/master
add server_poll_duration_seconds prometheus metric
2018-10-02 13:41:29 +02:00
Min RK
7656adc8b0 expand logging of ssl cert creation 2018-10-02 13:11:40 +02:00
Min RK
4b3f9e5f42 more descriptive 'internal-ssl' certs location
and update/clarify ssl-related docstrings
2018-10-02 11:23:26 +02:00
Min RK
febb7c32c1 make alt names attributes on Spawner instead of args to create_certs 2018-10-02 11:21:38 +02:00
Min RK
94bb9ed00d remove NOTEBOOK from internal ssl env 2018-10-02 11:20:36 +02:00
Min RK
5fbd4f2d4e call make/move certs at a higher level
mostly to allow them to be async
2018-10-02 11:20:36 +02:00
Min RK
50f1decee7 move local-process move_certs implementation to LocalProcessSpawner 2018-10-02 11:20:36 +02:00
Min RK
c3176b0ca3 Do not set ownership in create_certs
Most Authenticators do not have local users, so this doesn't make sense at this stage
2018-10-02 11:20:36 +02:00
Min RK
f29354e0f4 Merge branch 'master' into end-to-end-ssl 2018-10-02 11:15:53 +02:00
GeorgianaElena
67b774faca fix missing import and resolve class attributes 2018-10-02 11:58:33 +03:00
Nils Werner
a08a839385 Replace python with sys.executable in most service examples 2018-10-02 09:42:54 +02:00
GeorgianaElena
425078652e add status as a label for server_poll_duration_seconds metric 2018-10-02 09:38:00 +03:00
Thomas Mendoza
76a6959cf0 Test to ensure connections with improper certs fail 2018-10-01 16:48:03 -07:00
Thomas Mendoza
b7b5cf2f2d Fix spawner tests for running with internal_ssl 2018-10-01 16:48:03 -07:00
Thomas Mendoza
2ff067be6d Formatting change only 2018-10-01 16:48:03 -07:00
Thomas Mendoza
2cd6a9e720 Supply certs to individual async_requests 2018-10-01 16:48:03 -07:00
Thomas Mendoza
ca33692459 Only test internal_ssl if the value is set in request 2018-10-01 16:48:03 -07:00
Thomas Mendoza
32bd8aa105 Verify the self-signed certs for the proxy 2018-10-01 16:48:03 -07:00
Thomas Mendoza
080ff7043e Set appropriate protocol for bind_url 2018-10-01 16:48:03 -07:00
Thomas Mendoza
c5102452e4 Move turning ssl on into __init__ 2018-10-01 16:48:03 -07:00
Thomas Mendoza
99f2905cab Use certs if available for test_api 2018-10-01 16:48:03 -07:00
Thomas Mendoza
34d59f66d9 Setup mock services to use certs from env 2018-10-01 16:48:03 -07:00
Thomas Mendoza
88b2954c90 Missed change in mocksu to pick up certs from env 2018-10-01 16:48:03 -07:00
Thomas Mendoza
d1aeff7bbf Fix issue where Mockub was not seeing ssl_enabled flag 2018-10-01 16:48:03 -07:00
Thomas Mendoza
371ef6cad8 Spawn under name 'service' if no username exists 2018-10-01 16:48:03 -07:00
GeorgianaElena
053b038e74 Merge branch 'master' of https://github.com/jupyterhub/jupyterhub 2018-10-01 18:31:18 +03:00
Min RK
acdd9bb674 Merge pull request #2203 from minrk/entrypoints
allow spawners and authenticators to register via entry points
2018-10-01 17:22:11 +02:00
Tim Head
bc4844df3f Merge pull request #2208 from choldgraf/pip
pip command update
2018-10-01 10:29:39 +02:00
Chris Holdgraf
372af86250 rst code syntax in docs 2018-09-29 09:09:31 -07:00
Thomas Mendoza
a13f4197d4 Move proxy cert creation into .init_internal_ssl 2018-09-28 16:33:18 -07:00
Yuvi Panda
356e71709a Merge pull request #2197 from minrk/rm-null-string
Expand DummyAuthenticator docstring
2018-09-28 16:00:49 -07:00
Chris Holdgraf
c48988afcb pip command update 2018-09-28 12:00:28 -07:00
GeorgianaElena
48b0658a52 add server_poll_duration_seconds prometheus metric 2018-09-28 20:20:14 +03:00
Carol Willing
9fa4106c04 bump bootstrap version 2018-09-28 07:45:22 -07:00
Min RK
8a7ab7bc78 Merge pull request #2198 from kshitija08/master
spawners/simplespawner.py
2018-09-28 13:47:18 +02:00
Min RK
d3ae59eea6 Merge branch 'master' into master 2018-09-28 13:46:24 +02:00
kshitija08
6a7cb3dcc8 jupyterhub_config.py 2018-09-28 17:14:05 +05:30
Min RK
7f2050b522 expand docstring for DummyAuthenticator 2018-09-28 10:12:15 +02:00
Min RK
3c35aeb9a8 remove null password
preserve password type by using Falsy empty string for no password set
2018-09-28 10:11:03 +02:00
Min RK
c02ab23b3d allow spawners and authenticators to register via entrypoints
jupyterhub.authenticators for authenticators, jupyterhub.spawners for spawners

This has the effect that authenticators and spawners can be selected by name instead of full import string (e.g. 'github' or 'dummy' or 'kubernetes')
and, perhaps more importantly, the autogenerated configuration file will include a section for each installed and registered class.
2018-09-28 10:08:10 +02:00
Min RK
3a06310d37 Merge pull request #2201 from kyla-harper/master
Add DummyAuthenticator documentation
2018-09-28 10:05:27 +02:00
Kyla Harper
22b9a5e5dc Add DummyAuthenticator tests 2018-09-27 21:36:45 -05:00
kshitija08
75fd4b2525 jupyterhub_config.py 2018-09-27 23:04:36 +05:30
Kyla Harper
a78655c5a7 Add DummyAuthenticator documentation 2018-09-27 11:42:06 -05:00
Min RK
fa79e233b7 Merge pull request #2196 from choldgraf/copybutton
add a copy button to code cells
2018-09-27 14:13:56 +02:00
kshitija08
1e174e1abc tetsing/ 2018-09-27 16:48:22 +05:30
kshitija08
a87b2e680c init.py 2018-09-27 16:44:28 +05:30
Min RK
ec6123d39d include sphinx-copybutton in docs/requirements.txt 2018-09-27 12:58:51 +02:00
kshitija08
f381c2e649 spawners/simplespawner.py 2018-09-27 16:17:37 +05:30
Tim Head
5c3530cc7f Merge pull request #2195 from yuvipanda/better-upgrade
Expand & update documentation on upgrading JupyterHub
2018-09-27 09:56:08 +02:00
yuvipanda
6ca5b3aa70 Fixup upgrade toctree in index.rst 2018-09-27 00:16:24 -07:00
yuvipanda
e6a5dd1273 Fixes per @betatim & @choldgraf 2018-09-27 00:13:07 -07:00
yuvipanda
358b830747 Expand & consolidate upgrade documentation
- Expands the previous documentation on upgrading JupyterHub
  to include more information.
- Remove specific documentation on 0.7 -> 0.8 upgrade, since
  this seems to be a straight copy of the markdown version of
  upgrading docs. The important thing about the 0.7 -> 0.8 upgrade
  (requiring versions of JupyterHub to match) is now in the
  main document.
- Move from markdown to rst
2018-09-26 23:53:51 -07:00
yuvipanda
a91e94dd16 Re-order 'upgrading' section in main documentation page
Info on upgrading is important & relevant. This consolidates
the index to be a bit better. Next step is to consolidate the
documentation into one page.

Removes the 'tutorials' index page as well, since that only
had a reference to z2jh (which is now referenced from the
'distribution' section). The distribution section has
better visibility too
2018-09-26 23:53:19 -07:00
Chris Holdgraf
26f31a11f7 Merge pull request #2194 from yuvipanda/pip-cleanup
Use python3 -m pip explicitly in docs
2018-09-26 23:20:10 -04:00
Chris Holdgraf
3dc0a8388b copy button 2018-09-26 18:34:51 -04:00
Yuvi Panda
acc1fe9274 Merge pull request #2193 from kyla-harper/master
Add DummyAuthenticator
2018-09-26 12:17:08 -07:00
yuvipanda
7c273296c2 Use python3 -m pip explicitly in docs
- Add a documentation convention listing this too.

Fixes #2191
2018-09-26 12:14:43 -07:00
Kyla Harper
815034f0f1 Merge branch 'master' of https://github.com/jupyterhub/jupyterhub 2018-09-26 14:04:15 -05:00
Min RK
c8c39aa40d Merge pull request #2154 from minrk/named-ui
named-server UI
2018-09-26 14:28:30 +02:00
Min RK
b34119c908 Merge pull request #2190 from yuvipanda/contributing-docs
Expand contributing docs
2018-09-26 13:24:52 +02:00
yuvipanda
b9331dbd57 Reformat index.rst to get linkable sections
Currently, the sections in index.rst are using ** for bold,
rather than true section headers. This prevents them from being
linkable. Since we'd like to link to the 'contributing' section
from CONTRIBUTING.md, we change this by moving everything to
section headers. We also move to the toctree directive, since
it keeps the bullets aligned properly (they were hanging if
we used simple * markers)

This also replaces CONTRIBUTING.md content with a link to
the docs.
2018-09-25 18:35:38 -07:00
yuvipanda
c928d10316 Expand contributor documentation
- Move from CONTRIBUTING.md to a subdirectory in docs, so
  we can expand and add more documentation.
- Move from markdown to reStructuredTest
- Add a direct blurb in the JupyterHub docs index page on
  how contribution.
- More prominent link to the Code of Conduct
- Add section on getting in touch with the JupyterHub community
2018-09-25 18:19:09 -07:00
Kyla Harper
b43125e9e8 Add DummyAuthenticator 2018-09-25 15:44:05 -05:00
Min RK
451dccfbf4 Merge pull request #2181 from minrk/docs-ci
move docs to their own CI matrix
2018-09-24 16:49:05 +02:00
Min RK
eb8b9c4d98 implement server deletion client-side 2018-09-24 16:21:40 +02:00
Min RK
e79b43e906 support removing named servers 2018-09-24 16:21:40 +02:00
Min RK
a1dc73882a move helper properties onto orm.Spawner
since that's where they belong
2018-09-24 16:21:40 +02:00
Min RK
0fb78f19ec return future from stop_single_user
allows chaining actions when stop finally resolves via `spawner._stop_future`
2018-09-24 16:21:40 +02:00
Min RK
81a410db91 simplify admin UI for named servers 2018-09-24 16:21:40 +02:00
Min RK
924aeb4abb only include named spawners in all_spawner is named servers allowed 2018-09-24 16:21:40 +02:00
Min RK
b966258849 Simplify named-servers on home
- use a table for the list of servers
- support adding new servers
2018-09-24 16:21:40 +02:00
Min RK
9031b9aa57 add some re-usable APIs
define some pending/ready helpers as static constants on orm.Spawner

allows treating orm.Spawner the same as Spawner wrappers,
as long as `.active` etc. checks are performed first
2018-09-24 16:21:40 +02:00
Min RK
cbe4095533 use var instead of let
for better js compatibility
2018-09-24 16:21:40 +02:00
Min RK
1be278779d add npm run fmt for autoformatting js 2018-09-24 16:21:40 +02:00
Min RK
8c9d2f0c4f npm run fmt 2018-09-24 16:21:40 +02:00
Min RK
76fc077e3b Merge pull request #2180 from minrk/progress-cleanup
Fix intermittent failures in progress_bad_slow
2018-09-24 16:20:24 +02:00
Min RK
8e6d9de536 move docs to their own CI matrix
rather than building the docs after every test
2018-09-24 16:02:27 +02:00
Min RK
93045957a0 Warn instead of raising if spawner._generate_progress is called while spawn is not pending
and generate no events if not pending

Reason: race condition is unavoidable between first pending check and check inside _generate_progress.
In this event, return immediately.
2018-09-24 15:54:01 +02:00
Min RK
e71d181a23 slow down slow_bad_spawn
reduces likelihood of race condition in test
2018-09-24 15:54:01 +02:00
Min RK
fcbc6e06c8 stop keepalive loop promptly on finish
rather than waiting until keepalive_interval, which leaves idle coroutines for at least 8 seconds
2018-09-24 15:54:01 +02:00
Min RK
33c6e68b5e update changelog for 0.9.4 2018-09-24 14:01:23 +02:00
Min RK
a4d241524c Merge pull request #2177 from nils-werner/patch-1
Example homedir bootstrapping using `mkhomedir_helper`
2018-09-24 13:36:24 +02:00
Min RK
af1c71f7ff Merge pull request #2179 from minrk/disable-pdf
back to conda on rtd
2018-09-24 12:56:37 +02:00
Min RK
78c57805d5 omit pdf builds on rtd due to bug in sphinx 2018-09-24 12:48:11 +02:00
Min RK
cc324a6d4b back to conda for docs 2018-09-24 12:47:47 +02:00
Min RK
8437f47f36 Merge pull request #2165 from minrk/fix-content-type
Fix content-type on API endpoints
2018-09-24 11:03:19 +02:00
Min RK
89bde5db17 Merge pull request #2176 from GeorgianaElena/master
Issue #13 Outreachy: add running_servers metric
2018-09-24 10:37:20 +02:00
GeorgianaElena
f43ebe8d51 Rename metric 2018-09-24 11:05:01 +03:00
Nils Werner
341bc42d95 Example homedir bootstrapping using mkhomedir_helper 2018-09-24 10:01:57 +02:00
GeorgianaElena
493f9ab331 Issue #13 Outreachy: add running_servers metric 2018-09-23 18:31:37 +03:00
Yuvi Panda
e9753fd65d Merge pull request #2174 from jmfcodes/typofix
fixed a typo
2018-09-22 15:14:00 -07:00
Jennifer
3b136339af fixed a typo 2018-09-22 14:57:24 -07:00
Yuvi Panda
1821c21243 Merge pull request #2166 from minrk/testing-config
add sample configuration that loads dummyauthenticator and simplespawner
2018-09-21 10:58:44 -07:00
Min RK
e675ab85c7 Merge pull request #2164 from sashafierce/add-name-controlpanel
Add user name to control panel in JupyterHub
2018-09-21 15:16:19 +02:00
Min RK
58f005eea2 Fix content-type on API endpoints
and includes content-type header checks in tests to catch regressions
2018-09-21 15:12:53 +02:00
Min RK
d34e84ae9d add sample configuration that loads dummyauthenticator and simplespawner 2018-09-21 15:12:41 +02:00
Akanksha Bhardwaj
981ef2ca3b display username in control panel 2018-09-21 18:08:34 +05:30
Min RK
c87fcd9b71 Merge pull request #2155 from minrk/cleanup-client-fix
fix oauth client cleanup
2018-09-21 10:10:34 +02:00
Min RK
c69adfb506 Merge pull request #2161 from yuvipanda/better-contrib
Add notes on simplespawner & dummyauthenticator
2018-09-21 10:10:04 +02:00
Min RK
ac82f0f437 apply willingc's text proposals 2018-09-21 10:07:21 +02:00
Carol Willing
c975f7eb4a Merge pull request #2162 from yuvipanda/other-auth-cleanup
Link additional authenticators to wiki
2018-09-21 02:13:50 -04:00
yuvipanda
07b590e2c3 Link additional authenticators to wiki
The current list in the docs is out of date. The list
in the wiki is more up-to-date, and easier for folks
to change over time. In the long run, we should decide
where lists like this belong.
2018-09-20 22:49:00 -07:00
Erik Sundell
0b98be05fd Add links to default spawner & authenticator 2018-09-20 22:11:48 +00:00
yuvipanda
0a54b1aa99 Add notes on simplespawner & dummyauthenticator 2018-09-20 13:01:49 -07:00
Erik Sundell
e114f79e44 Merge pull request #2159 from yuvipanda/better-contrib
Expand 'Setting up Developer Environment' in CONTRIBUTING.md
2018-09-20 20:43:48 +02:00
yuvipanda
3ff046affa Expand 'Setting up Developer Environment' in CONTRIBUTING.md 2018-09-20 11:31:00 -07:00
Carol Willing
e26229c0b4 Merge pull request #2156 from willingc/pin-sphinx
Build docs with pip not conda
2018-09-19 20:25:39 -07:00
Carol Willing
6c000968c9 reset dependencies 2018-09-19 14:46:56 -07:00
Carol Willing
8d79be7cfb switch to requirements and pip 2018-09-19 14:46:36 -07:00
Carol Willing
25264a43cf update oauthlib dependency in docs 2018-09-19 14:45:00 -07:00
Min RK
4cd4fd1dff changelog for 0.9.4 2018-09-19 12:48:21 +02:00
Min RK
e2a899327f fix oauth client cleanup
- delete oauth clients for servers when they shutdown
- avoid deleting oauth clients for servers still running across an 0.8 -> 0.9 upgrade, when the oauth client ids changed from `user-NAME` to `jupyterhub-user-NAME`
2018-09-19 12:45:41 +02:00
Carol Willing
56601d93c3 Merge pull request #2149 from minrk/deprecate-maybe-future
stop using deprecated `gen.maybe_future`
2018-09-17 20:08:57 -07:00
Min RK
f2fa067025 Merge pull request #2089 from krinsman/master
UI for Named Servers (Home and Admin Pages)
2018-09-17 13:04:42 +02:00
William Krinsman
02cb5ec076 Handle named servers in UserSpawnHandler, home, admin pages
Made CSS and HTML (and Jinja2) of admin page compatible with named servers.
2018-09-17 11:54:51 +02:00
Min RK
571ca2dec6 Merge pull request #2142 from minrk/async-current-user-2
make `.get_current_user` async
2018-09-17 10:49:25 +02:00
Min RK
35a95b5f0c stop using deprecated gen.maybe_future
we already covered supported cases since we are using tornado 5,
so handle the scalar case ourselves, as recommended in the deprecation
2018-09-14 14:13:31 +02:00
Min RK
ce9d9fd26d clarify docstrings, comments in refresh_user
- refresh_user may return True in the common case, identifying that everything is up-to-date
- return False for "needs login"
- return auth_data dict when an update can be performed without logging in again
2018-09-13 10:28:10 +02:00
Min RK
d79a99323e make .get_current_user async
- `.get_current_user` is called in the `prepare` stage for all handlers
- use `.current_user` to access current user in methods
- adds Authenticator.refresh_user for refreshing user auth (unused at this point)
2018-09-13 10:16:13 +02:00
Thomas Mendoza
a81972067a Stop servers that don't get cleaned up
Running all tests (including internal_ssl
monkey-patched ones) leaves behind some
spawned servers. Stop them.
2018-09-12 17:48:31 -07:00
Thomas Mendoza
67f19a65b7 Use Certipy's trust graph to set up internal_ssl
With changes to CHP requiring a second, different
authority, the complexity of managing trust within
JupyterHub has risen. To solve this, Certipy now
has a feature to specify what components should
trust what and builds trust bundles accordingly.
2018-09-12 17:46:39 -07:00
Carol Willing
a21b496d48 Merge pull request #2144 from willingc/comm-guide
Add link to Jupyter Community Guide
2018-09-12 10:12:35 -07:00
Carol Willing
7ff49705bc fix typo 2018-09-12 08:41:05 -07:00
Carol Willing
6dc43dd70b add link to community guide reference 2018-09-12 08:39:07 -07:00
Min RK
42c78a8ba7 Merge pull request #2143 from minrk/fixup-progress
remove spurious print from keepalive code
2018-09-12 09:45:14 +02:00
Min RK
54449562bd remove spurious print from keepalive code
and send keepalive every 8 seconds

to protect against possibly aggressive proxies dropping connections after 10 seconds of inactivity
2018-09-11 16:50:48 +02:00
Min RK
e29fad06ed write needs no await 2018-09-11 16:41:27 +02:00
Matthias Bussonnier
f1a5c7da55 Merge pull request #2141 from minrk/093
changelog for 0.9.3
2018-09-11 13:41:50 +02:00
Min RK
0239ff8646 changelog for 0.9.3
Mainly small fixes, but the token page could be completely broken

This release will include the spawner.handler addition,
but not the oauthlib change currently in master
2018-09-11 11:06:31 +02:00
Min RK
e4a64bd129 Merge pull request #2127 from minrk/oauthlib
switch to oauthlib from python-oauth2
2018-09-11 11:01:51 +02:00
Min RK
a0354de3c1 Merge pull request #2139 from minrk/token-page
token expiry fixes
2018-09-11 11:01:37 +02:00
Min RK
2e4e1ce82f test token page with html parsing 2018-09-11 10:16:36 +02:00
Min RK
1f0ea679e5 clarify messages per review 2018-09-11 09:00:19 +02:00
Min RK
06f646099f token expiry fixes
typos in token expiry:

- omitted from token model (it's in the spec in docs, but wasn't in the model)
- wrong type when sorting oauth tokens on token page could cause token page to not render
2018-09-11 08:54:12 +02:00
Min RK
3360817cb6 Merge pull request #2138 from SivaMaplelabs/undefined-variable
Fix undefined variable 'datetime' error
2018-09-11 08:52:59 +02:00
Min RK
b84e929e8c skip oauthlib absolute-uri check
because we want to allow relative redirect uri for internal oauth
2018-09-10 17:12:08 +02:00
Min RK
df74ff68ab better error messages on oauth errors 2018-09-10 17:12:08 +02:00
SivaMaplelabs
e042ad0b4a Fix undefined variable 'datetime' error 2018-09-10 20:04:54 +05:30
Min RK
246f9f9044 Merge pull request #2135 from adelcast/dev/adelcast/fix_chp
add Windows case when stopping the CHP
2018-09-10 15:19:14 +02:00
Min RK
03aa48a88c update tests with oauth confirmation
cross-user / service oauth tests must submit oauth confirmation form
to complete authorization
2018-09-10 15:18:12 +02:00
Min RK
de54056005 add oauth confirmation page
users accessing their own servers still don't require confirmation,
but accessing other users' servers or services shows a confirmation page.
2018-09-10 14:31:19 +02:00
Min RK
5e2c133669 flesh out oauth provider
- avoid logging credentials
- implement some missing methods
2018-09-10 14:26:40 +02:00
Min RK
4fc4cfe2cc move oauth.store to oauth.provider
since it defines the provider!
2018-09-10 11:09:52 +02:00
Alejandro del Castillo
bc08f4de34 proxy: add Windows case when zombie proxy is still running
Windows doesn't support signal.SIGKILL, which is used by
_check_previous_process to kill the CHP if still running. Use existing
implementation to kill the CHP and children processes on Windows
instead.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-09-06 18:06:16 -05:00
Alejandro del Castillo
12904ecc32 _check_previous_process: use signal list as input to os.kill
Previously, signal.SIGTERM was using 3 times, instead of using it 2
times, then signal.SIGKILL.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-09-06 16:15:56 -05:00
Matthias Bussonnier
601d371796 Merge pull request #2132 from willingc/iss204
fix link
2018-09-06 10:16:17 +02:00
Carol Willing
30d9e09390 fix link 2018-09-05 11:27:19 -07:00
Thomas Mendoza
ca33ccd66d Add longer internal_ssl documentation to main docs 2018-09-04 15:51:26 -07:00
Thomas Mendoza
84deb1fa7a Update doc strings for create_certs and move_certs 2018-09-04 15:50:45 -07:00
Thomas Mendoza
2a0e5d90e6 Add the ability to generate JupyterHub's certificates
This is used to be able to access JupyterHub's CA
information and (manually) move it to components
that need them (like externally managed proxies).
2018-09-04 15:22:49 -07:00
Thomas Mendoza
3c05033481 Update cert generation to use Certipy's new API
To better accommodate external certificate management
as well as building of trust, Certipy was refactored.
This included general improvements to file and
record handling. In the process, some of Certipy's
APIs changed slightly, but should be more stable now
going forward.
2018-09-04 15:08:12 -07:00
Min RK
7850a5d478 Merge pull request #2036 from minrk/pass-handler
pass requesting handler to spawner
2018-09-04 18:27:02 +02:00
Min RK
f84c73eb15 [wip] switch to oauthlib from python-oauth2
lower-level implementation, but more robust and gives us more control
2018-09-04 15:10:58 +02:00
Min RK
f5a3b1bc5a Merge pull request #2122 from SivaMaplelabs/pylint-fix
Address the pylint warnings
2018-09-04 09:58:13 +02:00
SivaMaplelabs
b2fe8e5691 Address the pylint warnings 2018-09-03 21:35:46 +05:30
Min RK
9d4c410996 include params in redirect from /spawn -> /user/:name 2018-09-03 09:57:00 +02:00
Min RK
dcae92ce4a test passing url params to spawner 2018-09-03 09:56:42 +02:00
Carol Willing
29957b8cd8 Merge pull request #2112 from minrk/disable-quit
disable quit button
2018-08-30 22:47:13 -07:00
Carol Willing
6299e0368c Merge pull request #2119 from Carreau/typoes
Fix some typos using `codespell`.
2018-08-30 15:44:55 -07:00
Carol Willing
c862b6062d Merge pull request #2121 from minrk/progress-keepalive
add keepalive to progress eventstream
2018-08-30 15:43:18 -07:00
Min RK
146587ffff add keepalive to progress eventstream
avoids issues with proxies dropping connections when no data passes through

Progress behavior should already be resilient to dropped connections,
as the progress ought to just resume anew.
2018-08-30 19:03:14 +02:00
Matthias Bussonnier
077d8dec9a Fix some typos using codespell.
And checking each manually. It's funny because one of the words in the
sphinx custom dictionary was wrong :-)
2018-08-29 21:24:28 -07:00
Min RK
af8d6086fc disable quit button
quit button (new in recent notebook 5.x) shuts down the server, which we want to happen via the JupyterHub control panel
2018-08-27 16:18:53 +02:00
Min RK
18f8661d73 publish singleuser x.y.z.dev from master 2018-08-20 10:42:46 +02:00
Min RK
bd70f66c70 Merge pull request #2094 from minrk/image-dev-tag
add .dev suffix to development x.y image tags
2018-08-20 10:38:02 +02:00
Min RK
ac213fc4b5 add .dev suffix to development x.y image tags
instead of publishing "1.0" for a development version.
2018-08-20 10:37:43 +02:00
Min RK
db33549173 Merge pull request #2092 from minrk/stable-0.9
fix jupyterhub/singleuser tagging
2018-08-17 16:44:37 +02:00
Min RK
e985e2b84c singleuser stable version is 0.9 2018-08-17 16:33:42 +02:00
Min RK
1d9abf7528 back to dev 2018-08-17 16:30:24 +02:00
Min RK
935baa8bc6 Merge pull request #2080 from minrk/rel-0.9.2
prepare to release 0.9.2
2018-08-11 14:50:15 +02:00
Min RK
9b77732319 Merge pull request #2078 from minrk/fix-pin-attrs
move attrs pinning to dev-requirements
2018-08-10 13:59:09 +02:00
Min RK
85aac0fa2d prepare to release 0.9.2 2018-08-10 13:56:58 +02:00
Min RK
abd6f35638 Merge pull request #2067 from NERSC/announcement-service-example
Add an example simple announcement service
2018-08-10 12:25:24 +02:00
Min RK
ba4700b3f3 move attrs pinning to dev-requirements
it shouldn’t be in the package’s own requirements, which are propagated to users
2018-08-10 11:51:24 +02:00
Min RK
05b11bd47a Merge pull request #2072 from gesiscss/master
fix links in services doc
2018-08-10 11:40:58 +02:00
Kenan Erdogan
71cb628563 fix links in services doc 2018-08-06 11:11:14 +02:00
Rollin Thomas
0d664355f0 Some explanatory comments 2018-08-03 12:15:50 -07:00
R. C. Thomas
dd6261d031 Merge pull request #1 from NERSC/test-announcement-service-example
Use `hub_users=[]` and `allow_admin=True`
2018-08-02 09:55:23 -07:00
Rollin Thomas
f3f5b69e49 Try hub_users=[] and allow_admin=True 2018-08-02 09:00:46 -07:00
Tim Head
9ea4ca3646 Merge pull request #2065 from minrk/cull-named-servers
cull-idle: fix deletion of named servers
2018-08-02 07:55:27 +01:00
Rollin Thomas
8ee9869ca0 Add an example simple announcement service 2018-08-01 16:11:30 -07:00
Min RK
6cedd73d2a Merge pull request #2062 from chaoleili/master
Ensure request uri with trailing slash
2018-08-01 10:17:58 +02:00
Min RK
59145ca0f7 fix deletion of named servers
first submitted to zero-to-jupyterhub
2018-08-01 10:07:02 +02:00
Thomas Mendoza
9607edcc23 Return a dict instead of a tuple from move_certs 2018-07-27 17:03:12 -07:00
Thomas Mendoza
e082b923e0 Clarify output directory name for user certs 2018-07-27 16:44:24 -07:00
Thomas Mendoza
dd4df873b4 Move internal_ssl init into an init function 2018-07-27 16:41:33 -07:00
Chaolei Li
ab02f9c568 Ensure request uri with trailing slash
When request uri matching with base_url in PrefixRedirectHandler,
it's better to ensure uri with tariling slash. That's will avoid
redirecting /foobar to /foobar/hub/foobar.
2018-07-27 17:17:26 +08:00
Thomas Mendoza
3adbfe315e Pass certfile info via env instead of args 2018-07-26 17:05:50 -07:00
Thomas Mendoza
6000a84ffc Remove certs from the Server orm 2018-07-26 14:29:58 -07:00
Min RK
a2f003ed31 Merge pull request #2060 from betatim/docs-env-update
Update dependencies used by ReadTheDocs
2018-07-26 15:35:59 +02:00
Tim Head
7b6dd9f5cf Update dependencies used by ReadTheDocs 2018-07-26 12:53:19 +02:00
Min RK
0fa5c20f89 Merge pull request #2042 from minrk/abort-failures
add Spawner.consecutive_failure_limit
2018-07-26 10:33:36 +02:00
Min RK
204399ee2c Merge pull request #2040 from minrk/sigterm-fix
fix SIGTERM handling
2018-07-26 10:32:25 +02:00
Min RK
5e68dce02f Merge pull request #2057 from adelcast/dev/adelcast/fix_pid_removal
proxy: make process existance check Windows friendly
2018-07-26 10:32:00 +02:00
Alejandro del Castillo
952bbea039 proxy: make process existance check Windows friendly
Currently, to check if the proxy is running, os.kill(pid,0) is used,
which doesn't work on Windows. Wrapped call into a new function that
adds a Windows case.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-07-24 15:47:40 -05:00
Tim Head
630e85bfec Merge pull request #2050 from Carreau/https
Switch protocols to https in docs links
2018-07-24 06:09:26 +01:00
Matthias Bussonnier
26f7bb51bd Pin attrs to version greater than 17.4 or jsonschema 3.0.0a fails.
This is strange as JsonSchema already pin to higher than that.
2018-07-23 14:57:45 -07:00
Thomas Mendoza
d429433bb2 Add Certipy to requirements now that its in PyPI 2018-07-23 13:41:34 -07:00
Thomas Mendoza
5de870be41 Fix docstring 2018-07-23 13:41:20 -07:00
Thomas Mendoza
1fc75086aa Remove vague try-catch 2018-07-23 13:41:20 -07:00
Thomas Mendoza
fa3437c09a Add db migration for ssl changes to servers 2018-07-23 13:41:20 -07:00
Thomas Mendoza
01b27645fb Set http[s] as appropriate for the singleuser url 2018-07-23 13:41:19 -07:00
Thomas Mendoza
373c3f82dd SSL setup for testing
Setup general ssl request, not just to api

Basic tests comprised of non-ssl test copies

Create the context only when request is http

Refactor ssl key, cert, ca names

Configure the AsyncHTTPClient at app start

Change tests to import existing ones with ssl on

Override __new__ in MockHub to turn on SSL
2018-07-23 13:41:09 -07:00
Matthias Bussonnier
a1c2a50810 Switch protocols to https in docs links
Chrome will start to show insecure website for http next week
2018-07-22 18:58:22 -07:00
Thomas Mendoza
5c39325104 Only import certipy if internal_ssl is turned on 2018-07-18 16:02:57 -07:00
Thomas Mendoza
0304dd0040 Allow option to specify ssl_context in wait_up 2018-07-18 16:02:57 -07:00
Thomas Mendoza
a549edfd75 Testing internal ssl modifications 2018-07-18 16:02:57 -07:00
Thomas Mendoza
25e6b31a5f Only internal_ssl kwargs if internal_ssl is enabled 2018-07-18 16:02:57 -07:00
Thomas Mendoza
3c21e7d45b Server cert info into objects and orm 2018-07-18 16:02:57 -07:00
Thomas Mendoza
7c6972df7e Remove unnecessary flag, forward-ssl
Import socket when needed

Move pwd import since more than one thing uses it.
2018-07-18 16:02:57 -07:00
Thomas Mendoza
753bd0701f Create and move certs for use with spawned notebooks
Add Localhost to trusted alt names

Update to match refactored certipy names

Add the FQDN to cert alt names for hub

Ensure notebooks do not trust each other

Drop certs in user's home directory

Refactor cert creation and movement

Make alt names configurable

Make attaching alt names more generic

Setup ssl_context for the singleuser hub check
2018-07-18 16:02:57 -07:00
Thomas Mendoza
c5faf2c5ea Use certipy to automate cert creation 2018-07-18 16:02:57 -07:00
Thomas Mendoza
c50cd1ba7f Propagate certs to everything that needs them 2018-07-18 16:02:57 -07:00
Thomas Mendoza
a69e906c6e Add config and wiring for enabling internal ssl in app 2018-07-18 16:02:57 -07:00
Thomas Mendoza
f7f4759bde Build ssl_context as util, wait_up with context 2018-07-18 16:02:57 -07:00
Min RK
906abcc2f3 add Spawner.consecutive_failure_limit
The Hub will exit if consecutive failure count reaches this threshold

Any successful spawn will reset the count to 0

useful for auto-restarting / self-healing deployments such as kubernetes/systemd/docker where restarting the Hub

default is disabled, since it would bring down the Hub if it’s not an auto-restarting deployment
2018-07-16 12:07:26 -07:00
Min RK
5269370e4a fix SIGTERM handling
raise SystemExit on sigterm instead of calling atexit directly

- ensure fresh asyncio eventloop is created (not just IOLoop)
- makes cleanup more likely to run (one source of orphaned proxies)
2018-07-16 11:49:40 -07:00
Min RK
897f5f62d5 pass requesting handler to spawner
allows Spawners to implement logic such as processing GET params to select inputs

USE WITH CARE because this gives authors of links the ability to pass parameters to spawn without user knowledge or input.

This should only be used for things like selecting from a list of all known-good choices, e.g. a profile list.
2018-07-13 17:23:19 -05:00
Min RK
727356870a Merge pull request #2027 from adelcast/dev/adelcast/fix_services_windows
_ServiceSpawner: add 'SYSTEMROOT' to environment if Windows
2018-07-13 13:24:49 -05:00
Alejandro del Castillo
39aed3a5a0 _ServiceSpawner: add 'SYSTEMROOT' to environment if Windows
Python 3 cannot be started without SYSTEMROOT environment variable.
Otherwise, CryptAcquireContext() is unable to find a dll.

https://bugs.python.org/issue20614

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-07-06 14:47:19 -05:00
Min RK
ed26578717 back to dev 2018-07-04 11:59:43 +02:00
Min RK
22863f765f 0.9.1 2018-07-04 11:55:42 +02:00
Min RK
b500bd002b Merge pull request #2014 from willingc/bump-testing
add python 3.7 to travis
2018-07-04 11:02:55 +02:00
Carol Willing
aca40b24c3 remove env 2018-07-03 16:32:05 -07:00
Carol Willing
b5fe5a80c6 remove 3.7 from python list but leave in matrix 2018-07-03 14:57:58 -07:00
Carol Willing
ad073dd5dd add 3.7 to travis matrix 2018-07-03 14:44:09 -07:00
Carol Willing
7b815558c6 Merge pull request #2021 from minrk/091-changes
Prepare changelog for 0.9.1
2018-07-03 14:27:01 -07:00
Min RK
55f58b3ba7 review, note proxy prefix fix 2018-07-03 15:12:30 +02:00
Min RK
e1f93a4721 Merge pull request #2009 from BerserkerTroll/patch-2
proxy.py: Respect base_url in add_hub_route
2018-07-03 13:36:48 +02:00
Min RK
2e95f3c039 Merge branch 'master' into patch-2 2018-07-03 13:29:54 +02:00
Min RK
b0ba51f209 host-based routing doesn't support wildcards 2018-07-03 12:27:24 +02:00
Min RK
89e6c2110e add hub.routespec
this is the routespec for sending requests to the hub

It is [host]/prefix/ (not /hub/) so it receives all
requests, not just those destined for the hub
2018-07-03 12:05:21 +02:00
Min RK
7dfdc23b4e Prepare changelog for 0.9.1 2018-07-03 11:44:37 +02:00
Min RK
4c7df53a8a Merge pull request #2020 from weatherforce/master
Fix a couple of typos in the technical reference documentation
2018-07-03 11:23:36 +02:00
Alex Marandon
678afd3783 Fix a couple of typos 2018-07-03 11:16:55 +02:00
Carol Willing
0185a08f32 Merge pull request #2015 from minrk/allow_remote
disable host checking in upcoming notebook app
2018-07-02 08:45:41 -07:00
Tim Head
f3787dd2c8 Merge pull request #2016 from minrk/spawner-docs
mention get_env and get_args in spawner reference
2018-06-30 09:59:38 +02:00
Min RK
30f19cfc8c mention get_env and get_args in spawner reference
these are important and usually required (especially get_env) for custom Spawner implementations
2018-06-29 14:46:08 +02:00
Min RK
a84fa38c6b ensure prefix is on next_url in test_pages 2018-06-29 14:21:32 +02:00
Min RK
867ce4c213 use app.base_url in Proxy.check_routes
rather than assuming '/'
2018-06-29 14:19:20 +02:00
Min RK
005118e09d disable upcoming host checking in single-user notebook application 2018-06-29 11:55:47 +02:00
Carol Willing
04ce67ee71 add python 3.7 to travis 2018-06-28 08:47:04 -07:00
Min RK
31807929cb update test expectations for proxy state
expect app.base_url instead of unconditional ‘/‘
2018-06-27 12:46:13 +02:00
Min RK
cb4105b53e Merge pull request #2012 from josemonsalve2/master
c.LocalProcessSpawner.shell_cmd configuration option does not work
2018-06-27 12:39:19 +02:00
Carol Willing
151887dd56 Merge pull request #2008 from minrk/services-localhost
managed services always talk to hub on localhost
2018-06-26 12:07:29 -07:00
Carol Willing
5f97487184 Merge pull request #2001 from minrk/auto-spawn-api
avoid triggering a spawn from API requests to a not-running server
2018-06-26 12:04:10 -07:00
Carol Willing
4d2d677777 Merge pull request #1996 from minrk/proxy-cleanup
use pid file to check for previous proxy instances
2018-06-26 12:02:54 -07:00
Jose M Monsalve Diaz
6a3b3807c9 fixing shell_cmd attribute of the LocalProcessSpawner that was not tag for configuration 2018-06-25 17:07:39 -04:00
Min RK
02a52a0289 Merge pull request #1997 from gesiscss/master
fix wrong/missing closing tags in templates
2018-06-25 12:54:36 +02:00
BerserkerTroll
7bd1e387df proxy.py: Respect base_url in add_hub_route 2018-06-24 17:22:43 +03:00
Min RK
edc0d7901f services always talk to hub on localhost
When the Hub listens on all ips by default, the connection ip is the hostname.

in some cases (e.g. certain kubernetes deployments) the hub’s container’s hostname is not connectable from itself, preventing managed services from connecting to the hub.

This ensures that managed service processes talk to the hub over localhost in this case, rather than via the hostname.
2018-06-22 13:48:34 +02:00
Min RK
8e561f1c12 avoid triggering a spawn from API requests to a not-running server
this avoids left-open notebook tabs from respawning a culled server indefinitely
2018-06-20 14:57:41 +02:00
Kenan Erdogan
24d87c882f fix wrong/missing closing tags in templates 2018-06-19 09:15:18 +02:00
Min RK
1e333e2f29 Merge pull request #1992 from willingc/doc-toc
add templates and user env docs to home page index
2018-06-18 15:45:52 +02:00
Carol Willing
a507fa1c8a add templates and user env docs to home page index 2018-06-16 10:21:33 -07:00
Min RK
90cc03b3ec back to dev 2018-06-15 15:39:02 +02:00
Min RK
6f15113e2a link and date for 0.9.0 2018-06-15 15:36:48 +02:00
Min RK
f3f08c9caa 0.9.0 2018-06-15 15:23:25 +02:00
Min RK
c495c4731a Merge pull request #1983 from willingc/test-tilde
add test case for user with tilde
2018-06-15 14:48:49 +02:00
Min RK
e08a50ef66 Merge pull request #1988 from gesiscss/redirects
fix AddSlashHandler for hub_prefix without trailing /
2018-06-15 14:48:14 +02:00
Min RK
fbcd792062 Merge pull request #1984 from chicocvenancio/tilde_safe_in_proxy
mark tilde as safe in proxy routespec quoting FIX:#1982
2018-06-15 14:38:38 +02:00
Min RK
bb81ce0160 also test @ handling in proxy.check_routes
@ and ~ should be the same
2018-06-15 14:33:31 +02:00
Kenan Erdogan
315087d67c fix AddSlashHandler for hub_prefix without trailing / 2018-06-15 13:36:05 +02:00
Chico Venancio
31e6a15a85 mark tilde as safe in proxy routespec quoting FIX:#1982 2018-06-14 18:18:52 -03:00
Carol Willing
aed99d8d19 add test case for user with tilde 2018-06-14 13:24:05 -07:00
Min RK
ec83708892 use pid file to check for previous proxy instances
avoids failure to start when the previous proxy wasn't cleaned up properly
2018-06-14 17:50:33 +02:00
Min RK
bedac5f148 Merge pull request #1980 from willingc/pypi-meta
Add info to display at pypi site
2018-06-14 11:51:29 +02:00
Carol Willing
376aa13981 correct link 2018-06-13 14:37:27 -07:00
Carol Willing
4bc8b48763 add info to display at pypi site 2018-06-13 14:35:23 -07:00
Carol Willing
21496890f6 Remove stray bullet that I missed in review 2018-06-13 11:10:41 -07:00
Carol Willing
70dcd50e44 Merge pull request #1976 from minrk/changelog-more
last few things in changelog
2018-06-13 11:09:30 -07:00
Min RK
24094567e5 Merge pull request #1977 from kpfleming/patch-1
Correct 'conda' installation instructions
2018-06-13 15:44:27 +02:00
Kevin P. Fleming
6bd0febbe1 Correct 'conda' installation instructions
JupyterHub packages are in the 'conda-forge' channel of Anaconda packages; if the Anaconda installation doesn't already have 'conda-forge' enabled, `conda install jupyterhub` fails.

Rather than adding instructions to enable 'conda-forge' in Anaconda, this patch modifies the installation command to specify that channel.
2018-06-13 09:42:05 -04:00
Min RK
57075aba52 Add last few entries in changelog for 0.9 2018-06-13 15:15:18 +02:00
Min RK
f0260aae52 add missing expiry fields in rest-api doc 2018-06-13 15:15:09 +02:00
Min RK
edd8e21f71 Merge pull request #1969 from willingc/edit-userenv
Edit and reflow user environment reference
2018-06-13 09:49:23 +02:00
Min RK
681d3ce2d8 Merge pull request #1971 from willingc/contributor-list
Update contributor list for 0.9 release
2018-06-13 09:45:37 +02:00
Carol Willing
97e792ccde Update issue templates 2018-06-12 15:47:05 -07:00
Carol Willing
a5a0543b2a Delete old issue template 2018-06-12 15:42:46 -07:00
Carol Willing
5a810ccba3 Update issue templates 2018-06-12 15:41:30 -07:00
Carol Willing
0a6b2cdadc Merge pull request #1973 from jupyterhub/willingc-patch-1
Create CODE_OF_CONDUCT.md
2018-06-12 15:33:37 -07:00
Carol Willing
08903e7af8 Create PULL_REQUEST_TEMPLATE.md 2018-06-12 15:29:54 -07:00
Carol Willing
78439329c0 Merge pull request #1972 from willingc/insights
Move issue template one level down in .github directory
2018-06-12 15:28:34 -07:00
Carol Willing
4dfd6bc4b9 Create CODE_OF_CONDUCT.md 2018-06-12 15:25:27 -07:00
Carol Willing
574cc39b5f set up pull request template directory 2018-06-12 15:16:02 -07:00
Carol Willing
6fb43a8241 update issue templaate location to current github recommendation 2018-06-12 15:13:39 -07:00
Carol Willing
84c82fe382 update the contributor list for 0.9 2018-06-12 14:51:51 -07:00
Carol Willing
5e45e76f5b update contributors for 0.9 2018-06-12 14:36:00 -07:00
Carol Willing
92fd819cd6 Merge pull request #1970 from JasonJWilliamsNY/hub-not-found-at-localhost
Hub not found at localhost
2018-06-12 14:04:09 -07:00
Jason Williams
cb5ef0c302 Update troubleshooting.md 2018-06-12 17:01:37 -04:00
Jason Williams
34fab033fe Jupyterhub on Docker add workaround for unable to connect to localhost
Added a command that worked for me to fix the situation that localhost:8000 is unable to reach the hub even though the published command for Docker exposes the correct port.
2018-06-12 16:59:17 -04:00
Carol Willing
37f4c4429e edit and reflow user environment reference 2018-06-12 08:47:22 -07:00
Carol Willing
293410ec94 Merge pull request #1967 from minrk/config-docs
docs: configuring user environments
2018-06-12 07:55:53 -07:00
Min RK
ed6ee27dcd docs: configuring user environments
covers system-wide installation, kernelspec registration, and the differences between containers and host systems
2018-06-12 14:34:26 +02:00
Min RK
ca16ddb7ad back to dev 2018-06-12 14:21:16 +02:00
Min RK
2102c1fd1c 0.9.0rc1 2018-06-12 14:19:59 +02:00
Min RK
aa9676ec5e Merge pull request #1913 from rkdarst/announcement_text
Add customizable announcement text on home,login,logout,spawn
2018-06-12 14:14:21 +02:00
Min RK
5e93c7de4c announcement doc language
per willingc review
2018-06-12 13:48:42 +02:00
Min RK
d22626906b multiline conditionals setting announcement variable in templates
for readability per review by willingc
2018-06-12 13:48:24 +02:00
Min RK
5f91ed044e parametrize test_announcements 2018-06-12 13:47:55 +02:00
Min RK
5c3c7493c1 Merge pull request #1963 from willingc/hooks-doc
add a small section for pre/post spawn hooks
2018-06-11 15:27:39 +02:00
Carol Willing
1b7965092e remove backticks and long for rst format 2018-06-08 14:21:31 -07:00
Carol Willing
ef60be5a99 put backticks outside of link 2018-06-08 14:19:43 -07:00
Carol Willing
f78d652cd6 fix missing brackets 2018-06-08 14:18:14 -07:00
Carol Willing
3650575797 add a small section for pre/post spawn hooks 2018-06-08 14:13:45 -07:00
Tim Head
0f000f6d41 Merge pull request #1961 from willingc/doc-shib
Add link to authenticators used with Shibboleth
2018-06-08 18:17:08 +02:00
Carol Willing
643729ac0c Merge pull request #1962 from chicocvenancio/docs_mysql_dynamic
database docs utfmb4 collation and some versions of mysql/mariadb
2018-06-08 09:14:04 -07:00
Chico Venancio
91a67bf580 database docs: fix formatting 2018-06-08 13:09:09 -03:00
Chico Venancio
c75eddb730 database docs utfmb4 collation and some versions of mysql/mariadb 2018-06-08 12:55:02 -03:00
Carol Willing
0f5888ad6c Add link to authenticators used with Shibboleth 2018-06-08 08:22:11 -07:00
Carol Willing
8c48f3b856 Merge pull request #1960 from willingc/db-doc
add database doc section and edits to upgrading db
2018-06-08 08:08:51 -07:00
Carol Willing
6e7e18bc3c add @minrk review comments 2018-06-08 07:34:09 -07:00
Tim Head
3dfd7e5a84 Merge pull request #1958 from willingc/proxy-error
Add error message text
2018-06-08 15:19:27 +02:00
Carol Willing
19ecbf3734 add note about why no sqlite and nfs 2018-06-08 06:06:15 -07:00
Carol Willing
eac3e8ba90 add database doc section and edits to upgrading db 2018-06-08 05:51:00 -07:00
Carol Willing
a7a6829b69 add additional reference per @betatim review 2018-06-08 05:01:32 -07:00
Carol Willing
61299113c8 add error message text 2018-06-07 21:44:18 -07:00
Tim Head
21a57dfa0b Merge pull request #1949 from willingc/npm-doc
clarify that conda installs npm and proxy
2018-06-07 19:52:00 +02:00
Carol Willing
a7226a8231 changes per @minrk review 2018-06-07 09:10:04 -07:00
Min RK
6e3dd21f60 Merge pull request #1952 from willingc/docker-conda
bump miniconda to 4.5.1 in Dockerfile
2018-06-07 10:24:33 +02:00
Min RK
cf049730d4 Merge pull request #1954 from willingc/black-test
Blacken python doc build files
2018-06-07 10:24:14 +02:00
Min RK
cb9ce4d3af Merge pull request #1955 from dtaniwaki/handle-fatal-error
only relay headers from HTTPErrors
2018-06-07 10:22:38 +02:00
Daisuke Taniwaki
925ee1dfb2 Do not refer spawner on fatal errors 2018-06-07 14:53:46 +09:00
Daisuke Taniwaki
5d9122b26c Avoid setting unexpected headers 2018-06-07 14:53:34 +09:00
Carol Willing
6821ad0c59 blacken autodoc sphinx extension 2018-06-06 12:57:14 -07:00
Carol Willing
ff7851ee2e blacken conf.py 2018-06-06 12:52:30 -07:00
Carol Willing
6940ed85b1 bump miniconda to 4.5.1 2018-06-06 08:25:28 -07:00
Carol Willing
3d497a7f43 clarify that conda installs npm and proxy 2018-06-06 06:56:22 -07:00
Carol Willing
cc6968e225 Merge pull request #1942 from minrk/nginx-file
note where nginx config files are typically created.
2018-06-06 06:02:30 -07:00
Carol Willing
a6c517c344 Merge pull request #1947 from minrk/progress-stopping
Avoid showing spawn-pending page when user is stopping
2018-06-06 06:00:58 -07:00
Carol Willing
a3e08b7f52 Merge pull request #1948 from minrk/aclosing
Python 3.5.1 cannot close async iterators
2018-06-06 05:56:00 -07:00
Min RK
14c8d7dc46 Merge pull request #1946 from dtaniwaki/configure-max-inactive-duration
Configure max inactive duration
2018-06-06 12:54:55 +02:00
Daisuke Taniwaki
ac2590c679 Add active_user_window configuration 2018-06-06 19:00:34 +09:00
Min RK
ead13c6a11 further clarify that we are creating a new file, not editing nginx.confg 2018-06-06 12:00:21 +02:00
Min RK
5002ab2990 Python 3.5.1 cannot close async iterators
so provide a null aclosing async context manager that does nothing
2018-06-06 11:43:33 +02:00
Min RK
ab3e7293a4 disable my server link while stop is pending
makes it a little harder to request a spawn while stop is pending
2018-06-06 10:53:50 +02:00
Min RK
062af5e5cb Avoid showing spawn_pending page when pending action is stop
Separate stop_pending page when this occurs,
similar to the old spawn pending spinner without progress events
2018-06-06 10:53:05 +02:00
Carol Willing
92088570ea Merge pull request #1943 from minrk/getuser-delayed
delay call to getuser in token app
2018-06-05 10:18:08 -07:00
Min RK
604ccf515d delay call to getuser in token app
avoids issues with getuser preventing launch, e.g. in weird containers where the current user doesn’t exist
2018-06-05 17:52:00 +02:00
Min RK
ec9b244990 note where nginx config files are typically created. 2018-06-04 11:10:21 +02:00
Min RK
09acdc23b5 Merge pull request #1940 from dtaniwaki/fix-created-columne-error
Handle NULL created column of tokens table
2018-06-04 10:55:20 +02:00
Richard Darst
e7808b50af Add tests of page announcements
- Adds test_pages.py:test_page_contents, which currently tests just
  the page annoucement variables.
2018-06-03 01:18:48 +03:00
Richard Darst
9c27095744 Add customizable announcement text on home,login,logout,spawn
- Using the new template_vars setting (#1872), allow the variable
  `announcement` to create a header message on all the pages in the
  title, or the variables `announcement_{home,login,logout,spawn}` to
  set variables on these single pages.
- This is not the most powerful method of putting an announcement into
  the templates, because it requires a server restart to change.  But
  the invasiveness is very low, and allows minimal message
  without having to touch the templates themselves.
- Closes: #1836
2018-06-03 01:18:48 +03:00
Daisuke Taniwaki
690b07982e Handle NULL created column of api_tokens table 2018-06-02 23:55:21 +09:00
Min RK
784e5aa4ee Merge pull request #1926 from minrk/tilde-safe
tilde is a safe character in user URLs
2018-05-30 14:48:35 +02:00
Min RK
29187cab3a Merge pull request #1929 from minrk/pgbin
install psycopg2 from binary
2018-05-29 11:03:41 +02:00
Min RK
43a72807c6 install psycopg2 from binary
it has a new package name for the binary wheel
2018-05-29 10:41:53 +02:00
Min RK
1d1f6f1870 Merge pull request #1923 from nxg/doc-changes-1747
Documentation clarifications (adding explicitness).
2018-05-29 10:21:42 +02:00
Min RK
505a6eb4e3 ensure user subdomains are valid
escape with `_` instead of `%`.

This is not technically rigorous, as collisions are possible (users foo_40 and foo@ have the same domain)
and other domain restrictions are not applied (length, starting characters, etc.).
Username normalization can be used to apply stricter, more rigorous structure.
2018-05-29 10:19:21 +02:00
Min RK
cc49df8147 Merge pull request #1852 from summerswallow-whi/service-info
Attach an info field to the service
2018-05-28 14:57:10 +02:00
Min RK
98d60402b5 add service.info to rest api docs 2018-05-28 14:09:53 +02:00
Min RK
319e8a1062 update service models in tests 2018-05-28 14:09:44 +02:00
Min RK
0c5d564830 tilde is a safe character in user URLs
Chrome unconditionally reverts any not-strictly-necessary escaping in URLs (this seems wrong?)
2018-05-28 13:46:52 +02:00
Norman Gray
c0404cf9d9 Documentation clarifications (adding explicitness).
Addresses issue #1747.

These additions aren't perfect -- it's unfortunate that I've added
mention of reverse proxies on two separate pages.  I don't _think_
these can reasonably be put on the same page -- perhaps a cross
reference?
2018-05-27 18:49:40 +01:00
Min RK
f364661363 Merge pull request #1899 from adelcast/dev/adelcast/kill_proxy_tree
ConfigurableHTTPProxy.stop: kill child processes on Windows case
2018-05-25 15:25:53 +02:00
Min RK
f92d77b06d Merge pull request #1915 from rkdarst/respawn_error_msg
Clarify error message on implicit respawns.
2018-05-25 10:09:35 +02:00
Haw-minn Lu
2cf00e6aae Add info field to service model 2018-05-24 11:19:18 -07:00
Richard Darst
dfdb0cff2b Clarify error message on implicit respawns.
- This message is presented when the last spawn failed, along with a
  HTTP 500.  The current text is quite confusing, especially when the
  problem may just be solvable by trying to respawn again.
2018-05-24 16:07:26 +03:00
Alejandro del Castillo
d0dad84ffa ConfigurableHTTPProxy.stop: kill child processes on Windows case
On the Windows case, the configurable-http-proxy is spwaned using a
shell. To stop the proxy, we need to terminate both the main process
(shell) and its child (proxy).

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
2018-05-23 10:10:50 -05:00
Min RK
1745937f1a back to dev 2018-05-23 16:47:56 +02:00
Min RK
e7eb674a89 0.9.0b3 2018-05-23 16:30:07 +02:00
Min RK
b232633100 Merge pull request #1894 from minrk/db-rollback
Rollback database sessions on SQLAlchemy errors
2018-05-23 16:09:51 +02:00
Carol Willing
6abd19c149 Merge pull request #1911 from minrk/log-classes
log Authenticator and Spawner classes at startup
2018-05-22 11:50:59 -07:00
Min RK
0aa0ff8db7 Merge pull request #1912 from minrk/double-slash
Fix login redirect checking for `//` urls
2018-05-22 15:56:29 +02:00
Min RK
a907429fd4 more test cases for login redirects 2018-05-22 15:40:27 +02:00
Min RK
598b550a67 fix query/hash login redirect handling 2018-05-22 15:40:14 +02:00
Min RK
92bb442494 more robust checking for login redirects outside jupyterhub 2018-05-22 15:40:00 +02:00
Min RK
2d41f6223e log Authenticator and Spawner classes at startup
for better diagnostics
2018-05-22 13:52:41 +02:00
Min RK
791dd5fb9f Merge pull request #1895 from minrk/oauth-commits
avoid creating one huge transaction cleaning up oauth clients
2018-05-22 13:37:56 +02:00
Carol Willing
9a0ccf4c98 Merge pull request #1910 from minrk/ip-typo
default bind url should be on all ips
2018-05-22 01:26:35 -07:00
Min RK
ad2abc5771 default bind url should be on all ips
preserves jupyterhub default behavior

typo introduced in new bind_url config
2018-05-22 09:55:01 +02:00
Min RK
2d99b3943f enable pessimistic connection handling
from the sqlalchemy docs

checks if a connection is valid via `SELECT 1` prior to using it.

Since we have long-running connections, this helps us survive database restarts, disconnects, etc.
2018-05-21 22:14:11 +02:00
Min RK
a358132f95 remove --rm from docker-db.sh
for easier stop/start testing
2018-05-21 22:12:30 +02:00
Tim Head
09cd37feee Merge pull request #1896 from thoralf-gutierrez/fix-typos-in-config
Fix typos in auth config documentation
2018-05-16 22:37:51 +02:00
Thoralf Gutierrez
0f3610e81d Fix typos in auth config documentation 2018-05-16 10:58:02 -07:00
Min RK
3f97c438e2 avoid creating one huge transaction cleaning up oauth clients 2018-05-15 16:33:50 +02:00
Min RK
42351201d2 back to dev 2018-05-15 16:32:24 +02:00
Min RK
907bbb8e9d 0.9.0b2 2018-05-15 14:03:10 +02:00
Min RK
63f3d8b621 catch database errors in update_last_activity 2018-05-15 13:53:05 +02:00
Min RK
47d6e841fd cache get_current_user result
avoids raising an error rendering templates, etc.
2018-05-15 13:49:38 +02:00
Min RK
e3bb09fabe rollback database session on db errors
ensures reconnect will occur when database connection is lost
2018-05-15 13:49:14 +02:00
Carol Willing
d4e0c01189 Merge pull request #1893 from minrk/version
ensure jupyterhub version matches pep440
2018-05-15 07:40:24 -04:00
Min RK
50370d42b0 ensure jupyterhub version matches pep440
avoids mismatch jupyterhub version and tag in docker builds
2018-05-15 13:19:43 +02:00
Min RK
aa190a80b7 Merge pull request #1891 from minrk/base_url
fix and test bind_url / base_url interactions
2018-05-15 12:07:44 +01:00
Min RK
e48bae77aa Merge pull request #1890 from minrk/default-url
test default_url handling
2018-05-15 10:51:17 +01:00
Min RK
96cf0f99ed fix and test bind_url / base_url interactions 2018-05-15 10:51:11 +02:00
Min RK
f380968049 test default_url handling
- default_url is used even if not logged in
- flesh out docstrings
- pass via settings
2018-05-15 10:15:33 +02:00
Min RK
02468f4625 Merge pull request #1854 from summerswallow-whi/extra_handler
Add custom handlers and allow setting of defaults
2018-05-15 08:55:15 +01:00
Haw-minn Lu
24611f94cf Remove base_url from default_url
Add help to new traits
change extra_page_handler to extra_handler
2018-05-14 11:53:22 -07:00
Min RK
dc75a9a4b7 Merge pull request #1881 from paccorsi/check-post-stop-hook
Check the value of post stop hook
2018-05-14 13:31:33 +01:00
Min RK
33f459a23a Merge pull request #1878 from ausecocloud/master
fix listing of OAuth tokens on tokens page
2018-05-14 13:31:06 +01:00
Min RK
bdcc251002 Merge pull request #1882 from dhirschfeld/patch-1
Allow configuring the heading in spawn.html
2018-05-14 13:30:47 +01:00
Pierre Accorsi
86052ba7b4 Check the value of post stop hook 2018-05-11 10:12:45 -04:00
Dave Hirschfeld
62ebcf55c9 Allow configuring the heading in spawn.html 2018-05-11 13:34:17 +10:00
Haw-minn Lu
80ac2475a0 Restore whitespacing to original 2018-05-10 11:25:02 -07:00
Haw-minn Lu
5179d922f5 Clean up extra handler defaults 2018-05-10 11:22:50 -07:00
Gerhard Weis
26f085a8ed add test for oauth tokens on tokens page 2018-05-10 08:46:28 +10:00
Gerhard Weis
b7d302cc72 fix listing of OAuth tokens on tokens page 2018-05-10 08:46:28 +10:00
Carol Willing
f2941e3631 Merge pull request #1873 from minrk/apitoken-expiry
implement API token expiry
2018-05-09 11:45:41 -04:00
Carol Willing
26a6401af4 Merge pull request #1876 from willingc/sudo-section
refactor sudo example config
2018-05-08 09:23:28 -07:00
Carol Willing
5c8ce338a1 edit per @minrk review 2018-05-08 11:54:38 -04:00
Carol Willing
5addc7bbaf correct directive 2018-05-07 21:03:13 -07:00
Carol Willing
da095170bf remove toctree item 2018-05-07 20:38:15 -07:00
Carol Willing
1aab0a69bd fix typo 2018-05-07 20:31:20 -07:00
Carol Willing
fc8e04b62f reflow templates file 2018-05-07 20:29:13 -07:00
Carol Willing
c6c53b4e10 update index 2018-05-07 20:28:55 -07:00
Carol Willing
9b0219a2d8 break up configuration examples 2018-05-07 20:18:02 -07:00
Carol Willing
6e212fa476 reflow proxy doc 2018-05-07 20:17:14 -07:00
Carol Willing
58f9237b12 refactor sudo example config 2018-05-07 15:38:16 -07:00
Carol Willing
74fd925219 Merge pull request #1864 from datalayer-contrib/docs-sudo
Add Docs about sudo (and remove it from the wiki)
2018-05-07 23:29:08 +02:00
Carol Willing
2696bb97d2 Merge pull request #1875 from willingc/api-redux
add packages to environment.yml
2018-05-07 23:16:53 +02:00
Haw-minn Lu
9cefb27704 Move extra_handlers to fall below builtins in priority 2018-05-07 14:06:34 -07:00
Carol Willing
5e75357b06 add packages to environment.yml 2018-05-07 13:54:06 -07:00
Min RK
79bebb4bc9 Merge pull request #1872 from thedataincubator/template-vars
Allow extra variables to be passed into templates
2018-05-07 20:33:44 +02:00
Eric Charles
0ed88f212b add sudo.md 2018-05-07 19:49:26 +02:00
Eric Charles
a8c1cab5fe add sudo doc 2018-05-07 19:49:26 +02:00
Min RK
e1a6b1a70f Merge pull request #1856 from minrk/whoami-users
note about hub_users in whoami example
2018-05-07 19:47:45 +02:00
Robert Schroll
c95ed16786 Allow extra variables to be passed into templates 2018-05-07 10:47:27 -07:00
Min RK
ec784803b4 remove duplicate whoami-oauth.py from external-oauth example 2018-05-07 15:35:05 +02:00
Min RK
302d7a22d3 leave user-whitelist example in a comment
allow all users by default because default whitelist is confusing
2018-05-07 15:34:33 +02:00
Min RK
eccd5a460b 0.9.0b1 2018-05-07 14:43:59 +02:00
Min RK
80437229a1 include package-lock in sdists 2018-05-07 14:43:59 +02:00
Min RK
237ffba641 Merge pull request #1871 from minrk/fix-hub-bind-url
fix and test constructing objects from bind_url
2018-05-07 14:40:39 +02:00
Dave Hirschfeld
2695c5e49f Add missing import 2018-05-07 14:13:36 +02:00
Min RK
b7a608fdfd soften deprecation messages about ip/ports in favor of URLs
These are not deprecated, bind_url is only a potentially more convenient/powerful alternative.
2018-05-07 14:13:36 +02:00
Min RK
c3413bad78 ensure hub_prefix is part of hub bind/connect URLs 2018-05-07 14:13:36 +02:00
Min RK
dceb244e5b ensure connect_url includes base_url prefix 2018-05-07 14:13:36 +02:00
Min RK
cb31a0b162 fix and test constructing objects from bind_url 2018-05-07 14:13:36 +02:00
Min RK
7ced657d79 Merge pull request #1863 from jamescurtin/add-post-spawn-hook
Add post spawn hook
2018-05-07 13:15:21 +02:00
James Curtin
8dd9168077 Refactor method name to post_stop_hook 2018-05-07 07:07:29 -04:00
Min RK
7c6591aefe add token expiry to token model 2018-05-07 13:02:26 +02:00
Min RK
58c91e3fd4 implement API token expiry 2018-05-07 13:00:37 +02:00
Min RK
db4cf7ae62 note about hub_users in whoami example
explain what hub_users does and the value in the example
2018-05-07 10:55:39 +02:00
Min RK
a17f5e4f1b Merge pull request #1870 from dhirschfeld/patch-3
Allow `hub_connect_url` to be configured
2018-05-07 10:49:44 +02:00
Min RK
6cf7f2b0a7 Merge pull request #1866 from chicocvenancio/mysql_large_prefix
Mysql large prefix
2018-05-07 10:49:03 +02:00
Min RK
7e21ea9a48 Merge pull request #1867 from dhirschfeld/patch-1
Fix typo
2018-05-07 10:46:30 +02:00
Min RK
3f29198bae Merge pull request #1868 from dhirschfeld/patch-2
Fix ImportError on Windows
2018-05-07 10:45:57 +02:00
Dave Hirschfeld
d4293650ff Allow hub_connect_url to be configured 2018-05-07 18:43:58 +10:00
Dave Hirschfeld
d65dd16881 Fix ImportError on Windows
Delay importing unix-specific functionality until required
2018-05-07 13:27:44 +10:00
Dave Hirschfeld
f36e163581 Fix typo 2018-05-07 12:54:25 +10:00
Chico Venancio
f215adcfa2 move check after engine creation 2018-05-06 04:39:26 +00:00
Chico Venancio
1549af6f56 move large_prefix_check to previous mysql if 2018-05-06 04:29:37 +00:00
Chico Venancio
c553f82580 add comment 2018-05-06 04:27:16 +00:00
Chico Venancio
196b4ebc9f fix py syntax 2018-05-06 04:27:16 +00:00
Chico Venancio
8710ce1687 fixing py syntax 2018-05-06 04:27:16 +00:00
Chico Venancio
f65e8d7369 add ROW_FORMAT=DYNAMIC if server is configured to need it for large collums 2018-05-06 04:27:16 +00:00
Carol Willing
dc5d9f02c7 Merge pull request #1861 from minrk/0.9-changelog
Changelog for 0.9
2018-05-05 02:00:05 +02:00
James Curtin
2f3f8d7826 Add post-spawn hook 2018-05-04 19:56:34 -04:00
Carol Willing
297da070fc Merge pull request #1859 from minrk/auth-token
Allow Authenticators to authenticate requests for API tokens
2018-05-05 01:53:37 +02:00
Carol Willing
10ea92dcea Merge pull request #1850 from minrk/connect_url
Use URLs for config
2018-05-05 01:30:35 +02:00
Min RK
2e5f01f232 changelog for 0.9 2018-05-04 17:25:04 +02:00
Min RK
1a080c4261 test retrieving a token with auth in the body 2018-05-04 17:22:47 +02:00
Min RK
0e08963355 suppress auth errors on authenticated token request
since Authenticators may not be prepared for this
2018-05-04 17:18:32 +02:00
Min RK
cd9e39bf54 allow authenticators to authenticate API requests for tokens
gives Authenticators the ability to authenticate token requests,
e.g. with an existing OAuth token from the upstream provider
2018-05-04 17:18:32 +02:00
Min RK
580e840165 Merge pull request #1709 from yuvipanda/retry-suggest
Suggest retry timing when we throttle server starts
2018-05-04 16:33:35 +02:00
Min RK
09a8fd5254 address review in spawn-throttle-retry
- update config to single tuple instead of two integers
- call it spawn_throttle_retry_range
- fix setting Retry-After header without disabling error pages
2018-05-04 13:44:32 +02:00
yuvipanda
8898faa141 Suggest retry timing when we throttle server starts
Fixes #1706
2018-05-04 12:38:11 +02:00
Min RK
fdbb1dad79 use bind_url in tests 2018-05-04 12:36:59 +02:00
Min RK
c39244168b note deprecations for ip/port
in favor of bind_url
2018-05-04 11:03:47 +02:00
Min RK
9591fd88c5 add JupyterHub.bind_url for public bind URL 2018-05-04 11:02:16 +02:00
Min RK
3558ce958e Merge pull request #1848 from willingc/docs-theme
Switch docs theme to be consistent with z2jh and binderhub
2018-05-04 10:27:44 +02:00
Min RK
804a9b7be8 Spawner.start can return a URL
enables internal HTTPS, if setup by the Spawner
2018-05-03 16:41:02 +02:00
Min RK
3cae550b13 remove redundant "Adding default route" log
the same message is logged immediately after with the URL
2018-05-03 16:32:56 +02:00
Min RK
138bad5913 add connect_url, bind_url overrides
enables `c.JupyterHub.bind_url = 'unix+http://%2Fsrv%2Fjupyterhub%2Fjupyterhub.sock'`
for listening on a bsd socket.

Similarly, bind_url and connect_url work as overrides everywhere
2018-05-03 16:32:31 +02:00
Carol Willing
09011815af Good catch @betatim 2018-05-03 15:54:51 +02:00
Matthias Bussonnier
7b0c845c3a Allow Hub to listen on a unix-socket
Add the hub_socket option to the JupyterHub class, which takes
precedence over the hub_ip and hub_port setting. It does not forward
this setting to the Hub class though, and a few log messages still say
the hub is listening on `http://:8000` that works fine when testing with
netcat:

```
$ nc -U /tmp/jhub.sock
GET /login HTTP/1.1

HTTP/1.1 302 Found
Server: TornadoServer/4.5.1
Content-Type: text/html; charset=UTF-8
Date: Fri, 28 Jul 2017 02:05:36 GMT
X-Jupyterhub-Version: 0.8.0.dev
Content-Security-Policy: frame-ancestors 'self'; report-uri /hub/security/csp-report
Location: /hub/login
Content-Length: 0
```

Should still be better documented I guess.
2018-05-03 15:49:17 +02:00
Min RK
6a47123ec9 Merge pull request #1847 from willingc/update-contributing
Update the contributing instructions for running tests.
2018-05-03 14:56:01 +02:00
Carol Willing
19fab6bbf8 fix typo 2018-05-03 04:42:06 +02:00
Carol Willing
90e6b63e59 bump tornado and sphinx versions 2018-05-03 04:37:33 +02:00
Carol Willing
bd78217cf3 remove jupyter alabaster theme from requirements 2018-05-03 04:34:56 +02:00
Carol Willing
b0833985e6 fix wording from spawn to launch 2018-05-03 04:32:22 +02:00
Carol Willing
a6f73b035f updates to theme 2018-05-03 04:26:02 +02:00
Carol Willing
251440ec64 add templates for theme 2018-05-03 03:34:48 +02:00
Carol Willing
22a1df6fa0 update conf.py for theme 2018-05-03 03:34:16 +02:00
Carol Willing
6389751c22 move to alabaster theme 2018-05-03 03:22:26 +02:00
Carol Willing
8498691763 Update the contributing instructions for running tests. 2018-05-02 22:25:45 +02:00
Carol Willing
1750ff0324 Merge pull request #1846 from minrk/log-typo
ensure changed is defined
2018-05-02 20:53:08 +02:00
Carol Willing
2ce4c46afd Merge pull request #1845 from minrk/colorblind-friendly
pick colorblind-friendly alternatives for success/danger
2018-05-02 20:22:46 +02:00
Carol Willing
a20f5e44d1 Merge pull request #1819 from minrk/test-tornado-45
require tornado 5
2018-05-02 20:12:59 +02:00
Min RK
cd746d72d4 scrub redirect urls as well 2018-05-02 12:58:50 +02:00
Min RK
f7eaff0828 ensure changed is defined
avoids UnboundLocal error when no change has occurred
2018-05-02 12:52:58 +02:00
Min RK
849f119a47 Merge pull request #1835 from minrk/secret-logs
further scrub potentially sensitive url params
2018-05-02 11:58:40 +02:00
Min RK
52b68381f6 require tornado 5 2018-05-02 11:56:26 +02:00
Min RK
46d495e1e2 use btn-primary instead of btn-success
avoid references to formerly-green color
2018-05-02 11:19:46 +02:00
Min RK
acc6c22355 eliminate distinction between 'primary' and 'success'
since we don't use them both on the same screen
2018-05-02 11:16:56 +02:00
Min RK
8143182971 pick colorblind-friendly alternatives for success/danger
danger is still red, success is now blue

picked from color brewer 2 RdYlBu
2018-05-02 11:14:19 +02:00
Carol Willing
04a22cd482 Merge pull request #1841 from rkdarst/run_same_service_culling
cull_idle_servers: Add note about running with different timeouts
2018-05-02 05:41:13 +02:00
Richard Darst
4376224084 cull_idle_servers: Add note about running with different timeouts
- Instead of creating many options for different timeouts of users and
  servers, just add a note that the whole culler can be run multiple
  times with different options.  See discussion in #1834.
- Closes: #1834
2018-05-02 01:11:29 +03:00
Min RK
a9fe88c343 Merge pull request #1838 from tklever/moment-upgrade
chore: bump moment.js version
2018-04-30 14:59:43 +02:00
Carol Willing
6eb95e1c66 Merge pull request #1839 from jupyterhub/spawner-as-noun
Use verb spawn in README to refer to things related to spawner
2018-04-30 14:36:27 +02:00
J Forde
a46287c4a6 Update README.md
We should probably use the verb spawn to refer to the spawner since the spawner is the name of a specific part of JHub
2018-04-30 13:27:25 +02:00
Haw-minn Lu
bc86ee1c31 Add custom handlers and allow setting of defaults 2018-04-27 15:58:59 -07:00
Haw-minn Lu
a73e6f0bf8 Attach an info field to the service 2018-04-27 14:51:55 -07:00
Tim Klever
10a6c5144d chore: bump moment.js version
Moving to 2.19.3 or higher to clear some regex issues
2018-04-27 09:53:51 -07:00
Carol Willing
4e5f43aeae Merge pull request #1832 from minrk/dockerfiles
Docker updates
2018-04-27 06:10:59 -07:00
Min RK
ff56db0c8b Merge pull request #1828 from rkdarst/authenthicator_blacklist
Authenthicator blacklist
2018-04-26 17:59:44 +02:00
Richard Darst
95a9b97649 Add tests for authentication blacklist 2018-04-26 17:51:25 +03:00
Min RK
a5b5208823 add build context to alpine dir 2018-04-26 16:43:56 +02:00
Min RK
783295fabd fix tags in post_push 2018-04-26 16:43:56 +02:00
Min RK
1c942ec97c ubuntu base image has utf8 locale 2018-04-26 16:43:56 +02:00
Min RK
3b6d2655ab fix onbuild build arg 2018-04-26 16:43:56 +02:00
Min RK
8a18d0daab move onbuild hook to post_build 2018-04-26 16:43:56 +02:00
Min RK
e9f7ccbd25 make build hooks exit on failure 2018-04-26 16:43:56 +02:00
Min RK
68d9f35c0b build all our docker images on circleci 2018-04-26 16:43:56 +02:00
Min RK
28d78134c1 remove push from circle
building directly on docker cloud now, no credentials needed
2018-04-26 16:43:56 +02:00
Min RK
fd92ac852d add docker cloud hooks for onbuild 2018-04-26 16:43:56 +02:00
Min RK
8399f5288e add BASE_IMAGE build arg for onbuild
for easier automated building
2018-04-26 16:43:56 +02:00
Min RK
f99b7cb7eb update Python, conda, ubuntu in Dockerfile 2018-04-26 16:43:56 +02:00
Min RK
bb5166077f further scrub potentially sensitive url params
include oauth codes, state, and tokens
2018-04-26 16:42:24 +02:00
Carol Willing
b72e4b66ca Merge pull request #1831 from minrk/service-stop
service.stop is a coroutine
2018-04-26 07:28:55 -07:00
Carol Willing
ed85cd25d6 Merge pull request #1827 from minrk/circle
simplify circle2 config
2018-04-26 07:23:52 -07:00
Carol Willing
3f90697e18 Merge pull request #1820 from minrk/test-db-upgrade
test database upgrades
2018-04-26 07:22:58 -07:00
Tim Head
73271a3e55 Merge pull request #1833 from rkdarst/cull_idle_py36
Note cull-idle needs python3
2018-04-26 15:44:35 +02:00
Richard Darst
6f9ea712de Note cull-idle needs python3
- Closes: #1825
2018-04-26 16:30:51 +03:00
Min RK
6ee244e7cb Merge pull request #1829 from rkdarst/cull_idle_py36
cull_idle_servers.py: py<3.6 compatibility
2018-04-26 14:42:24 +02:00
Min RK
d66a4af79b service.stop is a coroutine
fixes waiting for services to stop on shutdown
2018-04-26 14:29:50 +02:00
Richard Darst
ea7b1caa4e Add blacklist to auth.py
- Introduce blacklist to supplement white list
- Original code by github:ndiy, updated by github:rkdarst
2018-04-26 15:22:41 +03:00
Richard Darst
9cd880fb35 cull_idle_servers.py: Remove f-string for py3.4 compatibility 2018-04-26 15:05:49 +03:00
Min RK
658c152707 simplify circleci 2 config 2018-04-26 10:49:22 +02:00
Min RK
6f1ba77608 Merge pull request #1813 from rkdarst/api_server_state
add server.state to server model if requester is an admin
2018-04-26 10:33:22 +02:00
Richard Darst
2344d696ca API: pass 'server_state' through to admin clients only
- This will allow, for example, cull_idle_servers to be more
  intelligent when culling servers.
- This is only given to admin API users, because we don't know if all
  spawners expect their state to be made available to users.
2018-04-24 16:52:18 +03:00
Min RK
bd816310cb Merge pull request #1817 from minrk/server-model
Always include server sub-models in user api requests
2018-04-24 14:12:58 +02:00
Min RK
2bcf759a9f Don't forget to install db libs in upgrade env 2018-04-24 11:44:08 +02:00
Min RK
82a04f7032 Merge pull request #1823 from willingc/test-time
Add a pytest ini file for running marked tests and edit testing mock files
2018-04-24 11:38:57 +02:00
Min RK
4281babee4 make server-model inclusion opt-in
so only certain API endpoints include server info:

- user list
- get named user

The rest exclude running servers
2018-04-24 11:35:51 +02:00
Min RK
d89f2965cf handle updated server models in culler
- servers sub-models model always defined in 0.9
- explicit 'ready' key added, use user.url fallback only when needed
2018-04-24 11:35:15 +02:00
Min RK
e2a2a9903a spawner.pending is None when nothing is pending
rather than False, which is a bit less convenient since we turn it to None in APIs anyway
2018-04-24 11:35:15 +02:00
Min RK
4401cdc16a Always have .servers model on users
rather than only when named_servers is enabled.

Put new-in-0.9 state there, rather than continuing to add server fields to top-level user model.
2018-04-24 11:35:15 +02:00
Carol Willing
e8d3fb2920 Document the mock service and mock single user servers 2018-04-23 17:38:02 -07:00
Carol Willing
f7ccc137ea add comments to header docstring 2018-04-23 17:06:44 -07:00
Carol Willing
07bbb4ea02 add comments to test file header docstring 2018-04-23 17:06:15 -07:00
Carol Willing
b189e70c9b add a minimal ini file for pytest 2018-04-23 15:31:34 -07:00
Carol Willing
de4c9c1463 mark some api tests as slow 2018-04-23 15:31:00 -07:00
Carol Willing
8bdb73ced4 Merge pull request #1809 from minrk/no-expire-again
don't expire objects on commit
2018-04-23 09:26:57 -07:00
Min RK
dee9050939 require virtualenv package for tests 2018-04-23 15:44:21 +02:00
Min RK
ae3c214708 remove unused old-jupyterhub.sqlite 2018-04-23 15:23:26 +02:00
Min RK
d6e81867bf remove upgrade-db step from travis.yml
it's now in the test itself
2018-04-23 15:22:45 +02:00
Min RK
d30a5ee0a5 add populate_db.py script to populate a database for upgrading 2018-04-23 15:22:45 +02:00
Min RK
88bb80be0f ALTER TABLE is required to add foreign key constraints
skip this for sqlite upgrade
2018-04-23 15:22:45 +02:00
Min RK
bba1ba1678 create additional test databases
for upgrading from multiple base hub versions
2018-04-23 15:22:45 +02:00
Min RK
b50daf20d0 IS NOT NULL typo in upgrade 2018-04-23 15:22:45 +02:00
Min RK
5c6c7cdff5 require tornado 4.5 2018-04-23 13:42:42 +02:00
Min RK
3f9b2a0c28 test with tornado 4.5 on travis 2018-04-23 13:42:34 +02:00
Min RK
453e119808 don't bypass spawner.server to delete server
this shouldn't happen, it's just breaking things
2018-04-23 12:54:22 +02:00
Min RK
a021f910c8 expose expire_on_commit option
conservative deployments may set

    c.JupyterHub.db_kwargs['expire_on_commit'] = True

as an escape if the optimization is causing problems.
2018-04-23 12:54:22 +02:00
Min RK
e6c2afc4db fix oauth lookup use of relationships
have to lookup orm client/user by id

client/user attributes don't exist on oauth objects, which aren't orm objects
2018-04-23 12:54:20 +02:00
Min RK
e6c7b28057 expire before re-running init_services
seems to be required, not sure why
2018-04-23 12:53:38 +02:00
Min RK
b1840e8be7 use relationships everywhere
in order to use sqlalchemy's expire_on_commit=False optimization,
we need to make sure that objects are kept up to date.

This means we cannot rely on ForeignKey ondelete/onupdate behavior,
we must use sqlalchemy's local relationship cascades

The main key here is that we must use relationships to set foreign-key relations,
e.g. APIToken.user = user instead of APIToken.user_id = user.id.

It also means that we cannot use passive_deletes,
which allows sqlalchemy to defer to the database's more efficient ON DELETE behavior.

This makes deletions more expensive in particular,
but should improve db performance overall.
2018-04-23 12:53:38 +02:00
yuvipanda
15e4b1ad8b Don't expire objects on commit 2018-04-23 12:53:38 +02:00
Min RK
2517afcee0 Merge pull request #1800 from minrk/token-api
API for managing tokens
2018-04-23 12:52:34 +02:00
Min RK
15c7ba3078 Merge pull request #1788 from NERSC/options-template-variables
Options form template variables
2018-04-23 12:49:41 +02:00
Rollin Thomas
f2cb24781a Pass for_user.spawner to templating namespace
Give access to spawner fields from the spawner form template.
2018-04-20 08:25:13 -07:00
Min RK
e1d346b8c3 add set -e to script
to prevent proceeding to docs after failure
2018-04-20 15:34:52 +02:00
Min RK
97bdf4811c update expected default token note 2018-04-20 15:34:52 +02:00
Min RK
45c871d779 add some description of API and OAuth tokens 2018-04-20 15:34:52 +02:00
Min RK
976fa9c907 update default note for API-requested tokens 2018-04-20 15:34:52 +02:00
Min RK
771c60ca37 update default token page note 2018-04-20 15:34:52 +02:00
Min RK
e15eeccd35 match oauth client description and sever token note
for spawner api tokens: "Server at /user/:name"
2018-04-20 15:34:52 +02:00
Min RK
ce535b55bc Revoking one oauth token revokes all oauth tokens for that client 2018-04-20 15:34:52 +02:00
Min RK
33cb62c2ee support revoking tokens from token page 2018-04-20 15:34:52 +02:00
Min RK
32fe3cf61d support adding note to new tokens on token page
turn token request into a form
2018-04-20 15:34:52 +02:00
Min RK
73a05498ce support new token API in jhapi.js 2018-04-20 15:34:52 +02:00
Min RK
034147f604 add token lists to token page 2018-04-20 15:34:52 +02:00
Min RK
b629e520a9 add token api to rest yaml 2018-04-20 15:34:52 +02:00
Min RK
30280cc6a4 add token.api_id
id key used in rest api
2018-04-20 15:34:52 +02:00
Min RK
f7f0b72776 retrieve tokens by id in REST API, not full token in URL 2018-04-20 15:34:52 +02:00
Min RK
251289fc05 add new token management to REST API
- list tokens
- create new tokens
- delete tokens
2018-04-20 15:34:52 +02:00
Min RK
6437093a67 add token_model method
for returning the model of an API or OAuth token
2018-04-20 15:34:52 +02:00
Min RK
be5a878da5 add description to oauth clients for services and user servers 2018-04-20 15:34:52 +02:00
Min RK
8dc73a852d add oauth client description 2018-04-20 15:34:42 +02:00
Min RK
e37d82951e Merge pull request #1814 from dhirschfeld/cookie-secret-permissions
Skip checking cookie secret permissions on Windows
2018-04-20 12:34:08 +02:00
dhirschf
acc311830e Skip checking cookie secret permissions on Windows
The existing checks are posix specific
2018-04-19 09:47:57 +10:00
Min RK
6b1046697a Merge pull request #1807 from rkdarst/cull_idle_unknown_times
cull_idle_servers.py: Fix problem when age/inactive undefined
2018-04-17 18:15:38 +02:00
Carol Willing
c5befc5b2a Merge pull request #1810 from minrk/service-stop
service.stop is not async
2018-04-17 05:18:37 -07:00
Min RK
e743a5733b add debug-logging for stopping proxy and services 2018-04-17 14:07:13 +02:00
Richard Darst
5f98801c99 cull_idle_servers.py: Don't try to delete non-running servers
- Only run the server handler if a server is actually running.  A bug
  could occur with non-named servers.
2018-04-17 13:52:13 +03:00
Richard Darst
9858a3db9d cull_idle_servers.py: Fix problem when age/inactive undefined
- Sometimes the inactive or age can be undefined instead of timedelta.
  Handle this case.
2018-04-17 13:51:40 +03:00
Min RK
65c1a525b9 service.stop is not async 2018-04-17 11:43:42 +02:00
Min RK
8bd055d4bd Merge pull request #1804 from consideRatio/query-string-memory-pr
/user/someone-else redirection retain query strings
2018-04-16 10:11:11 +02:00
Erik Sundell
5ee14db1f9 /user/someone-else redirection retain query strings 2018-04-15 05:03:56 +02:00
Carol Willing
58069d015b Merge pull request #1801 from minrk/cascades
fix and test deletion cascades
2018-04-13 13:47:27 -07:00
Carol Willing
f2684b59ec Merge pull request #1802 from minrk/dbutil-shell
add `python -m jupyterhub.dbutil shell`
2018-04-13 12:54:23 -07:00
Min RK
e0c0d03c5f define client_id in oauth token test 2018-04-13 21:52:17 +02:00
Min RK
1ac47d2bb0 consolidate stale client_id check to AccessToken.find 2018-04-13 21:49:57 +02:00
Min RK
bc75c71ca3 ensure oauth tokens with no client id aren’t accepted
these should have been deleted by deleting oauth clients
2018-04-13 21:42:38 +02:00
Min RK
c49fc14528 move oauth token relation to user
for symmetry with APIToken
2018-04-13 21:26:18 +02:00
Min RK
078bd8c627 fix and test deletion cascades
- ensure foreign keys are enabled on sqlite
- fix deletion cascades where relationships were causing dissociation instead of deletion
2018-04-13 21:23:58 +02:00
Min RK
33ba9fb5cf ensure foreign keys are enabled on sqlite 2018-04-13 21:23:58 +02:00
Min RK
4e7e586cb9 add python -m jupyterhub.dbutil shell
allows opening an IPython shell with a connection to your database

alembic moved from `python -m jupyterhub.dbutil` to `python -m jupyterhub.dbutil alembic` subcommand
2018-04-13 21:23:36 +02:00
Min RK
62fa795052 Merge pull request #1803 from minrk/status-code-typeyo
typo catching 404 in proxy.delete_route
2018-04-13 21:22:54 +02:00
Min RK
b6d9f89518 typo in test_multi_groups
add multiple groups, not users
2018-04-13 21:01:48 +02:00
Min RK
afbf867169 typo catching 404 in proxy.delete_route
status code is .code, not .status_code
2018-04-13 20:54:15 +02:00
Carol Willing
dace6ac156 Merge pull request #1793 from minrk/server.port
check if server is defined before accessing server.port
2018-04-13 10:31:05 -07:00
Carol Willing
cbf2b8cb78 Merge pull request #1790 from minrk/409-conflict
raise 409 conflict on duplicate actions
2018-04-13 10:29:52 -07:00
Carol Willing
96c5de63d8 Merge pull request #1775 from minrk/proxy-perf
proxy performance tweaks
2018-04-13 09:48:59 -07:00
Carol Willing
b8b57843a6 Merge pull request #1771 from minrk/progress
Progress on spawn-pending page
2018-04-12 16:16:37 -07:00
Min RK
e3fd4ad77d check if server is defined before accessing server.port
avoids error on premature access of Spawner.get_args if port is not set
2018-04-12 14:34:18 +02:00
Min RK
c08148266a raise 409 conflict on duplicate actions
Makes it easier for upstream clients to retry failed actions and ignore failure due to duplicate transactions
2018-04-11 10:52:05 +02:00
Min RK
a6a2d04c46 Merge pull request #1768 from sangramga/master
Added Post groups API in group list handlers
2018-04-10 13:11:05 +02:00
Min RK
8f7061fb9b Merge pull request #1779 from minrk/cull-semaphore
limit concurrent cull requests
2018-04-10 13:10:45 +02:00
Min RK
7b5235138f commit changes after stopping in cleanup 2018-04-09 16:00:04 +02:00
Min RK
7e3fa8c38d Don't double-check _stop_pending flag
could cause spurious raises of Timeout errors
2018-04-09 15:58:39 +02:00
Min RK
151acd5bec catch errors in cleanup 2018-04-09 15:16:05 +02:00
Min RK
23ca2039f6 run cleanup_after on ioloop
instead of directly on asyncio
2018-04-09 15:09:50 +02:00
Min RK
b291103592 fixup cleanup 2018-04-09 14:51:20 +02:00
Min RK
e962c9993b don't ask for exception is Future is not done 2018-04-09 14:47:50 +02:00
Min RK
955b769d3f add missing commits for deprecated ip/port
consider for removal
2018-04-09 14:47:34 +02:00
Min RK
9b914e8f01 fix waiting for spawner to fail in progress 2018-04-09 14:46:28 +02:00
Min RK
307ad636dc test spawner failure mid-progress 2018-04-09 14:46:08 +02:00
Min RK
2952f62726 add cleanup_after fixture
function-scoped fixture for shutting down servers

avoids servers leaking into neighbor tests without having to teardown the app itself after every test
2018-04-09 14:24:29 +02:00
Min RK
6d6e48f434 test native async generator on Python 3.6 2018-04-09 13:03:29 +02:00
Min RK
a189196855 ensure async generators are properly closed
only terminate with iterate_until in handler, not Spawner._generate_events
2018-04-09 13:03:18 +02:00
Min RK
d30e62a205 test spawn progress 2018-04-09 11:39:07 +02:00
Min RK
e56d416210 Don't delete failed spawners
They preserve error messages that are useful

only delete spawners that shutdown cleanly
2018-04-09 11:38:29 +02:00
Min RK
c0f37c48a1 fix wait for spawn future
asyncio.wait takes a list
2018-04-09 11:16:17 +02:00
Min RK
a3ed387455 move get_content_type up one level to BaseHandler
so all handlers get it
2018-04-09 10:38:02 +02:00
Min RK
beedc94179 delete the spinner
no need for a spinner when we have a progress bar
2018-04-09 10:32:28 +02:00
Tim Head
5229604782 Merge pull request #1781 from consideRatio/link-in-doc-fix-pr
links in docs corrected
2018-04-08 14:06:57 +02:00
Erik Sundell
cf665517dd links in docs corrected 2018-04-08 09:10:09 +02:00
sangramga
4663edd8a7 removed comments 2018-04-07 13:09:12 +05:30
Min RK
312e7974d9 limit concurrency of cull requests
avoids simultaneous request for deletion of lots of users, which can slow down the Hub
2018-04-06 16:03:48 +02:00
Min RK
ca8aa53b32 remove 'missing' from default route message
avoids indication that something went wrong
since this occurs during normal hub startup
2018-04-05 12:12:03 +02:00
Min RK
7122ca1c24 add lock to prevent concurrent calls to check_routes 2018-04-05 12:09:06 +02:00
Min RK
97cdb1a5d8 handle progress_url in user model tests 2018-04-05 11:46:47 +02:00
Min RK
31d3f7a20b allow isoformat(None)
simplifies "if timestamp is None" cases when we are just using it to serialize nullable timestamps to JSON
2018-04-05 11:32:34 +02:00
Min RK
6f8a34127b consolidate progress url
and include it in server models
2018-04-05 11:28:52 +02:00
Min RK
ee1a86d192 progress url is at server/progress
instead of server-progress
2018-04-05 11:22:00 +02:00
Min RK
707b300bd6 add iterate_until utility
allows iterating through an async generator, yielding items until another Future resolves

if/when that deadline Future resolves, ready items will continue to be yielded until there is one that actually needs to wait
at which point the iteration will halt
2018-04-05 11:22:00 +02:00
Min RK
c9e12182a2 halt progress iteration on completed spawn
requires calling `__aiter__` and `__anext__` instead of `async for`
2018-04-05 11:22:00 +02:00
Min RK
9b7186e9b8 close eventstream on success 2018-04-05 11:22:00 +02:00
Min RK
4eb07f9d48 stop spinner on failure 2018-04-05 11:22:00 +02:00
Min RK
4f78cbbd1b implement progress on spawn_pending page
- add Spawner.progress method. Must be an async generator of JSON-able progress events
- add /api/users/:user/server-progress eventstream endpoint
- use eventstream to fill progress bar on the spawn pending page
2018-04-05 11:22:00 +02:00
Min RK
d962e8bcbc Merge pull request #1748 from minrk/cookie-options
expose cookie options and pass them down to spawners
2018-04-05 10:28:46 +02:00
Min RK
ba695a0230 Merge pull request #1750 from minrk/warn-should-start
remove warning when generating proxy token if Proxy.should_start
2018-04-05 10:28:18 +02:00
Min RK
dfed2437a8 Merge pull request #1746 from minrk/activity-tracking
expand user activity timestamps
2018-04-05 10:27:55 +02:00
Min RK
ecfcb4ec64 Merge pull request #1745 from minrk/rm-redirects
clear ?redirects from URL once single-user pages load successfully
2018-04-05 10:25:24 +02:00
Min RK
b9335311de Merge pull request #1774 from dhirschfeld/patch-1
Fix Windows build
2018-04-05 10:24:41 +02:00
Dave Hirschfeld
354468db0a Fix Windows build
Closes #1773
2018-04-05 16:35:29 +10:00
Min RK
340a736722 use age instead of time cutoff
gets nicely formatted timedeltas in logging
instead of absolute times
2018-04-03 15:24:10 +02:00
Min RK
7bf93cb7e6 update cull_idle_servers for 0.9
- adds max-age
- handle named servers
- refactor culling a bit
2018-04-03 15:24:10 +02:00
Min RK
4fa9535fd4 get upstream changes from cull_idle_servers.py in zero-to-jupyterhub 2018-04-03 15:24:10 +02:00
Min RK
1abd3217aa always run test_auth_api with 'admin' user
avoids inconsistent subsequent state based on db behavior
2018-04-03 15:24:10 +02:00
Min RK
d0360d5c98 update tests with new user models
add normalize_user and fill_user utilities
2018-04-03 15:24:08 +02:00
Min RK
74365ad05e starting a server updates last_activity and started for user and spawner 2018-04-03 15:14:47 +02:00
Min RK
9dc24c0995 add user.created, spawner.started
- alembic revision
- in user/spawner models
2018-04-03 15:14:47 +02:00
Min RK
fd40e27be4 indicate that REST API timestamps are UTC
use iso8601 Z suffix for UTC timestamps

use dateutil to parse dates from proxy, as well

even though CHP uses iso8601 UTC timestamps, we no longer assume CHP, so use more general parsing

in our db we are stuck with naïve datetime objects, so use those internally.
But ensure we put 'Z' on timestamps we ship externally
2018-04-03 15:14:47 +02:00
Min RK
05b2bf4c96 ensure user.created is defined during app startup
avoids user.created being null after upgrade
2018-04-03 15:14:47 +02:00
Min RK
a0fcbcbc7d do not consider stopping a user's server activity 2018-04-03 15:14:47 +02:00
Min RK
3117ea9d34 handle user.last_activity being None 2018-04-03 15:14:47 +02:00
Min RK
8973dea33e add user.created and start last_activity as None
need to handle last_activity being None throughout
2018-04-03 15:14:47 +02:00
Min RK
3e7d0dbd23 update user.last_activity whenever we see activity on API tokens / cookies 2018-04-03 15:14:47 +02:00
Min RK
b26b1bc038 Merge pull request #1720 from glenak1911/gk/update-circleci-config-v2
Updated CircleCI config file to 2.0
2018-04-03 13:14:14 +02:00
Glen A Knight
74b1102dea Delete package-lock.json 2018-04-02 09:06:57 -04:00
Glen A Knight
a89226279f remove checkout step from deploy and release jobs 2018-04-02 09:03:50 -04:00
Glen A Knight
8b490c8ef0 add package-lock.json to gitignore 2018-04-02 09:03:09 -04:00
Min RK
77a98e7875 Merge pull request #1753 from minrk/check-pending
avoid deleting routes for spawners in a pending state
2018-04-02 09:31:29 +02:00
sangramga
c02592d5ba Merge remote-tracking branch 'origin/master' 2018-03-31 16:24:08 +05:30
sangramga
52d7dacbaa post groups api added
Added post groups list api

Added test for  Multi groups post API

Added Post  multiple groups API
2018-03-31 16:20:51 +05:30
sangramga
9a8457deff Added Post multiple groups API 2018-03-31 15:42:58 +05:30
sangramga
5039b3ac6f Added test for Multi groups post API 2018-03-31 14:46:49 +05:30
sangramga
00705223b6 Added post groups list api 2018-03-31 13:10:48 +05:30
Glen Knight
9f6ab4c419 make workflows in line with jobs 2018-03-30 11:39:25 -04:00
Glen Knight
9012c7310d update workflows 2018-03-29 01:53:37 -04:00
Glen Knight
a3edebcad9 update run commands 2018-03-29 01:49:50 -04:00
Glen Knight
f2abb6a73f update indentation 2018-03-29 01:40:35 -04:00
Glen Knight
e96e5b740a update indentation 2018-03-29 01:38:57 -04:00
Glen Knight
ee067ad97a update indentation 2018-03-29 01:36:44 -04:00
Glen Knight
d01b3a88b6 update workflow 2018-03-29 01:34:59 -04:00
Glen Knight
5a22c978cf update workflows 2018-03-29 01:26:14 -04:00
Glen Knight
f8a0e7d1be update workflows 2018-03-29 01:25:23 -04:00
Glen Knight
25a65564b1 update workflows 2018-03-29 01:24:00 -04:00
Glen Knight
c858023c88 update config and add workflows 2018-03-29 01:19:17 -04:00
sangramga
c3e470db26 post groups api added 2018-03-28 18:50:35 +05:30
Min RK
5908c4da7a clarify pending exception comment 2018-03-27 17:49:03 +02:00
Min RK
b08dbbd106 handle that auth_token is checked now at startup 2018-03-27 17:46:37 +02:00
Min RK
3b320c75e9 remove warning when generating proxy token if Proxy.should_start
Now that it's unambiguous whether the proxy should start or not,
we don't need a warning about generating tokens causing issues for hub restart.

We can raise a strict, early error if proxy s external and token is still unspecified,
rather than running into a 403 error due to a generated token
2018-03-27 17:46:25 +02:00
Min RK
1aa6dc6686 use semaphore to limit concurrent requests to the proxy
should limit timeout errors in case of flooding the proxy with requests

default concurrency is 10
2018-03-27 14:30:03 +02:00
Min RK
fdc4385e62 a bit more debug logging in proxy.check_routes
- log (info) that check_routes is starting
- log (debug) when fetching routes
2018-03-27 14:25:49 +02:00
Min RK
5094448762 Merge pull request #1743 from betatim/user-api
[MRG] Expose `auth_state` via /api/users/<name>
2018-03-27 10:56:39 +02:00
Min RK
98c7fa919f avoid deleting routes for spawners
we previously checked if spawn_pending, but *any* transitional state should exclude them from the check
2018-03-27 10:43:43 +02:00
Tim Head
5b9f51417f Fix permission check when handing out auth state 2018-03-27 10:02:59 +02:00
Tim Head
7a91f89474 Use user's token for auth when using API 2018-03-27 10:02:59 +02:00
Tim Head
bf7afa16e5 Remove auth state from user's self handler 2018-03-27 10:02:59 +02:00
Tim Head
0d57baae82 Modify user API wrt auth_state
A user can not get their own auth state via the REST API. Only admins
can fetch and update the auth state this way.
2018-03-27 10:02:59 +02:00
Tim Head
446d197cf7 Move auth state fixture to conftest 2018-03-27 10:02:59 +02:00
Tim Head
2582f0bbe6 Modify auth_state API test to use mocked crypto 2018-03-27 10:02:59 +02:00
Tim Head
1ee993c664 Add ability to modify auth_state via the REST API 2018-03-27 10:02:59 +02:00
Tim Head
542c20065f Reduce the number of endpoints that expose auth_state 2018-03-27 10:02:59 +02:00
Tim Head
39f663d03c Expose auth_state via user API 2018-03-27 10:02:59 +02:00
Min RK
6474a55302 Merge pull request #1749 from minrk/await-fixes
fix await of default authenticate
2018-03-26 13:34:01 +02:00
Min RK
8566d4c5ab fix await of default authenticate 2018-03-23 10:57:47 +01:00
Min RK
e374e93cfb expose cookie options and pass them down to spawners
enables forcing all-session cookies with:

```python
c.JupyterHub.tornado_settings['cookie_options'] = {
    'expires_days': None,
}
```
2018-03-23 10:38:50 +01:00
Min RK
7bd4f6490c Merge pull request #1731 from vilhelmen/pam_account_check
Allow checking PAM account stack during PAM auth
2018-03-23 09:19:20 +01:00
Unknown
25373f510d Allow and enable PAM account stack checking
JH can now differentiate between authenticated and authorized users via PAM
This allows JH to respect PAM-accessible user access controls.

This also fixes missing PAMAuthenticator.encoding usages.
2018-03-22 15:53:28 -05:00
Min RK
82cab39e1c Merge pull request #1722 from minrk/login-spawn
Simplify root/login redirect behavior
2018-03-21 13:20:49 +01:00
Min RK
22507cc1cd clear ?redirects from URL once single-user pages load successfully 2018-03-21 13:01:29 +01:00
Min RK
2bded65c7e update singleuser auth test url check
handle `?redirects`
2018-03-21 12:58:59 +01:00
Min RK
a3a0c60804 update redirect tests
now that redirects are not sensitive to state
2018-03-21 11:15:40 +01:00
Min RK
704b172887 update tests to reflect that login no longer implies spawn 2018-03-21 10:51:49 +01:00
Min RK
135717f8cb Merge pull request #1733 from willingc/spawner-comment
Add a spawner_class option to the reference example
2018-03-21 10:38:33 +01:00
Glen Knight
1d87ba8534 updated run? 2018-03-19 23:59:14 -04:00
Glen Knight
97cd27775b updated run command 2018-03-19 23:56:45 -04:00
Glen Knight
fe2e9c282e removed checkout 2018-03-19 23:44:53 -04:00
Glen Knight
fab125975b re-added build step 2018-03-19 23:39:50 -04:00
Glen Knight
cefd7e3b1b remove cicle.yml 2018-03-19 23:38:37 -04:00
Carol Willing
344a3e7b24 Add a spawner_class option to the reference example 2018-03-19 14:23:14 -07:00
Min RK
a0ee237ada Simplify root/login redirect behavior
- ignore spawner state when determining redirect destination
- remove implicit spawn from login handler (rely on redirect to user.url for spawn)
- settings.redirect_to_server determines if login sends users to /user/:name vs /hub/home
- visiting `/hub/` should result in the same destination regardless of login state or spawner state
2018-03-14 15:37:25 +01:00
Min RK
e81eb9a5f8 Merge pull request #1687 from minrk/external-oauth-basic
fix /api/user with oauth tokens
2018-03-13 16:11:28 +01:00
Min RK
98d3b538af Further clarifications in external-oauth example 2018-03-13 10:03:01 +01:00
Min RK
3614a0e368 move get_self test after get_users
to avoid changing expected state
2018-03-13 10:03:01 +01:00
Min RK
0421497b1e remove web.authenticated from /api/user handler
which prevents it from being used with oauth tokens
2018-03-13 10:03:01 +01:00
Min RK
8b3c2fa12f add whoami-oauth-basic example
implements oauth without inheriting from HubOAuthenticated

should be easier to parse for users with alternate oauth implementations
2018-03-13 10:03:01 +01:00
Min RK
a58bea6d93 Merge pull request #1696 from minrk/async-def
async/await syntax
2018-03-12 18:40:34 +01:00
Min RK
c7c41cd761 remove bad yield in test_api 2018-03-12 18:32:00 +01:00
Min RK
b282ec73c7 no_patience doesn't quite work with zero timeout anymore
thanks to asyncio always waiting a finite time on any await
2018-03-12 18:18:47 +01:00
Min RK
dad26be2c6 call it our own maybe_future
our version of gen.maybe_future that's fully tornado- and asyncio-compatible
2018-03-12 18:18:47 +01:00
Min RK
58d602e549 require Python 3.5 for async/await syntax 2018-03-12 18:18:46 +01:00
Min RK
5e14904205 fix a few unawaited calls to coroutines
asyncio is less forgiving about these than tornado
2018-03-12 18:18:46 +01:00
Min RK
97293ab7ce use asyncio.ensure_future to start coroutines immediately
asyncio has different coroutine start mechanics than tornado

tornado starts coroutines immediately,
whereas asyncio doesn't until they are scheduled with either ensure_future or waited upon.
2018-03-12 18:18:46 +01:00
Min RK
b6f634368c add utils.awaitable replacement for gen.maybe_future
gen.maybe_future doesn't accept asyncio coroutines
and asyncio.ensure_future doesn't accept *tornado* coroutines, so do our own thing
2018-03-12 18:18:46 +01:00
Min RK
7b4de150cc add awaitable wrapper
to replace gen.maybe_future
2018-03-12 18:18:46 +01:00
Min RK
7a268c94b0 bulk find/replace async def and await
- `@gen.coroutine def` -> `async def`
- `yield future` -> `await future`

needs some fine tuning, but this is the big one
2018-03-12 18:18:46 +01:00
Carol Willing
7a1fa78632 Merge pull request #1660 from minrk/spawn-form-access
expand admin[-access] support
2018-03-12 07:34:07 -07:00
Min RK
19f02da64d should_spawn=False when current_user is None (not logged in) 2018-03-12 14:23:57 +01:00
Min RK
5bf1aac9cb get the right render form when spawning for another user 2018-03-12 14:23:57 +01:00
Min RK
0ae034083c fix spawn admin tests 2018-03-12 14:23:57 +01:00
Min RK
5010af941b 'start server' on admin page opens spawn form
if spawn form is registered and admin access is enabled

cannot use spawn form on behalf of users without admin_access
2018-03-12 14:23:52 +01:00
Min RK
015df7e060 unify mocking of tornado_settings
ensures that everywhere we access settings, it's the same dict
and not a copy
2018-03-12 14:23:00 +01:00
Min RK
e025d58f6e fix mocks for spawner config 2018-03-12 14:23:00 +01:00
Min RK
b151d333d3 show who you're spawning for if it's not yourself
on the spawn page
2018-03-12 14:23:00 +01:00
Min RK
304c005a85 fix priority of template namespace
allow overrides
2018-03-12 14:23:00 +01:00
Min RK
e2591e8e36 fix user construction in add_user test function
ensures same construction is used as the real app
2018-03-12 14:23:00 +01:00
Min RK
f3c22cb6d0 test spawn-form for other users 2018-03-12 14:23:00 +01:00
Min RK
b2527984bc use find_user in POST /spawn/:user
so we get a 404 for missing users
2018-03-12 14:23:00 +01:00
Min RK
b8d2271191 add /spawn/:user for spawning servers for a specific user
part of admin-access
2018-03-12 14:23:00 +01:00
Min RK
b8978b0235 allow admin-access to launch servers via /user/:name
rather than checking if user.name == name,
check more directly if user should have access to :name's server
2018-03-12 14:23:00 +01:00
Min RK
63ef6419cd add admin_access fixture 2018-03-12 14:23:00 +01:00
Min RK
25dc429455 ensure app.tornado_settings is the real tornado settings in mocking
enables updates to settings during testing
2018-03-12 14:23:00 +01:00
Carol Willing
7550e63fd0 Merge pull request #1700 from minrk/cookie-name
cleanup some cookie names
2018-03-07 08:34:25 -08:00
Carol Willing
0561968fac Merge pull request #1694 from minrk/sigusr
add SIGINFO handler
2018-03-07 08:32:08 -08:00
Min RK
7811bf518b cleanup some cookie names
In part to cleanup a few remnants of early design where jupyterhub was ‘jupyter-hub’ instead of ‘jupyterhub’.
Should also clarify to some degree what the cookies are for.

- hub login cookie is now ‘jupyterhub-hub-login’ instead of ‘jupyter-hub-token’
- user server cookie is now ‘jupyterhub-user-<name>’ instead of ‘user-name’ to keep jupyterhub prefix on all cookies

All cookies at this point:

- jupyterhub-session-id on /
- jupyterhub-hub-login on /hub/ (the main login cookie)
- jupyterhub-services on /services/
- jupyterhub-user-<name> on /user/:name
- jupyterhub-user-<name>-oauth-state on /user/:name during oauth
2018-03-05 10:55:07 +01:00
Min RK
bc7116ad94 Merge pull request #1691 from minrk/async-pam-auth
talk to PAM in a thread
2018-03-02 11:40:18 +01:00
Carol Willing
70eec33d06 Merge pull request #1692 from minrk/gitignore
gitignore some more files
2018-03-01 09:05:53 -08:00
Min RK
773973825f also show asyncio task stacks
which are nicely formatted on their own

there won't be many yet, but if we transition to async def,
we will get lots more useful info
2018-03-01 14:39:11 +01:00
Min RK
a184d372f4 add SIGINFO handler
send SIGINFO (ctrl-T) to jupyterhub and it will dump
process info

- if psutil is available, show cpu, memory, FD counts
- always show stacks of non-idle threads
2018-03-01 14:37:46 +01:00
Min RK
ca1606a021 factor-out coroutine_frames filtering
so it can be used on stacks, not just tracebacks
2018-03-01 14:23:26 +01:00
Min RK
5c6d7eb309 gitignore some more files
static files have moved
2018-03-01 11:26:35 +01:00
Min RK
4de6b39788 talk to PAM in a thread
since PAM can be slow, we don't want to block the rest of the application
2018-03-01 11:22:01 +01:00
Carol Willing
f0494cc7d6 Merge pull request #1688 from minrk/no-trash
disable send2trash by default
2018-02-28 09:01:19 -08:00
Min RK
9d98d1ee63 disable send2trash by default
avoids filling up hidden .Trash directory when files are deleted

since there's no UI for trash in a jupyterhub deployment, this mainly results in files never being deleted and possibly filling up disks
2018-02-28 16:19:17 +01:00
Min RK
f1238e17b1 Merge pull request #1667 from minrk/templates
move static resources to share/jupyterhub
2018-02-28 15:57:10 +01:00
Min RK
4201c8a6f3 missing share_jupyterhub 2018-02-28 15:41:58 +01:00
Min RK
53396ed454 bower-lite, too 2018-02-28 15:41:58 +01:00
Min RK
8695823165 move static resources to share/jupyterhub
from share/jupyter/hub

to be consistent with use of etc/jupyterhub etc.
2018-02-28 15:41:58 +01:00
Min RK
ec8d008678 Merge pull request #1684 from emmanuel/support_async_options_form
Add `Spawner.get_options_form` for async support.
2018-02-28 11:08:51 +01:00
Emmanuel Gomez
a949ad14f8 Correct versionchanged annotation based on review. 2018-02-27 09:17:50 -08:00
Emmanuel Gomez
48e7bd4f10 Add Spawner.get_options_form for async support. 2018-02-26 16:50:40 -08:00
Min RK
4b11f8f26b Merge pull request #1670 from thedataincubator/nav-blocks
Add blocks for navbar components in the page template
2018-02-26 13:28:15 +01:00
Robert Schroll
b056444863 Add blocks for navbar components in the page template 2018-02-23 12:15:35 -08:00
Carol Willing
872f021ddc Merge pull request #1590 from minrk/external-oauth
enable external oauth clients
2018-02-23 06:35:59 -08:00
Min RK
079b0c1b91 feedback in README 2018-02-23 13:44:07 +01:00
Min RK
2664b50a18 Merge pull request #1678 from minrk/fix-stop
fix stop of singleuser with tornado 5
2018-02-23 09:29:02 +01:00
Min RK
6970df4dda add external oauth example 2018-02-22 17:01:00 +01:00
Min RK
22c3064ec4 pass note arg in User.new_api_token 2018-02-22 15:10:13 +01:00
Min RK
d6ab65a2e7 remove alembic autogenerate statements 2018-02-22 15:06:52 +01:00
Min RK
aa23b01a57 add notes on API tokens when they are allocated 2018-02-22 15:06:01 +01:00
Min RK
d82de98001 add alembic revision for token tracking
via alembic autogenerate
2018-02-22 15:06:01 +01:00
Min RK
7df8597484 cleanup oauth clients at startup
avoids leaving stale oauth clients in db

- cascade oauth access token, code deletion on delete of oauth client
2018-02-22 15:06:01 +01:00
Min RK
1b99b1275c allow service redirect uri to come from config
for external services

- ensure Spawner.oauth_client_id is always defined, not just for running Spawners
2018-02-22 15:05:53 +01:00
Min RK
d16461052b track activity of individual tokens 2018-02-22 15:05:18 +01:00
Min RK
9640364713 Merge pull request #1665 from thedataincubator/templates-doc
Add documentation for new templates system
2018-02-22 15:03:10 +01:00
Min RK
18e0600727 Merge pull request #1627 from minrk/logging-unicode
Fix unicode errors with extra_log_file
2018-02-22 15:01:34 +01:00
Min RK
17fffda74e fix stop of singleuser with tornado 5
Updates call to match notebook application itself

calling IOLoop.instance() is deprecated, and won't work from a background thread with tornado 5.
2018-02-22 14:48:36 +01:00
Robert Schroll
3ac4f48f82 Add version information to templates doc 2018-02-21 15:13:47 -08:00
Min RK
6f8ae98ed0 Merge pull request #1661 from GladysNalvarte/ports
Additional information about which ports can be used and which are reserved for internal use only.
2018-02-19 15:16:19 +01:00
Min RK
47b2ce6180 Merge pull request #1601 from thedataincubator/base-template
Base template mechanism
2018-02-19 14:42:40 +01:00
Gladys Nalvarte
d18d84e187 Includes suggestions to make more clear to the end user which port/ip is public. 2018-02-16 15:30:15 +01:00
Robert Schroll
c1dcdf49e5 Add doc page on templates 2018-02-15 16:18:15 -08:00
Min RK
079005eab1 Merge pull request #1643 from minrk/startup-lite
avoid instantiating idle Spawner objects during startup
2018-02-15 15:25:22 +01:00
Robert Schroll
dc8cea3a3e Change base template flag to "templates/" 2018-02-14 16:55:22 -08:00
Robert Schroll
efca88cf8b Always enable the base templates feature 2018-02-14 16:49:11 -08:00
Gladys Nalvarte
c05a6b96b7 Additional information about which ports can be used and which are reserved for internal use only. 2018-02-14 11:06:08 +01:00
Min RK
a831ff3b61 Merge pull request #1653 from dhirschfeld/patch-1
Add PyCharm folder to gitignore
2018-02-12 13:27:02 +01:00
Dave Hirschfeld
b814a09fe6 Add PyCharm folder to gitignore 2018-02-09 12:51:57 +10:00
Min RK
fb48c8626a fix reuse token test now that Spawners are cleaned up after stopping
put the Spawner instance back so it can reuse the token

'real' reuse cases don't need this because the info is stored in their own storage,
e.g. a stopped container.
2018-02-07 11:31:59 +01:00
Min RK
fbdeb4c386 move add_user call for new users to login_user
previous location was in a non-awaitable call
2018-02-07 11:22:47 +01:00
Min RK
4cf9ecc819 spawners are deleted during shutdown 2018-02-06 17:09:59 +01:00
Min RK
e9573b6e24 fixup test_orm with new User wrapper
user.db is evaluated immediately, rather than on first request,
which means we can't do User(orm.User) before adding the orm.User to the db
2018-02-06 17:02:23 +01:00
Min RK
d5f0137052 revert computing user_model from orm.User
always instantiate User wrapper
2018-02-06 15:38:32 +01:00
Min RK
d9f5adb1fb instantiate all User objects during application startup
still avoid instantiating Spawners
2018-02-06 15:38:30 +01:00
Min RK
0c6aa064ac Make User not a HasTraits
HasTraits are expensive to instantiate, so make Users as light as possible

Removes immediate instantiation of Spawners during User init. Spawners will only be instantiated while running
2018-02-06 15:38:08 +01:00
Min RK
646c853cf4 Merge pull request #1648 from thedataincubator/login-redirect
Add option to redirect to running Jupyter server
2018-02-06 15:16:45 +01:00
Min RK
fb3bc95623 Remove expunges from startup 2018-02-06 12:04:14 +01:00
Min RK
c8b4cab022 support getting user models from orm-only User objects
avoids instantiating User wrappers for inactive users in get_all_users
2018-02-06 12:04:14 +01:00
Min RK
06fb94b4ea Delay instantiation of User and Spawner objects
Avoids instantiating too many objects before they are used

- deletes Spawner instances after they stop to avoid lingering instances
- use user_dict cache more often instead of db queries
- check for empty spawners dict to avoid a few Spawner instantiations
2018-02-06 12:04:14 +01:00
Robert Schroll
9f6cef4fb4 Add option to redirect to running Jupyter server
This is how the system used to behave, but now it can be turned off, always
showing the control panel on login.  Adjustment is needed in two places.
2018-02-05 18:12:07 -08:00
Min RK
0315dd5612 avoid instantiating idle Spawner objects during startup
only instantiate Spawners when they are requested
2018-02-02 00:22:47 +01:00
Min RK
e4e5bebc1a Merge pull request #1638 from minrk/404-ok
avoid raising on 404 deleting proxy route
2018-02-01 21:32:52 +01:00
Min RK
c688e9ebad avoid raising on 404 deleting proxy route
deleting a route that doesn't exist should only warn, not error
2018-02-01 20:18:13 +01:00
Min RK
6d6041a3c1 parallelize startup poll
puts each check for a running spawner in a coroutine and runs them all concurrently.

Note: this will only improve performance when a large number of Spawners are running and `yield spawner.poll()` takes a nontrivial amount of time.
This is because these are coroutines, not threads. If instantiating Spawners themselves takes a long time, performance will not be affected.
2018-02-01 20:17:47 +01:00
Min RK
dde7b5ea68 Merge pull request #1642 from minrk/tornado-5-b
Fixes for tests with tornado 5
2018-02-01 19:57:59 +01:00
Min RK
9bf533b340 fixes when tests are run on asyncio
- need to explicitly instantiate asyncio eventloops in background threads
- remove some now-obsolete initialized checks in teardown
2018-02-01 14:56:40 +01:00
Min RK
f1a105abec register tornado's asyncio support at launch time, not import time
avoids other imports from overriding this
2018-02-01 14:49:55 +01:00
Carol Willing
e6587b5dc8 Merge pull request #1631 from minrk/bumps
bump jupyterhub version to 0.9.0.dev
2018-01-24 08:17:54 -08:00
Min RK
b2ad045a2d update docker build hooks
stable is 0.8 (and has been for some time now)
2018-01-24 16:50:49 +01:00
Min RK
89734d8c5f master is 0.9.0.dev
now that we've started making db changes
2018-01-24 16:46:46 +01:00
Min RK
53736099ba specify extra_log_file encoding as utf8
even if locale is ascii

extra_log_file can fail with encoding errors, where stdout logging will escape safely.
2018-01-22 07:39:09 +01:00
Carol Willing
2fcfa136c1 Merge pull request #1625 from jupyterhub/ellisonbg-patch-1
Remove unicode character in favor of plain ->
2018-01-18 15:40:05 -08:00
Brian E. Granger
9f85209a1b Remove unicode character in favor of plain ->
This is still causing problems in all fresh deployments we are doing. I am fine with another solution, but at least wanted to proposed this as a fix for now.
2018-01-18 12:31:17 -08:00
Carol Willing
cea1b2fd4d Merge pull request #1623 from BerserkerTroll/patch-1
Fix Authentication state documentation
2018-01-17 09:28:22 -08:00
BerserkerTroll
312252b670 Fix Authentication state documentation
This — is how it actually works!
2018-01-17 05:45:47 +03:00
Min RK
4d6b30c17b Merge pull request #1621 from consideRatio/master
Fix spawner/service typo in proxy.py
2018-01-13 13:20:44 -08:00
Erik Sundell
0beb9c2670 fix spawner/service typo in proxy.py 2018-01-13 21:43:09 +01:00
Min RK
a0289af59f Merge pull request #1615 from yuvipanda/hub_connect_ip
Add note about hub_connect_ip restrictions
2018-01-12 17:38:16 -08:00
Carol Willing
40363834c8 Merge pull request #1619 from timfreund/linkupdate
Update docker volumes link
2018-01-12 09:08:47 -08:00
Tim Freund
0c9e5fd10b Update docker volumes link
The old link now returns 404.
2018-01-11 21:28:24 -05:00
yuvipanda
3d90e5cdf6 Add note about hub_connect_ip restrictions
Kubernets Ingress Proxy requires IPs, and I suspect other
proxies in the future might have DNS restrictions too.
This causes confusion, in cases like
https://github.com/jupyterhub/kubespawner/issues/116.
2018-01-10 18:35:58 -08:00
Robert Schroll
8e3f1f0955 Add a block around the message in the spawn_pending page
This makes it easier for users to add or substitute custom messages on
this page.
2018-01-04 15:34:59 -08:00
Robert Schroll
7c64415096 Add base_template option
If true, the user can have custom templates (specified in
template_paths) that extend the default templates, by referencing them
as "BASE:filename.html".  This makes it easier to add information to
exising templates.
2018-01-04 15:34:59 -08:00
Min RK
e3fd1dba0e Merge pull request #1609 from minrk/tornado-5
tornado 5 fixes
2018-01-03 18:24:07 +01:00
Min RK
9866a0fadc avoid raising HTTPError in get_current_user
it can cause issues, e.g. with upcoming notebook releases .get_current_user may be called in set_default_headers,
which doesn't catch HTTPErrors.
2018-01-03 14:58:42 +01:00
Min RK
f87f24d9e5 unpin tornado 2018-01-03 14:12:29 +01:00
Min RK
4729ae4769 tornado 5 fixes
- ._running private attribute is removed. We don't need it anymore,
  since we were only using it while the application was run in a background thread.
- call blocking cleanup in a thread because asyncio doesn't allow multiple loops in one thread.
2018-01-03 14:12:23 +01:00
Min RK
691c4c158f Merge pull request #1606 from willingc/test-readme
Add CHP to dev install and move to CONTRIBUTING
2018-01-03 11:52:27 +01:00
Carol Willing
3c597339ba Add CHP to dev install and move to CONTRIBUTING 2018-01-03 11:52:01 +01:00
Min RK
e5fe174e03 Merge pull request #1607 from willingc/travis-tornado
pin tornado requirement to less than 5.0
2018-01-03 11:50:18 +01:00
Carol Willing
1c25a9d026 pin tornado requirement to less than 5.0 2018-01-02 15:19:35 -08:00
Min RK
2db378e9c1 Merge pull request #1577 from minrk/session-cookie
add session-id cookie
2017-12-19 15:18:02 +01:00
Min RK
a4067ee681 clarify alembic's autogenerated comments [ci skip]
with reformatting
2017-12-19 15:13:44 +01:00
Min RK
edb0831028 check for table before upgrading
avoids raising error, which aborts transactions on postgres
2017-12-19 14:19:49 +01:00
Min RK
dac3b0a6f5 clear cookies for the right domain 2017-12-19 11:05:02 +01:00
Min RK
9a180cc8ad relax failed-upgrade check
since each backend raises a different error, only check that the errors are the same.
2017-12-19 10:54:05 +01:00
Min RK
e81764610e Merge pull request #1588 from willingc/doc-spawner
Clarify resource limits/guarantees in docs and docstrings
2017-12-19 10:50:04 +01:00
Carol Willing
e4e2b627fe add formatting to clarify spawners' limits 2017-12-18 04:43:26 -08:00
Carol Willing
ec55f56725 clarify resource limits in docstrings 2017-12-18 04:33:41 -08:00
Carol Willing
1e4f871bcc update documentation on resource limits 2017-12-18 04:33:01 -08:00
Matthias Bussonnier
69f72919bd Merge pull request #1587 from darky2004/master
Request to add a new JupyterHub service provider
2017-12-15 21:20:32 +01:00
darky2004
dc0336fa45 Update gallery-jhub-deployments.md 2017-12-13 20:36:04 +00:00
darky2004
8c341d262e Update gallery-jhub-deployments.md 2017-12-13 20:35:34 +00:00
Min RK
2b15464e12 make add_columns conditional on table presence
in database upgrade.

For multi-version upgrades (e.g. 0.7 -> 0.9)
2017-12-12 14:38:06 +01:00
Min RK
a686235ffb alembic: add target_metadata
needed for `python -m jupyterhub.dbutil revision --autogenerate -m 'note'`
2017-12-12 10:54:08 +01:00
Min RK
29171a4d05 test logout
verify that:

1. auth is cached
2. oauth tokens are revoked on logout
3. clearing session id avoids cached auth data
2017-12-11 14:20:25 +01:00
Min RK
e9123f55e0 make HubAuth a singleton
allows cache re-use in default case

otherwise, default behavior is to instantiate anew on each request, eliminating cache
2017-12-11 14:20:25 +01:00
Min RK
ee004486bd include session id in cache key
if session id is defined, clearing the session id clears the cache,
allowing immediate revocation of tokens by the Hub.
2017-12-11 14:20:25 +01:00
Min RK
498e234c37 add cache repr for debugging 2017-12-11 14:20:25 +01:00
Min RK
b29f19e206 add session_id for OAuth tokens
allows tracking and revoking tokens for a login session
2017-12-11 12:15:36 +01:00
Min RK
1e00343262 Merge pull request #1581 from yuvipanda/prometheus
Add RED prometheus metrics for all requests
2017-12-11 12:00:25 +01:00
yuvipanda
3cd526c019 Make sure our metrics don't appear & disappear intermittently
Create all timeseries from the beginning, regardless of wether
they happen or not. Also rename metric objects for consistency.
2017-12-10 21:23:32 -08:00
yuvipanda
ea99c58da5 Clarify custom bucket sizes for spawn time histogram 2017-12-10 17:04:44 -08:00
yuvipanda
c64f23a64a Add note about metric naming conventions 2017-12-10 17:04:10 -08:00
yuvipanda
2099cd37fa s/starttime/start_time/ 2017-12-10 17:00:15 -08:00
yuvipanda
2559632079 Expand prometheus related docstrings a bit more 2017-12-10 16:59:35 -08:00
yuvipanda
352df39454 Add version requirement for prometheus_client 2017-12-10 16:52:19 -08:00
yuvipanda
ce3a940b11 Add histogram metric for proxy route addition 2017-12-10 15:01:47 -08:00
yuvipanda
6594e88390 Add metric recording spawn durations
Try to hit every possible exit point from the spawn_single_server
method, with an appropriate status code.

The default histogram buckets are also meant for request latencies,
but spawning usually takes longer so we use custom buckets
2017-12-10 14:54:34 -08:00
yuvipanda
339758ec42 Add RED prometheus metrics for all requests
This patch introduces Prometheus for exposing metrics
about JupyterHub's operation. We expose a standard /metrics
endpoint that can be queried without authentication. We
take on prometheus_client as an unconditional dependency
to both simplify code & because it is a pure python package
with no dependencies itself.

The first pass adds 'RED' style metrics for all HTTP requests.
http://rancher.com/red-method-for-prometheus-3-key-metrics-for-monitoring/
has some info on the RED method, but to summarize:

  For each request type, record at least the following metrics

   Rate – the number of requests, per second, your services are serving.
   Errors – the number of failed requests per second.
   Duration – The amount of time each request takes expressed as a time interval.

This instantly gives us a lot of useful metrics in a very
compact form.
2017-12-10 14:40:11 -08:00
Carol Willing
0b4c7defd4 Merge pull request #1578 from johnkpark/fix-static-file-caching
remove , which was turning timestamp into tuple
2017-12-07 19:55:24 -06:00
John Park
6d71e9065b remove , which was turning timestamp into tuple 2017-12-07 11:28:40 -08:00
Carol Willing
631ab4d4eb Merge pull request #1575 from minrk/rm-catchlog
remove pytest-catchlog in favor of recent pytest
2017-12-07 08:31:46 -06:00
Min RK
589ff47ae6 Merge pull request #1555 from ankitml/docker-compose-file
base dockerfile on alpine linux
2017-12-07 10:23:08 +01:00
Min RK
877034d012 remove pytest-catchlog in favor of recent pytest
pytest-catchlog has been merged into pytest as of pytest 3.3
2017-12-07 10:21:04 +01:00
Carol Willing
3d440bf8f5 Merge pull request #1570 from minrk/sigterm
stop polling proxy process during shutdown
2017-12-04 18:43:09 -06:00
Ankit
138b2be010 updated CMD and jupyterhub version is put into argument 2017-12-04 11:41:56 -05:00
Min RK
b729944480 Merge pull request #1564 from jkinkead/admin_from_authenticator
Allow Authenticators to return an `admin` flag for users.
2017-12-04 10:47:42 +01:00
Min RK
870afd9fac stop polling proxy process during shutdown
avoids proxy being restarted by `.check_running` during cleanup
2017-12-04 10:40:08 +01:00
Carol Willing
e808814725 Merge pull request #1567 from danielballan/build-docs
CI: Verify that the docs build without warnings.
2017-12-01 17:14:40 -06:00
danielballan
122cf2250d CI: Require the docs to build without warnings. 2017-12-01 11:18:47 -05:00
danielballan
fa1d962507 CI: Verify that the documentation builds. 2017-12-01 11:18:46 -05:00
Jesse Kinkead
6504692c5c Commit when setting admin, but only if the field changed. 2017-11-30 11:21:09 -08:00
Carol Willing
bd36962643 Merge pull request #1563 from jkinkead/patch-2
Include instructions for increasing test timeout.
2017-11-29 16:57:55 -06:00
Jesse Kinkead
f5ccfc3f8a Use travis timeout; expand documentation on timeout. 2017-11-29 14:46:18 -08:00
Jesse Kinkead
c1a7e0513b Allow Authenticators to return an admin flag for users. 2017-11-29 14:07:08 -08:00
Jesse Kinkead
af71e79371 Include instructions for increasing test timeout. 2017-11-29 13:05:01 -08:00
Min RK
bf911cf3a5 Merge pull request #1545 from ankitksharma/patch-1
Publish exposed port in docker run command
2017-11-29 18:15:46 +01:00
Carol Willing
6059a1c444 Merge pull request #1562 from minrk/external-proxy-test
wait for proxy to exit in test_external_proxy
2017-11-29 09:03:22 -06:00
Min RK
c4966a4bf2 Merge pull request #1561 from GladysNalvarte/master
test token and error pages
2017-11-29 15:24:44 +01:00
Min RK
cb9f356a69 wait for proxy to exit in test_external_proxy
.terminate() only sends the signal,
it doesn't wait for the process to exit.

If the process doesn't exit promptly,
the next instance may try to grab the port before the previous process has released it,
causing failure with EADDRINUSE.
2017-11-29 15:22:45 +01:00
Gladys Nalvarte
9d02f6a408 test_token and error pages 2017-11-28 10:09:39 +01:00
Min RK
ee76772e1b Merge pull request #1560 from GladysNalvarte/version-test
Version test
2017-11-27 12:56:42 +01:00
Min RK
f0a030a86d Merge pull request #1531 from thedataincubator/start_all_button
"Start All" button on admin page
2017-11-27 12:52:26 +01:00
Min RK
1a31e56f33 Merge pull request #1532 from minrk/npm-permissions
setup.py: run npm with --unsafe-perm
2017-11-27 12:52:06 +01:00
Gladys Nalvarte
04e9e0e687 test check_version
add coverage for different cases
2017-11-23 15:14:57 +01:00
Min RK
cec917c2a2 scaffolding for testing version checking 2017-11-23 10:55:35 +01:00
Carol Willing
08989a8797 Merge pull request #1557 from minrk/extra-log-file-warning
deprecate extra_log_file
2017-11-22 08:19:40 -08:00
Min RK
b734c331e4 deprecate extra_log_file
and add loud warning about discarding information

this has been the cause of many debugging difficulties,
when redirecting output seems to be a better option in ~all cases.
2017-11-22 17:02:43 +01:00
Matthias Bussonnier
fe477a6809 Merge pull request #1554 from smiller5678/remove-redirect-url-param-from-error-pages
Remove redirect url parameter from error pages
2017-11-21 23:05:47 +01:00
Carol Willing
6391a4a7f7 Merge pull request #1552 from cfournie/extendable_script_block
Add super() calls to child script blocks
2017-11-21 12:35:08 -08:00
Carol Willing
e68220d4b3 Merge pull request #1553 from syutbai/master
Add doc for building docs locally.
2017-11-21 12:21:28 -08:00
Ankit
b873149f9b updated alpine according to PR comments 2017-11-21 14:04:25 -05:00
Seak Pek Chhan
86aebbcaea Switch to python3 -m pip install instead of calling pip directly, move cd docs closer to make commands. 2017-11-21 14:02:07 -05:00
Ankit
fd260cf32f updated base name 2017-11-21 13:58:22 -05:00
Min RK
69101a5b14 Merge pull request #1533 from DerekHeldtWerle/master
If spawner is pending, always route to /hub/home/:user to resolve iss…
2017-11-21 19:54:51 +01:00
Ankit
151d6cbc48 updated readme 2017-11-21 13:53:39 -05:00
Ankit
04675e5fcb removed compose and env file 2017-11-21 13:50:43 -05:00
Ankit
b38c6fe06a added readme and started working on config image 2017-11-21 13:42:50 -05:00
Ankit
089a12bdc9 adding a readme 2017-11-21 13:32:59 -05:00
Ankit
d9a0a2003f moving base dockerfile into a directory 2017-11-21 13:23:21 -05:00
Derek Heldt-Werle
ad704d9925 No longer force a redirect when pending, simply set url to allow users access to home page during a pending spawn 2017-11-21 10:17:42 -08:00
Ankit
0cca79eeee auth token instructions updated 2017-11-21 13:03:25 -05:00
Ankit
457bea7c34 Base dockerfile 2017-11-21 13:01:21 -05:00
semiller
2479679eeb Remove redirect url parameter from error pages
Issue #1365
2017-11-21 12:59:02 -05:00
Chris Fournier
937405d2d8 Add super() calls to child script blocks 2017-11-21 12:24:58 -05:00
Seak Pek Chhan
d1bed1b9cc Add doc for building docs locally. 2017-11-21 12:15:30 -05:00
Ankit
acc60bce57 wip 2017-11-21 11:35:58 -05:00
Carol Willing
43807ff06b Merge pull request #1550 from syutbai/master
add jupyter-alabaster-theme to doc requirements.txt
2017-11-21 07:48:03 -08:00
Ankit
b8a63bcc0c auth env blank file 2017-11-21 10:26:28 -05:00
Ankit
66c1815a78 creating a simple docker compose environment to isolate jupyterhub notebook from other parts like configurable proxy 2017-11-21 10:25:06 -05:00
Matthias Bussonnier
4e5cfa2077 Merge pull request #1540 from minrk/cookie-secure
allow override of cookie options
2017-11-21 10:58:25 +01:00
Seak Pek Chhan
ebaf5d31b7 add jupyter-alabaster-theme to doc requirements.txt 2017-11-18 04:04:28 -05:00
Christian Moscardi
760a640c6a alternate, horizontal layout 2017-11-17 19:19:13 -05:00
Ankit Sharma
4fc06e9504 Publish exposed port in docker run command 2017-11-18 00:14:38 +05:30
Carol Willing
c283ccb122 Merge pull request #1539 from minrk/cors-fix
fix headers for CORS
2017-11-16 10:58:26 -08:00
Carol Willing
80df842b2b Merge pull request #1541 from jupyterhub/takluyver-patch-1
Clarify how to enable/disable statsd collection
2017-11-16 10:49:45 -08:00
Thomas Kluyver
f1a8a72a9f Clarify how to enable/disable statsd collection 2017-11-16 14:33:08 +00:00
Min RK
0296e16232 allow override of cookie options
via `tornado_settings['cookie_options']`

for cases where default options are incorrect or insufficient (e.g. expiry or https detection fails)
2017-11-16 13:53:27 +01:00
Min RK
f6f7081483 adjust headers for CORS
- add `authorization` to default Access-Control-Allow-Headers
- allow overriding `Access-Control-Allow-Headers` just like everything else in case default is inappropriate
- ensure case-insensitive comparison for proper header checks
2017-11-16 11:46:40 +01:00
Derek Heldt-Werle
7f7cd0a314 If spawner is pending, always route to /hub/home/:user to resolve issues with form options 2017-11-13 15:22:49 -08:00
Min RK
5ffb5763a5 setup.py: run npm with --unsafe-perm
this is the equivalent to bower's `--allow-root` that we had in bower-proper

fixes issues when installing jupyterhub from source with sudo
2017-11-13 11:09:25 +01:00
Christian Moscardi
4382037110 start all button 2017-11-10 16:57:48 -05:00
Carol Willing
963cd88440 Merge pull request #1526 from minrk/form-control
don't apply form-control unconditionally to spawn form
2017-11-08 05:40:55 -08:00
Min RK
885f99ac08 back to dev 2017-11-08 14:14:05 +01:00
Min RK
7c3919980a don't apply form-control unconditionally to spawn form
leave it to users to build their own form
2017-11-08 14:13:26 +01:00
Carol Willing
d8860d6f24 Merge pull request #1525 from minrk/thread-hangs
avoid waiting forever for threads to exit
2017-11-07 06:47:06 -08:00
Carol Willing
6b992e37e3 Merge pull request #1521 from jupyterhub/its-jupyter-now
strike mention of IPython notebook in README
2017-11-07 06:41:39 -08:00
Min RK
a3424355fa back to dev 2017-11-07 15:32:13 +01:00
Min RK
569a91296d avoid waiting forever for threads to exit
- call loop.stop via `.add_callback`
- add 30s timeout to `thread.join()` to avoid hanging forever if thread fails to exit
- assert that threads exit
2017-11-07 15:17:42 +01:00
Min RK
8b583cb445 release 0.8.1 2017-11-07 13:39:10 +01:00
Min RK
038a85af43 add removal of bower to changelog for 0.8.1 2017-11-07 13:39:10 +01:00
Min RK
9165beb41c Merge pull request #1306 from minrk/bower-lite
remove bower
2017-11-07 13:35:08 +01:00
Min RK
b285de4412 npm install with unsafe-perm on docker
npm doesn't like to run postinstall as root
2017-11-07 13:01:31 +01:00
Min RK
5826035fe9 node when css building starts 2017-11-07 12:59:57 +01:00
Min RK
b953ac295b check for built css as well in data-files lookup
avoids serving incomplete files
2017-11-07 11:40:24 +01:00
Min RK
8a95066b2e run lessc via npm 2017-11-07 11:39:53 +01:00
Min RK
00a4aef607 remove bower
use npm to fetch dependencies and a simple postinstall script to copy into components
2017-11-07 11:38:47 +01:00
Min RK
9e2663491e strike mention of IPython notebook in README
It's been long enough that we can call it Jupyter notebook, I think
2017-11-07 10:01:14 +01:00
Carol Willing
e01ce7b665 Merge pull request #1516 from minrk/0.8.1-changes
changelog for 0.8.1
2017-11-06 14:23:03 -08:00
Min RK
a57df48f28 changelog for 0.8.1 2017-11-03 11:07:08 +01:00
Min RK
5d7e008055 Merge pull request #1512 from DeepHorizons/update-service-doc
Update docs and examples for the slash at the end of the prefix
2017-11-03 10:31:46 +01:00
Min RK
ba31b3ecb7 Merge pull request #1497 from DeepHorizons/update-docs
[doc] Updated the rest docs to about change in 0.8
2017-11-01 11:49:41 +01:00
Joshua Milas
3c5eb934bf Update docs and examples for the slash at the end of the prefix 2017-10-31 14:04:37 -04:00
Joshua Milas
82e15df6e9 Added that you can also access the notebook if you are the owner 2017-10-31 10:15:02 -04:00
Yuvi Panda
e3c83c0c29 Merge pull request #1509 from minrk/stacky
copy exception before reraising
2017-10-30 17:50:37 -07:00
Min RK
94542334c4 Merge pull request #1507 from minrk/upgrade-db
add `jupyterhub --upgrade-db` to trigger upgrade on launch
2017-10-30 15:34:31 +01:00
Min RK
95494b3ace only sqlite 2017-10-30 09:58:55 +01:00
Min RK
a131cfb79e add jupyterhub --upgrade-db to trigger upgrade on launch
Upgrades the database (if needed) on start.

This is opt-in, for uses like the helm chart where explicit 'upgrade-db' steps are hard to insert.

This ought to be safe for sqlite users, where an automatic backup file is created *if an upgrade will occur*.
2017-10-27 15:35:17 +02:00
Min RK
f002c67343 add dbutil.upgrade_if_needed
so it's reusable now that we want to use it in more than one place
2017-10-27 15:35:17 +02:00
Min RK
b9caf95c72 copy exception before reraising
avoids growing traceback on each raise
2017-10-27 15:29:16 +02:00
Min RK
5356954240 Merge pull request #1493 from schon/rendering-logout
Rendering logout page when auto login is true
2017-10-27 14:42:22 +02:00
Joshua Milas
126c73002e Updated the rest docs to about change in 0.8
In 0.8, the jupyterhub api token can also be used to make requests to
hte jupyter notebook given some conditions. This commit updates that
documentation
2017-10-21 09:18:08 -04:00
Seongduk Cheon
65b4502a78 Rendering logout page when auto login is true 2017-10-19 12:14:20 +09:00
Min RK
3406161d75 Merge pull request #1460 from DeepHorizons/asyncio_event_loop
Enable the asyncio event loop to run with tornado
2017-10-13 11:18:02 +02:00
Yuvi Panda
e45f00f0f7 Merge pull request #1475 from minrk/disallow-slash
disallow '/' in usernames
2017-10-11 08:54:58 -07:00
Min RK
71f4a30562 Merge pull request #1473 from franga2000/patch-1
Change username input type to "text" to fix auto-filling
2017-10-11 16:01:45 +02:00
Min RK
20ba414b41 disallow / in usernames 2017-10-11 11:46:50 +02:00
Miha Frangez
f5250f04c5 Change username input type to "text"
<input type="username"> isn't allowed according to the spec and causes problems with autofill in Firefox.
2017-10-10 22:30:20 +02:00
Carol Willing
c2ea20a87a Merge pull request #1466 from minrk/auth_state_username
[doc] typo in auth_state structure
2017-10-04 16:57:27 -04:00
Carol Willing
b14989d4a5 Merge pull request #1465 from minrk/outerjoin
use outerjoin to join User with Spawner for admin page
2017-10-04 16:56:52 -04:00
Min RK
04578e329c typo in auth_state structure
it's 'name' not 'username'
2017-10-04 14:18:14 +02:00
Min RK
be05e438ca use outerjoin to join User with Spawner for admin page
avoids excluding users from admin page if they haven't instantiated their first Spawner yet
2017-10-04 13:58:08 +02:00
Min RK
24d9215029 back to dev 2017-10-03 21:49:23 +02:00
Min RK
8892270c24 0.8.0 2017-10-03 21:35:24 +02:00
Min RK
b928df6cba update changelog links for 0.8.0 release 2017-10-03 21:35:24 +02:00
Carol Willing
3fc74bd79e Merge pull request #1462 from minrk/proxy-docs
Document custom proxy implementations
2017-10-03 08:36:02 -07:00
Carol Willing
b34be77fec Merge pull request #1463 from minrk/auth-docs
Document auth_state
2017-10-03 08:29:45 -07:00
Joshua Milas
54dcca7ba9 Install the AsyncIOMainLoop instead of configuring it.
Installing the loop instructs the tornado loop to point to the ayncio loop and use
that. IOLoop.configure told the tornado loop to create a new ioloop when
a loop was needed, which is not what we want.
2017-10-03 08:30:49 -04:00
Min RK
d991c06098 document auth_state 2017-10-03 13:08:10 +02:00
Min RK
01a67ba156 document custom proxies 2017-10-03 12:42:52 +02:00
Min RK
8831573b6c typos in services.auth headings 2017-10-03 12:42:52 +02:00
Min RK
c5bc5411fb ignore docs/build 2017-10-03 12:42:52 +02:00
Carol Willing
a13ccd7530 Merge pull request #1461 from minrk/apache-docs
Update reverse proxy config examples
2017-10-03 02:46:27 -07:00
Min RK
e9a744e8b7 further clarify config-examples comments
per review
2017-10-03 10:19:43 +02:00
Min RK
582d43c153 add apache reverse proxy to config-examples 2017-10-02 18:18:03 +02:00
Min RK
7b5550928f mention how to generate dhparams
since we use them
2017-10-02 18:17:39 +02:00
Min RK
83920a3258 remove websocket-path-awareness from nginx config
using map, knowledge of the path is no longer necessary
2017-10-02 17:20:09 +02:00
Min RK
d1670aa443 fix mixed tabs and spaces 2017-10-02 16:19:21 +02:00
Min RK
c6f589124e Merge pull request #1458 from ryanlovett/master
Conditionally substitute $http_host for $host.
2017-09-29 16:06:56 +02:00
Carol Willing
35991e5194 Merge pull request #1455 from minrk/db-upgrade-test
Add db-upgrade test
2017-09-28 10:08:27 -07:00
Ryan Lovett
b956190393 Conditionally substitute $http_host for $host.
Necessary when using non-standard port. Closes #1457.
2017-09-28 09:40:51 -07:00
Min RK
122c989b7a specify mysql host and port explicitly
seems to be preferring MYSQL_UNIX_PORT
2017-09-28 18:20:57 +02:00
Min RK
5602575099 move db scripts to general ci directory
- remove shell test-db-upgrade test
- run mysql with docker on Travis because the version there is too old (< 5.7)
2017-09-28 16:20:15 +02:00
Min RK
4534499aad make db scripts accept one db at a time 2017-09-28 16:20:15 +02:00
Min RK
f733a91d7c avoid key length errors with old mysql + jupyterhub 0.7 2017-09-28 16:20:15 +02:00
Min RK
bf3fa30a01 load upgrade_db_url in test 2017-09-28 16:20:15 +02:00
Min RK
2625229847 note about venv 2017-09-28 16:20:15 +02:00
Min RK
2c3eb6d0d6 only count sqlite files when using sqlite 2017-09-28 15:09:17 +02:00
Min RK
5ff98fd1a5 run upgrade-tests on travis via pytest 2017-09-28 15:09:17 +02:00
Joshua Milas
056a7351a3 Enable the asyncio event loop to run with tornado
This allows packages written to use asyncio to work with tornado
2017-09-27 23:04:00 -04:00
Carol Willing
f79b71727b Merge pull request #1454 from minrk/auto-login-logout
typo rendering logout page when auto_login=True
2017-09-27 10:33:42 -07:00
Min RK
d3a3b8ca19 test db-upgrade on travis 2017-09-27 19:06:54 +02:00
Min RK
df9e002b9a separate docker-db from init-db
so we don't need docker on Travis
2017-09-27 19:05:55 +02:00
Min RK
a4a2c9d068 add tests for db upgrade with mysql, postgres 2017-09-27 18:41:08 +02:00
Min RK
c453e5ad20 mysql needs an extra step to drop _server_id 2017-09-27 18:34:54 +02:00
Min RK
617b879c2a stamp version before performing upgrade-db 2017-09-27 18:34:54 +02:00
Min RK
a0042e9302 typo rendering logout page when auto_login=True
and include it in test coverage
2017-09-27 14:29:56 +02:00
Min RK
6bbfcdfe4f 0.8.0rc2 2017-09-25 11:20:01 +02:00
Min RK
25662285af Merge pull request #1442 from DeepHorizons/add_more_spawner_statsd
[WIP] Added additional statsd collection for the spawner
2017-09-25 10:43:33 +02:00
Joshua Milas
84d12e8d72 Mock out the statsd object for testing 2017-09-22 12:57:41 -04:00
Joshua Milas
c317cbce36 Added additional statsd info for the spawner
spawner.failure coutner collects the number of failures for various reasons:
spawner.stop timer for seeing how long it takes a user server to stop
2017-09-22 12:13:15 -04:00
Min RK
d279604fac Merge pull request #1439 from minrk/oauth-state-cookie
avoid oauth state cookie collisions
2017-09-22 17:33:27 +02:00
Min RK
70fc4ef886 test concurrent oauth login state 2017-09-21 14:38:10 +02:00
Min RK
24ff91eef5 avoid oauth state cookie collisions
in case of multiple simultaneous

- state arg is strictly required now
- default cookie name in case of no collision is unchanged
- in case of collision, randomize cookie name with a suffix and store cookie_name in state
- expire state cookies after 10 minutes, not 1 day
2017-09-21 14:32:47 +02:00
Min RK
afc6789c74 Merge pull request #1441 from minrk/test-trailing-slash-wtf
debug intermittent failure on Travis
2017-09-21 14:18:08 +02:00
Min RK
819e5e222a stop server before testing trailing-slash handling
ensures `/user/name` is handled by the Hub without relying on CHP bug that was fixed in 3.0
2017-09-21 14:08:08 +02:00
Min RK
e1a4f37bbc cache pip packages on travis 2017-09-21 14:08:08 +02:00
Carol Willing
a73477feed Merge pull request #1435 from Analect/named-server-docs
Adding a short description ref starting/stopping named-servers via API
2017-09-20 21:29:11 -07:00
analect
89722ee2f3 Added in necessity to set c.JupyterHub.allow_named_servers = True 2017-09-20 10:27:28 +01:00
Min RK
30d4b2cef4 0.8.0rc1 2017-09-19 19:07:34 +02:00
analect
ca4fce7ffb Add Analect to contributor list 2017-09-19 16:18:09 +01:00
analect
018b2daace Fixing typo. 2017-09-19 16:17:54 +01:00
analect
fd01165cf6 Adding a short description ref starting/stopping named-servers via API 2017-09-19 14:33:20 +01:00
Carol Willing
34e4719893 Merge pull request #1434 from Analect/rest-api-named-server
Add handling for POST/DELETE of named-servers in hub API introduced in 0.8x
2017-09-19 06:17:05 -07:00
analect
c6ac9e1d15 Add handling for POST/DELETE of named-servers introduced in 0.8x 2017-09-19 13:20:15 +01:00
Min RK
70b8876239 Merge pull request #1413 from yuvipanda/memory-float
Allow non integral memory byte specifications
2017-09-18 10:50:56 +02:00
Min RK
5e34f4481a refer to self.UNIT_SUFFIXES 2017-09-18 10:10:20 +02:00
Min RK
eae5594698 byte specifications always return integers 2017-09-18 10:09:14 +02:00
Carol Willing
f02022a00c Merge pull request #1428 from minrk/default-server-name
allow default (empty) server name with named servers
2017-09-17 20:01:31 -07:00
Min RK
f964013516 exercise default server handler with named servers enabled 2017-09-17 11:55:50 +02:00
Min RK
5f7ffaf1f6 allow default (empty) server name with named servers
remove generated names behavior because it doesn't work
2017-09-17 11:47:17 +02:00
Carol Willing
0e7ccb7520 Merge pull request #1422 from minrk/lowercase-timeouts
lowercase LocalProcessSpawner timeouts
2017-09-15 08:11:15 -07:00
Min RK
c9db504a49 Merge pull request #1424 from phill84/bugfix/control-panel-button-height
wrap control panel button in a span
2017-09-15 06:56:41 -07:00
Jiening Wen
716677393e wrap control panel button in a span
make sure the same style is applied to all buttons in header-container
2017-09-15 15:29:38 +02:00
Min RK
ba8484f161 lowercase LocalProcessSpawner timeouts
traitlets doesn't like uppercase configurables
2017-09-15 12:07:03 +02:00
Yuvi Panda
ceec84dbb4 Merge pull request #1417 from minrk/test-delete
test restoring and deleting spawners while the Hub is down
2017-09-14 12:54:38 -07:00
Yuvi Panda
f2a83ec846 Merge pull request #1418 from minrk/oauth-state-boogaloo
Fixes (and tests!) for oauth state handling
2017-09-14 12:43:39 -07:00
Carol Willing
7deea6083a Merge pull request #1416 from minrk/traitlets-log
avoid error if another traitlets Application is initialized
2017-09-14 10:50:52 -07:00
Min RK
a169ff3548 test oauth redirects
include coverage of state handling
2017-09-14 16:06:57 +02:00
Min RK
f84a88da21 fix oauth state redirect
check for HubOAuth, not HubOAuthenticated
2017-09-14 16:06:36 +02:00
Min RK
eecec7183e fix clearing of oauth state cookie
missing path arg
2017-09-14 16:01:34 +02:00
Min RK
f11705ee26 delete service.server from db when they stop
same ondelete='SET NULL' as on spawner.server
2017-09-14 13:30:38 +02:00
Min RK
78ac5abf23 test restoring and deleting spawners while the Hub is down
- set ONDELETE='set null' on spawner->server relation (fixes error when deleting servers that stopped)
- set `spawner.server = None`, which is not triggered when deleting orm_spawner.server
2017-09-14 13:16:29 +02:00
Min RK
2beeaa0932 avoid error if another traitlets Application is initialized
encountered when doing db debugging in IPython
2017-09-14 11:37:34 +02:00
yuvipanda
90cb8423bc Allow non integral memory byte specifications 2017-09-12 16:19:10 -07:00
Min RK
3b07bd286b Merge pull request #1408 from DeepHorizons/update_service_doc
Updated the reference flask service example to include token auth
2017-09-12 23:49:55 +02:00
Joshua Milas
73564b97ea Updated the whoami-flask example 2017-09-11 12:16:17 -04:00
Joshua Milas
65cad5efad Updated the reference flask example to include token auth 2017-09-11 00:09:57 -04:00
Carol Willing
52eb627cd6 Merge pull request #1407 from willingc/spawn-hooks
Add pre/post spawn hooks to docs
2017-09-08 13:01:56 -07:00
Carol Willing
506e568a9a Add pre/post spawn hooks to docs 2017-09-08 13:00:14 -07:00
Min RK
6c89de082f 0.8.0b5 2017-09-08 11:19:25 +02:00
Carol Willing
6fb31cc613 Merge pull request #1393 from minrk/spawn-future
improve reporting of spawn failure
2017-09-07 10:20:38 -07:00
Carol Willing
cfb22baf05 Merge pull request #1399 from minrk/trailing-slash
add trailing slash on /user/name
2017-09-07 09:59:58 -07:00
Min RK
2d0c1ff0a8 Merge pull request #1404 from minrk/sqla-11
we require sqlalchemy 1.1
2017-09-07 16:48:13 +02:00
Min RK
7789e13879 we require sqlalchemy 1.1
for enum support

[ref](http://docs.sqlalchemy.org/en/latest/changelog/changelog_11.html#change-9d6d98d7acabc8564b8eebb11c28a624)
2017-09-07 15:10:48 +02:00
Yuvi Panda
f7b90e2c09 Merge pull request #1400 from minrk/auth-custom-html
allow Authenticator.custom_html to be HTML
2017-09-06 11:56:14 -07:00
Carol Willing
ccb29167dd Merge pull request #1392 from minrk/rm-extra-log
update docs to preferred method of writing to log file
2017-09-06 07:32:25 -07:00
Min RK
4ef1eca3c9 allow Authenticator.custom_html to be HTML 2017-09-06 15:14:26 +02:00
Min RK
c26ede30b9 Point users to /hub/home to retry spawn on spawn failure 2017-09-06 15:03:26 +02:00
Min RK
64c69a3164 update docs to preferred method of writing to log file
extra_log_files config is unreliable and doesn't capture all output.

Piping output is much more robust and reliable.
2017-09-06 14:38:33 +02:00
Min RK
ad7867ff11 add trailing slash on /user/name
proxies may not route `/user/name` correctly, only `/user/name/...`, so make sure that `/user/name` is redirected to `/user/name/`

this manifests as a redirect loop between /user/name and /hub/user/name when a route exists but /user/name is still
being routed to the Hub
2017-09-06 12:37:22 +02:00
Yuvi Panda
14fc1588f8 Merge pull request #1380 from minrk/cull-idle-users
add —cull-users to cull_idle_servers
2017-09-05 12:48:24 -07:00
Min RK
7e5a925f4f raise original spawn failure on implicit spawn
so the error message is the same, however it was arrived at.

potential downside: it could look like the current request is spawning and failing,
rather than the reality that a previous spawn failed and we are just re-presenting the earlier error.
It's possible for there to have been a long time in between spawn and error.
2017-09-04 14:27:01 +02:00
Min RK
3c61e422da prevent implicit spawn on /user/:name if previous spawn failed
require users to visit /hub/home and click 'Start My Server' to get a new server

Visits to /hub/user/:name will get an error if the previous spawn failed,
rather than triggering a new spawn.
This should guarantee that a user sees an error if their spawn failed,
regardless of when the failure occurred and how long it took.
Some cases of slow errors could result in triggering a new spawn indefinitely without
the user seeing an error message.

/hub/spawn was a simple redirect to /user/:name in the absence of a spawn form,
but now clears the `_spawn_future` prior to redirect
to signal that a new spawn has been explicitly requested in the case of a prior failure.
2017-09-04 14:17:24 +02:00
Min RK
0e2cf37981 point to single-user logs when spawner fails to start 2017-09-04 13:14:07 +02:00
Min RK
503d5e389f render pending page if triggered spawn doesn't finish
instead of redirecting, which starts redirect loop counter
2017-09-04 12:02:40 +02:00
Min RK
7b1e61ab2c allow waiting for pending spawn via spawner._spawn_future
avoids losing errors when visiting `/hub/user/:name` during a pending spawn
2017-09-04 11:53:42 +02:00
Min RK
4692d6638d 0.8.0b4 2017-08-31 16:47:12 +02:00
Carol Willing
7829070e1c Merge pull request #1383 from minrk/singleuser-token-cookie
set cookie on singleuser when authenticated with ?token=...
2017-08-31 09:31:35 -05:00
Min RK
5e4b935322 only HubOAuth can set token cookie 2017-08-31 16:04:54 +02:00
Carol Willing
4c445c7a88 Add jencabral to contributors 2017-08-31 07:52:08 -05:00
Carol Willing
8e2965df6a Merge pull request #1384 from minrk/spawner-db
restore db access on Spawner
2017-08-31 07:50:18 -05:00
Min RK
7a41d24606 set cookie on singleuser when authenticated with ?token=...
Allows `/user/name?token=...` URL to login users for more than one request.

matches token behavior of regular notebook server.
2017-08-31 13:53:48 +02:00
Min RK
5f84a006dc restore db access on Spawner
Shouldn’t be strictly necessary, but doesn’t hurt
2017-08-31 10:03:44 +02:00
Carol Willing
e19296a230 Merge pull request #1382 from minrk/request-token
let admins request tokens for other users
2017-08-31 00:04:59 -04:00
Min RK
89ba97f413 exercise more token API cases
separate parametrize cases for clarity
2017-08-30 14:38:00 +02:00
Min RK
fe2157130b Merge pull request #1381 from minrk/log-fix
fix logging error when login_user is called with no form data and login fails
2017-08-30 14:09:52 +02:00
Min RK
e3b17e8176 Merge pull request #1379 from ding-c3/master
Pass timeout value to exponential_backoff in wait functions
2017-08-30 14:05:42 +02:00
Min RK
027f2f95c6 let admins request tokens for other users 2017-08-30 12:31:41 +02:00
Min RK
210975324a fix logging error when login_user is called with no form data and login fails 2017-08-30 11:31:44 +02:00
Min RK
f9a90d2494 add —cull-users to cull_idle_servers
allows deleting idle users in addition to servers for temp-user cases such as binder/tmpnb
2017-08-30 10:31:44 +02:00
Alex Ding
932689f2f8 Pass timeout value to exponential_backoff in wait functions 2017-08-29 17:45:21 -07:00
Min RK
f91e911d1a Merge pull request #1375 from lsst-sqre/master
Prevent "extra" from being used before definition.
2017-08-29 08:36:25 -04:00
Adam Thornton
b75cce857e Merge pull request #1 from lsst-sqre/ticket/DM-11663
Fix "extra" so it isn't used before definition.
2017-08-28 19:00:17 -04:00
adam
62f00690f7 Fix "extra" so it isn't used before definition. 2017-08-28 15:58:31 -07:00
Yuvi Panda
f700ba4154 Merge pull request #1368 from minrk/check-version-error
Provide more detailed error message in case of version mismatch
2017-08-28 13:27:00 -04:00
Min RK
8b91842eae Merge pull request #1369 from minrk/template-typo
typo in navbar template
2017-08-27 16:41:44 -04:00
Min RK
80a9eb93f4 Merge pull request #1370 from yuvipanda/button-roles
Add role=button attribute to all <a> & <span> buttons
2017-08-27 15:39:04 -04:00
yuvipanda
e1deecbbfb Add role=button attribute to all <a> & <span> buttons
Simple accessibility win - screen readers will now be
able to properly present these as buttons than links.
2017-08-27 11:17:22 -04:00
Min RK
d3142704b7 typo in navbar template
mixed up elements causing funky alignment on some pages
2017-08-26 22:42:17 -04:00
Min RK
447edd081a Provide more detailed error message in case of version mismatch
this is the most likely cause of redirect loops when using docker,
so record the spawner version and check it when a redirect is detected.

In the event of a redirect and mismatch, fail with a message explaining the version mismatch and how to fix it.
2017-08-26 22:41:24 -04:00
Min RK
e1531ec277 Merge pull request #1366 from minrk/typo
typo in proxy recovery
2017-08-26 20:21:51 -04:00
Min RK
d12ac4b1f6 typo in proxy recovery
should have been the dict of instantiated services, not the list of service configurations
2017-08-26 15:25:17 -04:00
Min RK
17851b7586 0.8.0b3 2017-08-26 13:51:12 -04:00
Min RK
118e2fa610 Merge pull request #1364 from minrk/test-start-stop-race
exercise start/stop race conditions
2017-08-26 13:37:41 -04:00
Min RK
8e3553462c exercise start/stop race conditions
this doesn’t cover all the edge cases of each possible stage for the races, but it gets the basics covered.
2017-08-26 11:57:05 -04:00
Carol Willing
37da47d811 Merge pull request #1356 from minrk/proxy-race
rework spawn futures to fix races
2017-08-26 11:07:55 -04:00
Min RK
a640a468fb Merge pull request #1362 from stuartcampbell/master
Improve help comments for SSL key/certs configuration parameters
2017-08-26 09:41:47 -04:00
Min RK
92f034766e Merge pull request #1355 from minrk/update-oauth-secret
update oauth secret if API tokens change
2017-08-26 09:41:14 -04:00
Min RK
f7ea451df8 get the tests running 2017-08-25 18:12:15 -04:00
Stuart Campbell
1b7f54b462 Make SSL cert/key help clearer. 2017-08-25 14:52:23 -04:00
Stuart Campbell
b14b12231a Correct typo to have consistent comments 2017-08-24 16:53:25 -04:00
Min RK
2866be9462 don’t allow start while stop is pending
- start fails with 400 if stop is pending
- set spawn_pending across a whole spawn (including proxy)
- proxy_pending is only around the proxy
2017-08-23 23:35:19 -04:00
Min RK
f8648644bf ensure _stop_pending is always True on stop_single_user
previously there was a race during `delete_route`

apply the same logic as _start_pending
2017-08-23 18:30:49 -04:00
Min RK
69d4d48db0 rework spawn futures to fix races
1. set _proxy_pending before first wait to ensure that there is never a gap between setting spawn flags
2. always call `finish_user_spawn` to reduce the number of finalization cases
3. wait for proxy to finish on the slow_spawn timeout, not just start, because we are only interested in the total duration for page responsiveness
2017-08-21 11:27:30 +02:00
Min RK
df309749f2 update oauth secret if API tokens change
handle will_resume case correctly, where an API token *may* be re-used.

Previously, we only did it right if the token was *always* reused,
but clearing out a container would get it into a bad state.
2017-08-21 11:23:17 +02:00
Min RK
58751067db Merge pull request #1354 from minrk/log-typo
typo: use app_log, not self.log
2017-08-20 15:49:56 +02:00
Min RK
4fd70cf79b app_log typo 2017-08-20 15:48:55 +02:00
Carol Willing
ff15bad375 Merge pull request #1353 from minrk/log-connection-error
log error when failing to connect to Hub
2017-08-20 10:45:32 +02:00
Min RK
90ac4ab6fe 0.8.0b2 2017-08-20 10:11:45 +02:00
Min RK
cba5bb1676 log error when failing to connect to Hub
for better diagnosis
2017-08-20 10:03:52 +02:00
Min RK
4b5fa404fc Merge pull request #1352 from minrk/singleuser-image
build jupyterhub/singleuser on this repo
2017-08-20 09:45:54 +02:00
Min RK
c4ac1240ac Merge pull request #1347 from minrk/re-use-token
handle and test a few unlikely cases when Spawners reuse tokens
2017-08-20 09:45:35 +02:00
Min RK
d384ad2700 ensure notebook is installed 2017-08-18 17:57:53 +02:00
Min RK
c3da0b8073 include singleuser in sdists 2017-08-18 17:55:00 +02:00
Min RK
9919cba375 add BASE_IMAGE as a build arg 2017-08-18 17:45:35 +02:00
Min RK
1e6b94de92 add singleuser build dir from dockerspawner 2017-08-18 17:36:08 +02:00
Min RK
8451a4cd08 clarify and simplify api token tests 2017-08-18 13:09:41 +02:00
Carol Willing
48f1da1b8d Merge pull request #1348 from minrk/oauth-state
use state field for internal OAuth
2017-08-17 19:22:11 +02:00
Carol Willing
e20050b719 Merge pull request #1346 from minrk/test-admin-sort
Fix (and test!) sorting of admin page
2017-08-17 19:12:37 +02:00
Min RK
a9c0a46a06 add missing classes to services.auth 2017-08-17 17:29:45 +02:00
Min RK
03bb094b90 update service-whoami examples to include OAuth 2017-08-17 17:29:45 +02:00
Min RK
5d0d552c26 fix check for service startup 2017-08-17 17:29:45 +02:00
Min RK
2d50cef098 implement state handling in HubOAuth 2017-08-17 17:29:45 +02:00
Min RK
d6d0b83b4e remove redundant oauth callback implementation in singleuser 2017-08-17 17:29:45 +02:00
Min RK
f1dbeda451 regenerate cookie_secret on every single-user spawn
ensures that singleuser cookies do not persist across single-user instances

relaunching a singleuser instance invalidates all cookies used with that instance
2017-08-17 17:29:45 +02:00
Min RK
512bbae5cb handle and test a few unlikely cases when Spawners reuse tokens
- test that .will_resume preserves tokens (worked, but wasn't tested)

If a Spawner reuses a token, validate it in the db:

- verify that it's in the db
- if it doesn't map onto the right user, revoke the token
- if it's not in the db, insert it as a user-provided token

The most likely case is prior unclean shutdown of something like DockerSpawner,
where a spawn failed and thus the token was revoked,
but the container was in fact created.
2017-08-17 17:29:33 +02:00
Min RK
8c575d40af fix sort-by-running on admin page
server_id is on Spawner, not User anymore
2017-08-17 17:29:19 +02:00
Min RK
d6b9909bc6 test admin page sort order
just exercise the handler, sort results are not verified
2017-08-17 17:29:19 +02:00
Min RK
ef7d6dc091 Merge pull request #1350 from minrk/allow-fail-nightly
allow failures on python: nightly
2017-08-17 17:27:54 +02:00
Min RK
57f707bbfd allow failures on python: nightly
since they break stuff sometimes.
2017-08-17 17:27:07 +02:00
Min RK
0ae7213366 Merge pull request #1344 from minrk/0.8-changes
Start drafting 0.8 changelog
2017-08-17 17:24:05 +02:00
Min RK
22ff7aa672 begin 0.8 changelog
most of the changes I could find!
2017-08-17 17:21:48 +02:00
Carol Willing
ca579fbf4a Merge pull request #1342 from willingc/toc-tweak
Add detail to tutorials toc section
2017-08-16 15:52:22 +02:00
Carol Willing
f2eb30d090 Add detail to tutorials toc section 2017-08-16 15:41:22 +02:00
Min RK
63a4b4744b Merge pull request #1335 from willingc/upgrade-08
Add upgrade to 0.8 doc
2017-08-15 18:09:12 +02:00
Min RK
e03b5b3992 Merge pull request #1340 from zonca/patch-2
Fix broken jupyterhub getting started link
2017-08-15 18:08:56 +02:00
Min RK
fa4a27fb1a 0.8.0b1 2017-08-15 18:06:58 +02:00
Andrea Zonca
d3a6aa2471 Fix broken jupyterhub getting started link 2017-08-14 16:02:40 -05:00
Carol Willing
8bd64cff59 Merge pull request #1338 from willingc/update-conrtib
Update contributor list [ci skip]
2017-08-13 16:31:50 -07:00
Carol Willing
760db17640 Update contributor list 2017-08-13 16:26:33 -07:00
Carol Willing
a9cb25f3a2 Update gallery-jhub-deployments.md 2017-08-12 08:07:47 -07:00
Min RK
d9d5ddb77e Merge pull request #1337 from yuvipanda/urlencoding
Fix bug causing failures with special chars in user names
2017-08-12 15:28:40 +02:00
yuvipanda
9b8e5b03b4 Fix bug causing failures with special chars in user names
Fixes #1336
2017-08-11 16:46:19 -07:00
Yuvi Panda
02f0c4a5b8 Merge pull request #1333 from minrk/client-id
use fully-escaped name in oauth_client_id
2017-08-11 12:30:55 -07:00
Carol Willing
b254716cee Add upgrade to 0.8 doc 2017-08-11 09:05:54 -07:00
Min RK
4c52ad6f7c Merge pull request #1331 from willingc/travis-req
verify requirements installed in travis builds
2017-08-11 16:34:13 +02:00
Min RK
0c09bfcafa use fully-escaped name in oauth_client_id
because it will be a cookie key
and @ is not legal there
2017-08-11 16:32:54 +02:00
Carol Willing
0b67546481 Allow sqlalchemy to float upward 2017-08-11 06:08:52 -07:00
Min RK
2698b00fb9 Merge pull request #1330 from willingc/restructure-doc
Restructure doc source folders
2017-08-11 14:11:36 +02:00
Carol Willing
f7ce705999 Merge pull request #1332 from pjamason/patch-1
Update gallery-jhub-deployments.md
2017-08-10 16:23:11 -07:00
pjamason
ee14131827 Update gallery-jhub-deployments.md
added jupyterhub.ucsd.edu
2017-08-10 13:07:27 -07:00
Carol Willing
828c499ac7 Add missing images 2017-08-10 10:39:44 -07:00
Carol Willing
a43d594452 correct link 2017-08-10 09:53:29 -07:00
Carol Willing
406d572a7b keep sqlalchemy version from floating upward 2017-08-10 09:48:49 -07:00
Carol Willing
71c38fd515 modify link from md to rst 2017-08-10 09:07:38 -07:00
Carol Willing
68e02dd62a Correct links 2017-08-10 09:07:38 -07:00
Carol Willing
dd1902b1d9 update image links 2017-08-10 09:00:04 -07:00
Carol Willing
39041ee08c Update toc 2017-08-10 09:00:04 -07:00
Carol Willing
eb6a2f9e89 Restructure doc folder structure 2017-08-10 09:00:04 -07:00
Min RK
4f826d8245 Merge pull request #1325 from willingc/services-update
Update services getting started docs
2017-08-10 12:18:13 +02:00
Min RK
a434a6f144 Merge pull request #1328 from willingc/test-travis
Update pin on sqlalchemy for travis
2017-08-10 12:15:50 +02:00
Carol Willing
0fe1020022 Update pin on sqlalchemy for travis 2017-08-09 11:46:55 -07:00
Carol Willing
8aca08f508 Edit REST doc per minrk 2017-08-09 10:38:17 -07:00
Carol Willing
fb0331aa4c Edits per minrk 2017-08-09 10:28:38 -07:00
Carol Willing
184a9bceb9 Add link to HTCondor and JupyterHub 2017-08-09 10:17:31 -07:00
Min RK
dfef7c2b52 Merge pull request #1321 from willingc/doc-services
Add autodoc of services and update services.auth for OAuth
2017-08-09 11:37:16 +02:00
Min RK
6b16b51064 Merge pull request #1326 from willingc/aws-workshop
Add CTB's tutorial config on AWS to gallery of deployments
2017-08-09 08:33:06 +02:00
Carol Willing
85a75b637a Add automodule for app 2017-08-08 23:07:28 -07:00
Carol Willing
fae2d9414a Remove heading in docstring 2017-08-08 23:06:50 -07:00
Carol Willing
61e263b160 Correct docstring that was preventing build 2017-08-08 23:05:20 -07:00
Carol Willing
ac13140083 Edit some classes 2017-08-08 23:02:12 -07:00
Carol Willing
024fd07ec8 Update autodoc doc files 2017-08-08 23:01:08 -07:00
Carol Willing
95175155d4 Update autodoc of services.auth and add services 2017-08-08 22:51:35 -07:00
Carol Willing
e5c088f8d6 add alembic to conda env 2017-08-08 22:41:42 -07:00
Carol Willing
42a103c76f bump bootprint versions 2017-08-08 22:41:23 -07:00
Carol Willing
b70f2fa20a remove schema error 2017-08-08 22:41:08 -07:00
Carol Willing
8e69b158eb Update rest doc 2017-08-08 21:03:20 -07:00
Carol Willing
6e2c544a19 correct link formatting 2017-08-08 20:59:06 -07:00
Carol Willing
c62d080e9c Add CTB's tutorial config on AWS 2017-08-08 17:48:20 -07:00
Carol Willing
bd0e00ed86 Add tokens can be for activities not tied to a specific user 2017-08-08 16:01:41 -07:00
Carol Willing
264a78e2cc Add note about single-user servers auth and tokens 2017-08-08 15:46:47 -07:00
Carol Willing
4f95ef437f Add more complex requests example for API 2017-08-08 15:37:35 -07:00
Carol Willing
f0556954ed Deprecate and de-emphasize 'jupyterhub token' 2017-08-08 15:25:41 -07:00
Carol Willing
44bc569868 Update services getting started docs 2017-08-08 15:13:30 -07:00
Carol Willing
1e9bbb1d14 Merge pull request #1323 from minrk/prefix-slash
handle missing trailing slash on /hub
2017-08-08 09:07:56 -07:00
Min RK
f2953f6b09 handle missing trailing slash on /hub 2017-08-08 14:23:07 +02:00
Min RK
fa4c5ec9d4 Merge pull request #1320 from minrk/access-link
make sure we send users to `/user/name/`, not just `/user/name`
2017-08-08 13:35:45 +02:00
Min RK
546268809f add / to user-redirect
Some proxies may not correctly route /user/name, only /user/name/...
2017-08-08 12:02:36 +02:00
Min RK
6af4c0f9e0 Merge pull request #1322 from willingc/link-update
Correct broken links in docs
2017-08-08 09:50:33 +02:00
Min RK
7d0fd85d65 Merge pull request #1319 from minrk/test-mysql
Test against postgres, mysql (again)
2017-08-08 09:50:12 +02:00
Carol Willing
15b78307fb Correct broken links in docs 2017-08-07 14:35:17 -07:00
Min RK
6ba3090cd5 add trailing slash to user access link 2017-08-07 15:18:20 +02:00
Min RK
74c4c58e37 ensure mysql has proper unicode on travis 2017-08-07 13:18:28 +02:00
Min RK
31f63264b0 ensure oauth uses same db session as app
further remnant of test threads
2017-08-07 13:18:28 +02:00
Min RK
9e7dbbbbff avoid recreating existing users in test_proxy
db tests re-use users across sessions
2017-08-07 13:18:28 +02:00
Min RK
c1d120c9bb cleanup named servers 2017-08-07 13:18:27 +02:00
Min RK
3955a8c1d0 limit unique columns to 255 chars
for MySQL key size limits (767 = 256 * 3 - 1 for utf8)
2017-08-07 13:18:27 +02:00
Min RK
12f8073e5d only create first user if it doesn't exist 2017-08-07 13:18:27 +02:00
Min RK
ec2b1dd39b install mysql/postres drivers on Travis 2017-08-07 11:23:34 +02:00
Min RK
e9d603abf1 run tests with mysql, postgres
make sure everything works
2017-08-07 11:23:34 +02:00
Carol Willing
ac33ba6ff4 Merge pull request #1316 from minrk/rm-scoped-session
drop scoped_session
2017-08-06 09:01:50 -07:00
Carol Willing
3b4888b8ba Merge pull request #1314 from minrk/spawner.start-doc
update spawner.start docs
2017-08-06 08:58:49 -07:00
Carol Willing
5c64c88d5a Merge pull request #1312 from minrk/reverse-generated-token
reverse generated-tokens default logic
2017-08-06 08:57:27 -07:00
Carol Willing
924d095c68 Merge pull request #1311 from minrk/oauth-token-no-service
handle OAuthAccessTokens with no user
2017-08-06 08:49:37 -07:00
Min RK
700ccb17cb Merge pull request #1317 from minrk/proxy-check-routes
disable periodic check_routes during proxy tests
2017-08-06 15:06:36 +02:00
Min RK
1d156f8183 disable periodic check_routes during proxy tests
can race tests and create inconsistent state
2017-08-06 14:39:42 +02:00
Min RK
c0e2c5cb71 drop scoped_session
this was an artifact of the now-removed test thread
2017-08-06 14:29:10 +02:00
Min RK
25d19732e0 keep salting generated tokens
all the savings are in rounds, but keep salt because it still prevents the ability to hash a token once and check it against the whole db
2017-08-06 14:16:47 +02:00
Min RK
f0b8d56e9f fix oauth hashed column sizes 2017-08-06 13:28:06 +02:00
Min RK
718a3fe7ef update spawner.start docs
remove mention of self.user.server, which is deprecated in 0.7
2017-08-06 13:15:46 +02:00
Carol Willing
ca6e0ec9b9 Merge pull request #1307 from minrk/last_activity
remove last_activity from server
2017-08-05 15:34:45 -07:00
Min RK
a27765f7d5 reverse generated-tokens default logic
user-provided tokens are added in exactly one place,
so switch default handling of tokens to generated=True
and explicitly distrust user tokens.

Add JupyterHub.trust_user_provided_tokens flag so that users can avoid the extra hashing
if they know they are providing good keys.
2017-08-05 15:36:03 +02:00
Min RK
bf1dd03df3 handle OAuthAccessTokens with no user
This shouldn’t happen, raise if it does.

If a token API request is authenticated with no user or service, delete the token because it is invalid and return with 404 because it doesn’t correspond to an existing user.
2017-08-05 15:01:22 +02:00
Min RK
2726648982 typo in OAuthAccessToken.service
Token.session doesn’t exist

OAuthAccessTokens are never associated with services
2017-08-05 14:58:41 +02:00
Min RK
275a4ce18d remove last_activity from server
and put it on individual spawners
2017-08-05 14:55:09 +02:00
Carol Willing
0b34e13dd4 Merge pull request #1303 from minrk/message-202
consolidate server APIHandlers
2017-08-04 07:43:40 -07:00
Carol Willing
e666261434 Merge pull request #1308 from minrk/rest-api-finish
finish up oauth swagger doc
2017-08-04 07:40:06 -07:00
Min RK
57c8ad6b92 consolidate server APIHandlers
no need for separate handlers for named and default servers

avoid claiming that empty responses are JSON.
2017-08-04 16:17:20 +02:00
Min RK
3f032abc25 finish oauth swagger doc
- clarify that /authorize is not really an API endpoint, but the redirect target
- /oauth2/token accepts x-www-form-urlencoded not json
2017-08-04 15:23:50 +02:00
Carol Willing
f86202c07d Update link to Jupyter contributor guide 2017-08-04 04:02:18 -07:00
Min RK
1b0ff0a5f6 Merge pull request #1093 from willingc/oauth-doc
Add docs for OAuth
2017-08-04 12:14:01 +02:00
Carol Willing
cebb962645 Edit per mirnk review 2017-08-03 10:34:12 -07:00
Min RK
55000f98bc include non-empty body with 202 responses
reply claims to be application/json, so make sure it has some content
2017-08-03 12:01:19 +02:00
Min RK
449aff1b1d Merge pull request #1302 from minrk/properties
restore user.running property
2017-08-03 12:00:52 +02:00
Min RK
3c591f744b Merge pull request #1305 from minrk/alembic-log
hook up alembic logging to Hub app if it's running
2017-08-03 11:46:32 +02:00
Min RK
329781023f use futures to avoid races on slow spawners
trigger events by hand so that performance can't cause races
2017-08-03 11:45:29 +02:00
Min RK
8d9731e241 hook up alembic logging to Hub app if it's running
avoids calling `logging.fileConfig` which disables all exiting logging when called
2017-08-03 11:28:53 +02:00
Min RK
bde37ba9c2 Merge pull request #1299 from minrk/hash-auto
only apply reduced hash+salt to internally generated tokens
2017-08-03 11:13:25 +02:00
Min RK
088fdc8f42 Deprecate User.spawn|stop_pending flags
Rather than removing them immediately
2017-08-03 11:12:10 +02:00
Min RK
886005be2a handle named servers in user_stopped callback 2017-08-03 11:09:28 +02:00
Min RK
684afed3f1 restore user.running property
it was made a method for handing named_servers,
but that made things way more complicated and replaced a boolean flag with a callable,
which would behave unexpectedly but without error if a boolean flag was expected.

Spawners have properties for dealing with this now, so use spawners

Restore `user.running` as an alias for `user.spawner.ready`
2017-08-03 11:09:27 +02:00
Min RK
210d7e59fd Merge pull request #1301 from minrk/total-running-limit
add active_server_limit
2017-08-03 11:08:23 +02:00
Min RK
a19a94b2c2 test active_server_limit 2017-08-03 10:52:32 +02:00
Min RK
9bf70208c8 return 'spawn' pending for spawn or proxy_pending
In general, we treat both the same way
2017-08-03 10:52:01 +02:00
Min RK
fada0d99f0 call it active_server_limit 2017-08-03 10:50:50 +02:00
Min RK
e6ce468301 set Spawner.server directly
avoids Spawner.server property looking up on the ORM every time,
which is expensive and we want to check `Spawner.server is None` often.
2017-08-03 09:59:01 +02:00
Min RK
875e5d59fe Merge pull request #1300 from minrk/check-hub-ip
verify route targets in check_routes
2017-08-02 22:28:38 +02:00
Min RK
6556135a69 verify route targets in check_routes
updates routes that have the wrong target
2017-08-02 11:23:49 +02:00
Min RK
8636b4ebca Merge pull request #1294 from minrk/alembic-tag
always include and check alembic revision
2017-08-02 11:14:44 +02:00
Min RK
4a5f914a62 only apply reduced hash+salt to internally generated tokens
don't trust any user-provided tokens to have decent entropy, regardless of size
2017-08-02 11:14:18 +02:00
Yuvi Panda
47b6014d13 Merge pull request #1297 from minrk/check-enabled-auth-state
prevent saving auth_state if auth_state is not enabled.
2017-08-01 09:24:34 -07:00
Yuvi Panda
1995d825df Merge pull request #1293 from minrk/test-spawn-limit
test pending spawn count
2017-08-01 09:23:36 -07:00
Min RK
f49606dff6 add user.count_active_users
produces summary of active/pending/ready spawner counts

Avoids brittle bookkeeping of running counts,
computing the value upon request.

For 10k users this is still only a few milliseconds, which seems worth it
2017-08-01 17:00:45 +02:00
Min RK
7520d4b81e add concurrent_user_limit
limits total active users, not just spawns
2017-08-01 16:22:54 +02:00
Min RK
083408a685 add pending/ready/active properties to Spawner
- pending: stop or start is pending
- ready: spawner is running and ready (not pending)
- active: spawner is running or pending (consuming resources)
2017-08-01 16:17:37 +02:00
Min RK
9c4972239d prevent saving auth_state if auth_state is not enabled.
allows Authenticators to return auth_state without having to check enable_auth_state
2017-08-01 10:51:44 +02:00
Min RK
4458f2e6d4 error when db mismatches is SystemExit now
since we catch explicitly and call `self.exit` with a nice message
2017-07-31 17:04:27 +02:00
Min RK
a24027f188 hook up app logging in upgrade-db
matches default formatting
2017-07-31 16:19:47 +02:00
Min RK
c749fc05f4 update 0.8 alembic revision
add some missing transactions
2017-07-31 16:19:24 +02:00
Min RK
5ad77df04f check database revision on launch
fail with informative error if version mismatches

Since we weren't always tagging before,
we have to handle no tag being present:

- database empty (use latest because we are about to create everything anew)
- if 'spawners' is present, assume 0.8.dev
- if 'services' is present, assume 0.7.x
- else: assume base revision when we started tracking this stuff
2017-07-31 16:18:58 +02:00
Min RK
4b51d67d35 match alembic log formatting to default hub log format 2017-07-31 15:12:39 +02:00
Min RK
88268bd76f test spawn_pending_count
make sure to cover various cases of spawn failure
so that failed spawns don't leak pending-spawn counts
2017-07-31 12:39:06 +02:00
Min RK
744d96330e use properties for spawn_pending 2017-07-31 11:45:01 +02:00
Min RK
55c3164a7d Make default concurrent spawn limit 100
it's a conservative default, and deployments can turn it up if need be
2017-07-31 11:24:21 +02:00
Min RK
c78e31b136 Merge pull request #1290 from yuvipanda/concurrent_spawn_limit
Add support for limiting the number of concurrent spawns
2017-07-31 10:28:37 +02:00
Min RK
ecfd0a6796 Merge pull request #1285 from Carreau/spawner-import
Try enforcing methods overwrite at import time.
2017-07-31 10:27:28 +02:00
Yuvi Panda
162ce2a9c5 Merge pull request #1178 from yuvipanda/auth-state
Encrypt auth_state at rest
2017-07-30 10:31:32 -07:00
Min RK
1f2125a097 Add Authenticator.enable_auth_state
Allows authenticators to optionally enable this flag

and signal that auth_state will be used,
enabling early check and exit if encryption is not available.
2017-07-28 22:36:49 +02:00
Matthias Bussonnier
feae3eacb1 Try enforcing methods overwrite at import time.
Currently Spawners need to overwrite start, stop, poll. When this is not
done, it will fail at runtime.

This replicate this check at class definition time, meaning that
potential errors will be caught way earlier. It also have not runtime
cost as the check is a class definition time (ie often import time).

This takes only effect on Python 3.6+ which introduce __init_subclass__,
we could do it with metaclasses, but that's might be too complicated.

If one want to create a class the avoid these restriction they can
overwrite __init_subclass__ and not call the super() method.
2017-07-28 12:05:18 -07:00
yuvipanda
a1a706cb31 More cleanup 2017-07-28 11:58:58 -07:00
Min RK
8a1da297d9 CryptKeeper is configurable 2017-07-28 17:20:57 +02:00
Min RK
1987221026 Python 3.4 doesn't allow bytestring formatting
can't do  until Python 3.5. When do we get to drop py34 support :)
2017-07-28 17:08:18 +02:00
Min RK
4b7b34064b alembic revision for encrypted_auth_state 2017-07-28 16:52:18 +02:00
Min RK
5abb4618bd test auth_state on login handler 2017-07-28 16:51:46 +02:00
Min RK
75c1d36237 trade privy for raw Fernet
only benefit of privy was KDF, but if users provide good 32B keys, this doesn't help.

Fernet already adds randomness, etc. to tokens, so is good enough on its own if keys are good.
2017-07-28 16:08:12 +02:00
Min RK
90e8e1a8aa move auth_state encryption outside the ORM
privy is used for encryption

- db only has blob column, no knowledge of encryption
- add CryptKeeper for handling encryption
- use privy for encryption, so we have fewer choices to make
- storing/loading encrypted auth_state runs in a ThreadPool
2017-07-28 16:08:12 +02:00
Min RK
32a9b38d26 use HKDF on auth keys
if the given tokens aren't already the right shape, pass through a proper KDF
2017-07-28 16:08:12 +02:00
Min RK
5714f56083 encrypt auth_state with MultiFernet
- MultFernet allows key rotation via `AUTH_STATE_KEY=secret2;secret1;secret0`
- Failure to decrypt results in cleared state
- Attempting to set auth_state without encryption is a hard failure
- Absent encryption, auth_state will always be None
2017-07-28 16:08:12 +02:00
Min RK
3d635816c9 add cryptography to dev requirements 2017-07-28 16:08:12 +02:00
yuvipanda
1aa5ce2f35 Add sqlalchemy-utils to requirements.txt 2017-07-28 16:08:12 +02:00
yuvipanda
f765fde6c1 Add OptionalEncrypted type 2017-07-28 16:08:12 +02:00
Min RK
523cbf641c Merge pull request #1288 from Carreau/fix-port-number
Default port is 8081 not 8080
2017-07-28 15:36:01 +02:00
yuvipanda
112834bbaa Cleanup code a little 2017-07-28 01:10:19 -07:00
Matthias Bussonnier
f0ab1ae907 Merge pull request #1286 from willingc/authenticator-edits
Refresh docs on Authenticators
2017-07-27 22:16:32 -07:00
yuvipanda
d6827a2794 Error if we hit pending spawn limit
The backlog actually doesn't help - almost all of them fail,
and the exponential backoff just adds more work for our ticks
2017-07-27 20:36:59 -07:00
Carol Willing
a1591185c1 Flesh out auth in swagger spec 2017-07-27 19:44:59 -07:00
Carol Willing
b77c8a8717 Update the API index section 2017-07-27 19:44:59 -07:00
Carol Willing
831b7d2a86 WIP 2017-07-27 19:44:59 -07:00
Carol Willing
057a52dd32 Add oauth to swagger api doc 2017-07-27 19:44:59 -07:00
Matthias Bussonnier
8f88fae530 Default port is 8081 not 8080 2017-07-27 19:21:16 -07:00
Carol Willing
85cc8eb6f3 Fix typo 2017-07-27 17:42:49 -07:00
Carol Willing
349f1b115e Reorganize content 2017-07-27 17:33:37 -07:00
yuvipanda
27de44b0ec Add support for limiting the number of concurrent spawns 2017-07-27 16:32:45 -07:00
Carol Willing
9847408d77 Edit auth docs 2017-07-27 08:59:57 -07:00
Carol Willing
cc24f36e80 Merge pull request #1281 from minrk/no-test-threads
eliminate test application thread
2017-07-27 08:43:45 -07:00
Min RK
e7fe6d25b6 set ASYNC_TEST_TIMEOUT=15 on Travis
Travis is super slow and default timeout is 5 seconds, which is too low sometimes.
2017-07-27 12:48:46 +02:00
Min RK
afc968146d fix race in test_proxy
prevent `.check_routes` from firing while we wait for a new proxy to come up

We check explicitly that it comes up with no routes, so makes sure check_routes hasn't restored its state, which is causing intermittent failures
2017-07-27 12:48:25 +02:00
Min RK
471decdbb6 Merge pull request #1280 from yuvipanda/hub_connect_port
Add hub_connect_port
2017-07-27 12:07:12 +02:00
Min RK
638f980281 fix race waiting for slow spawners
wait for `.running` instead of `._spawn_pending`,
since we now have `._proxy_pending` as well to wait for.
2017-07-27 11:46:33 +02:00
Min RK
8f1115a257 remove handling of changing db sessions
this was purely for accessing the db from multiple threads in tests
2017-07-27 11:37:19 +02:00
Min RK
9e8b6503a0 use gen_test in place of IOLoop.run_sync
even where not strictly required

for consistency, now that we are using gen_test on the main app tests
2017-07-27 11:29:58 +02:00
Min RK
91d042f6f3 get the rest of tests running without threads
all tests pass!
2017-07-27 11:29:58 +02:00
Min RK
d559cad042 test_pages without threads 2017-07-27 11:29:56 +02:00
Min RK
f05aecf5f9 test_api passes without threads
just put requests in a thread via `utils.async_requests`

eliminates db threads issue
2017-07-27 11:29:16 +02:00
Min RK
58f072e5af start MockHub without threads
everything's going to run with gen_test

need our own io_loop fixture that's module_scoped to go with our app fixture
2017-07-27 11:28:32 +02:00
yuvipanda
afc3bcbc75 Fix more references to port that should be connect_port 2017-07-26 18:12:01 -07:00
yuvipanda
8ee2fd2cf8 Fix possible redirect loop 2017-07-26 18:05:50 -07:00
yuvipanda
be7faacd07 Add ability to set hub_connect_port 2017-07-26 17:53:40 -07:00
Yuvi Panda
dc97433d9b Merge pull request #1272 from yuvipanda/exponential-function
Move exponential backoff into a function
2017-07-26 15:38:01 -07:00
Carol Willing
da10a8e7dd Edit docstring and comments 2017-07-26 13:00:16 -07:00
Carol Willing
847ae21ccb Merge pull request #1267 from minrk/auto-login
add login_user and get_next_url methods
2017-07-26 10:16:47 -07:00
Carol Willing
128cf115a7 Merge pull request #1269 from willingc/network-docs
Streamline networking and using REST API Docs
2017-07-26 09:50:49 -07:00
Carol Willing
1b9cff6d5f Add minrk comments 2017-07-26 09:48:58 -07:00
Carol Willing
110a8e22ae Edit for clarity 2017-07-26 09:26:21 -07:00
Carol Willing
7f058c0c77 Minor edits 2017-07-26 09:26:21 -07:00
Carol Willing
1e3512ac84 Update TOC placement 2017-07-26 09:26:21 -07:00
Carol Willing
8662a4a807 Edit networking and REST API usage docs 2017-07-26 09:26:21 -07:00
Carol Willing
63d1c918e5 Merge pull request #1276 from minrk/stop-button
running is a method now
2017-07-26 06:45:35 -07:00
Min RK
0a89090dc2 add login_user and get_next_url methods
for easier re-use of login in custom handlers

Further, enable auto_login + no custom login handler to mean that auth info is already present in requests
(e.g. REMOTE_USER)
2017-07-26 15:40:13 +02:00
Min RK
645575239f running is a method now
a few that were missed on the home page
2017-07-26 15:38:34 +02:00
Min RK
8de38b1708 add some jitter to the deadline itself
so that we don't re-align a bunch of timing out calls once the deadline is reached.

(±10% of timeout by default)
2017-07-26 14:12:28 +02:00
Min RK
6db987972a exponential backoff
- apply jitter to first iteration
- due to jitter, double start_wait to 0.2 so that <first wait> is still 0.1
- keep scaling by start_wait, rather than previous dt
- limit last wait to deadline so timeout is not overshot
2017-07-26 14:06:07 +02:00
Min RK
0ddf6bf579 restore wait_for_death
- don't raise TimeoutError
- keep Spawner.death_interval for subclasses
2017-07-26 14:06:07 +02:00
yuvipanda
9f8033a147 Move exponential backoff into a function
Also use the 'Full Jitter' jitter algorithm from
https://www.awsarchitectureblog.com/2015/03/backoff.html
2017-07-26 14:06:07 +02:00
Carol Willing
d007b40e15 Merge pull request #1275 from minrk/log-spawn-start
add log statement when spawn starts
2017-07-26 04:30:02 -07:00
Carol Willing
bbfd36fc92 Merge pull request #1274 from minrk/hub-token
simplify Hub object a bit
2017-07-26 04:24:24 -07:00
Min RK
3faa02b00d add log statement when spawn starts
for easier monitoring of spawn time
and improve consistency of named spawner logging
2017-07-26 12:57:15 +02:00
Min RK
eb1895e980 simplify Hub object a bit
- remove use of deprecated Hub.server
- add deprecation warning to Hub.server property
- move cookie_name declaration to Hub

It should now be possible to use Hub.from_url('http://1.2.3.4:1234/hub/') without missing information
2017-07-26 11:48:30 +02:00
Min RK
7ee8e96ece Merge pull request #1243 from minrk/named_servers
Flesh out named-servers
2017-07-26 11:15:16 +02:00
Min RK
3e796b579d Address review in named_servers
from willingc

- consistency of repr/str when logging usernames
- cleanup some attribute declarations
- add comments about db session weirdness
2017-07-26 10:47:35 +02:00
Carol Willing
74d9e2f421 Merge pull request #1268 from Carreau/flake8
Ignore a couple other of regularly non followed lint rules.
2017-07-25 13:58:47 -07:00
Matthias Bussonnier
2603cbb102 Ignore a couple other of regularly non followed lint rules.
These rules are not followed in a lot of place leading to too many
warnnigs which (at least in my editor) make code unreadable.
2017-07-25 13:50:13 -07:00
Min RK
194d6c9d4c Merge branch 'master' into named_servers 2017-07-25 18:29:01 +02:00
Yuvi Panda
f364f8e832 Merge pull request #1250 from yuvipanda/exponential-backoff-redirect
Apply exponential backoff when we're redirecting to ourselves
2017-07-25 08:19:10 -07:00
Carol Willing
ba6af85e9d Merge pull request #1264 from willingc/tech-overview
Streamline technical overview docs
2017-07-25 08:02:19 -07:00
Carol Willing
d2e411dba0 Edits per @minrk review 2017-07-25 08:01:14 -07:00
Min RK
e15a6bb758 Merge branch 'master' into named_servers 2017-07-25 16:56:16 +02:00
Carol Willing
96c04f3c60 Edit section intro 2017-07-25 07:49:06 -07:00
Carol Willing
9c9bc68092 Expand section overview and prune auth/spawners 2017-07-25 07:49:06 -07:00
Carol Willing
46f003fe14 Minor edits 2017-07-25 07:49:06 -07:00
Carol Willing
1404965b07 Edit and deduplicate the document text 2017-07-25 07:49:06 -07:00
Carol Willing
9fbb1417f2 Update table of contents 2017-07-25 07:49:06 -07:00
Carol Willing
158a7090a3 Combine tech overview docs into one 2017-07-25 07:49:06 -07:00
Carol Willing
9fa9859495 Move tech overview to config reference 2017-07-25 07:49:06 -07:00
Carol Willing
de85fefa7d Merge pull request #1262 from willingc/config-doc
Streamline configuration docs
2017-07-25 07:44:50 -07:00
Carol Willing
dee55df94a Edits per @minrk review 2017-07-25 07:43:48 -07:00
Carol Willing
62b9450ce1 Merge pull request #1266 from willingc/fix-link
Fix link to direct to docs not source
2017-07-25 07:07:32 -07:00
Carol Willing
bcdcf4351d Fix link to direct to docs not source 2017-07-25 07:04:47 -07:00
Min RK
0d941e9c96 move redirect loop fallback to /user/name handler
- add user_redirect_limit to settings, default 5 (that's still a whole minute before failing)
- limit sleep to ten seconds
2017-07-24 17:32:57 -07:00
yuvipanda
9d837b2e4b Add more docs & tweak max redirect wait time 2017-07-24 17:32:57 -07:00
yuvipanda
8544010eb6 Apply exponential backoff when we're redirecting to ourselves
Lots of custom proxy implementations that are distributed are
eventually consistent, and it might take upto a few seconds for
all the components to start redirecting properly. If we do
exponential backoff when doing these redirects, it gives the
proxies a lot of time to catch up. We also explicitly raise an
error if it's going on too long, instead of giving the user
juts a 'redirected too many times' error.
2017-07-24 17:32:57 -07:00
Carol Willing
f37243169a Update links 2017-07-24 14:30:05 -07:00
Yuvi Panda
7caa1e1f0e Merge pull request #1258 from minrk/salt-hash-uuid
don't salt & re-hash generated UUID tokens
2017-07-24 14:07:52 -07:00
Yuvi Panda
e019a394b0 Merge pull request #1259 from willingc/fix-docstring
Reformat docstring causing Sphinx error
2017-07-24 14:06:25 -07:00
Carol Willing
c0b482e68c Fix typos 2017-07-24 08:57:25 -07:00
Carol Willing
2da115f5c4 Reformat docstring causing Sphinx error 2017-07-24 08:32:12 -07:00
Min RK
639ccf5582 index prefix column 2017-07-24 17:27:19 +02:00
Min RK
2654794968 don't salt & extra hash uuids
They have enough entropy on their own,
so use just the hash and no salt.

ref: https://security.stackexchange.com/a/151262/155114
2017-07-24 17:03:04 +02:00
Min RK
2cec124b4f support named servers in REST API
and exercise them in tests
2017-07-24 16:55:17 +02:00
Carol Willing
e21737399b Edit config basics doc and examples 2017-07-24 07:53:20 -07:00
Min RK
9a555d8a6e move user.proxy_pending to Spawner._proxy_pending 2017-07-24 15:22:36 +02:00
Min RK
f7bf2b0ba6 Merge branch 'master' into named_servers 2017-07-24 15:21:42 +02:00
Min RK
710ed0a5c8 Merge pull request #1245 from willingc/deduplicate
Review and edit security documentation
2017-07-24 14:35:33 +02:00
Min RK
7539523ef2 Merge pull request #1251 from yuvipanda/another-race-maybe
Don't add route if there's already a route addition pending
2017-07-24 14:34:34 +02:00
Yuvi Panda
c97444e438 Merge pull request #1257 from minrk/dirty
Dirty database fixes
2017-07-24 05:19:19 -07:00
Min RK
4c86d10037 comment about sqlachemy dirty flag 2017-07-24 14:12:50 +02:00
Min RK
69a6c79558 use admin user in test_admin
rather than relying on multi db sessions talking to each other
2017-07-24 13:37:11 +02:00
yuvipanda
a0466dc322 Count ourselves as a good route if we've a proxy pending 2017-07-24 04:35:13 -07:00
Min RK
546e35e9a3 Merge pull request #1249 from Carreau/fix-pam-500
Do not 500 if cannot authenticate.
2017-07-24 12:54:56 +02:00
Min RK
ce53b11cf7 Make rollback conditional on db.dirty
avoids calling rollback when there are no changes

includes warning about what objects are actually dirty
2017-07-24 12:53:58 +02:00
Min RK
1229fd100f only set attributes on orm_server if they changed
Setting things on orm_server set the dirty flag,
even if they haven't changed.
2017-07-24 12:52:46 +02:00
Matthias Bussonnier
e4541591ea Do not 500 if cannot authenticate.
self.authenticate can return None, in which case you can't subscript.
So move extracting data into the branch checking whether authenticate is
not `None`.

Now that extracting the username is inside the if branch, it can't be
used in the else one, so extract username from the request itself.

This can be easily reproduce with the default PAM login with a wrong
non existing/ wrong username.
2017-07-21 15:40:28 -07:00
Carol Willing
be62b1b9df Reword based on @minrk's review 2017-07-21 11:47:24 -07:00
Carol Willing
9c21cf4c62 Add @minrk review comments 2017-07-21 11:32:48 -07:00
Carol Willing
51af6a98cc Be clearer about the config file name 2017-07-21 11:23:43 -07:00
Carol Willing
520d6160f0 Make use of config file and environment variable consistent 2017-07-21 11:23:43 -07:00
Carol Willing
e8ebedb2da Move security audits to overview doc 2017-07-21 11:23:43 -07:00
Carol Willing
fd7700d577 Update title 2017-07-21 11:23:43 -07:00
Carol Willing
6ee88a5424 Edit content for clarity 2017-07-21 11:23:43 -07:00
Carol Willing
c89711d0d5 Edit and deduplicate security docs 2017-07-21 11:23:43 -07:00
Carol Willing
daee0f8df8 Merge pull request #1248 from Carreau/cleanup
Remove unused import and add version to deprecations.
2017-07-21 11:21:20 -07:00
Matthias Bussonnier
e1444f4aca remove trailing comma 2017-07-21 11:13:18 -07:00
Matthias Bussonnier
97b9c4899a typo 2017-07-21 11:12:24 -07:00
Matthias Bussonnier
b8aa6ecd70 Remove unused import and add version to deprecations. 2017-07-21 10:23:54 -07:00
Min RK
e28f3947bd Merge branch 'master' into named_servers 2017-07-21 15:43:09 +02:00
Min RK
bc9cc98789 Merge pull request #1246 from yuvipanda/no-unconditional-add
Don't unconditionally add hub route to proxy
2017-07-21 10:23:25 +02:00
yuvipanda
72132e7946 Don't unconditionally add hub route to proxy
This is done contidtionally in check_routes instead
2017-07-21 01:01:21 -07:00
Carol Willing
b0307dd98e Merge pull request #1242 from minrk/headers-fixes
various singleuser header fixes
2017-07-20 11:49:13 -07:00
Carol Willing
fd1ac55a70 Merge pull request #1240 from minrk/drop-33
Require Python 3.4
2017-07-20 11:25:30 -07:00
Yuvi Panda
39d8800389 Merge pull request #1241 from minrk/progress-spin
add spinner to slow-spawn page
2017-07-20 09:59:32 -07:00
Min RK
382a7121e1 further clear up named servers
- use spawner.server instead of user.server
- user.running, proxy_spec are methods that take spawner names
2017-07-20 16:54:17 +02:00
Min RK
4c0ac6d502 Merge pull request #1234 from CRegenschein/master
Add pre_spawn_hook
2017-07-20 15:45:06 +02:00
Min RK
40dcbedc2a various singleuser header fixes
- always set content security policy header, to workaround bug in notebook 5.0
- set x-jupyterhub-version on all requests, not just our own
- fix version comparison in _check_version (leftover `__version__`)
- even log version matches at debug-level (verifies that check happened)
2017-07-20 15:37:54 +02:00
Min RK
9eda66b3ae bump bower dependencies
need fa 4.3 for fa-pulse, but rev everything while we're at it
2017-07-20 14:31:13 +02:00
Min RK
d4c48db248 add spinner on slow-spawn page 2017-07-20 14:30:45 +02:00
Min RK
7bd4861689 minor cleanup in pre_spawn_hook
- remove reduntant None, allow_none in Any
- remove callable check (if it's not callable, let the error raise)
- let outer error handling deal with failed pre-spawn hook
- add missing `return` in pre_spawn_hook
2017-07-20 14:08:06 +02:00
CRegenschein
72550725da jupyterhub-1219 Enhancement: automatically create a directory for the user after successful login 2017-07-20 14:02:13 +02:00
Min RK
5a8011ea66 Require Python 3.4
Specify Requires-Python (PEP345) metadata
2017-07-20 13:49:34 +02:00
Min RK
0fd1a95405 Merge pull request #1239 from willingc/remove-33
Bump Python support to 3.4 and up
2017-07-20 13:48:56 +02:00
Min RK
8d0cfa8e7c always set content-type json on API handlers 2017-07-20 11:58:50 +02:00
Min RK
3d1187283c apply stricter CSP on api endpoints
double-ensure that no scripts run on api pages (referrer check already doesn't allow malicious links)
2017-07-20 11:58:50 +02:00
Carol Willing
7416a55083 Add test for invalid version 2017-07-19 19:23:37 -07:00
Carol Willing
e8a3c4dac6 Fix link 2017-07-19 17:33:14 -07:00
Carol Willing
33f2026dac Add badge for 0.7.2 docs to README 2017-07-19 17:30:57 -07:00
Carol Willing
d34f6e779d Bump Python support to 3.4 and up 2017-07-19 14:57:52 -07:00
Min RK
738976a956 Merge pull request #1236 from willingc/doc-intro
Break up long Getting Started doc page
2017-07-19 11:40:39 +02:00
Carol Willing
fd8cc1df15 Break up large getting started doc 2017-07-18 17:57:56 -07:00
Carol Willing
61053b063e Reorganize content 2017-07-18 16:47:11 -07:00
Carol Willing
a27e1e9d40 Break up installation document 2017-07-18 11:45:03 -07:00
Carol Willing
a7889eb536 Rename guide to reference 2017-07-18 11:03:49 -07:00
Carol Willing
0f17709d4e Edit content in intro 2017-07-18 11:03:13 -07:00
Min RK
3eca010f66 limit curl logging to INFO-level
curl debug logs every byte of every request
2017-07-18 14:49:13 +02:00
Min RK
041ffd6db2 support named servers in proxy 2017-07-18 14:48:51 +02:00
Min RK
4b5aad41b1 make user.running a method
accept server names
2017-07-18 14:48:29 +02:00
Min RK
d6565076f5 add admin user by default 2017-07-18 14:29:59 +02:00
Min RK
c943162649 merge named server handlers
only need one handler class per path
2017-07-18 14:28:45 +02:00
Min RK
a2e94b8493 create Spawners table
for named servers

removes User.servers
2017-07-18 14:28:31 +02:00
Min RK
94b2bc1261 Merge pull request #1231 from willingc/doc-refresh
Update docs main TOC and edit quickstart
2017-07-18 13:19:45 +02:00
Min RK
7d34f83b18 Merge pull request #1232 from dhirschfeld/win-fix3
Pass `shell=True` to `check_call` on Windows
2017-07-18 13:18:54 +02:00
Hirschfeld
4f27a18616 Pass shell=True to check_call on Windows 2017-07-18 12:15:33 +10:00
Carol Willing
5a5aa1c2aa Update main TOC and edit quickstart 2017-07-17 12:24:43 -07:00
Carol Willing
1bafdf9130 Merge pull request #1223 from minrk/wait-up-fall-off
apply exponential backoff to all waits
2017-07-17 09:15:48 -07:00
Min RK
9eef5d7b1e refresh session of spawner server 2017-07-17 11:05:25 +02:00
Min RK
aee3c74681 Merge origin/master into named_servers 2017-07-17 10:53:17 +02:00
Min RK
653a39c05e checkpoint: named server state 2017-07-17 10:41:36 +02:00
Min RK
efa6a33b0a variables for exponential falloff 2017-07-17 10:27:42 +02:00
Min RK
0c5a9e8347 Merge pull request #1225 from willingc/unofficial-win
Document more fully platform support
2017-07-17 10:24:54 +02:00
Min RK
657f77b7c6 Merge pull request #1224 from dhirschfeld/more-windows-fixes
More Windows Fixes
2017-07-17 10:23:50 +02:00
Carol Willing
b528572960 Document in more detail platform support 2017-07-16 19:13:54 -07:00
Hirschfeld
e75d24aca2 Create getgrnam wrapper function to allow mocking in tests 2017-07-17 11:38:04 +10:00
Hirschfeld
7607f8d639 More Windows fixes 2017-07-17 11:13:00 +10:00
Carol Willing
9a59c02077 Merge pull request #1220 from minrk/service-msg
fix filtering of services with no endpoint
2017-07-16 08:46:54 -07:00
Min RK
8e3c4b1925 apply exponential backoff to all waits
Waiting for servers to come up and shut down was polled at an even interval of 100ms. If things are slow and busy, this is a lot if waiting events. exponential backoff reduces the number of callbacks triggered by slow spawners.

This may improve the load a bit when there’s a bunch of outstanding spawns.
2017-07-15 12:56:47 +02:00
Yuvi Panda
057bf03d3a Merge pull request #1221 from minrk/proxy-race
add User.proxy_pending
2017-07-14 19:20:16 -07:00
Min RK
224faff879 Merge pull request #1208 from dhirschfeld/windows-fixes
Minor fixes to get setup.py to work on Windows
2017-07-14 17:28:28 +02:00
Min RK
a6c2939bb4 delay stop_pending until the end of stop
avoids stop_pending being False while there's still one yield to go
2017-07-14 15:53:38 +02:00
Min RK
c78d88707c fallback during initial hub connection 2017-07-14 15:34:34 +02:00
Min RK
a79071bb33 add User.proxy_pending
flag for waiting for the proxy to be updated

avoids User.running being True when the user's server has not yet been added to the proxy,
causing potential redirect loops.
2017-07-14 15:17:56 +02:00
Min RK
dca530d2c0 Merge pull request #1218 from minrk/raise-not-exit
fix leftover `self.exit` in proxy
2017-07-14 14:13:17 +02:00
Min RK
c5b1542af2 fix service filtering
use `!=` to check for None, not `is not`
2017-07-14 14:11:25 +02:00
Min RK
a13e7766fc fix leftover self.exit in proxy
self.exit is a method on Application, missed copying the proxy code out of the JupyterHub app.
2017-07-14 10:51:14 +02:00
Min RK
765e391810 Merge pull request #1214 from yuvipanda/hub_ip_connect_config
Tag hub_ip_connect as configurable
2017-07-14 10:44:09 +02:00
Yuvi Panda
6a12e78cee Merge pull request #1212 from yuvipanda/typo-fix
Fix typo in proxy implementation
2017-07-13 21:15:17 -07:00
yuvipanda
e0effa567a Tag hub_ip_connect as configurable
This value is expected to be provided by the user.
2017-07-13 20:14:11 -07:00
yuvipanda
0322ca6d05 Fix typo
It is now self.command, not cmd
2017-07-13 19:52:13 -07:00
Hirschfeld
13eda34676 Used os.pathsep to join paths 2017-07-13 22:19:37 +10:00
Hirschfeld
874ed0c450 Passed shell argument to check_call instead of calling cmd.exe directly 2017-07-13 22:15:19 +10:00
Hirschfeld
f25ec3c3f0 Minor fixes to get setup.py to work on Windows 2017-07-13 16:47:26 +10:00
Carol Willing
8373c4619e Merge pull request #1207 from minrk/check-routes-on-startup
check routes on startup
2017-07-12 08:56:14 -05:00
Min RK
549dfd99e5 check routes on startup
and be more thorough about clearing out stale routes that shouldn't be there
2017-07-12 14:06:04 +02:00
Carol Willing
eed88f6366 Merge pull request #1204 from minrk/httponly
set httponly on cookies
2017-07-11 09:33:00 -05:00
Carol Willing
fcf745b2f4 Merge pull request #1206 from minrk/pycurl-by-default
use pycurl by default, if available
2017-07-11 09:31:58 -05:00
Min RK
69a27b7843 use pycurl by default, if available
simplehttpclient can have issues with high load
2017-07-11 16:16:02 +02:00
Min RK
a51141810d set httponly on cookies 2017-07-11 11:06:00 +02:00
Yuvi Panda
396f454998 Merge pull request #1199 from jupyterhub/data-dict-default
Make data a non-optional arg to add_route
2017-06-29 14:06:00 -07:00
yuvipanda
5f21909138 Fix proxy test failure 2017-06-29 12:32:31 -07:00
yuvipanda
ebb7b4b4ae Make data a non-optional arg to add_route
We expect at least an empty dict when we fetch it,
so let's make it non-optional and always pass in something.
This is clearer.
2017-06-29 12:26:27 -07:00
Min RK
e691231f64 Merge pull request #1169 from minrk/version-check
Compare JupyterHub and single-user server versions
2017-06-29 17:49:22 +01:00
Min RK
471110c0f2 Merge pull request #1194 from yuvipanda/route_fix
Mark `data` param to proxy.add_route optional
2017-06-29 06:52:14 +01:00
yuvipanda
73948c016b Mark data param to proxy.add_route optional
It is used as optional throughout the code, and the CHP implementation
makes it optional too. So let's explicitly mark it as such.
2017-06-28 22:40:52 -07:00
Carol Willing
864e7ac4ee Merge pull request #1193 from willingc/rtd-update
Remove mkdocs as workaround fixed in RTD upstream
2017-06-28 15:53:07 -07:00
Carol Willing
2207220592 Remove mkdocs as workaround fixed upstream 2017-06-28 15:50:35 -07:00
Min RK
a4a5781f7f invoke app when testing single-user 2017-06-28 21:55:15 +01:00
Min RK
194d2b9639 handle oauth id checks in tests 2017-06-28 21:55:15 +01:00
Min RK
530f499ce1 _version.py is private 2017-06-28 21:55:15 +01:00
Min RK
d167e275d1 compare hub and single-user server versions
in both directions - Hub checks singleuser server on spawn and singleuser server checks Hub on startup

if minor versions mismatch, log at warning level, otherwise debug
2017-06-28 21:55:15 +01:00
Min RK
cdcc7fc3c1 return http response from wait_for_http_server 2017-06-28 21:55:15 +01:00
Min RK
0a30e0ade5 put jupyterhub version in logs and headers 2017-06-28 21:55:15 +01:00
Min RK
47dc66db5a better handle a few values being undefined when launching single-user 2017-06-28 21:55:15 +01:00
Yuvi Panda
c192391551 Merge pull request #1189 from minrk/default-route
add default hub route via Proxy.add_route
2017-06-28 12:58:30 -07:00
Carol Willing
b0c44aa67a Merge pull request #1192 from willingc/fix-conda
Add mkdocs as RTD workaround
2017-06-28 08:21:48 -07:00
Carol Willing
29890dcfa9 Add mkdocs as RTD workaround 2017-06-28 04:46:06 -07:00
Min RK
1742065f77 Merge pull request #1191 from kroq-gar78/fix-anchors
Fix in-document anchors
2017-06-28 10:36:14 +01:00
Aditya Vaidya
28480d0359 Fix in-document anchors
Removes the explicit extension of the target if it's in the same
document. This allows these links to work in GitHub or in Read the Docs.
2017-06-28 01:57:45 -07:00
Min RK
2f57cfc812 respect port in testing subdomain host 2017-06-28 09:53:57 +01:00
Min RK
b12a52e266 run tests -v 2017-06-28 09:50:07 +01:00
Min RK
5d45a44247 use db_factory in Proxy
should avoid session crossover problems in tests

…still really need to move tests over to gen_test
2017-06-27 22:39:39 +01:00
Min RK
8ee520d99b filter out non-jupyterhub routes in CHP 2017-06-27 15:22:26 +01:00
Min RK
4c0d4ffc47 add default hub route via Proxy.add_route
instead of relying on default target
2017-06-27 15:22:26 +01:00
Min RK
44c00a2581 run test hub on a random port 2017-06-27 15:22:26 +01:00
Min RK
1015f3bf53 Merge pull request #1187 from minrk/fix-db
fix db reconnect when user.db changes
2017-06-27 15:21:20 +01:00
Yuvi Panda
71378d23d5 Merge pull request #1180 from minrk/auth-return-dict
allow .authenticate to return a dict containing name and state
2017-06-26 10:23:39 -07:00
Yuvi Panda
f5d0855c2b Merge pull request #1177 from minrk/proxy-routespec
define routespec
2017-06-26 10:05:07 -07:00
Min RK
88040362b0 fix db reconnect when user.db changes
store id on outer User, rather than accessing orm_user.id, which seems to fail sometimes

this may fix the recent increase in intermittent test failures
2017-06-26 12:46:55 +02:00
Min RK
8f49412438 docstrings for proxy 2017-06-26 11:32:15 +02:00
Min RK
bb417b98b8 Merge pull request #1184 from evanlinde/evanlinde-patch-1
Add '/tree' to spawner default_url
2017-06-25 08:36:18 +02:00
evanlinde
afed81d173 Fix default_url documentation 2017-06-24 23:07:31 -05:00
evanlinde
def99c1795 Add '/tree' to default_url
Add '/tree' to default_url so it doesn't have to be included in config file.
2017-06-23 16:22:41 -05:00
evanlinde
fcdea007ac Merge pull request #1 from jupyterhub/master
Trying to update local copy
2017-06-23 13:51:10 -05:00
Min RK
383b56276e fix versionchanged format 2017-06-23 18:51:51 +02:00
Min RK
11e6c38702 routespecs are strings (again)
- no slash means host-routing
- slash means no-host
2017-06-23 14:49:42 +02:00
Min RK
a2686ac27b always return dict from get_authenticated_user
outer APIs don't need to handle the different cases
2017-06-23 14:41:06 +02:00
Min RK
49bf4747fd avoid error in service.stop if service failed to start 2017-06-23 14:12:31 +02:00
Min RK
cf257c48b4 handle host-routing in add/get/delete 2017-06-23 14:12:31 +02:00
Min RK
05d939beac JSON shenanigans now that proxy route keys aren't strings 2017-06-23 14:12:31 +02:00
Min RK
fa7fed8ea3 routespec docstrings 2017-06-23 14:12:31 +02:00
Min RK
fbf5816952 handle leading/trailing slashes in RouteSpec 2017-06-23 14:12:31 +02:00
Min RK
31fc89c944 add RouteSpec namedtuple for route specification
namedtuple(path, host)

everywhere that accepts a RouteSpec must also accept a string
and treat it as RouteSpec(string).
RouteSpec.as_routespec(spec_or_string) handles this.
2017-06-23 14:12:30 +02:00
Min RK
f7a05713a1 allow .authenticate to return a dict containing name and state
Allows authenticators to set .auth_state from info in the initial authentication.
2017-06-22 15:19:45 +02:00
Yuvi Panda
9f532d6b2d Merge pull request #1176 from minrk/protect-pamela
delay errors on pamela import
2017-06-21 08:58:12 -07:00
Min RK
5263e4ceae user.state is keyed by server name 2017-06-21 16:52:54 +02:00
Min RK
3145011004 add multi-spawner info to user model 2017-06-21 16:33:39 +02:00
Min RK
5da4348c2d move some state to Spawner
now that there are more than one per user
2017-06-21 16:33:16 +02:00
Min RK
e33e34748f Re-sync with master 2017-06-21 15:33:01 +02:00
Min RK
d2e62a90d7 Merge pull request #1167 from minrk/more-env-less-argv
pass more arguments as environment variables instead of CLI args
2017-06-21 14:13:25 +02:00
Min RK
593a3c8ebb fix base_url handling in services
JUPYTERHUB_BASE_URL is the whole application base_url (default: /)
JUPYTERHUB_SERVICE_PREFIX is the service prefix (/user/name/)
2017-06-21 14:02:55 +02:00
Min RK
6713277f33 delay errors on pamela import
only raise ImportError on pamela if PAMAuthenticator is actually used

avoids failure to start in rare cases where pamela is not importable (e.g. broken libpam)
2017-06-21 11:17:13 +02:00
Min RK
178f1ed5e0 fix defaults in singleuser ip/port
when service url is undefined

never return None
2017-06-15 11:08:35 +02:00
Min RK
f5c703a04f update tests for env change 2017-06-15 11:08:35 +02:00
Min RK
27e83a3260 pass more arguments as environment variables instead of CLI args
env is often easier to deal with for Spawners

Now, only optional args are passed on the command-line and all required args come from environment variables.
2017-06-15 11:08:33 +02:00
Carol Willing
e7cd5ec019 Merge pull request #1170 from minrk/403-bad-user
raise 403 on disallowed user, rather than redirect to login
2017-06-14 15:12:35 -07:00
Min RK
8704deeb31 ensure db.commit happens before yield 2017-06-14 21:19:38 +02:00
Min RK
9c6056518f use user.base_url in args 2017-06-14 21:18:38 +02:00
Min RK
5f813a4206 Merge pull request #1172 from Carreau/intersphinx-python-3
Inter-sphinx with Python 3, not 2.
2017-06-13 10:27:42 +02:00
Matthias Bussonnier
5cb40531d0 Inter-sphinx with Python 3, not 2.
Python 2 is the default, you need to be explicit for Python 3.
2017-06-12 12:04:41 -07:00
Min RK
fe85a79ae3 403 in services_auth tests 2017-06-08 19:00:35 +02:00
Min RK
97ec0b803d Merge pull request #1171 from minrk/close-socket
close socket when testing connections
2017-06-08 18:57:30 +02:00
Min RK
a5fbc0351f close socket when testing connections
rather than relying on garbage collection
2017-06-08 15:28:02 +02:00
Yuvi Panda
38e772dfec Merge pull request #1165 from minrk/hub_connect_ip
add hub_connect_ip
2017-06-07 14:32:40 -07:00
Min RK
dda3762b48 raise 403 on disallowed user, rather than redirect to login url
raise UserNotAllowed exception in generic `check_hub_user`
when a user or service is identified and not allowed.

turn it into `HTTPError(403)` in tornado `get_current_user` wrapper,
caching `None` so that subsequent calls don't re-trigger the same error.
2017-06-07 15:30:12 +02:00
Min RK
1ddbf97c11 comments to clarify that connect_ip is only for connecting 2017-06-07 13:21:52 +02:00
Min RK
ca4952a85d Merge pull request #1166 from minrk/log-cleanup
disconnect logging during MockHub cleanup
2017-06-06 18:39:56 +02:00
Min RK
d76632de91 update tests for connect_ip changes 2017-06-06 16:33:30 +02:00
Min RK
b96f3485fd make connect_ip a property
so that the default doesn't override explicit settings
2017-06-06 16:33:30 +02:00
Min RK
a6f1f6ea09 disconnect logging during MockHub cleanup
pytest appears to close captured FDs prematurely,
causing huge "I/O operation on closed file" tracebacks
whenever tests stop early due to a failure.

This should quiet the extra traceback, though it could potentially silence useful log messages during cleanup in rare cases
2017-06-06 15:28:19 +02:00
Min RK
d2533688b6 add hub_connect_ip
allows specifying the connect ip/hostname for the Hub
when it differs from hub_ip (the bind address).

Used when the Hub is not on the same host as the spawners and/or proxy (e.g. docker, kubernetes, etc.)
2017-06-06 12:47:43 +02:00
Min RK
6810aba5e9 Merge pull request #1164 from joychak/master
Added Kerberos authenticator link for Jupyterhub in ReadMe file
2017-06-06 10:09:12 +02:00
jchakrabort5
aca5b1ccd4 Added Kerberos authenticator for Jupyterhub in ReadMe 2017-06-05 10:00:16 -04:00
Carol Willing
888aa99ea6 Merge pull request #1069 from minrk/first-poll-fails-no-crash
Prevent crashes due to deleted system users
2017-06-02 05:25:34 -07:00
Min RK
b112b88587 Merge pull request #1148 from yuvipanda/pwdfree
Don't use getuser to find out current user name for spawning
2017-05-22 16:40:14 -07:00
Carol Willing
86276541be Merge pull request #1146 from minrk/log-redirect-targets
log redirect targets
2017-05-22 15:18:31 -07:00
Carol Willing
bdfd81fe83 Merge pull request #1144 from minrk/raise-on-config-error
raise on config file errors
2017-05-22 15:16:05 -07:00
Min RK
c24a0a4995 typo missing hub.api_url in service 2017-05-22 15:09:31 -07:00
Min RK
524b9104d0 also skip user_env for no username 2017-05-22 15:09:01 -07:00
Min RK
19e896c38d Merge pull request #1143 from minrk/spawn-next-url
Don’t redirect back to home from spawn
2017-05-22 14:39:58 -07:00
Min RK
62517d0c89 Merge pull request #1098 from minrk/proxy
implement proxy API
2017-05-22 14:17:41 -07:00
yuvipanda
49a0f154d0 Don't use getuser to find out current user name for spawning
It can easily be spoofed, since it only looks at env vars
2017-05-22 14:17:19 -07:00
Min RK
39248a532d log redirect targets
on both Hub and singleuser

should help debugging redirect loops, etc.
2017-05-21 11:04:15 -07:00
Min RK
465c81f281 clarify delete-invalid-user messages and docstrings 2017-05-20 11:31:59 -07:00
Min RK
2d8facd022 Add Authenticator.delete_invalid_users
opt-in option for deleting users that have been invalidated,
e.g. for LocalAuthenticators when system users have been removed and `create_system_users` is False.

Since it’s opt-in, log config to do so when the error is seen and option is not enabled.
2017-05-20 11:21:21 -07:00
Min RK
d548aa1e72 deprecate old proxy config
but keep it working with warnings
2017-05-19 12:08:49 -07:00
Min RK
7968912a7c raise on config file errors
don’t start jupyterhub if we can’t load config files
2017-05-19 11:43:59 -07:00
Min RK
79bd1a50ad Don’t redirect back to home from spawn
options_form spawn sent people back to home instead of to their newly spawned server
2017-05-19 11:42:58 -07:00
Carol Willing
7b96950a9c Merge pull request #1139 from tschaume/patch-1
semi-colons missing
2017-05-16 18:49:48 -07:00
Patrick Huck
89331d15cc semi-colons missing 2017-05-16 15:44:47 -07:00
Carol Willing
25910b732a Merge pull request #1132 from minrk/stop-docstring
Correct stop docstring
2017-05-16 13:21:56 -07:00
Min RK
bdcb9e7540 Correct stop docstring
stop should always wait to finish,
`now` indicates how forcefully it should be done.
2017-05-15 09:33:23 +02:00
Min RK
130bec4a2f Merge pull request #1133 from willingc/travis-requests
Update pip before install of dependencies on travis
2017-05-10 22:05:27 +02:00
Carol Willing
db2d685c40 Update pip before install dependencies on travis 2017-05-09 10:32:47 -07:00
Carol Willing
f9e0f90e08 Merge pull request #1119 from minrk/next-url
include next_url in authenticator login url
2017-05-08 03:05:56 -07:00
Carol Willing
4f85644c34 Merge pull request #1131 from minrk/clear-poll-notify
clear poll callbacks list before using it
2017-05-08 03:04:00 -07:00
Min RK
73d77ee56b clear poll callbacks list before using it
avoids accumulating callbacks for repeated spawns
2017-05-08 11:34:24 +02:00
Min RK
33a37ffa25 User has no single .server anymore 2017-05-08 11:07:35 +02:00
Carol Willing
2716ba4dc6 Merge pull request #1129 from charnpreetsingh/docs-warning
add jupyterhub-deployment-aws in docs
2017-05-06 17:35:00 -07:00
Carol Willing
65afc65f51 Merge pull request #1130 from willingc/new-docs
Update docs for jupyter alabaster theme
2017-05-06 17:20:34 -07:00
Carol Willing
034432bfba Remove self from contents 2017-05-06 16:51:29 -07:00
Carol Willing
f815fe8b59 Update for jupyter-alabaster local build 2017-05-06 16:46:48 -07:00
Carol Willing
cc7605d6a9 Add subsection docs 2017-05-06 16:46:48 -07:00
Carol Willing
d809b8717c Add numbered, self, and order in index 2017-05-06 16:46:48 -07:00
Carol Willing
f878ad54a8 Change single toc tree to visible and numbered 2017-05-06 16:46:48 -07:00
Carol Willing
22bc9b0dbf Make a single toctree 2017-05-06 16:46:48 -07:00
Carol Willing
86428aa0f6 Change to jupyter alabaster doc theme 2017-05-06 16:46:48 -07:00
charnpreetsingh
8c8b532ffd add jupyterhub-deployment-aws 2017-05-05 12:55:59 -07:00
Min RK
475c0a3144 Merge pull request #1127 from minrk/sudo-false
set sudo: false on Travis
2017-05-04 16:27:52 +02:00
Min RK
3c6e20585c set sudo: false on Travis 2017-05-04 14:03:19 +02:00
Min RK
98c2bd9a6a return ip, port from stub spawner
avoids deprecation warning in tests
2017-05-04 13:49:31 +02:00
Min RK
226b6c40a5 improve waiting for service to start in mockservice fixture
- wait for proxy update before starting service
- wait for service server to respond to start before proceeding
2017-05-04 13:33:16 +02:00
Min RK
4cb18c931d JUPYTERHUB_HOST is hub.public_host 2017-05-04 13:24:04 +02:00
Min RK
96b75c18b7 fix check-routes data access 2017-05-04 13:23:53 +02:00
Min RK
87d9d14e5d update proxy test 2017-05-04 12:28:37 +02:00
Min RK
1069799ea7 get rid of single-user cookie_name
it's unused now that single-user uses OAuth
2017-05-04 12:20:02 +02:00
Min RK
5e55753baa various cleanup to get most tests passing (yay!) 2017-05-04 12:16:47 +02:00
Min RK
be8f847309 move proxy management to Proxy object
out of the Application
2017-05-04 11:13:19 +02:00
Min RK
acc31b8441 remove Hub, Proxy from database
These are in-memory-only objects, no need for a table with one row
2017-05-04 11:05:58 +02:00
YuviPanda
a98bab8b5e Mock of how the proxy base class will be used 2017-05-04 11:02:33 +02:00
YuviPanda
7b944a3a3f Add proxy base class 2017-05-04 11:02:33 +02:00
Carol Willing
a0d32c5b33 Merge pull request #1126 from charnpreetsingh/dependencies
Sphinx min version is 1.4
2017-05-03 17:06:17 -07:00
charnpreetsingh
89f1254396 resolve merge conflicts 2017-05-03 16:06:57 -07:00
charnpreetsingh
41c136392f Sphinx min version is 1.4 2017-05-03 16:00:31 -07:00
Min RK
b4d1ee353d include next_url in authenticator login url
avoids losing redirect target when clicking through "Login with ..."
2017-05-02 14:37:52 +02:00
Carol Willing
a24d7406fc Merge pull request #1097 from minrk/whoami-only
Don't give OAuth access tokens access to the REST API
2017-05-02 03:03:58 -07:00
Min RK
574d3ba1f4 unused imports 2017-05-02 11:10:06 +02:00
Carol Willing
6eb61e2923 Merge pull request #1111 from minrk/whitespace-password
avoid stripping login form fields
2017-04-28 09:57:05 -07:00
Min RK
9e679e8024 avoid stripping login form fields
which prevented users from being able to login with passwords that start or end with whitespace
2017-04-28 16:40:11 +02:00
Carol Willing
006488fc74 Merge pull request #1101 from prasadkatti/patch-1
[docs] Minor fix to index.rst
2017-04-23 22:06:22 -04:00
Prasad Katti
8e66c383e8 [docs] Minor fix to index.rst 2017-04-23 11:12:34 -07:00
Carol Willing
e7a0556118 Merge pull request #1066 from minrk/auto_login
make Authenticator.auto_login explicit
2017-04-22 07:02:04 -04:00
Min RK
6117c0b573 accept OAuthAccessTokens in /authorization/token 2017-04-21 14:52:47 +02:00
Min RK
c3a90e0804 raise 500 on failure to identify a user in oauth callback 2017-04-21 14:52:23 +02:00
Min RK
66cb630b86 separate OAuth access tokens from API tokens
OAuth access tokens can only be used to identify users, not perform actions on their behalf, which API tokens do.

Implementing OAuth scopes would allow us to achieve this limitation without separating the two items, but that would be a much bigger change, including having an OAuth "Would you like to grant permissions..." confirmation page.
2017-04-21 14:52:07 +02:00
Christian Barra
2b2eefdd1f catch KeyError for get_spawner 2017-04-19 14:58:43 +02:00
Christian Barra
db77932a95 moving track of spawner's instances inside user 2017-04-19 14:46:54 +02:00
Christian Barra
2aaf82412d add a dict to save spawner's instances, fix user.server with server 2017-04-19 03:25:26 +02:00
Min RK
4df93cab04 add oauth2 to doc requirements 2017-04-18 16:16:16 +02:00
Carol Willing
b778232cac Merge pull request #1090 from minrk/rm-other-user-cookies
remove references to unused other_user_cookies
2017-04-18 07:05:41 -07:00
Min RK
f58015dc57 remove references to unused other_user_cookies
OAuth gets rid of the concept of the Hub managing cookies on behalf of sub-servers
2017-04-18 11:22:00 +02:00
Min RK
57d3cbccc4 Merge pull request #1084 from prasadkatti/patch-2
Fix Travis CI url
2017-04-18 11:18:59 +02:00
Prasad Katti
52fdd0bd8c Fix Travis CI url 2017-04-15 17:50:23 -07:00
Christian Barra
ced8e9f874 add named_servers proxy 2017-04-15 05:22:01 +03:00
Christian Barra
76b589bc90 fix named_servers, change server.base_url 2017-04-15 03:47:09 +03:00
Carol Willing
4c79a8cb2d Merge pull request #1077 from willingc/ipython-profile
Remove reference to profile for Jupyter
2017-04-13 07:28:53 -07:00
Carol Willing
64f7244808 Remove reference to profile for Jupyter 2017-04-13 07:27:07 -07:00
Carol Willing
ebaf36d503 Merge pull request #1072 from willingc/docker-docs
Add information about DockerHub to FAQ
2017-04-13 07:18:27 -07:00
Carol Willing
e58c1a5f5a Merge pull request #1076 from philejmath/readme_updates
Updates Jupyter server config file names and locations
2017-04-13 07:17:07 -07:00
Philip Matheson
c1eb7618d6 Updates jupyter server config names and locations to use "jupyter" instead of "ipython" 2017-04-12 12:18:36 -04:00
Carol Willing
0ce0dfbc35 Add information about DockerHub to FAQ 2017-04-10 09:49:17 -07:00
Carol Willing
a555af428d Merge pull request #1068 from zonca/patch-1
[DOC] gallery deployments, improve UCSD
2017-04-08 09:39:11 -07:00
Min RK
b5666a45f6 prevent crash on first poll failure of Spawners
1. only poll if server might be running
2. catch and log failure to poll, treat it as not running to avoid Spawner bugs aborting Hub startup
2017-04-08 10:57:22 +02:00
Andrea Zonca
170f0f918f [DOC] gallery deployments, improve UCSD
added post titles and added one more post.
2017-04-07 21:49:01 -07:00
Min RK
a59b0af2b4 test auto_login redirects 2017-04-07 17:01:51 +02:00
Min RK
3cac9a2203 add path arg to public_url helper 2017-04-07 17:01:51 +02:00
Min RK
6b22f80ead Add Authenticator.auto_login
Simplifies login URL, handler login

- all login redirects go to `settings['login_url']`
- `login_url` is unconditionally `/hub/login`
- `/hub/login` renders form page or 'login with...' button
- enabling auto_login redirects from /hub/login to Authenticator.login_url()
2017-04-07 14:49:18 +02:00
Min RK
5f498ffaf3 Merge pull request #1062 from betatim/doc-fix
Fix missing space in header
2017-04-07 11:48:34 +02:00
Tim Head
258fe7b277 Fix missing space in header 2017-04-07 10:08:07 +02:00
Carol Willing
703ed7d21e Merge pull request #938 from minrk/oauth-provider
Make JupyterHub an OAuth provider
2017-04-06 06:57:55 -07:00
Min RK
9a1f84329f clarify oauth store docstrings
per review
2017-04-06 12:15:34 +02:00
Min RK
a20c7eb4de remove unused/unimplemented AccessTokenStore methods 2017-04-06 12:13:08 +02:00
Min RK
e866651f96 update admin access deprecation message 2017-04-06 11:59:31 +02:00
Min RK
2b5f42a546 docstring clarifying what we override in OAuthHandler 2017-04-06 11:50:23 +02:00
Min RK
b811c63ac5 blacklist sphinx 1.5.4
it has a bug preventing docs from building
2017-04-06 10:09:14 +02:00
Min RK
c7ea106675 use User wrappers in test_spawner 2017-04-05 16:12:29 +02:00
Min RK
1f2218c875 update travis.yml
- remove Python 3.3
- install node.js 6 with nvm
- remove use of outdated travis-wheels
2017-04-05 16:04:34 +02:00
Min RK
99369aa5a1 fix trailing - in oauth-client-id for single-user servers with empty server_name 2017-04-05 15:53:49 +02:00
Min RK
ffd3c171fe fix oauth url for SU servers with subdomains
and services without
2017-04-05 15:53:49 +02:00
Min RK
ce4b9e8e9f only store token in single-user cookie
not the user model

preserves cached-response behavior from the Hub
so that the Hub can still revoke tokens.
2017-04-05 15:53:49 +02:00
Min RK
ef51eb21e0 get OAuth working with subdomains
needs a lot of host passing around
2017-04-05 15:53:49 +02:00
Min RK
b1efe3a5c1 load initial API token before setting up oauth client 2017-04-05 15:53:48 +02:00
Min RK
6d647b5387 use API token for oauth client secret
rather than a separate single-purpose secret

since we need the token anyway, use it for the secret handshake as well
2017-04-05 15:53:48 +02:00
Min RK
d11c7ba4db cleanup more after mockservices 2017-04-05 15:53:48 +02:00
Carol Willing
6b33358c56 Merge pull request #1054 from parente/clarify-token-api-auth
Minor update to clarify hub token auth
2017-04-04 20:20:48 -07:00
Peter Parente
9030302ff7 Fix typo request -> requests 2017-04-04 22:36:05 -04:00
Peter Parente
1631a6eab0 Minor update to clarify hub token auth 2017-04-04 22:33:57 -04:00
Min RK
c6fe145030 s/JupyterHubOAuthCallback/HubOAuthCallback/ 2017-04-04 17:02:34 +02:00
Min RK
5b1435081a remove redundant/unused code in mockservice fixture 2017-04-04 17:02:34 +02:00
Min RK
39fce0304d support oauth in services
fix bugs caught by tests
2017-04-04 17:02:34 +02:00
Min RK
5a5fdc2565 validate oauth client_id/secret 2017-04-04 17:02:33 +02:00
Min RK
bef121dbe3 get default hub_prefix from env 2017-04-04 17:02:33 +02:00
Min RK
0b7a43f6fa remove placeholder oauth example 2017-04-04 14:26:44 +02:00
Peter Parente
2d1a45f019 Merge pull request #1050 from willingc/admin-doc
Clarify admin users and access in docs
2017-03-31 20:58:54 -04:00
Carol Willing
5494172706 Clarify admin users and access in docs 2017-03-31 10:28:37 -07:00
Min RK
198bb875df delay evaluation of oauth environment variables
only affects mocking in tests
2017-03-31 17:07:21 +02:00
Min RK
d1822ee939 handle hub prefix in HubAuth 2017-03-31 17:06:51 +02:00
Min RK
5e1516189b allow oauth provider to be missing
mostly for testing
2017-03-31 16:15:00 +02:00
Min RK
5819b442aa stop using deprecated server cookie in tests
use Hub cookie instead, which still exists
2017-03-31 15:58:39 +02:00
Min RK
4bb8e47f3b implement admin-access with OAuth 2017-03-30 19:15:43 +02:00
Min RK
ff6a68112e put whole user model in cookie
ensures cached value has all the info needed (group, etc.)
2017-03-30 16:52:20 +02:00
Min RK
52b9060415 remove debug-print in self handler 2017-03-30 16:35:50 +02:00
Min RK
74728e5f42 make HubOAuth a subclass
instead of implementing both shared-cookie and OAuth on HubAuth
2017-03-30 15:57:58 +02:00
Min RK
3e482d08d7 Don't overwrite class name when patching-in hub auth 2017-03-30 15:24:48 +02:00
Min RK
7e55220c3f use OAuth in single-user server 2017-03-30 15:24:35 +02:00
Min RK
453d1daf8b move oauth tables to top-level orm 2017-03-29 13:35:13 +02:00
Min RK
d0eb4e0946 add /api/user handler for identifying the requester 2017-03-28 16:19:56 +02:00
Min RK
9a40196678 Avoid storing secrets and tokens at rest
- OAuth access tokens *are* APITokens.
  oauth_access_tokens table only stores extra oauth metadata.
- only store hashed client_secret in database,
  using HashedCompare to allow comparison.
2017-03-28 16:19:56 +02:00
Min RK
4f7552ea1d OAuth works! 2017-03-28 16:19:56 +02:00
Min RK
7412e357cf allow 'bearer' in Authorization header
since that's what OAuth likes
2017-03-28 16:19:56 +02:00
Min RK
bac96c679f fix login URL for oauth provider 2017-03-28 16:19:56 +02:00
Min RK
4f1d201286 OAuth handlers inherit from BaseHandler 2017-03-28 16:19:56 +02:00
Min RK
bcf6559514 WIP: Make JupyterHub an OAuth provider 2017-03-28 16:19:55 +02:00
Min RK
0af9f2b875 Merge pull request #1046 from willingc/iss753
Add default behavior of whitelist to FAQ in docs
2017-03-28 09:31:06 +02:00
Min RK
d9393c6663 Merge pull request #1047 from willingc/iss1024
Add note to FAQ about updating node on Debian
2017-03-28 09:30:30 +02:00
Carol Willing
00274c991f Add note to FAQ about updating node on Debian 2017-03-27 08:51:20 -07:00
Carol Willing
e6848b68aa Add default behaviorof whitelist to doc FAQ 2017-03-27 07:27:46 -07:00
Carol Willing
853a460bd7 Merge pull request #1043 from minrk/local.jovyan
run subdomain test with localhost.jovyan.org
2017-03-27 06:48:46 -07:00
Carol Willing
ff5b708707 Merge pull request #1044 from minrk/hex-regex
match the whole content when checking if cookie secret is hex
2017-03-27 06:46:15 -07:00
Min RK
0d62ba2f80 use hex secretfile in tests 2017-03-27 14:02:30 +02:00
Min RK
f257716d1b match the whole content when checking if cookie secret is hex
fixes spurious message with base64 cookie secrets that start with hex subset
2017-03-27 14:02:30 +02:00
Min RK
43a6cd0bf9 Merge pull request #1039 from minrk/validate_security
prevent warnings about security in single-user servers
2017-03-27 13:58:14 +02:00
Min RK
af8965664e Merge pull request #1030 from yuvipanda/port-configurable
Tag c.Spawner.port as configurable
2017-03-27 13:39:07 +02:00
Min RK
168ad315c7 run subdomain test with localhost.jovyan
instead of relying on xip.io, which seems to be flaky sometimes
2017-03-27 12:48:10 +02:00
Min RK
66510de4e9 Merge pull request #1040 from willingc/doc-logging
Add rotating log info by @minrk to docs
2017-03-27 12:37:32 +02:00
Carol Willing
942e05888b Add rotating log info by @minrk to docs 2017-03-24 10:56:35 -07:00
Min RK
1970273c58 Merge pull request #1027 from mgeplf/form_redirect
Teach FormSpawner to handle query next=/path/to/landing
2017-03-24 15:56:58 +01:00
Min RK
06d081a73b prevent warnings about security in single-user servers
single-user warns if no token or password is set unless validate_security is overridden

these checks are not relevant when using JupyterHub
2017-03-24 13:14:18 +01:00
Min RK
352efa6d47 Merge pull request #1036 from yuvipanda/none-cmd
Allow setting spawner.cmd to None
2017-03-24 11:32:19 +01:00
Min RK
586dc3868d describe when setting port config makes sense
only in containers / remote servers
2017-03-24 11:14:18 +01:00
yuvipanda
0fe149dd57 Allow setting spawner.cmd to None
In some spawners you want to unset .cmd - for example, in
KubeSpawner setting it to None will use the CMD metadata that
is set in the Docker Image. Currently there's no way to set a
None value - you can't set it to [] either. Treating None and
empty values as separate is a useful thing to have.
2017-03-23 16:49:50 -07:00
yuvipanda
688845b907 Tag c.Spawner.port as configurable
Fixes #1029
2017-03-18 17:25:57 -07:00
Mike Gevaert
21af37a7a3 Teach FormSpawner to handle query next=/path/to/landing
* before, if /user-redirect/ was used, or if ?next=/path/
  and there was a FormSpawner, the query param would be lost
2017-03-17 14:00:15 +01:00
Carol Willing
6078b8d9e5 Merge pull request #1025 from barrachri/correct_named_servers
correct self.allow_multiple_servers to self.allow_named_servers
2017-03-16 18:30:17 -07:00
Christian Barra
bfe1457897 fix after test fail 2017-03-17 01:53:04 +01:00
Christian Barra
f873b77a5f correct self.allow_multiple_servers to self.allow_named_servers 2017-03-17 01:15:47 +01:00
Min RK
be1af58147 Merge pull request #1016 from yuvipanda/accessibility
Hide the logout icon from screen readers
2017-03-09 13:45:38 -08:00
Min RK
2b8268f1d4 Merge pull request #1015 from willingc/aws-config
[DOC] Integrate AWS example into doc
2017-03-09 13:44:44 -08:00
Min RK
6cc3cd325c Merge pull request #1014 from willingc/galler
[DOC] Add gallery of jupyterhub deployments
2017-03-09 13:44:19 -08:00
YuviPanda
efab0dbc47 Hide the logout icon from screen readers
This makes the logout link more discoverable by screen readers,
which sort links based on what they say. Since our icon was
in front of and not behind 'Logout', someone looking for Logout
will not find this
2017-03-09 10:35:28 -08:00
Carol Willing
a5b4ed83f7 Integrate AWS example into doc 2017-03-07 16:11:29 -08:00
Carol Willing
8eed5c7709 Merge pull request #1002 from ThomasMChen/aws-setup-doc
Add AWS setup documentation.
2017-03-07 16:00:24 -08:00
Carol Willing
883d3ad29b Fix typo 2017-03-07 15:55:03 -08:00
Carol Willing
044d5d2a84 Add gallery of deployments to docs 2017-03-07 15:51:52 -08:00
Min RK
68f23b2cdf Merge pull request #1009 from jupyterhub/willingc-patch-1
Add word to docstring to improve comprehension
2017-03-05 16:03:39 -08:00
Carol Willing
91553ebe34 Add word to docstring to improve comprehension 2017-03-05 13:15:58 -08:00
Carol Willing
a45bc9b31e Merge pull request #1008 from willingc/rtd-build
Pin Python to 3.5 for RTD build
2017-03-05 12:37:20 -08:00
Carol Willing
849f52de67 Pin Python to 3.5 2017-03-05 12:28:03 -08:00
Min RK
46f9841dce Merge pull request #1007 from barrachri/contributor_list
correct barrachri
2017-03-05 09:53:08 -08:00
Christian Barra
d8213b5fa5 correct barrachri 2017-03-05 12:35:26 +01:00
Carol Willing
ee276adcf8 Merge pull request #1006 from jupyterhub/willingc-patch-1
Add Christian Barra to contributor list
2017-03-04 15:28:46 -06:00
Carol Willing
07ae847d08 Add Christian Barra to contributor list 2017-03-04 15:28:05 -06:00
Min RK
95dc4713f4 Merge pull request #942 from barrachri/multi_servers
Multiple singleuser servers
2017-03-04 14:00:53 -05:00
Christian Barra
2294dc0ad9 from multiservers to namedservers 2017-03-03 03:42:24 +01:00
Min RK
87c0d7e54f Merge pull request #1005 from prasadkatti/patch-1
minor fix in upgrade process doc
2017-03-01 15:38:59 -05:00
Prasad Katti
18238241ef minor fix 2017-03-01 12:24:55 -08:00
Min RK
192cb193a1 Merge pull request #1003 from whitead/issue_997_fix
Ensure that SERVICE_FIX has trailing slash
2017-02-27 23:20:49 +01:00
Andrew White
2fb503df17 Ensure that SERVICE_FIX has trailing slash.
Fixes Issue #997. Also updated Traitlets to 4.3.2 since the change in singleuser.py relies on trait default values being checked through validator, which was added in traitlets 4.3.2.
2017-02-27 16:34:54 -05:00
Thomas Chen
810566729d Add AWS setup documentation. 2017-02-25 21:16:06 -06:00
Christian Barra
746912cece fix *args and **kwargs 2017-02-24 00:37:41 +01:00
Christian Barra
7a38a57397 remove unused imports and correct base_url 2017-02-24 00:37:41 +01:00
Christian Barra
4fdf405d77 add JupyterHub.allow_multiple_servers 2017-02-24 00:37:41 +01:00
Christian Barra
488706293f pass server_name to the spawner 2017-02-24 00:37:41 +01:00
Christian Barra
9373325f1b fix options error and base_url 2017-02-24 00:37:40 +01:00
Christian Barra
e151248ac2 fix server_name 2017-02-24 00:37:40 +01:00
Christian Barra
b09ccc4373 fix base_url 2017-02-24 00:37:40 +01:00
Christian Barra
f4a7e28aa5 add default_server_name, change spawn start 2017-02-24 00:37:40 +01:00
Christian Barra
5b85d1e248 correct server name and base_url unique=True 2017-02-24 00:09:48 +01:00
Christian Barra
a85bc5cad4 change classes for creating/deleting a server, add server_name param for delete method 2017-02-24 00:09:48 +01:00
Christian Barra
d682edd44f use only the first 10 chars of server_url 2017-02-24 00:09:48 +01:00
Christian Barra
3524399984 fix some errors 2017-02-24 00:09:48 +01:00
Christian Barra
b127788100 add a new base for multi servers 2017-02-24 00:09:48 +01:00
Christian Barra
a823a6b371 add a name field for the server 2017-02-24 00:09:48 +01:00
Carol Willing
b47f76c037 Merge pull request #983 from minrk/config-docs
add configurable traits to api docs
2017-02-22 08:36:33 -06:00
Min RK
1d19684b2c Handle traitlets 4.x 2017-02-21 18:06:48 +01:00
Min RK
08e8c93b16 add app.rst 2017-02-20 21:44:02 +01:00
Carol Willing
a0103ebd6c Merge pull request #988 from minrk/cookie-secret-256b
use 32B hex cookie secret
2017-02-17 11:38:09 -08:00
Carol Willing
b5a600d488 Merge pull request #984 from minrk/spawner-shell
allow customization of spawn command
2017-02-17 10:43:31 -08:00
Min RK
27410a6c51 remove spurious print 2017-02-15 11:31:25 +01:00
Min RK
67d6de9f68 don't forget to yield 2017-02-15 11:30:34 +01:00
Min RK
3996fa00ef turn off database echo in tests
it's a bunch of noise
2017-02-15 11:29:48 +01:00
Min RK
42f8509287 use observer instead of validator for checking cookie length
since we aren't mutating the value
2017-02-15 10:58:16 +01:00
Min RK
11b738b837 Merge pull request #989 from willingc/update-confpyapp
Rename to mocked_app to avoid shadowing app
2017-02-15 10:56:00 +01:00
Carol Willing
576858b6ca Rename to mocked_app to avoid shadowing app 2017-02-14 18:55:02 -08:00
Carol Willing
645c2bdd4a Merge pull request #974 from willingc/travis-config
Refactor travis config for more efficient builds
2017-02-14 18:18:51 -08:00
Min RK
9ae708b367 use 32B hex cookie secret
instead of large b64 secret, which doesn't make sense for sha256

Warn about deprecated base64 secrets and too-large secrets.
2017-02-14 14:36:50 +01:00
Min RK
abf554f9cf Merge pull request #987 from yuvipanda/cookie-id-nullcheck
Make cookie_id be unique and not-null too
2017-02-14 13:02:45 +01:00
YuviPanda
9df6e76cc3 Make cookie_id be unique and not-null too
Fixes #985
2017-02-13 09:15:39 -08:00
Min RK
7afbe952e6 test
take pytest-tornado for a spin

it's nice!
2017-02-13 17:55:50 +01:00
Min RK
00aa92f7b6 add env handler to mocksu 2017-02-13 17:53:30 +01:00
Min RK
4ae264de5e allow customization of spawn command
- add shell_cmd for launching with a shell (e.g. `bash -l -c`
- add popen_kwargs for overriding keyword args passed to Popen
2017-02-13 17:51:53 +01:00
Min RK
4b987dd334 add configurable traits to api docs 2017-02-13 14:18:20 +01:00
Carol Willing
f75c4c0ba3 Edit per @minrk review 2017-02-10 10:40:57 -08:00
Carol Willing
8b4d089376 Remove extra dash in maxfail 2017-02-10 10:40:57 -08:00
Carol Willing
bd2e758b04 Add maxfail to tests to prevent travis stalls 2017-02-10 10:40:57 -08:00
Carol Willing
54e5910e45 Remove verbose tests 2017-02-10 10:40:57 -08:00
Carol Willing
5460d5748f Remove travis retry 2017-02-10 10:40:57 -08:00
Carol Willing
25d5d95a5b Remove pypy test 2017-02-10 10:40:57 -08:00
Carol Willing
8db26af57a Update conditionals 2017-02-10 10:40:57 -08:00
Carol Willing
4f29cbe81f Update travis settings 2017-02-10 10:40:57 -08:00
Min RK
0dced91495 Merge pull request #975 from willingc/cleanup-fixtures
Remove deprecated yield_fixture
2017-02-10 10:04:30 +01:00
Min RK
c02a463348 Merge pull request #978 from willingc/style-util
Add flake8 support
2017-02-10 10:03:47 +01:00
Carol Willing
a2f717fba2 Remove pylintrc for a different PR 2017-02-09 08:03:58 -08:00
Carol Willing
8973571dc0 Add pylint config file 2017-02-09 07:38:36 -08:00
Carol Willing
0fe3aacb4d Update punctuation per @minrk 2017-02-09 06:48:15 -08:00
Carol Willing
7313b4fd26 Update ignored errors in flake8 config 2017-02-09 06:15:06 -08:00
Carol Willing
5c0b3f8b34 Add spacing for user.py 2017-02-08 22:36:56 -08:00
Carol Willing
a4eb795d32 Add exclude files to flake8 config 2017-02-08 22:33:58 -08:00
Carol Willing
8e1efc2851 Remove extra space in __init__.py 2017-02-08 22:33:13 -08:00
Carol Willing
8c999907c2 Add spacing to _data.py 2017-02-08 22:26:39 -08:00
Carol Willing
cd7a31dd3c Add spacing to app.py 2017-02-08 22:23:28 -08:00
Carol Willing
b21b0427d1 Add error to flake8 config 2017-02-08 22:22:59 -08:00
Carol Willing
3a2299f7f2 Add space to auth.py 2017-02-08 22:04:53 -08:00
Carol Willing
7d5287000f Fix spacing in dbutil.py 2017-02-08 22:03:56 -08:00
Carol Willing
bc37c56742 Add error to flake8 config 2017-02-08 22:03:33 -08:00
Carol Willing
97b04d8b43 Add spacing to emptyclass.py 2017-02-08 21:58:59 -08:00
Carol Willing
5de1c078d2 Edit spacing in log.py 2017-02-08 21:49:19 -08:00
Carol Willing
021ef6e6c4 Add error to flake8 config 2017-02-08 21:47:06 -08:00
Carol Willing
69d20eb297 Edit spacing in orm.py 2017-02-08 21:46:33 -08:00
Carol Willing
4688348020 Edit spacing in singleuser.py 2017-02-08 21:38:23 -08:00
Carol Willing
cf02f3133a Correct spacing in spawner.py 2017-02-08 21:29:56 -08:00
Carol Willing
e0748540d7 Ignore errors in flake8 config 2017-02-08 21:29:35 -08:00
Carol Willing
ab3c28e46a Correct spacing in traitlets.py 2017-02-08 21:19:55 -08:00
Carol Willing
13ae12b57d Correct style spacing 2017-02-08 21:18:12 -08:00
Carol Willing
222cdc7f79 Add config file for flake8 2017-02-08 21:17:46 -08:00
Carol Willing
e8a1d2f1bd Clean up docstring errors 2017-02-08 20:53:53 -08:00
Carol Willing
5245670af1 Remove deprecated yield_fixture; add docstrings 2017-02-08 14:16:36 -08:00
Carol Willing
6b83d516a7 Merge pull request #976 from minrk/no-token-pop
Don't pop token env in single-user servers
2017-02-08 14:03:02 -08:00
Carol Willing
b72562e805 Merge pull request #971 from minrk/token-page
Add page for requesting tokens
2017-02-08 13:57:45 -08:00
Min RK
0b964c8358 Don't pop token env in single-user servers
Users should be allowed to access their own tokens to talk to the Hub API.
2017-02-08 22:31:18 +01:00
Min RK
d61f9547fe Merge pull request #973 from apetresc/patch-1
Update traitlets dependency to 4.3
2017-02-08 22:24:25 +01:00
Adrian Petrescu
78360608b1 Update traitlets dependency
Fixes #972. Currently, Jupyterhub actually has a hard requirement on the 4.3 traitlets API, otherwise you'll run into the crash described in that issue for any traitlets version older than that.
2017-02-08 11:21:23 -05:00
Min RK
2a25e3cb89 replace existing get_token tests 2017-02-08 16:46:50 +01:00
Min RK
f3b7fda4a8 it's JupyterHub
not Jupyter Hub
2017-02-08 14:43:11 +01:00
Min RK
6c6d070b16 minor html cleanup 2017-02-08 14:42:41 +01:00
Min RK
eec0a11ef0 add POST /authorizations/token to rest API docs 2017-02-08 14:39:13 +01:00
Min RK
2b262f453d test requesting token via API 2017-02-08 14:32:19 +01:00
Min RK
c2b494f702 put nav in the header
reduce custom css, use more bootstrap variables.

Admin link is now in the heading rather than the list of big buttons
2017-02-08 14:19:35 +01:00
Min RK
958ee00efd Add /token page with a button for requesting new tokens 2017-02-08 14:16:11 +01:00
Min RK
363354d941 allow POST /authorizations/token to request new tokens 2017-02-08 13:39:46 +01:00
Carol Willing
074ea61514 Merge pull request #969 from minrk/logout-redirect
redirect to `/hub/login` to avoid automatically starting login process
2017-02-03 08:17:19 -08:00
Min RK
abc59d3d30 redirect logout page to login page directly
instead of relying on root redirect
2017-02-03 12:55:45 +01:00
Min RK
fea683f992 redirect root to /hub/login instead of authenticator.login_url
/hub/login always renders a page,
whereas `authenticator.login_url` may automatically log the user in via redirects,
causing logout to appear not to work, as redirects immediately cause login again.
2017-02-03 12:51:03 +01:00
Min RK
3402f4f514 Merge pull request #966 from minrk/service-token-auth
support service tokens in HubAuth
2017-02-01 13:11:32 +01:00
Carol Willing
3bb82ea330 Merge pull request #949 from willingc/test-mock
Refactor test classes used to mock services
2017-01-27 05:43:29 -08:00
Carol Willing
bced09e5b3 Add file docstring from @minrk 2017-01-27 05:19:05 -08:00
Carol Willing
9e84402f42 Edit docstrings to clarify handlers are not mocked 2017-01-27 04:58:29 -08:00
Min RK
18c65453fd Merge pull request #965 from willingc/test-proxy
Refactor proxy tests
2017-01-27 13:40:28 +01:00
Carol Willing
57ed99020f Edit comment 2017-01-27 04:19:43 -08:00
Carol Willing
caa3b0c438 Parameterize test values 2017-01-27 04:14:51 -08:00
Carol Willing
5133cf0275 Add some comments 2017-01-27 04:14:51 -08:00
Carol Willing
7f6c080b46 Fix pep8 errors 2017-01-27 04:14:51 -08:00
Carol Willing
142907395f Use pytest parameterize for proxy tests; fix spacing 2017-01-27 04:14:51 -08:00
Min RK
43d069438e Merge pull request #956 from willingc/test-api
Refactor API tests
2017-01-27 10:36:14 +01:00
Carol Willing
e7b73c4f53 Add docstrings and remove request_received 2017-01-26 13:58:38 -08:00
Carol Willing
f2ca0a2372 Implement all methods for classes that inherit from abstract class 2017-01-26 12:54:11 -08:00
Carol Willing
021cfe446f Fix formatting on a few requests 2017-01-26 12:41:39 -08:00
Carol Willing
1a71c906d5 Revert "Relax line length for requests" 2017-01-26 12:26:02 -08:00
Carol Willing
10d2eb6449 Return to original style for line length for requests 2017-01-26 12:20:19 -08:00
Carol Willing
0f283e088e Fix minor formatting 2017-01-26 12:17:11 -08:00
Carol Willing
025977f19a Clean up vertical spacing 2017-01-26 12:17:11 -08:00
Min RK
2a9ba788d0 shorten date_fmt in tests
reduces log prefix length a bit in test output
2017-01-26 11:52:59 +01:00
Min RK
aa65266726 support services in HubAuth 2017-01-26 11:52:40 +01:00
Min RK
4b6c58292b add 'kind' field to user and group models 2017-01-26 11:48:20 +01:00
Min RK
d0813cc736 support service tokens in /api/authorizations 2017-01-26 10:44:25 +01:00
Min RK
f1d7e5e779 Merge pull request #961 from minrk/get-user-simplified
Enable token authentication in HubAuth
2017-01-26 09:55:35 +01:00
Min RK
66f01fc880 set login url on hub_auth 2017-01-25 22:58:10 +01:00
Min RK
d93384536f clarify some things
- cleanup docstrings
- more comments
- rename cookie_cache to cache, since it's not a cache of cookies
2017-01-25 17:10:14 +01:00
Min RK
69250db70e support token authentication in HubAuth.get_user
in Authorization header or `?token` parameter

enables token authentication in single-user server based on notebook >= 4.3 as well
2017-01-25 13:53:36 +01:00
Min RK
ad52398087 add get_login_url to HubAuthenticated
needed for tornado's default redirect
2017-01-25 13:52:14 +01:00
Min RK
4f1eec31a1 more code consolidation in HubAuth
consolidates duplicate code in user_for_cookie and user_for_token
into _check_hub_authorization
2017-01-25 13:50:20 +01:00
Min RK
43c02740ab Merge pull request #960 from DeepHorizons/get_user_by_token
Added user_for_token method, moved r check into its own function
2017-01-25 10:39:01 +01:00
Joshua Milas
4605f74cf9 Fixed missing variable 2017-01-24 11:49:18 -05:00
Joshua Milas
9ab4b35f22 Changed error message to be more generic 2017-01-24 11:47:52 -05:00
Min RK
e9784f0e69 Merge pull request #959 from willingc/test-typo
Add missing assert to test
2017-01-24 13:27:51 +01:00
Min RK
3e37d0a39b Merge pull request #958 from willingc/add-badges
Edit README content and update formatting
2017-01-24 13:14:57 +01:00
Min RK
44ae162f09 Merge pull request #955 from willingc/test-services
Refactor services tests
2017-01-24 13:13:15 +01:00
Joshua Milas
2821b9a832 Added user_for_token method, moved r check into its own function 2017-01-23 21:12:40 -05:00
Carol Willing
cf97247f75 Add missing assert to test 2017-01-23 08:33:48 -08:00
Carol Willing
1bb40e2be1 Add built-in spawner to table 2017-01-23 08:09:00 -08:00
Carol Willing
869db9e31c Edit content and update formatting 2017-01-22 21:00:58 -08:00
Carol Willing
39ee52ad3c Refactor services tests 2017-01-20 23:13:09 -08:00
Carol Willing
7e699af2b5 Merge pull request #953 from willingc/covfix
Rename test class to stub class to allow pytest collection

Closes #952
2017-01-20 14:52:39 -08:00
Min RK
2b344cc717 Merge pull request #950 from willingc/travis36
Add Python versions to Travis
2017-01-20 11:25:17 -10:00
Carol Willing
246f0bc442 Omit alembic directory from report 2017-01-20 12:30:46 -08:00
Carol Willing
4afb659f44 Omit travis site-packages directory from report 2017-01-20 12:25:33 -08:00
Carol Willing
a43069fc35 Correct syntax in coverage command 2017-01-20 11:35:39 -08:00
Carol Willing
5b43266278 Update coverage setting to ignore test directory 2017-01-20 11:26:19 -08:00
Carol Willing
5df16371e1 Rename class used in test cases to StubSingleUserSpawner 2017-01-20 10:49:59 -08:00
Carol Willing
c086f05c7c Rename test class to allow pytest to collect tests 2017-01-20 10:49:59 -08:00
Carol Willing
7a38857bcd Add Python versions to Travis 2017-01-20 08:32:52 -08:00
Min RK
e860925f57 Merge pull request #944 from barrachri/fix_patch_post_#941
check name collisions on rename
2017-01-19 10:38:38 -10:00
Christian Barra
3808067dd7 better docs 2017-01-19 10:57:18 +01:00
Min RK
c7d7dec40d Merge pull request #939 from minrk/service-logs
more debugging and health checks for services
2017-01-18 16:19:01 -10:00
Christian Barra
e96e0acc9f more pythonic 2017-01-19 03:05:28 +01:00
Min RK
3efd2398ca review comments 2017-01-18 16:03:05 -10:00
Christian Barra
7284ef6e06 change from username to name 2017-01-19 02:35:42 +01:00
Christian Barra
f5dc3ad753 fix to have unique username value 2017-01-19 02:30:04 +01:00
Christian Barra
fc0d0031bf typo correct 2017-01-16 17:03:47 +01:00
Min RK
d44ee4b8fa Merge pull request #937 from minrk/service-chdir
Don't set cwd to user's home for services
2017-01-16 15:39:20 +01:00
Min RK
eb5e755aa6 more debugging and health checks for services
- log that external services are added (helps catch accidental external services due to missing fields)
- check connectivity of services with web endpoints periodically
2017-01-16 15:36:11 +01:00
Min RK
6fc9e90f28 Don't set cwd to user's home for services
allow `cwd` setting to take effect
2017-01-15 20:10:06 +01:00
Min RK
2effd3da16 Merge pull request #933 from DeepHorizons/fix_service_help
Fixed help and documentation related to service tokens
2017-01-15 20:08:41 +01:00
Min RK
69230b1147 Merge pull request #936 from barrachri/add_grant_cookie_admin_services
Allow services to request admin-access
2017-01-15 20:08:06 +01:00
Christian Barra
5435bf3ec4 add api_token to services' properties 2017-01-15 13:36:36 +01:00
Christian Barra
b0b13bfcb9 fix AttributeError when a service ask for a cookie 2017-01-14 05:48:07 +01:00
Joshua Milas
c3b0b2ecf0 Fixed help and documentation related to service tokens
The documentation stated that the key `token` should be used to specify
the pregenerated token in `JupyterHub.services`. This is wrong as the key
should be `api_token`.

This changes the help on the trait, along with changing the module
docstring in `service.py`.
2017-01-13 17:45:42 -05:00
Min RK
a276421d25 Merge pull request #907 from barrachri/adding_multi_server_features_orm
Allow users to have multiple servers (in db)
2017-01-11 15:19:47 +01:00
Christian Barra
dbb6303bdc update and test with version 0.7.2 2017-01-11 14:02:11 +01:00
Christian Barra
d28036e173 fix docstrings 2017-01-11 12:27:30 +01:00
Carol Willing
bc3f1cae16 Merge pull request #931 from jupyterhub/willingc-patch-1
Correct links for changelog
2017-01-10 07:38:09 -08:00
Carol Willing
5e84d0c2b3 Correct links for changelog
Update links for 0.7.2 and Unreleased titles
2017-01-10 07:23:39 -08:00
Min RK
086f88852d back to dev 2017-01-10 16:15:01 +01:00
Min RK
aa132cade7 release 0.7.2 2017-01-10 16:12:45 +01:00
Carol Willing
dd35ffbe86 Merge pull request #928 from minrk/0.7.2
Changelog for 0.7.2
2017-01-09 16:18:12 -08:00
Min RK
8edcf8be81 Changelog for 0.7.2 2017-01-09 12:45:16 +01:00
Christian Barra
11196443ac remove relationship, fix some typo 2017-01-06 22:15:51 +01:00
Min RK
29b02b7bcb Merge pull request #927 from willingc/clarify-whitelist
Add better prose for removing users
2017-01-06 20:25:01 +01:00
Carol Willing
0383bc27b2 Add better prose for removing users 2017-01-06 08:52:48 -08:00
Carol Willing
65d5102b49 Merge pull request #926 from minrk/singleuser-service-defaults
support service env vars in singleuser entrypoint
2017-01-06 08:28:48 -08:00
Min RK
8a226e6f46 simplify singleuser-service examples
now that service env vars are respected
2017-01-06 17:21:28 +01:00
Min RK
0bd34e0a10 support service env variables in singleuser
and set a few sensible defaults where they are known/likely
2017-01-06 17:21:10 +01:00
Min RK
186107d959 cache HubAuth user per request 2017-01-06 17:19:10 +01:00
Carol Willing
91b07b7ea4 Merge pull request #924 from minrk/singleuser-service-example
singleuser-server service example
2017-01-06 08:10:34 -08:00
Min RK
f5b30fd2b4 move version requirement further up 2017-01-06 16:57:13 +01:00
Min RK
0234396c2c Merge pull request #922 from yuvipanda/fix-user-redirect
Pass query params through with user-redirect
2017-01-06 13:31:23 +01:00
Min RK
a43d677ae4 add external-service shared notebook example 2017-01-06 13:30:53 +01:00
Min RK
dcfe71e7f0 add managed notebook service example 2017-01-06 13:30:53 +01:00
Min RK
5d41376c2e use JUPYTERHUB_API_TOKEN env in Spawner
to be more consistent with services

deprecate JPY_API_TOKEN, but keep it around for compatibility
2017-01-06 13:30:53 +01:00
Min RK
dd083359ec Merge pull request #925 from minrk/fix-hub-group-auth
[HubAuth] Fix group authentication for services
2017-01-06 13:30:30 +01:00
Min RK
e6d54960ba test group whitelist checking 2017-01-06 13:24:40 +01:00
Min RK
a9295bc5c2 more debug logging for Hub auth 2017-01-06 13:24:40 +01:00
Min RK
2015c701fa HubAuth services: fix group authentication checking
If group authentication checking was enabled, any user would be allowed
2017-01-06 13:24:40 +01:00
YuviPanda
3e9c18f50a Pass query params through with user-redirect 2017-01-05 17:18:36 -08:00
Min RK
7cac874afc Merge pull request #919 from ellisonbg/nbserver-group
Adding group to single user server for group based auth
2017-01-05 14:37:20 +01:00
Brian E. Granger
a7b6bd8d32 Adding group to single user server for group based auth 2017-01-04 20:12:34 -07:00
Min RK
1649a98656 2017 typo 2017-01-03 15:55:39 +01:00
Christian Barra
6694cb42c8 remove pep8 corrections 2017-01-03 14:30:36 +01:00
Christian Barra
b6e293c38e update to the last jupyterhub version 2017-01-03 14:22:12 +01:00
Christian Barra
02090c953b fix errors, remove pep8 corrections 2017-01-03 14:10:46 +01:00
Min RK
ecbe51f60f signaling typo 2017-01-02 14:50:10 +01:00
Min RK
fed14abed3 back to dev 2017-01-02 14:44:07 +01:00
Min RK
94978ea9e0 release 0.7.1 2017-01-02 13:53:43 +01:00
Min RK
bf6999e439 changelog for 0.7.1 2017-01-02 13:53:43 +01:00
Carol Willing
020ee7378f Merge pull request #916 from rachmaninovquartet/master
Added Toree troubleshooting to docs
2016-12-22 13:56:51 -08:00
Min RK
e4a0569961 Merge pull request #915 from jupyterhub/willingc-patch-1
Update README to clarify docker image contents
2016-12-22 16:43:02 +01:00
Ian Maloney
4ff525d5bd updated docs/source/troubleshooting.md per conversation with @willingc in issue 889 2016-12-21 15:21:50 -05:00
Carol Willing
37a31b01b2 Update README to clarify docker image contents
Addresses #879 and #772 re: confusion about the docker image contents
2016-12-21 10:46:30 -08:00
Carol Willing
1604cb1b0b Merge pull request #914 from minrk/update-bootprint
fix rest-api doc building
2016-12-21 10:29:08 -08:00
Min RK
45702ac18c update bootprint to 0.10
0.8 has stopped working for some reason
2016-12-21 14:51:12 +01:00
Min RK
c81e9d60e4 fix rest-api link
link to REST API, not Python API
2016-12-21 14:51:12 +01:00
Carol Willing
224865b894 Merge pull request #910 from minrk/cleanup-server-token
Avoid cleaning up API tokens for Spawners that will resume
2016-12-20 08:29:06 -08:00
Min RK
3b3bc8224b comment review 2016-12-20 16:41:26 +01:00
Carol Willing
c56dc2ea6f Merge pull request #911 from jjaraalm/master
Update Service Docs

Closes #908
2016-12-19 10:28:30 -08:00
jjaraalm
62202bbb74 Revert "Revert "Update service docs""
This reverts commit 7ba28c0207.
2016-12-19 13:00:48 -05:00
jjaraalm
7ba28c0207 Revert "Update service docs"
This reverts commit 9392a29dad.
2016-12-19 12:59:42 -05:00
jjaraalm
9392a29dad Update service docs
Fixes #908
2016-12-19 12:56:26 -05:00
Min RK
72ab8f99ec Avoid cleaning up API tokens for Spawners that will resume
in which case the previous API token should be left alone.
2016-12-19 10:50:25 +01:00
Min RK
fcf32c7e50 Merge pull request #909 from willingc/update-travis
Add 3.6 to travis
2016-12-19 09:59:47 +01:00
Carol Willing
da451d6552 Add 3.6 to travis 2016-12-18 21:26:52 -08:00
Christian Barra
dbe8bf5428 add users_servers class in orm.py, correct test_orm.py, fix some pep8, issue #766 2016-12-17 04:55:00 +01:00
Carol Willing
662b1a4d4a Merge pull request #902 from minrk/redirect-empty-msg
Don't warn about empty next_url
2016-12-09 08:04:56 -08:00
Min RK
732adea997 Don't warn about empty next_url
empty next_url is fine
2016-12-09 15:34:32 +01:00
Carol Willing
7e1dbf3515 Merge pull request #896 from minrk/whitelist-warning
Warn about single-character names in whitelist
2016-12-05 11:16:30 -06:00
Min RK
65b92ec246 Warn about single-character names in whitelist
likely cause is `set('string')` typo instead of `set(['string'])`,
so include that in the error message:

    whitelist contains single-character names: ['i', 'k', 'm', 'n', 'r']; did you mean set(['ikmnr']) instead of set('ikmnr')?
2016-12-05 09:46:52 +01:00
Min RK
dc42ee4779 typo in changelog link 2016-12-02 18:12:28 +01:00
Min RK
c04441c1b2 back to dev 2016-12-02 18:08:03 +01:00
Min RK
c3faef8e2a release 0.7.0 2016-12-02 18:02:20 +01:00
Carol Willing
d2175635af Merge pull request #895 from minrk/release-0.7
Update changelog for 0.7 final
2016-12-02 10:47:21 -06:00
Min RK
1f7401cd14 Update changelog for 0.7 final 2016-12-02 17:35:19 +01:00
Min RK
c94b3e34d2 Merge pull request #894 from minrk/disable-token
disable unused token on singleuser-server
2016-12-02 17:01:50 +01:00
Carol Willing
566e1d05ea Merge pull request #893 from minrk/expanduser
call expanduser on singleuser notebook_dir
2016-12-01 21:53:24 -06:00
Min RK
0488d0bd73 call expanduser on singleuser notebook_dir
This copies validate_notebook_dir from notebook with one addition:
calling expanduser.
2016-12-01 22:04:18 +01:00
Min RK
ca31d9b426 disable token on singleuser-server
fixes confusing output about token access in notebook server startup
2016-12-01 21:59:44 +01:00
Min RK
8721f9010f Merge pull request #892 from yuvipanda/maybe-async
Document that authenticator's add_user maybe a coroutine
2016-12-01 17:58:02 +01:00
YuviPanda
88de48ebac Document that authenticator's add_user maybe a coroutine 2016-12-01 19:31:23 +05:30
Min RK
d5a6e2b2ac Merge pull request #886 from yuvipanda/spawner-docs 2016-11-30 13:48:05 +01:00
Min RK
2152a94156 review pass on spawner docstring changes
- small wording, spelling tweaks
- rst formatting fixes
- remove some spurious, cluttering newlines
- clearer traitlets default values on first line
2016-11-30 13:43:59 +01:00
Min RK
bc3824e9bf review pass on auth docstrings 2016-11-30 13:22:07 +01:00
YuviPanda
60bc92cf78 Spawner doc fixes per @willingc 2016-11-30 14:02:02 +05:30
YuviPanda
3b15467738 Clearer module docstring for spawner.py 2016-11-29 16:26:34 +08:00
YuviPanda
4970fe0a1c Add more docs for spawner base class 2016-11-29 16:25:15 +08:00
YuviPanda
7dbe2425b8 Fix typo 2016-11-29 16:00:25 +08:00
YuviPanda
433d44a642 Add docs for PAMAuthenticator 2016-11-29 15:58:35 +08:00
YuviPanda
7733d320d0 Add more docs to LocalAuthenticator 2016-11-29 15:56:16 +08:00
YuviPanda
20d367c2a8 Add more docs for authenticator base class 2016-11-29 15:55:32 +08:00
YuviPanda
4687fbe075 Add extended docs for LocalProcessSpawner too 2016-11-28 23:07:54 -08:00
YuviPanda
b0dc52781e Add info about shell expansion to cmd / args traitlets
We should probably standardize this too
2016-11-28 22:45:06 -08:00
YuviPanda
4f1f7d6b8f Add example use for default_url traitlet 2016-11-28 22:42:10 -08:00
YuviPanda
41f8608f4e Fix port config documentation to match reality 2016-11-28 22:41:47 -08:00
Min RK
ba3a8f2e76 Merge pull request #887 from yuvipanda/rename-spec
Rename MemorySpecification to ByteSpecification
2016-11-28 10:27:41 +01:00
YuviPanda
12e3a5496d Rename MemorySpecification to ByteSpecification 2016-11-27 17:57:34 -08:00
YuviPanda
280644bab5 Expand traitlet documentation for spawner base class 2016-11-27 17:53:41 -08:00
Carol Willing
bf28371356 Merge pull request #882 from minrk/alembic.ini
add alembic.ini to package_data
2016-11-22 08:10:43 -08:00
Carol Willing
ce237181f2 Merge pull request #881 from minrk/more-allow-async-whitelist
handle async check_whitelist in app
2016-11-22 07:46:27 -08:00
Min RK
85ca5a052e add alembic.ini to package_data 2016-11-22 16:21:03 +01:00
Min RK
db8b3dbce9 handle async check_whitelist in app
follow-up to previous PR
2016-11-22 16:06:08 +01:00
Min RK
9c2d56f015 Merge pull request #876 from jbweston/bugfix/whitelist-coroutine
allow `check_whitelist` to be a coroutine
2016-11-22 09:56:28 +01:00
Joseph Weston
d244a1e02f allow check_whitelist to be a coroutine
Some authenticators may have whitelist checking that requires
async operations.
2016-11-21 16:14:02 +01:00
Min RK
9f134277a9 Merge pull request #872 from jupyterhub/willingc-patch-1
Change py.test to newer convention of pytest
2016-11-16 10:18:15 +01:00
Carol Willing
ef9aca7bcb Change py.test to newer convention of pytest 2016-11-15 14:13:03 -08:00
Min RK
32f39f23eb Merge pull request #871 from jupyterhub/willingc-patch-1
Add info on tests to README
2016-11-15 20:39:59 +01:00
Carol Willing
c9b2beb821 Add info on tests to README 2016-11-15 06:35:39 -08:00
Min RK
e9ad82e350 release 0.7b1 2016-11-12 18:36:36 -08:00
Min RK
347dd3cc0f prune docs/node_modules 2016-11-12 18:36:30 -08:00
Min RK
798346dbe8 Merge pull request #869 from willingc/doc-service
Edit Services doc content
2016-11-12 18:28:24 -08:00
Carol Willing
fd94c6de17 Fix missing link target 2016-11-12 18:16:59 -08:00
Carol Willing
3fc6fc32c5 Add review comment by @parente 2016-11-12 18:07:17 -08:00
Carol Willing
a1b6aa5537 Add troubleshooting commands 2016-11-12 18:01:53 -08:00
Carol Willing
f9965bb3c3 Add example of Service per @parente 2016-11-12 17:37:30 -08:00
Carol Willing
541997371c Fix broken or changed links 2016-11-12 17:17:00 -08:00
Carol Willing
522c3e5bee Edit Services doc content 2016-11-12 16:54:57 -08:00
Carol Willing
1baf434695 Merge pull request #868 from minrk/more-changes
Add a few more things in the changelog
2016-11-12 13:40:16 -08:00
Carol Willing
92db71f293 Merge pull request #867 from minrk/upgrade-db-backup
backup db file during upgrade-db
2016-11-12 13:39:39 -08:00
Min RK
b985f8384d Add a few more things in the changelog 2016-11-12 12:54:44 -08:00
Min RK
4c2d049e70 backup db file during upgrade-db 2016-11-12 12:44:59 -08:00
Carol Willing
605c4f121c Merge pull request #866 from parente/note-about-db-secrets
Add two short notes about db security
2016-11-12 12:03:21 -08:00
Peter Parente
4baf5035cb Reflow markdown for easier editing 2016-11-12 11:57:45 -08:00
Peter Parente
f8a57eb7d9 Add two short notes about db security 2016-11-12 11:49:17 -08:00
Min RK
93ac343493 Merge pull request #865 from willingc/doc-tidbits
Add documentation prior to 0.7 beta
2016-11-12 11:40:53 -08:00
Carol Willing
dc092186f0 Edit example for clarity 2016-11-12 11:27:36 -08:00
Carol Willing
6b7c319351 Add intro and standardize code format 2016-11-12 11:15:44 -08:00
Carol Willing
ef5885f769 Make minor edits 2016-11-12 11:15:02 -08:00
Peter Parente
0ffd53424d Merge pull request #861 from willingc/issuetempl
Add initial issue template
2016-11-11 13:36:11 -08:00
Carol Willing
5f464d01b4 Soften tone 2016-11-11 10:44:20 -08:00
Yuvi Panda
0a054cc651 Merge pull request #858 from willingc/post855-edits
Reflow text and minor edits following PR #855
2016-11-11 09:54:14 -08:00
Carol Willing
348af48d45 Merge pull request #863 from minrk/checklist-checklist
Make the release checklist a GFM checklist
2016-11-11 09:31:47 -08:00
Min RK
4d03c00dab Make the release checklist a GFM checklist
so we can paste into a new issue when preparing for a release
2016-11-11 09:14:07 -08:00
Min RK
7a71074a55 Merge pull request #860 from willingc/release-checklist
Add a high-level release checklist
2016-11-11 08:23:12 -08:00
Carol Willing
5527a3e7dd Fix spacing 2016-11-11 07:39:23 -08:00
Carol Willing
f961800fa4 Add troubleshoot command per @parente review 2016-11-11 07:37:43 -08:00
Peter Parente
adbf961433 Merge pull request #859 from willingc/contrib-thanks
Update contributor thank you list
2016-11-11 07:30:02 -08:00
Carol Willing
73e130cb2c Add initial issue template 2016-11-11 07:03:05 -08:00
Carol Willing
a44f178b64 Fix typo 2016-11-11 03:56:42 -08:00
Carol Willing
057fe32e3b Add release checklist 2016-11-11 03:54:33 -08:00
Carol Willing
cad9ffa453 Update contributor thank you list 2016-11-11 03:29:42 -08:00
Carol Willing
a11193a240 Reflow text and minor edits 2016-11-11 03:13:51 -08:00
Carol Willing
ea61a580b3 Merge pull request #855 from yuvipanda/limits-env
Add docs for the LIMIT_ and GUARANTEE_ conventions
2016-11-11 02:43:05 -08:00
Min RK
0bf6db92dd typo in example 2016-11-10 17:07:48 -08:00
YuviPanda
b0f38e7626 Fix docs to match reality 2016-11-10 14:38:09 -08:00
YuviPanda
0f237f28e7 Rename the env variables
Match the traitlet names
2016-11-10 14:37:50 -08:00
YuviPanda
d63bd944ac Add clarifying comment about limit / guarantee env variables 2016-11-10 10:39:44 -08:00
YuviPanda
54e28d759d Some inline doc fixups 2016-11-10 10:31:04 -08:00
YuviPanda
a00c13ba67 Set allow_none=True for limit/guarantee floats 2016-11-09 09:41:54 -08:00
YuviPanda
b4bc5437dd Set allow_none = True as default for MemorySpecification 2016-11-08 22:43:47 -08:00
Min RK
13bc0397f6 Merge pull request #767 from willingc/upgrade723
Add document on upgrading JupyterHub and its db
2016-11-08 18:13:27 -08:00
YuviPanda
9eb30f6ff6 Add resource limits / guarantees consistently to jupyterhub
- Allows us to standardize this on the spawner base class,
  so there's a consistent interface for different spawners
  to implement this.
- Specify the supported suffixes and various units we accept
  for memory and cpu units.
- Standardize the way we expose resource limit / guarantees
  to single-user servers
2016-11-08 17:17:10 -08:00
YuviPanda
17f20d8593 Add docs for the LIMIT_ and GUARANTEE_ conventions
https://github.com/jupyterhub/jupyterhub/issues/854 has
rationale for why, and links to PRs.
2016-11-08 16:19:25 -08:00
Carol Willing
cd23e086a8 Add an upgrade checklist 2016-11-08 12:04:57 -08:00
Carol Willing
03087f20fe Add additional database content from @minrk review 2016-11-08 11:51:42 -08:00
Carol Willing
f536eb4629 Change title 2016-11-08 10:50:49 -08:00
Carol Willing
f3e814aa8a Minor edits 2016-11-08 10:50:49 -08:00
Carol Willing
5fb0a6dffe Add note on databases 2016-11-08 10:50:49 -08:00
Carol Willing
c7ba86d1d8 Add upgrade instructions 2016-11-08 10:50:49 -08:00
Carol Willing
38dcc694b7 Add shutdown and upgrade steps 2016-11-08 10:50:49 -08:00
Carol Willing
fdfffefefa Update process steps 2016-11-08 10:50:49 -08:00
Carol Willing
4e7704afd9 Edit heading levels 2016-11-08 10:50:49 -08:00
Carol Willing
b52fcf4936 Add structure to upgrading doc 2016-11-08 10:50:49 -08:00
Carol Willing
539be2f08e Add basics for alembic 2016-11-08 10:50:49 -08:00
Carol Willing
29b2836c50 Add wip upgrade doc 2016-11-08 10:50:49 -08:00
Min RK
3a757d003a Merge pull request #852 from parente/use-conda-forge
[WIP] Update Dockerfile
2016-11-08 09:58:36 -08:00
Peter Parente
236802be1f Update Dockerfile
* Use nodejs, CHP from condaforge
* Bump the version of conda used
2016-11-07 18:46:04 -08:00
Carol Willing
4a2c9e97c6 Merge pull request #844 from willingc/secure-doc
Reflow text in websecurity doc
2016-11-01 15:15:16 -07:00
Carol Willing
0444d8465c Reflow text in doc 2016-11-01 14:27:49 -07:00
Carol Willing
faef34e4ff Merge pull request #838 from minrk/ensure-strings
quotes around single-user CLI args
2016-11-01 14:05:56 -07:00
Carol Willing
c174ec42f0 Merge pull request #842 from minrk/generate-path-error
finish error message when generate-config path does not exist
2016-11-01 09:26:52 -07:00
Min RK
d484728de9 check directory existence when writing config file
rather than file

and put output on stderr with exit message
2016-11-01 14:47:44 +01:00
Min RK
7da7f7e074 quotes around single-user CLI args
avoids mishandling things such as integer-literals
2016-11-01 12:07:25 +01:00
Min RK
53bdcd7d74 Merge pull request #840 from parente/clear-services-cookie
Fix jupyter-services cookie reset on logout
2016-10-31 13:25:43 +01:00
Peter Parente
1849964699 Fix jupyter-services cookie reset on logout
It currently remains set after logout from the hub allowing the user to
continue to access any services.
2016-10-30 22:36:31 -04:00
Carol Willing
5163c7a97f Merge pull request #824 from minrk/allow-empty-state
Don't assume empty state means not running
2016-10-27 08:33:54 -07:00
Min RK
b9daef9947 docstring review 2016-10-27 11:41:23 +02:00
Carol Willing
f16e0488ab Merge pull request #837 from Scrypy/issue-821
Updated authenticators and spawner docs
2016-10-26 15:44:09 -07:00
Daniel Martinez
adc16be4dc Updated spawners docs 2016-10-26 16:50:25 -05:00
Daniel Martinez
3e4b4149de Updated authenticators docs 2016-10-26 16:48:15 -05:00
Min RK
c392bae7e4 Merge pull request #835 from willingc/check-return
Edit model check to be consistent for user and group
2016-10-26 23:25:24 +02:00
Carol Willing
2e5373aa37 Edit model check to be consistent for user and group 2016-10-26 12:03:53 -07:00
Min RK
5412cd414f Merge pull request #832 from willingc/replace-warn
Use warning instead of warn for logs
2016-10-26 13:26:41 +02:00
Carol Willing
d957c5158f Use warning instead of warn for logs 2016-10-26 04:06:29 -07:00
Carol Willing
4a622cb964 Merge pull request #831 from jupyterhub/willingc-patch-1
Remove duplicate word in docstring
2016-10-26 02:24:39 -07:00
Carol Willing
69e721de46 Remove duplicate word in docstring 2016-10-26 02:19:49 -07:00
Carol Willing
f3f130f452 Merge pull request #830 from minrk/services-todo
Flesh out custom services examples
2016-10-26 02:16:39 -07:00
Min RK
fd4a04e3f3 docs review 2016-10-26 10:22:54 +02:00
Min RK
85c040ab8e flesh out custom services doc 2016-10-25 13:28:13 +02:00
Min RK
2bb4cd4739 allow HubAuthenticated to check groups 2016-10-25 13:27:57 +02:00
Min RK
4c3b134f10 add flask whoami service
for a non-tornado example
2016-10-25 13:24:46 +02:00
Carol Willing
bb8536b553 Merge pull request #826 from Scrypy/issue-822
Updated spawner docs
2016-10-24 23:21:00 -07:00
Carol Willing
8998fd480c Merge pull request #829 from Todd-Z-Li/issue-823
Added funky ascii art to previous TODO messages.
2016-10-24 18:40:25 -07:00
Carol Willing
d948fed0b5 Merge pull request #828 from temogen/deldoc
Deleted IPython from howitworks doc.
2016-10-24 18:38:17 -07:00
Daniel Anthony Noventa
fcfe6314ac Delted IPython from howitworks docs. 2016-10-24 19:13:57 -05:00
Todd
dcfe2aa792 Added funky ascii art to previous TODO messages. 2016-10-24 19:03:21 -05:00
Danowsky
85790ab9d8 Updated spawner docs 2016-10-24 18:57:17 -05:00
Min RK
adda2fcd90 Don't assume empty state means not running
Some Spawners may not need state,
and they should be allowed to resume on Hub restart as well.

Adds some detail about when .poll may be called and how it should behave in less obvious circumstances
2016-10-21 16:28:40 +02:00
Min RK
5604e983db Merge pull request #818 from minrk/unmanaged-no-start
don’t try to start unmanaged services
2016-10-19 10:44:14 +02:00
Min RK
386563a10a don’t try to start unmanaged services 2016-10-18 16:18:03 +02:00
Min RK
0e3c5cf625 statsd typo 2016-10-18 16:17:49 +02:00
Min RK
a3eb2d2b9a Merge pull request #815 from kinuax/fix-setting-in-configuration-example
Fix setting in configuration example
2016-10-14 13:03:45 +02:00
Asier
b6a8860a44 Fix setting in configuration example 2016-10-13 13:45:23 -05:00
Carol Willing
b8a649ae86 Add error message when generate config path does not exist 2016-10-13 07:20:38 -07:00
Min RK
7774bfc612 Merge pull request #811 from willingc/quick-install
Sync quick install steps with PyData tutorial
2016-10-13 10:56:55 +02:00
Carol Willing
9f76613aed Sync quick install steps with PyData tutorial 2016-10-12 18:06:11 -07:00
Min RK
f1ccbe4bed Merge pull request #807 from willingc/normalize-whitelist
Add tests for username normalization
2016-10-12 16:21:19 +02:00
Carol Willing
668d78f729 Add tests for username normalization 2016-10-11 16:44:24 -07:00
Min RK
0009b9a3d6 Merge pull request #805 from danielballan/template-vars
MNT: Add hub host and prefix to template vars in prep for JLab extension
2016-10-11 18:18:21 +02:00
danielballan
b2be07ea6a MNT: Add hub host and prefix to template vars in prep for JLab extension. 2016-10-11 11:27:50 -04:00
Min RK
74649eaad0 Merge pull request #804 from willingc/ssl-termination
Clarify deprecation of --no-ssl
2016-10-11 12:08:55 +02:00
Carol Willing
f33086aa13 Clarify deprecation of --no-ssl 2016-10-10 12:05:39 -07:00
Min RK
9c1cd960fc Merge pull request #801 from minrk/warn-about-direct-connect
try to detect and warn about connecting directly to the Hub
2016-10-10 10:36:50 +02:00
Min RK
3a5226ffa0 Merge pull request #802 from minrk/spawn-pending-finish
add User.waiting_for_response
2016-10-07 11:53:04 +02:00
Min RK
96a53f9921 Merge pull request #797 from ianabc/redirection_loop
spawn_pending set too soon causing redirect loop
2016-10-07 11:13:09 +02:00
Min RK
ff92ac9dad more mocking in tests
avoids no_patience state leaking into other tests
2016-10-07 10:59:32 +02:00
Min RK
933478bfff add waiting_for_response indicator on User
.spawn_pending used for the *whole* window, from request to responsive (added to proxy)
.waiting_for_response is just used for the window between Spawner.start returning (process started, http endpoint known) and http endpoint becoming responsive

.waiting_for_response will never be True while .spawn_pending is False
2016-10-07 10:59:05 +02:00
Min RK
7d996f91b0 try to detect and warn about connecting directly to the Hub
This is guaranteed to result in a redirect loop.
2016-10-07 10:16:21 +02:00
Min RK
c818cbb644 Merge pull request #799 from willingc/doc-install
Move README installation instructions to docs
2016-10-06 19:46:51 +02:00
Carol Willing
e638e5b684 Move README installation instructions to docs 2016-10-06 04:37:57 -07:00
Ian Allison
625e76ea40 spawn_pending set too soon causing redirect loop
Signed-off-by: Ian Allison <iana@pims.math.ca>
2016-10-05 13:28:52 -07:00
Min RK
f8229c9fb6 Merge pull request #793 from willingc/slimconfpy
Slim conf.py comments and options cruft
2016-10-04 15:04:32 +02:00
Min RK
47da422a93 Merge pull request #758 from willingc/update-changes
Add changes for 0.7 release
2016-10-04 14:47:00 +02:00
Carol Willing
3dd98bc0fc Slim conf.py comments and options cruft 2016-10-04 05:28:03 -07:00
Carol Willing
fa6e4aa449 Add pr 789 deprecate --no-ssl 2016-09-30 09:02:58 -07:00
Carol Willing
182472f921 Changes per @minrk review 2016-09-30 08:57:35 -07:00
Carol Willing
d99afe531d Add changes for 0.7 release 2016-09-30 08:57:35 -07:00
Carol Willing
b6b238073f Merge pull request #789 from minrk/deprecate-no-ssl
Deprecate `--no-ssl`
2016-09-30 08:42:07 -07:00
Min RK
a4c696d3bd Merge pull request #788 from willingc/warehouse
Update link to docs
2016-09-30 17:03:34 +02:00
Min RK
bce767120c Merge pull request #785 from willingc/devclarity
Clarify docstring
2016-09-30 16:58:23 +02:00
Min RK
6a9f346b21 Deprecate --no-ssl
it's unnecessarily pedantic. Just warn instead.
2016-09-30 16:16:33 +02:00
Carol Willing
d4646e1caa Update link 2016-09-28 20:54:57 -07:00
Carol Willing
77f0e00695 Clarify docstring 2016-09-28 07:36:29 -07:00
Carol Willing
26a6c89b3a Merge pull request #778 from minrk/shutdown-services
cleanup managed services in shutdown
2016-09-27 09:53:50 -07:00
Carol Willing
34297b82b3 Merge pull request #777 from minrk/service-cookie
Work on service authentication
2016-09-27 09:53:12 -07:00
Carol Willing
70727c4940 Merge pull request #776 from minrk/cleanup-on-start
remove stopped users from proxy on startup
2016-09-27 09:51:01 -07:00
Min RK
56080e5436 Merge pull request #782 from spoorthyv/master
Updated Logos To Match New Brand Guidelines
2016-09-27 15:41:44 +02:00
spoorthyv
309b1bda75 Updated Logos 2016-09-26 15:56:11 -07:00
Min RK
f3ebb694b4 Merge pull request #780 from minrk/travis-no-verbose-pip
remove -v from pip install on travis
2016-09-26 17:06:44 +02:00
Min RK
f35c14318a Merge pull request #779 from minrk/docker-cdn
Dockerfile: set debian CDN
2016-09-26 17:06:01 +02:00
Min RK
b60f2e8233 remove -v from pip install on travis
it makes way too much noise
2016-09-26 17:03:51 +02:00
Min RK
f1a55e31ce Dockerfile: set debian CDN
because the default httpredir fails with some regularity

based on info from http://deb.debian.org
2016-09-26 16:58:31 +02:00
Min RK
2432611264 cleanup managed services in shutdown
don’t leave them running
2016-09-26 15:20:34 +02:00
Min RK
729b608eff Fix setting cookie for services
and exercise it in tests
2016-09-26 14:30:00 +02:00
Min RK
eb3252da28 simplify whoami service example
rely on defaults in HubAuthenticated to show how simple it can be
2016-09-26 14:18:54 +02:00
Min RK
a9e9338ee4 get HubAuth defaults from service env variables
allows use of HubAuthenticated without any arguments
2016-09-26 14:13:04 +02:00
Min RK
aad063e3cd remove stopped users from proxy on startup
We already added running users, but we didn't handle removing users from the proxy
if the user's server was stopped (e.g. while the Hub was restarting).
2016-09-26 13:20:42 +02:00
Min RK
be00265d1a Merge pull request #762 from willingc/swagger
Edit descriptions in API spec for user clarity
2016-09-25 14:39:42 +02:00
Min RK
335ba4f453 Merge pull request #771 from willingc/faq-adds
Added navigation links and workshop best practices
2016-09-25 14:38:45 +02:00
Carol Willing
5a4f3a4910 Added navigation links and workshop best practices 2016-09-22 10:02:29 -07:00
Carol Willing
7ee4be0f13 Remove api review notes doc 2016-09-22 09:13:39 -07:00
Carol Willing
10c3fbe5cf Add changes per @minrk 2016-09-22 09:12:26 -07:00
Carol Willing
13826a41a1 Merge pull request #769 from minrk/service-start-yield
service.start is not a coroutine
2016-09-22 03:21:47 -07:00
Min RK
cb35026637 service.start is not a coroutine
don’t yield it
2016-09-22 12:04:31 +02:00
Min RK
24c080cf4a Merge pull request #768 from minrk/service-url
only set service URL env if there's a URL to set
2016-09-22 11:57:44 +02:00
Min RK
e9fc629285 only set service URL env if there's a URL to set
These fields are only relevant for services with a web endpoint
2016-09-21 12:39:07 +02:00
Min RK
150b67c1c9 Merge pull request #761 from willingc/apidocs
Update API docs
2016-09-21 10:34:57 +02:00
Carol Willing
acdee0ac29 Change notes from txt to md 2016-09-19 12:05:26 -07:00
Carol Willing
193b236ef1 Add additional review questions re: API 2016-09-19 11:52:43 -07:00
Carol Willing
1851e6a29d Edit descriptions in API spec for user clarity 2016-09-19 10:49:56 -07:00
Carol Willing
74f086629c Update API docs 2016-09-19 08:42:28 -07:00
Min RK
33a59c8352 Merge pull request #757 from willingc/doc-contrib
Add contributor list to the docs and update the contents
2016-09-19 09:01:54 +02:00
Carol Willing
08644fea74 Add services to index/table of contents 2016-09-18 15:33:01 -07:00
Carol Willing
f878bf6ad3 Add contribution list to documentation 2016-09-18 15:29:54 -07:00
Carol Willing
651c457266 Add contributor list 2016-09-18 15:28:51 -07:00
Carol Willing
2dd3463ea8 Merge pull request #748 from minrk/string-formatting
Deprecate `%U` username substitution
2016-09-18 06:34:01 -04:00
Carol Willing
ad93af8cc8 Merge pull request #749 from minrk/single-user-help-all
exercise single-user help output
2016-09-18 06:33:38 -04:00
Min RK
080cf7a29b exercise single-user help output
and tweak some of its output
2016-09-15 13:04:09 +02:00
Min RK
b8f4803ef4 Deprecate %U username substitution
use Python format-strings instead.
2016-09-15 12:05:46 +02:00
Min RK
4a8f51ed6d Merge pull request #741 from willingc/add-lab
Add info on trying out JupyterLab
2016-09-13 10:31:49 +02:00
Carol Willing
7923074ed5 Add info on trying out JupyterLab 2016-09-12 22:22:22 -07:00
Min RK
834b2ba77d Merge pull request #739 from jupyterhub/fix-readme-1
Add --no-ssl to docker run command in README
2016-09-10 10:55:41 +02:00
Yuvi Panda
7897a13ca5 Add --no-ssl to docker run command
Otherwise this doesn't run by default, and someone in gitter ran into this earlier.
2016-09-09 10:57:19 -07:00
Min RK
7987011372 Merge pull request #738 from willingc/inspired-zulip
Add navigation to README
2016-09-09 13:38:22 +02:00
Min RK
d7a76077bd Merge pull request #734 from minrk/deprecated-local-spawner-subclasses
backward-combat for ip, port in LocalProcessSpawner subclasses
2016-09-09 13:37:58 +02:00
Min RK
62731cf489 Merge pull request #727 from willingc/servicespec
Edit Services document
2016-09-09 10:29:10 +02:00
Carol Willing
5d501bc465 Add navigation to README 2016-09-08 22:41:44 -07:00
Kyle Kelley
63a6841848 Merge pull request #737 from willingc/issue438
Add info on configuring pySpark executors on YARN
2016-09-08 17:59:24 -05:00
Carol Willing
403241bd98 Add reference to official pySpark docs 2016-09-08 15:28:54 -07:00
Carol Willing
de3fe88df6 Fix code indentation for markdown 2016-09-08 15:11:25 -07:00
Carol Willing
6a370286e1 Add info on setting pySpark executors on YARN 2016-09-08 15:09:20 -07:00
Carol Willing
491b7e7d11 Use Hub-Managed and Externally-Managed 2016-09-08 08:23:47 -07:00
Min RK
0b0db97117 Merge pull request #728 from willingc/cull-idle
Add readme to cull-idle example to demonstrate managed services
2016-09-08 16:57:16 +02:00
Min RK
42a993fd08 backward-combat for ip, port in LocalProcessSpawner subclasses
Subclasses prior to 0.6 may assume return value
of LocalProcessSpawner.start can be ignored
instead of passing it through.

For these cases, keep setting ip/port in the deprecated way
so that it still works with a warning,
rather than failing with the wrong port.
2016-09-08 16:54:52 +02:00
Carol Willing
fd1544bf41 Edits per @minrk's review 2016-09-08 07:16:25 -07:00
Carol Willing
ed36207328 Merge pull request #731 from willingc/issue654
Add config for default URL to FAQ
2016-09-08 07:05:56 -07:00
Carol Willing
a0b8ccf805 Add config for whole filesystem access and user home directory as default 2016-09-08 06:54:23 -07:00
Min RK
9d2278d29b Merge pull request #733 from willingc/issue594
Add troubleshooting info about sudospawner
2016-09-08 14:51:57 +02:00
Min RK
df42385d7e Merge pull request #732 from willingc/issue632
Add info on updates and Qualsys SSL analyzer to docs
2016-09-08 14:51:42 +02:00
Min RK
02796d4daa Merge pull request #730 from willingc/issue661
Add install instructions with no network to FAQ
2016-09-08 14:50:44 +02:00
Carol Willing
80c5f67335 Add troubleshooting info about sudospawner 2016-09-08 00:57:17 -07:00
Carol Willing
0b14e89404 Add info on updates and Qualsys SSL analyzer to docs 2016-09-07 22:00:33 -07:00
Carol Willing
f595b1ad59 Add clarification re: run on hub not each single user server 2016-09-07 21:21:10 -07:00
Carol Willing
80ca1eacc5 Add install instructions with no network to FAQ 2016-09-07 21:06:56 -07:00
Carol Willing
5b3ac6c840 Add readme to cull-idle example 2016-09-07 14:01:46 -07:00
Carol Willing
0000b7447a Make command consistent with examples/cull-idle 2016-09-07 13:52:33 -07:00
Carol Willing
a22060ca7f Edit Services document 2016-09-07 11:39:15 -07:00
Min RK
8ca321ecc3 Merge pull request #705 from minrk/actual-services
WIP: implement services API
2016-09-07 13:43:54 +02:00
Min RK
862cb3640b Merge pull request #722 from minrk/setuptools-no-egg
always install with setuptools
2016-09-07 13:38:06 +02:00
Min RK
51908c9673 clarifications from review 2016-09-07 13:19:09 +02:00
Min RK
9aa4046093 always install with setuptools
but not eggs (effectively require pip install .)
2016-09-05 15:46:20 +02:00
Min RK
acb49adfea Merge pull request #719 from Mistobaan/patch-1
fix docker repository
2016-09-05 10:38:12 +02:00
Fabrizio Milo
f345ad5422 fix docker repository 2016-09-02 14:45:16 -07:00
Min RK
5ad618bfc1 add API endpoint for services 2016-09-02 15:19:45 +02:00
Min RK
26b00578a1 remove redundant user_url utility
public_url works for users now
2016-09-02 13:22:49 +02:00
Min RK
c3111b04bb support services subdomain
- all services are on the 'services' domain, share the same cookie
2016-09-02 13:21:46 +02:00
Min RK
a61ba74360 Merge pull request #717 from minrk/hubauth-defaults
HubAuth login_url changes:
2016-09-02 12:05:17 +02:00
Min RK
4de93fd1d5 Merge pull request #718 from willingc/sdist-one
Remove zip from sdist build per PEP 527
2016-09-02 11:45:44 +02:00
Min RK
46bb7b05f4 strict host matching by including / 2016-09-02 11:44:51 +02:00
Carol Willing
1aa2cb1921 Remove zip from sdist build per PEP 527 2016-09-01 07:33:10 -07:00
Min RK
c4bfa63fd6 allow full URLs for login redirects iff they are for our host 2016-09-01 15:10:02 +02:00
Min RK
4c5d6167bd use just path for default hub auth login_url 2016-09-01 15:07:00 +02:00
Min RK
9a002c2445 update services doc with some feedback 2016-09-01 15:01:02 +02:00
Min RK
f97d32c5bd add services to the proxy
and start test coverage
2016-09-01 14:46:34 +02:00
Min RK
bac311677f Merge pull request #711 from willingc/update-change
Update changelog format
2016-08-29 12:01:08 +02:00
Carol Willing
94cb5b3a05 Update changelog format 2016-08-29 02:39:39 -07:00
Carol Willing
ed4f0ba014 Merge pull request #707 from willingc/mytheme
Update conda env and conf.py for clean build
2016-08-28 10:42:49 -07:00
Carol Willing
fd219b5fff Update conda env and conf.py for clean build 2016-08-28 10:08:00 -07:00
Min RK
140c4f2909 use services API in cull-idle example 2016-08-27 13:23:45 +02:00
Min RK
a1c787ba5f basic implementation of managed services
- managed services are automatically restarted
- proxied services not there yet
2016-08-27 12:59:26 +02:00
Min RK
54c808fe98 Service specification document 2016-08-26 17:25:53 +02:00
Min RK
eaeec9f19b Merge pull request #693 from willingc/doc-revise
Documentation refresh
2016-08-24 23:05:54 +02:00
Min RK
21d25ac130 Merge pull request #689 from minrk/log-add-user-error
log errors adding users already in db
2016-08-21 22:19:39 +02:00
Min RK
eda21642bd log errors adding users already in db
avoids removal of system users preventing Hub startup
2016-08-21 22:07:46 +02:00
Carol Willing
aace54d5b2 Merge pull request #699 from jhamrick/swarm-docs
Remove link to SwarmSpawner
2016-08-19 20:41:18 -07:00
Jessica B. Hamrick
e460c00759 Remove link to SwarmSpawner 2016-08-20 02:02:08 +01:00
Carol Willing
678fd1cd08 Shorten name 2016-08-18 10:36:40 -07:00
Carol Willing
42c78f3c43 Drop back to old environment 2016-08-18 10:20:57 -07:00
Carol Willing
548e0f6153 Edits to technical overview 2016-08-18 09:58:37 -07:00
Carol Willing
31f63c737f Add image of JupyterHub parts to index 2016-08-18 09:15:48 -07:00
Carol Willing
71b35602d7 Edit grammar in index 2016-08-18 08:36:46 -07:00
Carol Willing
7c41a024ba Fix typo 2016-08-18 05:05:46 -07:00
Carol Willing
51097de43d Update contents format 2016-08-18 04:52:51 -07:00
Carol Willing
44e16d538d Edit and corrections 2016-08-18 04:52:22 -07:00
Carol Willing
f6517d01db Move 'Using API' to user guide 2016-08-18 04:51:48 -07:00
Carol Willing
039b925cf6 Edit config-examples 2016-08-18 04:50:11 -07:00
Carol Willing
bba5460236 Simplify formating of troubleshooting doc 2016-08-18 04:49:30 -07:00
Carol Willing
e5d3705a1a Edit headings for authenticators and spawners docs 2016-08-18 04:48:43 -07:00
Carol Willing
7b80b95a49 Add checks for spelling 2016-08-18 04:47:21 -07:00
Carol Willing
75cb487ab3 Update conf 2016-08-17 15:11:57 -07:00
Carol Willing
eba4b3e8c7 More doc edits 2016-08-17 15:11:17 -07:00
Carol Willing
712b895d8e WIP refresh 2016-08-15 19:18:38 -07:00
Carol Willing
635fd9b2c3 Fix typo 2016-08-15 18:50:26 -07:00
Min RK
afcbdd9bc4 Merge pull request #678 from vilhelmen/swagger_fix
Swagger spec conformance
2016-08-04 13:06:00 +02:00
Will Starms
80fa5418b7 Fix missing description for responce 2016-08-03 16:59:14 -05:00
Will Starms
b0a09c027d Fix invalid type bool->boolean 2016-08-03 16:57:17 -05:00
Kyle Kelley
4edf59efeb Merge pull request #675 from minrk/api-info
Add /api/ and /api/info endpoints
2016-08-02 22:26:10 -05:00
Min RK
9f0dec1247 ignore generated rest-api html 2016-08-01 15:16:26 +02:00
Min RK
2c47fd4a02 Add /api/ and /api/info endpoints
/api/ is not authenticated, and just reports JupyterHub's version for now.
/api/info is admin-only, and reports more detailed info about Python, authenticators/spawners in use, etc.
2016-08-01 15:15:59 +02:00
Min RK
9878f1e32d Document parameters to shutdown API 2016-08-01 15:12:05 +02:00
Min RK
5c396668ff Merge pull request #671 from vilhelmen/swagger_fix
Fix timestamp type in API spec
2016-08-01 13:39:10 +02:00
Min RK
5f12f9f2c3 Merge pull request #667 from vilhelmen/master
Proxy will no longer recieve Hub's SIGINT
2016-08-01 11:04:39 +02:00
Will Starms
4974775cd9 Fix timestamp type 2016-07-31 19:23:59 -05:00
Will Starms
0cb777cd0f Switch to start_new_sesstion 2016-07-29 13:43:09 -05:00
Min RK
a4bb25a75f Merge pull request #604 from minrk/service-token
add Services to db
2016-07-29 10:32:15 +02:00
Min RK
b3f117bc59 Merge pull request #669 from vilhelmen/swagger_fix
Fix invalid license object and bad JSON pointers in API spec
2016-07-29 10:25:39 +02:00
Will Starms
499ba89f07 Correct invalid JSON pointers 2016-07-28 22:25:38 -05:00
Will Starms
05d743f725 Correct invalid license object in API spec 2016-07-28 22:19:05 -05:00
Carol Willing
a347d56623 Merge pull request #668 from willingc/toc-tweak
Minor additions to work done by @iamed18 in PR#602
2016-07-28 14:33:36 -07:00
Carol Willing
172976208e Minor additions to work done by @iamed18 in PR#602 2016-07-28 14:27:19 -07:00
Carol Willing
b6db3f59a2 Merge pull request #602 from iamed18/master
Added nginx reverse proxy example to GettingStarted.md
2016-07-28 14:09:31 -07:00
Carol Willing
4b31279fc8 Merge branch 'iamed18-master'
Closes #509
2016-07-28 14:01:29 -07:00
Edward Leonard
bfef83cefc separated configuration examples into their own document
Merge conflict resolved by @willingc
2016-07-28 13:58:20 -07:00
Edward Leonard
07d599fed2 added code-block ends
forgot them in last commit
2016-07-28 13:56:15 -07:00
Edward Leonard
0412407558 added example config with nginx reverse proxy 2016-07-28 13:56:15 -07:00
Edward Leonard
4c568b46d6 separated configuration examples into their own document 2016-07-28 14:17:51 -05:00
Michael Milligan
d92fcf5827 batchspawner URL change 2016-07-28 13:54:34 -05:00
Will Starms
36f3abbfc7 Proxy will no longer recieve Hub's SIGINT #665 2016-07-28 13:04:55 -05:00
Min RK
49a45b13e6 debug installation on travis 2016-07-28 17:23:44 +02:00
Min RK
dfa13cb2c5 avoid creating duplicate users in test_api
now that we check!
2016-07-28 17:23:44 +02:00
Min RK
fd3b959771 add api_tokens.service_id column with alembic 2016-07-28 17:23:44 +02:00
Min RK
39a80edb74 async fixes in test_init_tokens 2016-07-28 17:23:44 +02:00
Min RK
2a35d1c8a6 add service API tokens
service_tokens supersedes api_tokens,
since they now map to a new services collection,
rather than regular Hub usernames.

Services in the ORM have:

- API tokens
- servers (multiple, can be 0)
- pid (0 if not managed)
2016-07-28 17:23:44 +02:00
Min RK
81350322d7 Merge pull request #660 from willingc/remove-badge
Remove requires.io badge
2016-07-26 12:02:33 +02:00
Min RK
50c2528359 Merge pull request #659 from willingc/fix-restlink
Remove link and reflow text
2016-07-26 12:02:24 +02:00
Min RK
77bac30654 Merge pull request #650 from minrk/return-ip-port
return (ip, port) from Spawner.start
2016-07-26 12:02:13 +02:00
Carol Willing
41fafc74cf Merge pull request #662 from mwmarkland/master
Fix typo regarding user's interactions with PATH
2016-07-25 17:58:48 -07:00
Matthew Markland
c6281160fa Fix typo regarding user 2016-07-25 14:55:17 -05:00
Min RK
3159b61ae7 return (ip, port) from Spawner.start
removes the need for Spawners to set db state themselves in most cases

Should be backward-compatible with warnings.
2016-07-25 16:54:15 +02:00
Carol Willing
11278ddb26 Remove requires.io badge 2016-07-25 07:45:34 -07:00
Carol Willing
e299a6c279 Remove link and reflow text 2016-07-25 07:41:28 -07:00
Min RK
22ff5f3d91 Merge pull request #635 from minrk/traitlets-4.2-singleuser
use traitlets 4.2 API in singleuser script
2016-07-25 16:29:07 +02:00
Carol Willing
a3e8bd346f Merge pull request #656 from minrk/rest-api-docs
Add REST API to docs
2016-07-25 07:09:16 -07:00
Min RK
592a084a28 set API token in single-user-spawner test 2016-07-25 15:57:43 +02:00
Min RK
c27e59b0f9 better exit message if JPY_API_TOKEN is undefined. 2016-07-25 15:27:32 +02:00
Min RK
1c9bc1b133 traitlets 4.2 API in singleuser script 2016-07-25 15:27:32 +02:00
Min RK
be4f4853cf Merge pull request #655 from willingc/doc-rest
Add links to REST API docs
2016-07-25 10:51:08 +02:00
Carol Willing
7d8895c2fb Add links to swagger docs for REST API 2016-07-23 18:47:23 -07:00
Min RK
5b8913be5b install nodejs with conda on RTD 2016-07-23 12:23:30 +02:00
Min RK
d03a1ee490 build rest-api on RTD 2016-07-23 12:05:50 +02:00
Min RK
19ae38c108 add REST API to docs
include local build, even though it's not as nice as petstore.
Due the that, link to petstore as well.
2016-07-23 12:05:25 +02:00
Carol Willing
9b71f11213 Merge pull request #651 from minrk/check-hub-ip
more informative error if single-user server can't connect to Hub for auth
2016-07-22 07:30:27 -07:00
Min RK
8fbaedf4d7 more informative error if single-user server can't connect to Hub for auth
error message points to hub_ip setting if Hub doesn't appear to be accessible at 127.0.0.1
2016-07-22 15:35:24 +02:00
Min RK
87ab07b322 Merge pull request #646 from datapolitan/fix_juptyter
fixing start_proxy() that misspelled name of the project
2016-07-18 22:05:22 -07:00
Richard Dunks
f36a1e10e6 fixing start_proxy() that misspelled name of the project 2016-07-17 23:23:32 -04:00
Carol Willing
5944671663 Merge pull request #644 from JamiesHQ/doctypo
Fix link
2016-07-16 11:21:55 -05:00
Jamie W
27dfd0edca fix link 2016-07-16 11:18:14 -05:00
Min RK
9dfc043352 Merge pull request #639 from ryanlovett/patch-1
Correct Spawner.start typo
2016-07-13 17:10:17 -05:00
Min RK
e8bd1520b2 Merge pull request #640 from minrk/travis-pre-for-nathaniel
install dependencies with pre
2016-07-13 17:10:03 -05:00
Min RK
a30b9976f5 install dependencies with pre
to catch bugs introduced by dependencies during prerelease
2016-07-13 16:19:15 -05:00
Ryan Lovett
954e5b3d5e Correct Spawner.start typo
As documented at https://github.com/jupyterhub/jupyterhub/blob/master/jupyterhub/spawner.py#L103
2016-07-13 10:23:16 -07:00
Min RK
7cd8aa266b Merge pull request #634 from minrk/cleanup-after-yourself
cleanup servers, api tokens after spawner shutdown
2016-07-11 14:29:20 -05:00
Min RK
d0449d136c cascade on API token delete 2016-07-11 10:44:55 -05:00
Min RK
ff9aeb70b4 try ondelete=SET NULL in foreign keys 2016-07-09 12:13:04 +02:00
Min RK
2eaecd22ba cleanup servers, api tokens after spawner shutdown
prevents growing table of unused servers and tokens
2016-07-08 16:50:43 +02:00
Carol Willing
4801d647c1 Merge pull request #627 from minrk/alembic-util
allow running alembic with `python -m jupyterhub.dbutil`
2016-07-01 17:17:54 -07:00
Carol Willing
b7e6fa3abe Merge pull request #626 from minrk/check-permissions
Add a permissions-check hint when spawn fails with PermissionError
2016-07-01 17:02:37 -07:00
Min RK
d590024c47 allow running alembic with python -m jupyterhub.dbutil
since we only have generated alembic.ini, present a command that generates one and uses it.

enables generating new revisions with:

    python -m jupyterhub.dbutil revision -m msg
2016-07-01 14:38:31 +02:00
Min RK
f3f71c38c3 Merge pull request #620 from Fokko/fd-add-badge
Added requirements badge
2016-07-01 14:37:26 +02:00
Min RK
27125a169c Merge pull request #621 from minrk/user-redirect-handler
Add /user-redirect/ endpoint
2016-07-01 14:37:00 +02:00
Min RK
3f9205d405 Add a permissions-check hint when spawn fails with PermissionError 2016-07-01 14:36:34 +02:00
Carol Willing
96861dc2b0 Merge pull request #622 from minrk/getting-started-log
update log instructions in getting started
2016-06-24 08:52:31 -07:00
Min RK
cedaa184f1 update log instructions in getting started
use recommended output-piping instead of nonexistent log_file config
2016-06-24 17:15:50 +02:00
Fokko Driesprong
f491791081 Added requirements badge 2016-06-24 16:17:51 +02:00
Min RK
6bba1c474f Add /user-redirect/ endpoint
should avoid needing to cram user-detection / intent into other endpoints.
That functionality isn't removed,
but warnings are added indicating that /user-redirect/ should be used instead.
2016-06-24 16:08:30 +02:00
Carol Willing
357f6799b0 Merge pull request #613 from minrk/user-redirect-560
Finish up cross-user redirects
2016-06-16 08:32:03 -07:00
Carol Willing
ce3ea270f5 Merge pull request #612 from minrk/doc-links
fix links to authenticator/spawner pages from howitworks
2016-06-16 08:28:56 -07:00
Min RK
992717adc0 support cross-user redirects when JupyterHub is on a prefix 2016-06-16 15:42:00 +02:00
Min RK
993101710f fix links to authenticator/spawner pages from howitworks 2016-06-16 15:00:19 +02:00
Matthias Bussonnier
ac6fe61804 Merge pull request #609 from minrk/only-relevant-warning
hide http warning until it's relevant
2016-06-14 09:42:24 -07:00
Min RK
37aa1a291a Merge pull request #606 from minrk/rm-hub-prefix-option
disable hub_prefix config
2016-06-13 12:08:58 +02:00
Min RK
c6294f2763 Merge pull request #607 from Carreau/fix-bad-security-anchor-link
Fix bad anchor
2016-06-13 12:08:34 +02:00
Min RK
6e9a77f55f hide http warning until it's relevant
avoids flash of invalid warning when everything is correct
2016-06-13 12:07:52 +02:00
Min RK
799b407d89 Merge pull request #608 from Carreau/add-ssl-frontend-warning
Add a warning on login if page not over ssl.
2016-06-13 12:00:02 +02:00
Matthias Bussonnier
3ddfa5f939 Add a warning on login if page not over ssl.
The --no-ssl option in the backend make sens, but still too many
deployment are not over SSL because they underestimate / do not
understand the risks.
2016-06-12 13:24:46 -07:00
Matthias Bussonnier
5968661742 Fix bad anchor 2016-06-11 12:09:00 -07:00
Dara Adib
34592e3da5 Process single-user server redirects
Follow-up to #448.

If single-user notebook is running, it will redirect other
users to hub root with next argument, which was previously
ignored.
2016-06-10 17:15:48 +02:00
Min RK
5aea7eda96 disable hub_prefix config
it shouldn't be configurable
2016-06-10 17:14:47 +02:00
Edward Leonard
08024be1c0 added code-block ends
forgot them in last commit
2016-06-06 22:07:10 -05:00
Edward Leonard
39daff3099 added example config with nginx reverse proxy 2016-06-06 22:05:27 -05:00
Min RK
d4c0fe8679 Merge pull request #597 from minrk/single-user-service-auth
use HubAuth in single-user server
2016-06-06 13:31:40 +02:00
Min RK
c9ae45bef3 Merge pull request #599 from minrk/groups
Add groups
2016-06-04 21:22:29 +02:00
Min RK
503f21fd37 allow initializing groups from config
c.JupyterHub.load_groups creates groups and adds users to them.

It *does not* remove users from groups added previously.
2016-06-01 14:35:34 +02:00
Min RK
6d106b24f4 add groups API 2016-06-01 14:04:32 +02:00
Min RK
71f47b7a70 add user groups 2016-06-01 13:47:53 +02:00
Min RK
844381e7c9 use HubAuthenticated in jupyterhub-singleuser 2016-05-31 13:20:21 +02:00
Min RK
267994b191 move singleuser script into the package 2016-05-31 12:59:38 +02:00
Min RK
cc2202c188 Merge pull request #554 from minrk/service-auth
Add HubAuth for authenticating services with JupyterHub
2016-05-31 12:58:51 +02:00
Min RK
4996a84ca0 Merge pull request #596 from minrk/hub-prefix-traitlet
fix _hub_prefix_changed signature
2016-05-31 12:58:37 +02:00
Min RK
3cefc2951c fix _hub_prefix_changed signature
wasn't update for new traitlets API

c/o @Milly
2016-05-31 11:33:12 +02:00
Min RK
835b4afc06 Merge pull request #593 from minrk/redirect-typo
only strip base_url if it's actually there
2016-05-31 11:32:42 +02:00
Min RK
146bef1d88 test hub-authenticated tornado handler 2016-05-30 13:32:10 +02:00
Min RK
ef9656eb8b add example service 2016-05-30 13:32:10 +02:00
Min RK
84868a6475 add login_url to HubAuth
needed for tornado redirects. Still not sure the best way to pass it to tornado app settings.
2016-05-30 13:32:10 +02:00
Min RK
9e9c6f2761 document services.auth 2016-05-30 13:32:10 +02:00
Min RK
19e8bdacfe Add HubAuth for authenticating tornado-based services with JupyterHub
- HubAuth implements request to identify users with the Hub
- HubAuthenticated is a mixin for tornado handlers
2016-05-30 13:32:10 +02:00
Min RK
c6640aa51d only strip base_url if it's actually there 2016-05-30 10:34:33 +02:00
Min RK
1514a2f2e2 ignore .cache 2016-05-27 16:12:54 +02:00
Min RK
9edb282067 Merge pull request #591 from minrk/clean-css-fix
require clean-css 3.4.13
2016-05-27 13:12:09 +02:00
Min RK
9ffe5e6187 require clean-css 3.4.13
fixes node 6 compatibility
2016-05-26 18:31:10 +02:00
Min RK
14662111a8 Merge pull request #508 from minrk/alembic
Use alembic for database migrations
2016-05-26 15:40:44 +02:00
Min RK
a7ea5774d9 test database upgrades with alembic 2016-05-26 15:32:57 +02:00
Min RK
c998458362 include old-jupyterhub.sqlite generated by
I don't like including this, but I don't know a better way to get a starting db
other than doing a complete installation of old JupyterHub in an env.

At least it's small.
2016-05-26 15:32:50 +02:00
Min RK
07ddede40c typo: write db url in alembic 2016-05-26 15:31:49 +02:00
Min RK
b8a6ac62e8 include alembic in package_data 2016-05-26 14:23:10 +02:00
Min RK
86e9a3217c add jupyterhub upgrade-db entry point
don't do automatic upgrades (yet)

I'm not sure if auto upgrades are a good idea or not.
2016-05-26 14:17:41 +02:00
Min RK
f591e6e3fb require alembic 2016-05-26 14:17:41 +02:00
Min RK
64dd1db327 add User.auth_state column
a place for storing authenticator state,
and a simple test case for alembic.
2016-05-26 14:17:41 +02:00
Min RK
b68569f61c init alembic
prepare for database migration
2016-05-26 14:17:40 +02:00
Min RK
3a52e3f4df Merge pull request #589 from minrk/test-with-base-url
Run tests with an encoded base_url
2016-05-26 14:14:18 +02:00
Min RK
05c268e190 Run tests with an encoded base_url
to ensure we get our escaping right

Mostly revealed fixes needed in tests so far, not code,
but should catch regressions.
2016-05-26 13:56:20 +02:00
Carol Willing
98937de278 Merge pull request #586 from jupyterhub/willingc-patch-1
Fix typo in README link
2016-05-25 09:36:41 -07:00
Carol Willing
ff35e3b93e Fix typo in README link
Extra 's' on jupyter-notebook removed.
2016-05-25 09:12:10 -07:00
Carol Willing
4eebc95109 Merge pull request #585 from willingc/link-me
Fix RTD links to PDF
2016-05-25 09:02:39 -07:00
Carol Willing
c708c2a3a0 Fix RTD links to PDF back to org 2016-05-25 08:46:54 -07:00
Kyle Kelley
35f8190128 Merge pull request #584 from willingc/wtd-readme
Edit README based on Write The Docs tips
2016-05-24 13:31:46 -07:00
Carol Willing
78b268ddef Edit README based on Write The Docs tips 2016-05-24 12:40:52 -07:00
Min RK
eb99060a25 Merge pull request #578 from willingc/doc-570
Add docs on chain certificates and configuration re: 570
2016-05-19 08:24:54 +02:00
Carol Willing
8e99f659f5 Fix link 2016-05-18 10:59:04 -07:00
Carol Willing
5c9e9d65b5 Add links to SSL section in docs 2016-05-18 10:52:49 -07:00
Carol Willing
3e768b7297 Add chained cert doc info from @ryanlovett and @LMtx 2016-05-18 10:34:38 -07:00
Kyle Kelley
aa2999210d Merge pull request #572 from PeterDaveHelloKitchen/image-optimize
Losslessly optimize images using Google zopflipng
2016-05-16 09:33:59 -05:00
Peter Dave Hello
be95a27597 optimize images 2016-05-16 21:46:53 +08:00
Kyle Kelley
5edcdd4fb2 Merge pull request #567 from minrk/less-271
require less-2.7.1
2016-05-12 07:12:32 -05:00
Min RK
b81586de0a require less-2.7.1
2.7.0 has compatibility problems with source maps
2016-05-12 10:32:52 +02:00
Carol Willing
e0f3e3b954 Merge pull request #559 from ozancaglayan/doc-fix-apitoken
doc: Add section about API tokens
2016-05-09 05:57:56 -07:00
Ozan Çağlayan
3037d264c3 docs: Fix last two typos 2016-05-05 15:41:38 +03:00
Ozan Çağlayan
17f1346c08 doc: address reviewers comments 2016-05-04 18:15:15 +03:00
Ozan Çağlayan
276aba9f85 doc: Add section about API tokens 2016-05-04 17:35:54 +03:00
Min RK
0ba63c42fd back to dev 2016-05-04 14:09:47 +02:00
Min RK
2985562c2f release 0.6.1 2016-05-04 14:08:39 +02:00
Min RK
754f850e95 changelog for 0.6.1 2016-05-04 14:08:39 +02:00
Min RK
dccb85d225 plural add-users ids 2016-05-04 13:57:16 +02:00
Min RK
a0e401bc87 Merge pull request #551 from minrk/proxy-error
Serve proxy error pages from the Hub
2016-05-04 12:34:10 +02:00
Min RK
c6885a2124 Merge pull request #552 from minrk/poll-and-notify
notice dead servers more often
2016-05-04 12:33:09 +02:00
Min RK
7528fb7d9b notice dead servers more often
call poll_and_notify to ensure triggering of dead-server events in a few places:

- `/hub/home` page view
- user start and stop API endpoints

This should avoid the failure to stop a server that's died uncleanly because the server hasn't noticed yet
2016-05-04 11:07:28 +02:00
Carol Willing
e7df5a299c Merge pull request #556 from minrk/shutdown-all
Add Stop All button to admin page
2016-05-03 05:58:41 -07:00
Min RK
ff997bbce5 Add Stop All button to admin page
for stopping all single-user servers at once
2016-05-03 13:25:12 +02:00
Min RK
1e21e00e1a return status from poll_and_notify
allows calling it directly
2016-04-27 14:28:23 +02:00
Min RK
77d3ee98f9 allow logo_url in template namespace to set the logo link 2016-04-27 14:06:51 +02:00
Min RK
1f861b2c90 server proxy error pages from the Hub 2016-04-27 14:06:29 +02:00
Carol Willing
14a00e67b4 Merge pull request #550 from daradib/typo
Fix docs typo for Spawner.disable_user_config
2016-04-26 15:28:02 -07:00
Dara Adib
14f63c168d Fix docs typo for Spawner.disable_user_config 2016-04-26 11:36:48 -07:00
Kyle Kelley
e70dbb3d32 Merge pull request #549 from minrk/optional-statsd
Make statsd an optional dependency
2016-04-26 07:46:28 -05:00
Min RK
b679275a68 remove unneeded codecov.yml
codecov team config suffices
2016-04-26 13:44:29 +02:00
Min RK
0c1478a67e Make statsd an optional dependency
only import it if it's used
2016-04-26 13:37:39 +02:00
Min RK
d26e2346a2 Merge pull request #548 from minrk/jupyterhub-urls
fix a few more jupyter->jupyterhub URLs
2016-04-26 12:41:19 +02:00
Min RK
9a09c841b9 Merge pull request #547 from minrk/disable-codecov-comments
disable codecov PR comments
2016-04-26 12:41:02 +02:00
Min RK
f1d4f5a733 fix a few more jupyter->jupyterhub URLs
in README
2016-04-26 11:58:27 +02:00
Min RK
d970dd4c89 disable CodeCov PR comments
The've removed web app config, in favor of codecov.yml,
discarding our existing config,
which means coverage reports are showing up in most Jupyter PRs now.
2016-04-26 11:55:52 +02:00
Min RK
f3279bf849 Merge pull request #544 from rafael-ladislau/master
Fix multiple windows logout error
2016-04-26 11:41:53 +02:00
Rafael Ladislau
db0878a495 Fix multiple windows logout error
When you have two JupyterHub windows and log out successfully in one of them. If you try to click the logout button in the other window, you will receive a 500 error.

It happened because there were operations being done in a None user object.
2016-04-25 13:31:39 -04:00
Min RK
c9b1042791 back to dev 2016-04-25 14:34:15 +02:00
Min RK
cd81320d8f push tags on circleci 2016-04-25 14:25:34 +02:00
306 changed files with 35157 additions and 6076 deletions

View File

@@ -1,3 +0,0 @@
{
"directory": "share/jupyter/hub/static/components"
}

33
.circleci/config.yml Normal file
View File

@@ -0,0 +1,33 @@
# Python CircleCI 2.0 configuration file
# Updating CircleCI configuration from v1 to v2
# Check https://circleci.com/docs/2.0/language-python/ for more details
#
version: 2
jobs:
build:
machine: true
steps:
- checkout
- run:
name: build images
command: |
docker build -t jupyterhub/jupyterhub .
docker build -t jupyterhub/jupyterhub-onbuild onbuild
docker build -t jupyterhub/jupyterhub:alpine -f dockerfiles/Dockerfile.alpine .
docker build -t jupyterhub/singleuser singleuser
- run:
name: smoke test jupyterhub
command: |
docker run --rm -it jupyterhub/jupyterhub jupyterhub --help
- run:
name: verify static files
command: |
docker run --rm -it -v $PWD/dockerfiles:/io jupyterhub/jupyterhub python3 /io/test.py
# Tell CircleCI to use this workflow when it builds the site
workflows:
version: 2
default:
jobs:
- build

View File

@@ -1,4 +1,18 @@
[run]
parallel = True
branch = False
omit =
jupyterhub/tests/*
jupyterhub/singleuser.py
jupyterhub/alembic/*
[report]
exclude_lines =
if self.debug:
pragma: no cover
raise NotImplementedError
if __name__ == .__main__.:
ignore_errors = True
omit =
jupyterhub/tests/*
jupyterhub/alembic/*
*/site-packages/*

View File

@@ -4,3 +4,7 @@ jupyterhub_cookie_secret
jupyterhub.sqlite
jupyterhub_config.py
node_modules
docs
.git
dist
build

24
.flake8 Normal file
View File

@@ -0,0 +1,24 @@
[flake8]
# Ignore style and complexity
# E: style errors
# W: style warnings
# C: complexity
# F401: module imported but unused
# F403: import *
# F811: redefinition of unused `name` from line `N`
# F841: local variable assigned but never used
# E402: module level import not at top of file
# I100: Import statements are in the wrong order
# I101: Imported names are in the wrong order. Should be
ignore = E, C, W, F401, F403, F811, F841, E402, I100, I101, D400
builtins = c, get_config
exclude =
.cache,
.github,
docs,
jupyterhub/alembic*,
onbuild,
scripts,
share,
tools,
setup.py

View File

19
.gitignore vendored
View File

@@ -1,21 +1,30 @@
node_modules
*.py[co]
*~
.cache
.DS_Store
build
/build
dist
docs/_build
docs/build
docs/source/_static/rest-api
.ipynb_checkpoints
# ignore config file at the top-level of the repo
# but not sub-dirs
/jupyterhub_config.py
jupyterhub_cookie_secret
jupyterhub.sqlite
share/jupyter/hub/static/components
share/jupyter/hub/static/css/style.min.css
share/jupyter/hub/static/css/style.min.css.map
package-lock.json
share/jupyterhub/static/components
share/jupyterhub/static/css/style.min.css
share/jupyterhub/static/css/style.min.css.map
*.egg-info
MANIFEST
.coverage
.coverage.*
htmlcov
.idea/
.vscode/
.pytest_cache
pip-wheel-metadata
docs/source/reference/metrics.rst

19
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,19 @@
repos:
- repo: https://github.com/asottile/reorder_python_imports
rev: v1.9.0
hooks:
- id: reorder-python-imports
- repo: https://github.com/psf/black
rev: 19.10b0
hooks:
- id: black
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.4.0
hooks:
- id: end-of-file-fixer
- id: check-json
- id: check-yaml
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: requirements-txt-fixer
- id: flake8

View File

@@ -1,21 +1,120 @@
# http://travis-ci.org/#!/jupyter/jupyterhub
dist: bionic
language: python
sudo: false
python:
- 3.5
- 3.4
- 3.3
cache:
- pip
env:
global:
- MYSQL_HOST=127.0.0.1
- MYSQL_TCP_PORT=13306
# request additional services for the jobs to access
services:
- postgresql
- docker
# install dependencies for running pytest (but not linting)
before_install:
- npm install
- npm install -g configurable-http-proxy
- git clone --quiet --depth 1 https://github.com/minrk/travis-wheels travis-wheels
- set -e
- nvm install 6; nvm use 6
- npm install
- npm install -g configurable-http-proxy
- |
# setup database
if [[ $JUPYTERHUB_TEST_DB_URL == mysql* ]]; then
unset MYSQL_UNIX_PORT
DB=mysql bash ci/docker-db.sh
DB=mysql bash ci/init-db.sh
# FIXME: mysql-connector-python 8.0.16 incorrectly decodes bytes to str
# ref: https://bugs.mysql.com/bug.php?id=94944
pip install 'mysql-connector-python==8.0.11'
elif [[ $JUPYTERHUB_TEST_DB_URL == postgresql* ]]; then
psql -c "CREATE USER $PGUSER WITH PASSWORD '$PGPASSWORD';" -U postgres
DB=postgres bash ci/init-db.sh
pip install psycopg2-binary
fi
# install general dependencies
install:
- pip install -f travis-wheels/wheelhouse -r dev-requirements.txt .
- pip install --upgrade pip
- pip install --upgrade --pre -r dev-requirements.txt .
- |
if [[ "$MASTER_DEPENDENCIES" == "True" ]]; then
pip install git+https://github.com/ipython/traitlets#egg=traitlets --force
fi
- |
if [[ "$TEST" == "jupyter_server" ]]; then
pip uninstall notebook --yes
pip install jupyter_server
fi
- pip freeze
# run tests
script:
- travis_retry py.test --cov jupyterhub jupyterhub/tests -v
- pytest -v --maxfail=2 --cov=jupyterhub jupyterhub/tests
# collect test coverage information
after_success:
- codecov
matrix:
- codecov
# list the jobs
jobs:
include:
- python: 3.5
env: JUPYTERHUB_TEST_SUBDOMAIN_HOST=http://127.0.0.1.xip.io:8000
- name: autoformatting check
python: 3.6
# NOTE: It does not suffice to override to: null, [], or [""]. Travis will
# fall back to the default if we do.
before_install: echo "Do nothing before install."
script:
- pre-commit run --all-files
after_success: echo "Do nothing after success."
after_failure:
- |
echo "You can install pre-commit hooks to automatically run formatting"
echo "on each commit with:"
echo " pre-commit install"
echo "or you can run by hand on staged files with"
echo " pre-commit run"
echo "or after-the-fact on already committed files with"
echo " pre-commit run --all-files"
# When we run pytest, we want to run it with python>=3.5 as well as with
# various configurations. We increment the python version at the same time
# as we test new configurations in order to reduce the number of test jobs.
- name: python:3.5 + dist:xenial
python: 3.5
dist: xenial
- name: python:3.6 + subdomain
python: 3.6
env: JUPYTERHUB_TEST_SUBDOMAIN_HOST=http://localhost.jovyan.org:8000
- name: python:3.7 + mysql
python: 3.7
env:
- JUPYTERHUB_TEST_DB_URL=mysql+mysqlconnector://root@127.0.0.1:$MYSQL_TCP_PORT/jupyterhub
- name: python:3.8 + postgresql
python: 3.8
env:
- PGUSER=jupyterhub
- PGPASSWORD=hub[test/:?
# The password in url below is url-encoded with: urllib.parse.quote($PGPASSWORD, safe='')
- JUPYTERHUB_TEST_DB_URL=postgresql://jupyterhub:hub%5Btest%2F%3A%3F@127.0.0.1/jupyterhub
- name: python:3.8 + master dependencies
python: 3.8
env:
- PGUSER=jupyterhub
- PGPASSWORD=hub[test/:?
# The password in url below is url-encoded with: urllib.parse.quote($PGPASSWORD, safe='')
- JUPYTERHUB_TEST_DB_URL=postgresql://jupyterhub:hub%5Btest%2F%3A%3F@127.0.0.1/jupyterhub
- MASTER_DEPENDENCIES=True
- name: python:3.8 + jupyter_server
python: 3.8
env:
- TEST=jupyter_server
- JUPYTERHUB_SINGLEUSER_APP=jupyterhub.tests.mockserverapp.MockServerApp
- name: python:nightly
python: nightly
allow_failures:
- name: python:nightly
# https://github.com/jupyterhub/jupyterhub/issues/3141
# The latest traitlets is close to release so it should not fail
# - name: python:3.8 + master dependencies
fast_finish: true

26
CHECKLIST-Release.md Normal file
View File

@@ -0,0 +1,26 @@
# Release checklist
- [ ] Upgrade Docs prior to Release
- [ ] Change log
- [ ] New features documented
- [ ] Update the contributor list - thank you page
- [ ] Upgrade and test Reference Deployments
- [ ] Release software
- [ ] Make sure 0 issues in milestone
- [ ] Follow release process steps
- [ ] Send builds to PyPI (Warehouse) and Conda Forge
- [ ] Blog post and/or release note
- [ ] Notify users of release
- [ ] Email Jupyter and Jupyter In Education mailing lists
- [ ] Tweet (optional)
- [ ] Increment the version number for the next release
- [ ] Update roadmap

1
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1 @@
Please refer to [Project Jupyter's Code of Conduct](https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md).

View File

@@ -1,3 +1,137 @@
# Contributing
# Contributing to JupyterHub
We mainly follow the [IPython Contributing Guide](https://github.com/ipython/ipython/blob/master/CONTRIBUTING.md).
Welcome! As a [Jupyter](https://jupyter.org) project,
you can follow the [Jupyter contributor guide](https://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html).
Make sure to also follow [Project Jupyter's Code of Conduct](https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md)
for a friendly and welcoming collaborative environment.
## Setting up a development environment
<!--
https://jupyterhub.readthedocs.io/en/stable/contributing/setup.html
contains a lot of the same information. Should we merge the docs and
just have this page link to that one?
-->
JupyterHub requires Python >= 3.5 and nodejs.
As a Python project, a development install of JupyterHub follows standard practices for the basics (steps 1-2).
1. clone the repo
```bash
git clone https://github.com/jupyterhub/jupyterhub
```
2. do a development install with pip
```bash
cd jupyterhub
python3 -m pip install --editable .
```
3. install the development requirements,
which include things like testing tools
```bash
python3 -m pip install -r dev-requirements.txt
```
4. install configurable-http-proxy with npm:
```bash
npm install -g configurable-http-proxy
```
5. set up pre-commit hooks for automatic code formatting, etc.
```bash
pre-commit install
```
You can also invoke the pre-commit hook manually at any time with
```bash
pre-commit run
```
## Contributing
JupyterHub has adopted automatic code formatting so you shouldn't
need to worry too much about your code style.
As long as your code is valid,
the pre-commit hook should take care of how it should look.
You can invoke the pre-commit hook by hand at any time with:
```bash
pre-commit run
```
which should run any autoformatting on your code
and tell you about any errors it couldn't fix automatically.
You may also install [black integration](https://github.com/psf/black#editor-integration)
into your text editor to format code automatically.
If you have already committed files before setting up the pre-commit
hook with `pre-commit install`, you can fix everything up using
`pre-commit run --all-files`. You need to make the fixing commit
yourself after that.
## Testing
It's a good idea to write tests to exercise any new features,
or that trigger any bugs that you have fixed to catch regressions.
You can run the tests with:
```bash
pytest -v
```
in the repo directory. If you want to just run certain tests,
check out the [pytest docs](https://pytest.readthedocs.io/en/latest/usage.html)
for how pytest can be called.
For instance, to test only spawner-related things in the REST API:
```bash
pytest -v -k spawn jupyterhub/tests/test_api.py
```
The tests live in `jupyterhub/tests` and are organized roughly into:
1. `test_api.py` tests the REST API
2. `test_pages.py` tests loading the HTML pages
and other collections of tests for different components.
When writing a new test, there should usually be a test of
similar functionality already written and related tests should
be added nearby.
The fixtures live in `jupyterhub/tests/conftest.py`. There are
fixtures that can be used for JupyterHub components, such as:
- `app`: an instance of JupyterHub with mocked parts
- `auth_state_enabled`: enables persisting auth_state (like authentication tokens)
- `db`: a sqlite in-memory DB session
- `io_loop`: a Tornado event loop
- `event_loop`: a new asyncio event loop
- `user`: creates a new temporary user
- `admin_user`: creates a new temporary admin user
- single user servers
- `cleanup_after`: allows cleanup of single user servers between tests
- mocked service
- `MockServiceSpawner`: a spawner that mocks services for testing with a short poll interval
- `mockservice`: mocked service with no external service url
- `mockservice_url`: mocked service with a url to test external services
And fixtures to add functionality or spawning behavior:
- `admin_access`: grants admin access
- `no_patience`: sets slow-spawning timeouts to zero
- `slow_spawn`: enables the SlowSpawner (a spawner that takes a few seconds to start)
- `never_spawn`: enables the NeverSpawner (a spawner that will never start)
- `bad_spawn`: enables the BadSpawner (a spawner that fails immediately)
- `slow_bad_spawn`: enables the SlowBadSpawner (a spawner that fails after a short delay)
To read more about fixtures check out the
[pytest docs](https://docs.pytest.org/en/latest/fixture.html)
for how to use the existing fixtures, and how to create new ones.
When in doubt, feel free to [ask](https://gitter.im/jupyterhub/jupyterhub).

View File

@@ -21,43 +21,81 @@
# your jupyterhub_config.py will be added automatically
# from your docker directory.
FROM debian:jessie
MAINTAINER Jupyter Project <jupyter@googlegroups.com>
ARG BASE_IMAGE=ubuntu:focal-20200729@sha256:6f2fb2f9fb5582f8b587837afd6ea8f37d8d1d9e41168c90f410a6ef15fa8ce5
FROM $BASE_IMAGE AS builder
USER root
# install nodejs, utf8 locale
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get -y install npm nodejs nodejs-legacy wget locales git &&\
/usr/sbin/update-locale LANG=C.UTF-8 && \
locale-gen C.UTF-8 && \
apt-get remove -y locales && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV LANG C.UTF-8
RUN apt-get update \
&& apt-get install -yq --no-install-recommends \
build-essential \
ca-certificates \
locales \
python3-dev \
python3-pip \
python3-pycurl \
nodejs \
npm \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# install Python with conda
RUN wget -q https://repo.continuum.io/miniconda/Miniconda3-4.0.5-Linux-x86_64.sh -O /tmp/miniconda.sh && \
echo 'a7bcd0425d8b6688753946b59681572f63c2241aed77bf0ec6de4c5edc5ceeac */tmp/miniconda.sh' | shasum -a 256 -c - && \
bash /tmp/miniconda.sh -f -b -p /opt/conda && \
/opt/conda/bin/conda install --yes python=3.5 sqlalchemy tornado jinja2 traitlets requests pip && \
/opt/conda/bin/pip install --upgrade pip && \
rm /tmp/miniconda.sh
ENV PATH=/opt/conda/bin:$PATH
RUN python3 -m pip install --upgrade setuptools pip wheel
# install js dependencies
RUN npm install -g configurable-http-proxy && rm -rf ~/.npm
ADD . /src/jupyterhub
# copy everything except whats in .dockerignore, its a
# compromise between needing to rebuild and maintaining
# what needs to be part of the build
COPY . /src/jupyterhub/
WORKDIR /src/jupyterhub
RUN python setup.py js && pip install . && \
rm -rf $PWD ~/.cache ~/.npm
# Build client component packages (they will be copied into ./share and
# packaged with the built wheel.)
RUN python3 setup.py bdist_wheel
RUN python3 -m pip wheel --wheel-dir wheelhouse dist/*.whl
FROM $BASE_IMAGE
USER root
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -yq --no-install-recommends \
ca-certificates \
curl \
gnupg \
locales \
python3-pip \
python3-pycurl \
nodejs \
npm \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
ENV SHELL=/bin/bash \
LC_ALL=en_US.UTF-8 \
LANG=en_US.UTF-8 \
LANGUAGE=en_US.UTF-8
RUN locale-gen $LC_ALL
# always make sure pip is up to date!
RUN python3 -m pip install --no-cache --upgrade setuptools pip
RUN npm install -g configurable-http-proxy@^4.2.0 \
&& rm -rf ~/.npm
# install the wheels we built in the first stage
COPY --from=builder /src/jupyterhub/wheelhouse /tmp/wheelhouse
RUN python3 -m pip install --no-cache /tmp/wheelhouse/*
RUN mkdir -p /srv/jupyterhub/
WORKDIR /srv/jupyterhub/
EXPOSE 8000
LABEL maintainer="Jupyter Project <jupyter@googlegroups.com>"
LABEL org.jupyter.service="jupyterhub"
CMD ["jupyterhub"]

View File

@@ -1,8 +1,9 @@
include README.md
include COPYING.md
include setupegg.py
include bower.json
include bower-lite
include package.json
include package-lock.json
include *requirements.txt
include Dockerfile
@@ -10,19 +11,23 @@ graft onbuild
graft jupyterhub
graft scripts
graft share
graft singleuser
graft ci
# Documentation
graft docs
prune docs/node_modules
# prune some large unused files from components
prune share/jupyter/hub/static/components/bootstrap/css
exclude share/jupyter/hub/static/components/components/fonts/*.svg
exclude share/jupyter/hub/static/components/bootstrap/less/*.js
exclude share/jupyter/hub/static/components/font-awesome/css
exclude share/jupyter/hub/static/components/font-awesome/fonts/*.svg
exclude share/jupyter/hub/static/components/jquery/*migrate*.js
prune share/jupyter/hub/static/components/moment/lang
prune share/jupyter/hub/static/components/moment/min
prune share/jupyterhub/static/components/bootstrap/dist/css
exclude share/jupyterhub/static/components/bootstrap/dist/fonts/*.svg
prune share/jupyterhub/static/components/font-awesome/css
prune share/jupyterhub/static/components/font-awesome/scss
exclude share/jupyterhub/static/components/font-awesome/fonts/*.svg
prune share/jupyterhub/static/components/jquery/external
prune share/jupyterhub/static/components/jquery/src
prune share/jupyterhub/static/components/moment/lang
prune share/jupyterhub/static/components/moment/min
# Patterns to exclude from any directory
global-exclude *~

300
README.md
View File

@@ -1,158 +1,260 @@
# JupyterHub: A multi-user server for Jupyter notebooks
Questions, comments? Visit our Google Group:
[![Google Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
[![Build Status](https://travis-ci.org/jupyterhub/jupyterhub.svg?branch=master)](https://travis-ci.org/jupyterhub/jupyterhub)
[![Circle CI](https://circleci.com/gh/jupyterhub/jupyterhub.svg?style=shield&circle-token=b5b65862eb2617b9a8d39e79340b0a6b816da8cc)](https://circleci.com/gh/jupyterhub/jupyterhub)
[![Documentation Status](https://readthedocs.org/projects/jupyterhub/badge/?version=latest)](http://jupyterhub.readthedocs.org/en/latest/?badge=latest)
[![codecov.io](https://codecov.io/github/jupyter/jupyterhub/coverage.svg?branch=master)](https://codecov.io/github/jupyter/jupyterhub?branch=master)
**[Technical Overview](#technical-overview)** |
**[Installation](#installation)** |
**[Configuration](#configuration)** |
**[Docker](#docker)** |
**[Contributing](#contributing)** |
**[License](#license)** |
**[Help and Resources](#help-and-resources)**
JupyterHub, a multi-user server, manages and proxies multiple instances of the single-user <del>IPython</del> Jupyter notebook server.
Three actors:
- multi-user Hub (tornado process)
- configurable http proxy (node-http-proxy)
- multiple single-user IPython notebook servers (Python/IPython/tornado)
Basic principles:
- Hub spawns proxy
- Proxy forwards ~all requests to hub by default
- Hub handles login, and spawns single-user servers on demand
- Hub configures proxy to forward url prefixes to single-user servers
# [JupyterHub](https://github.com/jupyterhub/jupyterhub)
## Dependencies
[![Latest PyPI version](https://img.shields.io/pypi/v/jupyterhub?logo=pypi)](https://pypi.python.org/pypi/jupyterhub)
[![Latest conda-forge version](https://img.shields.io/conda/vn/conda-forge/jupyterhub?logo=conda-forge)](https://www.npmjs.com/package/jupyterhub)
[![Documentation build status](https://img.shields.io/readthedocs/jupyterhub?logo=read-the-docs)](https://jupyterhub.readthedocs.org/en/latest/)
[![TravisCI build status](https://img.shields.io/travis/com/jupyterhub/jupyterhub?logo=travis)](https://travis-ci.com/jupyterhub/jupyterhub)
[![DockerHub build status](https://img.shields.io/docker/build/jupyterhub/jupyterhub?logo=docker&label=build)](https://hub.docker.com/r/jupyterhub/jupyterhub/tags)
[![CircleCI build status](https://img.shields.io/circleci/build/github/jupyterhub/jupyterhub?logo=circleci)](https://circleci.com/gh/jupyterhub/jupyterhub)<!-- CircleCI Token: b5b65862eb2617b9a8d39e79340b0a6b816da8cc -->
[![Test coverage of code](https://codecov.io/gh/jupyterhub/jupyterhub/branch/master/graph/badge.svg)](https://codecov.io/gh/jupyterhub/jupyterhub)
[![GitHub](https://img.shields.io/badge/issue_tracking-github-blue?logo=github)](https://github.com/jupyterhub/jupyterhub/issues)
[![Discourse](https://img.shields.io/badge/help_forum-discourse-blue?logo=discourse)](https://discourse.jupyter.org/c/jupyterhub)
[![Gitter](https://img.shields.io/badge/social_chat-gitter-blue?logo=gitter)](https://gitter.im/jupyterhub/jupyterhub)
JupyterHub itself requires [Python](https://www.python.org/downloads/) ≥ 3.3. To run the single-user servers (which may be on the same system as the Hub or not), [Jupyter Notebook](https://jupyter.readthedocs.org/en/latest/install.html) ≥ 4 is required.
With [JupyterHub](https://jupyterhub.readthedocs.io) you can create a
**multi-user Hub** which spawns, manages, and proxies multiple instances of the
single-user [Jupyter notebook](https://jupyter-notebook.readthedocs.io)
server.
Install [nodejs/npm](https://www.npmjs.com/), which is available from your
package manager. For example, install on Linux (Debian/Ubuntu) using:
[Project Jupyter](https://jupyter.org) created JupyterHub to support many
users. The Hub can offer notebook servers to a class of students, a corporate
data science workgroup, a scientific research project, or a high performance
computing group.
sudo apt-get install npm nodejs-legacy
## Technical overview
(The `nodejs-legacy` package installs the `node` executable and is currently
required for npm to work on Debian/Ubuntu.)
Three main actors make up JupyterHub:
Next, install JavaScript dependencies:
- multi-user **Hub** (tornado process)
- configurable http **proxy** (node-http-proxy)
- multiple **single-user Jupyter notebook servers** (Python/Jupyter/tornado)
sudo npm install -g configurable-http-proxy
Basic principles for operation are:
### (Optional) Installation Prerequisite (pip)
Notes on the `pip` command used in the installation directions below:
- `sudo` may be needed for `pip install`, depending on the user's filesystem permissions.
- JupyterHub requires Python >= 3.3, so `pip3` may be required on some machines for package installation instead of `pip` (especially when both Python 2 and Python 3 are installed on a machine). If `pip3` is not found, install it using (on Linux Debian/Ubuntu):
sudo apt-get install python3-pip
- Hub launches a proxy.
- Proxy forwards all requests to Hub by default.
- Hub handles login, and spawns single-user servers on demand.
- Hub configures proxy to forward url prefixes to the single-user notebook
servers.
JupyterHub also provides a
[REST API](http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/master/docs/rest-api.yml#/default)
for administration of the Hub and its users.
## Installation
JupyterHub can be installed with pip, and the proxy with npm:
npm install -g configurable-http-proxy
pip3 install jupyterhub
### Check prerequisites
If you plan to run notebook servers locally, you may also need to install the
Jupyter ~~IPython~~ notebook:
- A Linux/Unix based system
- [Python](https://www.python.org/downloads/) 3.5 or greater
- [nodejs/npm](https://www.npmjs.com/)
pip3 install --upgrade notebook
* If you are using **`conda`**, the nodejs and npm dependencies will be installed for
you by conda.
* If you are using **`pip`**, install a recent version of
[nodejs/npm](https://docs.npmjs.com/getting-started/installing-node).
For example, install it on Linux (Debian/Ubuntu) using:
### Development install
```
sudo apt-get install npm nodejs-legacy
```
For a development install, clone the repository and then install from source:
The `nodejs-legacy` package installs the `node` executable and is currently
required for npm to work on Debian/Ubuntu.
git clone https://github.com/jupyter/jupyterhub
cd jupyterhub
pip3 install -r dev-requirements.txt -e .
- If using the default PAM Authenticator, a [pluggable authentication module (PAM)](https://en.wikipedia.org/wiki/Pluggable_authentication_module).
- TLS certificate and key for HTTPS communication
- Domain name
If the `pip3 install` command fails and complains about `lessc` being unavailable, you may need to explicitly install some additional JavaScript dependencies:
### Install packages
npm install
#### Using `conda`
This will fetch client-side JavaScript dependencies necessary to compile CSS.
To install JupyterHub along with its dependencies including nodejs/npm:
You may also need to manually update JavaScript and CSS after some development updates, with:
```bash
conda install -c conda-forge jupyterhub
```
python3 setup.py js # fetch updated client-side js (changes rarely)
python3 setup.py css # recompile CSS from LESS sources
If you plan to run notebook servers locally, install the Jupyter notebook
or JupyterLab:
```bash
conda install notebook
conda install jupyterlab
```
## Running the server
#### Using `pip`
To start the server, run the command:
JupyterHub can be installed with `pip`, and the proxy with `npm`:
```bash
npm install -g configurable-http-proxy
python3 -m pip install jupyterhub
```
If you plan to run notebook servers locally, you will need to install the
[Jupyter notebook](https://jupyter.readthedocs.io/en/latest/install.html)
package:
python3 -m pip install --upgrade notebook
### Run the Hub server
To start the Hub server, run the command:
jupyterhub
and then visit `http://localhost:8000`, and sign in with your unix credentials.
Visit `https://localhost:8000` in your browser, and sign in with your unix
PAM credentials.
To allow multiple users to sign into the server, you will need to
*Note*: To allow multiple users to sign into the server, you will need to
run the `jupyterhub` command as a *privileged user*, such as root.
The [wiki](https://github.com/jupyter/jupyterhub/wiki/Using-sudo-to-run-JupyterHub-without-root-privileges)
describes how to run the server as a *less privileged user*, which requires more
configuration of the system.
The [wiki](https://github.com/jupyterhub/jupyterhub/wiki/Using-sudo-to-run-JupyterHub-without-root-privileges)
describes how to run the server as a *less privileged user*, which requires
more configuration of the system.
## Getting started
## Configuration
See the [getting started document](docs/source/getting-started.md) for the
basics of configuring your JupyterHub deployment.
The [Getting Started](https://jupyterhub.readthedocs.io/en/latest/getting-started/index.html) section of the
documentation explains the common steps in setting up JupyterHub.
### Some examples
The [**JupyterHub tutorial**](https://github.com/jupyterhub/jupyterhub-tutorial)
provides an in-depth video and sample configurations of JupyterHub.
Generate a default config file:
### Create a configuration file
To generate a default config file with settings and descriptions:
jupyterhub --generate-config
Spawn the server on ``10.0.1.2:443`` with **https**:
### Start the Hub
To start the Hub on a specific url and port ``10.0.1.2:443`` with **https**:
jupyterhub --ip 10.0.1.2 --port 443 --ssl-key my_ssl.key --ssl-cert my_ssl.cert
The authentication and process spawning mechanisms can be replaced,
which should allow plugging into a variety of authentication or process control environments.
Some examples, meant as illustration and testing of this concept:
### Authenticators
- Using GitHub OAuth instead of PAM with [OAuthenticator](https://github.com/jupyter/oauthenticator)
- Spawning single-user servers with Docker, using the [DockerSpawner](https://github.com/jupyter/dockerspawner)
| Authenticator | Description |
| ---------------------------------------------------------------------------- | ------------------------------------------------- |
| PAMAuthenticator | Default, built-in authenticator |
| [OAuthenticator](https://github.com/jupyterhub/oauthenticator) | OAuth + JupyterHub Authenticator = OAuthenticator |
| [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) | Simple LDAP Authenticator Plugin for JupyterHub |
| [kerberosauthenticator](https://github.com/jupyterhub/kerberosauthenticator) | Kerberos Authenticator Plugin for JupyterHub |
### Docker
### Spawners
There is a ready to go [docker image for JupyterHub](https://hub.docker.com/r/jupyter/jupyterhub/).
[Note: This `jupyter/jupyterhub` docker image is only an image for running the Hub service itself.
It does not require the other Jupyter components, which are needed by the single-user servers.
To run the single-user servers, which may be on the same system as the Hub or not, installation of Jupyter Notebook ≥ 4 is required.]
| Spawner | Description |
| -------------------------------------------------------------- | -------------------------------------------------------------------------- |
| LocalProcessSpawner | Default, built-in spawner starts single-user servers as local processes |
| [dockerspawner](https://github.com/jupyterhub/dockerspawner) | Spawn single-user servers in Docker containers |
| [kubespawner](https://github.com/jupyterhub/kubespawner) | Kubernetes spawner for JupyterHub |
| [sudospawner](https://github.com/jupyterhub/sudospawner) | Spawn single-user servers without being root |
| [systemdspawner](https://github.com/jupyterhub/systemdspawner) | Spawn single-user notebook servers using systemd |
| [batchspawner](https://github.com/jupyterhub/batchspawner) | Designed for clusters using batch scheduling software |
| [yarnspawner](https://github.com/jupyterhub/yarnspawner) | Spawn single-user notebook servers distributed on a Hadoop cluster |
| [wrapspawner](https://github.com/jupyterhub/wrapspawner) | WrapSpawner and ProfilesSpawner enabling runtime configuration of spawners |
## Docker
A starter [**docker image for JupyterHub**](https://hub.docker.com/r/jupyterhub/jupyterhub/)
gives a baseline deployment of JupyterHub using Docker.
**Important:** This `jupyterhub/jupyterhub` image contains only the Hub itself,
with no configuration. In general, one needs to make a derivative image, with
at least a `jupyterhub_config.py` setting up an Authenticator and/or a Spawner.
To run the single-user servers, which may be on the same system as the Hub or
not, Jupyter Notebook version 4 or greater must be installed.
The JupyterHub docker image can be started with the following command:
docker run -d --name jupyterhub jupyter/jupyterhub jupyterhub
docker run -p 8000:8000 -d --name jupyterhub jupyterhub/jupyterhub jupyterhub
This command will create a container named `jupyterhub` that you can stop and resume with `docker stop/start`.
It will be listening on all interfaces at port 8000, so this is perfect to test JupyterHub on your desktop or laptop.
If you want to run docker on a computer that has a public IP then you should (as in MUST) secure it with ssl by
adding ssl options to your docker configuration or using a ssl enabled proxy.
[Mounting volumes](https://docs.docker.com/engine/userguide/containers/dockervolumes/) will
allow you to store data outside the docker image (host system) so it will be persistent, even when you start
a new image. The command `docker exec -it jupyterhub bash` will spawn a root shell in your docker
container. You can use it to create system users in the container. These accounts will be used for authentication
in jupyterhub's default configuration. In order to run without SSL (for testing purposes only), you'll need to set `--no-ssl` explicitly.
This command will create a container named `jupyterhub` that you can
**stop and resume** with `docker stop/start`.
# Getting help
The Hub service will be listening on all interfaces at port 8000, which makes
this a good choice for **testing JupyterHub on your desktop or laptop**.
We encourage you to ask questions on the mailing list:
If you want to run docker on a computer that has a public IP then you should
(as in MUST) **secure it with ssl** by adding ssl options to your docker
configuration or by using a ssl enabled proxy.
[![Google Group](https://img.shields.io/badge/-Google%20Group-lightgrey.svg)](https://groups.google.com/forum/#!forum/jupyter)
[Mounting volumes](https://docs.docker.com/engine/admin/volumes/volumes/) will
allow you to **store data outside the docker image (host system) so it will be persistent**, even when you start
a new image.
and you may participate in development discussions or get live help on Gitter:
The command `docker exec -it jupyterhub bash` will spawn a root shell in your docker
container. You can **use the root shell to create system users in the container**.
These accounts will be used for authentication in JupyterHub's default configuration.
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jupyter/jupyterhub?utm_source=badge&utm_medium=badge)
## Contributing
## Resources
If you would like to contribute to the project, please read our
[contributor documentation](http://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html)
and the [`CONTRIBUTING.md`](CONTRIBUTING.md). The `CONTRIBUTING.md` file
explains how to set up a development installation, how to run the test suite,
and how to contribute to documentation.
For a high-level view of the vision and next directions of the project, see the
[JupyterHub community roadmap](docs/source/contributing/roadmap.md).
### A note about platform support
JupyterHub is supported on Linux/Unix based systems.
JupyterHub officially **does not** support Windows. You may be able to use
JupyterHub on Windows if you use a Spawner and Authenticator that work on
Windows, but the JupyterHub defaults will not. Bugs reported on Windows will not
be accepted, and the test suite will not run on Windows. Small patches that fix
minor Windows compatibility issues (such as basic installation) **may** be accepted,
however. For Windows-based systems, we would recommend running JupyterHub in a
docker container or Linux VM.
[Additional Reference:](http://www.tornadoweb.org/en/stable/#installation) Tornado's documentation on Windows platform support
## License
We use a shared copyright model that enables all contributors to maintain the
copyright on their contributions.
All code is licensed under the terms of the revised BSD license.
## Help and resources
We encourage you to ask questions on the [Jupyter mailing list](https://groups.google.com/forum/#!forum/jupyter).
To participate in development discussions or get help, talk with us on
our JupyterHub [Gitter](https://gitter.im/jupyterhub/jupyterhub) channel.
- [Reporting Issues](https://github.com/jupyterhub/jupyterhub/issues)
- [JupyterHub tutorial](https://github.com/jupyterhub/jupyterhub-tutorial)
- [Documentation for JupyterHub](https://jupyterhub.readthedocs.io/en/latest/) | [PDF (latest)](https://media.readthedocs.org/pdf/jupyterhub/latest/jupyterhub.pdf) | [PDF (stable)](https://media.readthedocs.org/pdf/jupyterhub/stable/jupyterhub.pdf)
- [Documentation for JupyterHub's REST API](http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/master/docs/rest-api.yml#/default)
- [Documentation for Project Jupyter](http://jupyter.readthedocs.io/en/latest/index.html) | [PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)
- [Project Jupyter website](https://jupyter.org)
- [Documentation for JupyterHub](http://jupyterhub.readthedocs.org/en/latest/) [[PDF](https://media.readthedocs.org/pdf/jupyterhub/latest/jupyterhub.pdf)]
- [Documentation for Project Jupyter](http://jupyter.readthedocs.org/en/latest/index.html) [[PDF](https://media.readthedocs.org/pdf/jupyter/latest/jupyter.pdf)]
- [Issues](https://github.com/jupyter/jupyterhub/issues)
- [Technical support - Jupyter Google Group](https://groups.google.com/forum/#!forum/jupyter)
- [Project Jupyter community](https://jupyter.org/community)
JupyterHub follows the Jupyter [Community Guides](https://jupyter.readthedocs.io/en/latest/community/content-community.html).
---
**[Technical Overview](#technical-overview)** |
**[Installation](#installation)** |
**[Configuration](#configuration)** |
**[Docker](#docker)** |
**[Contributing](#contributing)** |
**[License](#license)** |
**[Help and Resources](#help-and-resources)**

33
bower-lite Executable file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env python
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
"""
bower-lite
Since Bower's on its way out,
stage frontend dependencies from node_modules into components
"""
import json
import os
import shutil
from os.path import join
HERE = os.path.abspath(os.path.dirname(__file__))
components = join(HERE, "share", "jupyterhub", "static", "components")
node_modules = join(HERE, "node_modules")
if os.path.exists(components):
shutil.rmtree(components)
os.mkdir(components)
with open(join(HERE, 'package.json')) as f:
package_json = json.load(f)
dependencies = package_json['dependencies']
for dep in dependencies:
src = join(node_modules, dep)
dest = join(components, dep)
print("%s -> %s" % (src, dest))
shutil.copytree(src, dest)

View File

@@ -1,11 +0,0 @@
{
"name": "jupyterhub-deps",
"version": "0.0.0",
"dependencies": {
"bootstrap": "components/bootstrap#~3.1",
"font-awesome": "components/font-awesome#~4.1",
"jquery": "components/jquery#~2.0",
"moment": "~2.7",
"requirejs": "~2.1"
}
}

59
ci/docker-db.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
# source this file to setup postgres and mysql
# for local testing (as similar as possible to docker)
set -eu
export MYSQL_HOST=127.0.0.1
export MYSQL_TCP_PORT=${MYSQL_TCP_PORT:-13306}
export PGHOST=127.0.0.1
NAME="hub-test-$DB"
DOCKER_RUN="docker run -d --name $NAME"
docker rm -f "$NAME" 2>/dev/null || true
case "$DB" in
"mysql")
RUN_ARGS="-e MYSQL_ALLOW_EMPTY_PASSWORD=1 -p $MYSQL_TCP_PORT:3306 mysql:5.7"
CHECK="mysql --host $MYSQL_HOST --port $MYSQL_TCP_PORT --user root -e \q"
;;
"postgres")
RUN_ARGS="-p 5432:5432 postgres:9.5"
CHECK="psql --user postgres -c \q"
;;
*)
echo '$DB must be mysql or postgres'
exit 1
esac
$DOCKER_RUN $RUN_ARGS
echo -n "waiting for $DB "
for i in {1..60}; do
if $CHECK; then
echo 'done'
break
else
echo -n '.'
sleep 1
fi
done
$CHECK
case "$DB" in
"mysql")
;;
"postgres")
# create the user
psql --user postgres -c "CREATE USER $PGUSER WITH PASSWORD '$PGPASSWORD';"
;;
*)
esac
echo -e "
Set these environment variables:
export MYSQL_HOST=127.0.0.1
export MYSQL_TCP_PORT=$MYSQL_TCP_PORT
export PGHOST=127.0.0.1
"

27
ci/init-db.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# initialize jupyterhub databases for testing
set -eu
MYSQL="mysql --user root --host $MYSQL_HOST --port $MYSQL_TCP_PORT -e "
PSQL="psql --user postgres -c "
case "$DB" in
"mysql")
EXTRA_CREATE='CHARACTER SET utf8 COLLATE utf8_general_ci'
SQL="$MYSQL"
;;
"postgres")
SQL="$PSQL"
;;
*)
echo '$DB must be mysql or postgres'
exit 1
esac
set -x
for SUFFIX in '' _upgrade_072 _upgrade_081 _upgrade_094; do
$SQL "DROP DATABASE jupyterhub${SUFFIX};" 2>/dev/null || true
$SQL "CREATE DATABASE jupyterhub${SUFFIX} ${EXTRA_CREATE:-};"
done

View File

@@ -1,19 +0,0 @@
machine:
services:
- docker
dependencies:
override:
- ls
test:
override:
- docker build -t jupyterhub/jupyterhub .
- docker build -t jupyterhub/jupyterhub-onbuild:${CIRCLE_TAG:-latest} onbuild
deployment:
hub:
branch: master
commands:
- docker login -u $DOCKER_USER -p $DOCKER_PASS -e unused@example.com
- docker push jupyterhub/jupyterhub-onbuild:${CIRCLE_TAG:-latest}

16
demo-image/Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
# Demo JupyterHub Docker image
#
# This should only be used for demo or testing and not as a base image to build on.
#
# It includes the notebook package and it uses the DummyAuthenticator and the SimpleLocalProcessSpawner.
ARG BASE_IMAGE=jupyterhub/jupyterhub-onbuild
FROM ${BASE_IMAGE}
# Install the notebook package
RUN python3 -m pip install notebook
# Create a demo user
RUN useradd --create-home demo
RUN chown demo .
USER demo

25
demo-image/README.md Normal file
View File

@@ -0,0 +1,25 @@
## Demo Dockerfile
This is a demo JupyterHub Docker image to help you get a quick overview of what
JupyterHub is and how it works.
It uses the SimpleLocalProcessSpawner to spawn new user servers and
DummyAuthenticator for authentication.
The DummyAuthenticator allows you to log in with any username & password and the
SimpleLocalProcessSpawner allows starting servers without having to create a
local user for each JupyterHub user.
### Important!
This should only be used for demo or testing purposes!
It shouldn't be used as a base image to build on.
### Try it
1. `cd` to the root of your jupyterhub repo.
2. Build the demo image with `docker build -t jupyterhub-demo demo-image`.
3. Run the demo image with `docker run -d -p 8000:8000 jupyterhub-demo`.
4. Visit http://localhost:8000 and login with any username and password
5. Happy demo-ing :tada:!

View File

@@ -0,0 +1,7 @@
# Configuration file for jupyterhub-demo
c = get_config()
# Use DummyAuthenticator and SimpleSpawner
c.JupyterHub.spawner_class = "simple"
c.JupyterHub.authenticator_class = "dummy"

View File

@@ -1,5 +1,20 @@
-r requirements.txt
# temporary pin of attrs for jsonschema 0.3.0a1
# seems to be a pip bug
attrs>=17.4.0
beautifulsoup4
codecov
pytest-cov
pytest>=2.8
coverage
cryptography
html5lib # needed for beautifulsoup
mock
notebook
pre-commit
pytest-asyncio
pytest-cov
pytest>=3.3
requests-mock
# blacklist urllib3 releases affected by https://github.com/urllib3/urllib3/issues/1683
# I *think* this should only affect testing, not production
urllib3!=1.25.4,!=1.25.5
virtualenv

View File

@@ -0,0 +1,9 @@
FROM python:3.6.3-alpine3.6
ARG JUPYTERHUB_VERSION=0.8.1
RUN pip3 install --no-cache jupyterhub==${JUPYTERHUB_VERSION}
ENV LANG=en_US.UTF-8
USER nobody
CMD ["jupyterhub"]

20
dockerfiles/README.md Normal file
View File

@@ -0,0 +1,20 @@
## What is Dockerfile.alpine
Dockerfile.alpine contains base image for jupyterhub. It does not work independently, but only as part of a full jupyterhub cluster
## How to use it?
1. A running configurable-http-proxy, whose API is accessible.
2. A jupyterhub_config file.
3. Authentication and other libraries required by the specific jupyterhub_config file.
## Steps to test it outside a cluster
* start configurable-http-proxy in another container
* specify CONFIGPROXY_AUTH_TOKEN env in both containers
* put both containers on the same network (e.g. docker network create jupyterhub; docker run ... --net jupyterhub)
* tell jupyterhub where CHP is (e.g. c.ConfigurableHTTPProxy.api_url = 'http://chp:8001')
* tell jupyterhub not to start the proxy itself (c.ConfigurableHTTPProxy.should_start = False)
* Use dummy authenticator for ease of testing. Update following in jupyterhub_config file
- c.JupyterHub.authenticator_class = 'dummyauthenticator.DummyAuthenticator'
- c.DummyAuthenticator.password = "your strong password"

9
dockerfiles/test.py Normal file
View File

@@ -0,0 +1,9 @@
import os
from jupyterhub._data import DATA_FILES_PATH
print(f"DATA_FILES_PATH={DATA_FILES_PATH}")
for sub_path in ("templates", "static/components", "static/css/style.min.css"):
path = os.path.join(DATA_FILES_PATH, sub_path)
assert os.path.exists(path), path

View File

@@ -2,7 +2,7 @@
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXOPTS = "-W"
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
@@ -47,11 +47,26 @@ help:
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
@echo " spelling to run spell check on documentation"
@echo " metrics to generate documentation for metrics by inspecting the source code"
clean:
rm -rf $(BUILDDIR)/*
html:
node_modules: package.json
npm install && touch node_modules
rest-api: source/_static/rest-api/index.html
source/_static/rest-api/index.html: rest-api.yml node_modules
npm run rest-api
metrics: source/reference/metrics.rst
source/reference/metrics.rst: generate-metrics.py
python3 generate-metrics.py
html: rest-api metrics
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
@@ -171,6 +186,11 @@ linkcheck:
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
spelling:
$(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling
@echo
@echo "Spell check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/spelling/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \

57
docs/generate-metrics.py Normal file
View File

@@ -0,0 +1,57 @@
import os
from os.path import join
from pytablewriter import RstSimpleTableWriter
from pytablewriter.style import Style
import jupyterhub.metrics
HERE = os.path.abspath(os.path.dirname(__file__))
class Generator:
@classmethod
def create_writer(cls, table_name, headers, values):
writer = RstSimpleTableWriter()
writer.table_name = table_name
writer.headers = headers
writer.value_matrix = values
writer.margin = 1
[writer.set_style(header, Style(align="center")) for header in headers]
return writer
def _parse_metrics(self):
table_rows = []
for name in dir(jupyterhub.metrics):
obj = getattr(jupyterhub.metrics, name)
if obj.__class__.__module__.startswith('prometheus_client.'):
for metric in obj.describe():
table_rows.append([metric.type, metric.name, metric.documentation])
return table_rows
def prometheus_metrics(self):
generated_directory = f"{HERE}/source/reference"
if not os.path.exists(generated_directory):
os.makedirs(generated_directory)
filename = f"{generated_directory}/metrics.rst"
table_name = ""
headers = ["Type", "Name", "Description"]
values = self._parse_metrics()
writer = self.create_writer(table_name, headers, values)
title = "List of Prometheus Metrics"
underline = "============================"
content = f"{title}\n{underline}\n{writer.dumps()}"
with open(filename, 'w') as f:
f.write(content)
print(f"Generated {filename}.")
def main():
doc_generator = Generator()
doc_generator.prometheus_metrics()
if __name__ == "__main__":
main()

14
docs/package.json Normal file
View File

@@ -0,0 +1,14 @@
{
"name": "jupyterhub-docs-build",
"version": "0.8.0",
"description": "build JupyterHub swagger docs",
"scripts": {
"rest-api": "bootprint openapi ./rest-api.yml source/_static/rest-api"
},
"author": "",
"license": "BSD-3-Clause",
"devDependencies": {
"bootprint": "^1.0.0",
"bootprint-openapi": "^1.0.0"
}
}

View File

@@ -1,3 +1,12 @@
-r ../requirements.txt
sphinx>=1.3.6
recommonmark==0.4.0
alabaster_jupyterhub
# Temporary fix of #3021. Revert back to released autodoc-traits when
# 0.1.0 released.
https://github.com/jupyterhub/autodoc-traits/archive/75885ee24636efbfebfceed1043459715049cd84.zip
pydata-sphinx-theme
pytablewriter>=0.56
recommonmark>=0.6
sphinx-copybutton
sphinx-jsonschema
sphinx>=1.7

View File

@@ -1,11 +1,13 @@
# see me at: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/master/docs/rest-api.yml#/default
# see me at: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/master/docs/rest-api.yml#/default
swagger: '2.0'
info:
title: JupyterHub
description: The REST API for JupyterHub
version: 0.4.0
version: 1.2.0dev
license:
name: BSD-3-Clause
schemes:
- http
[http, https]
securityDefinitions:
token:
type: apiKey
@@ -13,18 +15,73 @@ securityDefinitions:
in: header
security:
- token: []
basePath: /hub/api/
basePath: /hub/api
produces:
- application/json
consumes:
- application/json
paths:
/:
get:
summary: Get JupyterHub version
description: |
This endpoint is not authenticated for the purpose of clients and user
to identify the JupyterHub version before setting up authentication.
responses:
'200':
description: The JupyterHub version
schema:
type: object
properties:
version:
type: string
description: The version of JupyterHub itself
/info:
get:
summary: Get detailed info about JupyterHub
description: |
Detailed JupyterHub information, including Python version,
JupyterHub's version and executable path,
and which Authenticator and Spawner are active.
responses:
'200':
description: Detailed JupyterHub info
schema:
type: object
properties:
version:
type: string
description: The version of JupyterHub itself
python:
type: string
description: The Python version, as returned by sys.version
sys_executable:
type: string
description: The path to sys.executable running JupyterHub
authenticator:
type: object
properties:
class:
type: string
description: The Python class currently active for JupyterHub Authentication
version:
type: string
description: The version of the currently active Authenticator
spawner:
type: object
properties:
class:
type: string
description: The Python class currently active for spawning single-user notebook servers
version:
type: string
description: The version of the currently active Spawner
/users:
get:
summary: List users
responses:
'200':
description: The user list
description: The Hub's user list
schema:
type: array
items:
@@ -32,7 +89,7 @@ paths:
post:
summary: Create multiple users
parameters:
- name: data
- name: body
in: body
required: true
schema:
@@ -40,7 +97,7 @@ paths:
properties:
usernames:
type: array
description: list of usernames to create
description: list of usernames to create on the Hub
items:
type: string
admin:
@@ -81,6 +138,33 @@ paths:
description: The user has been created
schema:
$ref: '#/definitions/User'
patch:
summary: Modify a user
description: Change a user's name or admin status
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: body
in: body
required: true
description: Updated user info. At least one key to be updated (name or admin) is required.
schema:
type: object
properties:
name:
type: string
description: the new name (optional, if another key is updated i.e. admin)
admin:
type: boolean
description: update admin (optional, if another key is updated i.e. name)
responses:
'200':
description: The updated user info
schema:
$ref: '#/definitions/User'
delete:
summary: Delete a user
parameters:
@@ -92,47 +176,90 @@ paths:
responses:
'204':
description: The user has been deleted
patch:
summary: Modify a user
description: Change a user's name or admin status
/users/{name}/activity:
post:
summary:
Notify Hub of activity for a given user.
description:
Notify the Hub of activity by the user,
e.g. accessing a service or (more likely)
actively using a server.
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: data
- name: body
in: body
required: true
description: Updated user info. At least one of name and admin is required.
schema:
type: object
properties:
name:
last_activity:
type: string
description: the new name (optional)
admin:
type: boolean
description: update admin (optional)
format: date-time
description: |
Timestamp of last-seen activity for this user.
Only needed if this is not activity associated
with using a given server.
servers:
description: |
Register activity for specific servers by name.
The keys of this dict are the names of servers.
The default server has an empty name ('').
type: object
properties:
'<server name>':
description: |
Activity for a single server.
type: object
required:
- last_activity
properties:
last_activity:
type: string
format: date-time
description: |
Timestamp of last-seen activity on this server.
example:
last_activity: '2019-02-06T12:54:14Z'
servers:
'':
last_activity: '2019-02-06T12:54:14Z'
gpu:
last_activity: '2019-02-06T12:54:14Z'
responses:
'200':
description: The updated user info
schema:
$ref: '#/definitions/User'
'401':
$ref: '#/responses/Unauthorized'
'404':
description: No such user
/users/{name}/server:
post:
summary: Start a user's server
summary: Start a user's single-user notebook server
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: options
description: |
Spawn options can be passed as a JSON body
when spawning via the API instead of spawn form.
The structure of the options
will depend on the Spawner's configuration.
The body itself will be available as `user_options` for the
Spawner.
in: body
required: false
schema:
type: object
responses:
'201':
description: The server has started
description: The user's notebook server has started
'202':
description: The server has been requested, but has not yet started
description: The user's notebook server has not yet started, but has been requested
delete:
summary: Stop a user's server
parameters:
@@ -143,41 +270,285 @@ paths:
type: string
responses:
'204':
description: The server has stopped
description: The user's notebook server has stopped
'202':
description: The server has been asked to stop, but is taking a while
/users/{name}/admin-access:
description: The user's notebook server has not yet stopped as it is taking a while to stop
/users/{name}/servers/{server_name}:
post:
summary: Grant an admin access to this user's server
summary: Start a user's single-user named-server notebook server
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: server_name
description: |
name given to a named-server.
Note that depending on your JupyterHub infrastructure there are chracterter size limitation to `server_name`. Default spawner with K8s pod will not allow Jupyter Notebooks to be spawned with a name that contains more than 253 characters (keep in mind that the pod will be spawned with extra characters to identify the user and hub).
in: path
required: true
type: string
- name: options
description: |
Spawn options can be passed as a JSON body
when spawning via the API instead of spawn form.
The structure of the options
will depend on the Spawner's configuration.
in: body
required: false
schema:
type: object
responses:
'201':
description: The user's notebook named-server has started
'202':
description: The user's notebook named-server has not yet started, but has been requested
delete:
summary: Stop a user's named-server
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: server_name
description: name given to a named-server
in: path
required: true
type: string
- name: body
in: body
required: false
schema:
type: object
properties:
remove:
type: boolean
description: |
Whether to fully remove the server, rather than just stop it.
Removing a server deletes things like the state of the stopped server.
Default: false.
responses:
'204':
description: The user's notebook named-server has stopped
'202':
description: The user's notebook named-server has not yet stopped as it is taking a while to stop
/users/{name}/tokens:
parameters:
- name: name
description: username
in: path
required: true
type: string
get:
summary: List tokens for the user
responses:
'200':
description: Sets a cookie granting the requesting admin access to the user's server
description: The list of tokens
schema:
type: array
items:
$ref: '#/definitions/Token'
'401':
$ref: '#/responses/Unauthorized'
'404':
description: No such user
post:
summary: Create a new token for the user
parameters:
- name: token_params
in: body
required: false
schema:
type: object
properties:
expires_in:
type: number
description: lifetime (in seconds) after which the requested token will expire.
note:
type: string
description: A note attached to the token for future bookkeeping
responses:
'201':
description: The newly created token
schema:
$ref: '#/definitions/Token'
'400':
description: Body must be a JSON dict or empty
/users/{name}/tokens/{token_id}:
parameters:
- name: name
description: username
in: path
required: true
type: string
- name: token_id
in: path
required: true
type: string
get:
summary: Get the model for a token by id
responses:
'200':
description: The info for the new token
schema:
$ref: '#/definitions/Token'
delete:
summary: Delete (revoke) a token by id
responses:
'204':
description: The token has been deleted
/user:
get:
summary: Return authenticated user's model
responses:
'200':
description: The authenticated user's model is returned.
schema:
$ref: '#/definitions/User'
/groups:
get:
summary: List groups
responses:
'200':
description: The list of groups
schema:
type: array
items:
$ref: '#/definitions/Group'
/groups/{name}:
get:
summary: Get a group by name
parameters:
- name: name
description: group name
in: path
required: true
type: string
responses:
'200':
description: The group model
schema:
$ref: '#/definitions/Group'
post:
summary: Create a group
parameters:
- name: name
description: group name
in: path
required: true
type: string
responses:
'201':
description: The group has been created
schema:
$ref: '#/definitions/Group'
delete:
summary: Delete a group
parameters:
- name: name
description: group name
in: path
required: true
type: string
responses:
'204':
description: The group has been deleted
/groups/{name}/users:
post:
summary: Add users to a group
parameters:
- name: name
description: group name
in: path
required: true
type: string
- name: body
in: body
required: true
description: The users to add to the group
schema:
type: object
properties:
users:
type: array
description: List of usernames to add to the group
items:
type: string
responses:
'200':
description: The users have been added to the group
schema:
$ref: '#/definitions/Group'
delete:
summary: Remove users from a group
parameters:
- name: name
description: group name
in: path
required: true
type: string
- name: body
in: body
required: true
description: The users to remove from the group
schema:
type: object
properties:
users:
type: array
description: List of usernames to remove from the group
items:
type: string
responses:
'200':
description: The users have been removed from the group
/services:
get:
summary: List services
responses:
'200':
description: The service list
schema:
type: array
items:
$ref: '#/definitions/Service'
/services/{name}:
get:
summary: Get a service by name
parameters:
- name: name
description: service name
in: path
required: true
type: string
responses:
'200':
description: The Service model
schema:
$ref: '#/definitions/Service'
/proxy:
get:
summary: Get the proxy's routing table
description: A convenience alias for getting the info directly from the proxy
description: A convenience alias for getting the routing table directly from the proxy
responses:
'200':
description: Routing table
schema:
type: object
description: configurable-http-proxy routing table (see CHP docs for details)
description: configurable-http-proxy routing table (see configurable-http-proxy docs for details)
post:
summary: Force the Hub to sync with the proxy
responses:
'200':
description: Success
patch:
summary: Tell the Hub about a new proxy
description: If you have started a new proxy and would like the Hub to switch over to it, this allows you to notify the Hub of the new proxy.
summary: Notify the Hub about a new proxy
description: Notifies the Hub of a new proxy to use.
parameters:
- name: data
- name: body
in: body
required: true
description: Any values that have changed for the new proxy. All keys are optional.
@@ -199,43 +570,173 @@ paths:
responses:
'200':
description: Success
/authorizations/token/{token}:
get:
summary: Identify a user from an API token
/authorizations/token:
post:
summary: Request a new API token
description: |
Request a new API token to use with the JupyterHub REST API.
If not already authenticated, username and password can be sent
in the JSON request body.
Logging in via this method is only available when the active Authenticator
accepts passwords (e.g. not OAuth).
parameters:
- name: token
in: path
required: true
type: string
- name: credentials
in: body
schema:
type: object
properties:
username:
type: string
password:
type: string
responses:
'200':
description: The user identified by the API token
description: The new API token
schema:
$ref: '#!/definitions/User'
type: object
properties:
token:
type: string
description: The new API token.
'403':
description: The user can not be authenticated.
/authorizations/token/{token}:
get:
summary: Identify a user or service from an API token
parameters:
- name: token
in: path
required: true
type: string
responses:
'200':
description: The user or service identified by the API token
'404':
description: A user or service is not found.
/authorizations/cookie/{cookie_name}/{cookie_value}:
get:
summary: Identify a user from a cookie
description: Used by single-user servers to hand off cookie authentication to the Hub
description: Used by single-user notebook servers to hand off cookie authentication to the Hub
parameters:
- name: cookie_name
in: path
required: true
type: string
- name: cookie_value
in: path
required: true
type: string
- name: cookie_name
in: path
required: true
type: string
- name: cookie_value
in: path
required: true
type: string
responses:
'200':
description: The user identified by the cookie
schema:
$ref: '#!/definitions/User'
$ref: '#/definitions/User'
'404':
description: A user is not found.
/oauth2/authorize:
get:
summary: 'OAuth 2.0 authorize endpoint'
description: |
Redirect users to this URL to begin the OAuth process.
It is not an API endpoint.
parameters:
- name: client_id
description: The client id
in: query
required: true
type: string
- name: response_type
description: The response type (always 'code')
in: query
required: true
type: string
- name: state
description: A state string
in: query
required: false
type: string
- name: redirect_uri
description: The redirect url
in: query
required: true
type: string
responses:
'200':
description: Success
'400':
description: OAuth2Error
/oauth2/token:
post:
summary: Request an OAuth2 token
description: |
Request an OAuth2 token from an authorization code.
This request completes the OAuth process.
consumes:
- application/x-www-form-urlencoded
parameters:
- name: client_id
description: The client id
in: formData
required: true
type: string
- name: client_secret
description: The client secret
in: formData
required: true
type: string
- name: grant_type
description: The grant type (always 'authorization_code')
in: formData
required: true
type: string
- name: code
description: The code provided by the authorization redirect
in: formData
required: true
type: string
- name: redirect_uri
description: The redirect url
in: formData
required: true
type: string
responses:
'200':
description: JSON response including the token
schema:
type: object
properties:
access_token:
type: string
description: The new API token for the user
token_type:
type: string
description: Will always be 'Bearer'
/shutdown:
post:
summary: Shutdown the Hub
parameters:
- name: body
in: body
schema:
type: object
properties:
proxy:
type: boolean
description: Whether the proxy should be shutdown as well (default from Hub config)
servers:
type: boolean
description: Whether users' notebook servers should be shutdown as well (default from Hub config)
responses:
'200':
description: Hub has shutdown
'202':
description: Shutdown successful
'400':
description: Unexpeced value for proxy or servers
# Descriptions of common responses
responses:
NotFound:
description: The specified resource was not found
Unauthorized:
description: Authentication/Authorization error
definitions:
User:
type: object
@@ -246,14 +747,135 @@ definitions:
admin:
type: boolean
description: Whether the user is an admin
groups:
type: array
description: The names of groups where this user is a member
items:
type: string
server:
type: string
description: The user's server's base URL, if running; null if not.
description: The user's notebook server's base URL, if running; null if not.
pending:
type: string
enum: ["spawn", "stop"]
enum: ["spawn", "stop", null]
description: The currently pending action, if any
last_activity:
type: string
format: ISO8601 Timestamp
format: date-time
description: Timestamp of last-seen activity from the user
servers:
type: array
description: The active servers for this user.
items:
$ref: '#/definitions/Server'
Server:
type: object
properties:
name:
type: string
description: The server's name. The user's default server has an empty name ('')
ready:
type: boolean
description: |
Whether the server is ready for traffic.
Will always be false when any transition is pending.
pending:
type: string
enum: ["spawn", "stop", null]
description: |
The currently pending action, if any.
A server is not ready if an action is pending.
url:
type: string
description: |
The URL where the server can be accessed
(typically /user/:name/:server.name/).
progress_url:
type: string
description: |
The URL for an event-stream to retrieve events during a spawn.
started:
type: string
format: date-time
description: UTC timestamp when the server was last started.
last_activity:
type: string
format: date-time
description: UTC timestamp last-seen activity on this server.
state:
type: object
description: Arbitrary internal state from this server's spawner. Only available on the hub's users list or get-user-by-name method, and only if a hub admin. None otherwise.
user_options:
type: object
description: User specified options for the user's spawned instance of a single-user server.
Group:
type: object
properties:
name:
type: string
description: The group's name
users:
type: array
description: The names of users who are members of this group
items:
type: string
Service:
type: object
properties:
name:
type: string
description: The service's name
admin:
type: boolean
description: Whether the service is an admin
url:
type: string
description: The internal url where the service is running
prefix:
type: string
description: The proxied URL prefix to the service's url
pid:
type: number
description: The PID of the service process (if managed)
command:
type: array
description: The command used to start the service (if managed)
items:
type: string
info:
type: object
description: |
Additional information a deployment can attach to a service.
JupyterHub does not use this field.
Token:
type: object
properties:
token:
type: string
description: The token itself. Only present in responses to requests for a new token.
id:
type: string
description: The id of the API token. Used for modifying or deleting the token.
user:
type: string
description: The user that owns a token (undefined if owned by a service)
service:
type: string
description: The service that owns the token (undefined of owned by a user)
note:
type: string
description: A note about the token, typically describing what it was created for.
created:
type: string
format: date-time
description: Timestamp when this token was created
expires_at:
type: string
format: date-time
description: Timestamp when this token expires. Null if there is no expiry.
last_activity:
type: string
format: date-time
description: |
Timestamp of last-seen activity using this token.
Can be null if token has never been used.

View File

@@ -0,0 +1,4 @@
/* Added to avoid logo being too squeezed */
.navbar-brand {
height: 4rem !important;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,159 @@
.. _admin/upgrading:
====================
Upgrading JupyterHub
====================
JupyterHub offers easy upgrade pathways between minor versions. This
document describes how to do these upgrades.
If you are using :ref:`a JupyterHub distribution <index/distributions>`, you
should consult the distribution's documentation on how to upgrade. This
document is if you have set up your own JupyterHub without using a
distribution.
It is long because is pretty detailed! Most likely, upgrading
JupyterHub is painless, quick and with minimal user interruption.
Read the Changelog
==================
The `changelog <../changelog.html>`_ contains information on what has
changed with the new JupyterHub release, and any deprecation warnings.
Read these notes to familiarize yourself with the coming changes. There
might be new releases of authenticators & spawners you are using, so
read the changelogs for those too!
Notify your users
=================
If you are using the default configuration where ``configurable-http-proxy``
is managed by JupyterHub, your users will see service disruption during
the upgrade process. You should notify them, and pick a time to do the
upgrade where they will be least disrupted.
If you are using a different proxy, or running ``configurable-http-proxy``
independent of JupyterHub, your users will be able to continue using notebook
servers they had already launched, but will not be able to launch new servers
nor sign in.
Backup database & config
========================
Before doing an upgrade, it is critical to back up:
#. Your JupyterHub database (sqlite by default, or MySQL / Postgres
if you used those). If you are using sqlite (the default), you
should backup the ``jupyterhub.sqlite`` file.
#. Your ``jupyterhub_config.py`` file.
#. Your user's home directories. This is unlikely to be affected directly by
a JupyterHub upgrade, but we recommend a backup since user data is very
critical.
Shutdown JupyterHub
===================
Shutdown the JupyterHub process. This would vary depending on how you
have set up JupyterHub to run. Most likely, it is using a process
supervisor of some sort (``systemd`` or ``supervisord`` or even ``docker``).
Use the supervisor specific command to stop the JupyterHub process.
Upgrade JupyterHub packages
===========================
There are two environments where the ``jupyterhub`` package is installed:
#. The *hub environment*, which is where the JupyterHub server process
runs. This is started with the ``jupyterhub`` command, and is what
people generally think of as JupyterHub.
#. The *notebook user environments*. This is where the user notebook
servers are launched from, and is probably custom to your own
installation. This could be just one environment (different from the
hub environment) that is shared by all users, one environment
per user, or same environment as the hub environment. The hub
launched the ``jupyterhub-singleuser`` command in this environment,
which in turn starts the notebook server.
You need to make sure the version of the ``jupyterhub`` package matches
in both these environments. If you installed ``jupyterhub`` with pip,
you can upgrade it with:
.. code-block:: bash
python3 -m pip install --upgrade jupyterhub==<version>
Where ``<version>`` is the version of JupyterHub you are upgrading to.
If you used ``conda`` to install ``jupyterhub``, you should upgrade it
with:
.. code-block:: bash
conda install -c conda-forge jupyterhub==<version>
Where ``<version>`` is the version of JupyterHub you are upgrading to.
You should also check for new releases of the authenticator & spawner you
are using. You might wish to upgrade those packages too along with JupyterHub,
or upgrade them separately.
Upgrade JupyterHub database
===========================
Once new packages are installed, you need to upgrade the JupyterHub
database. From the hub environment, in the same directory as your
``jupyterhub_config.py`` file, you should run:
.. code-block:: bash
jupyterhub upgrade-db
This should find the location of your database, and run necessary upgrades
for it.
SQLite database disadvantages
-----------------------------
SQLite has some disadvantages when it comes to upgrading JupyterHub. These
are:
- ``upgrade-db`` may not work, and you may need delete your database
and start with a fresh one.
- ``downgrade-db`` **will not** work if you want to rollback to an
earlier version, so backup the ``jupyterhub.sqlite`` file before
upgrading
What happens if I delete my database?
-------------------------------------
Losing the Hub database is often not a big deal. Information that
resides only in the Hub database includes:
- active login tokens (user cookies, service tokens)
- users added via JupyterHub UI, instead of config files
- info about running servers
If the following conditions are true, you should be fine clearing the
Hub database and starting over:
- users specified in config file, or login using an external
authentication provider (Google, GitHub, LDAP, etc)
- user servers are stopped during upgrade
- don't mind causing users to login again after upgrade
Start JupyterHub
================
Once the database upgrade is completed, start the ``jupyterhub``
process again.
#. Log-in and start the server to make sure things work as
expected.
#. Check the logs for any errors or deprecation warnings. You
might have to update your ``jupyterhub_config.py`` file to
deal with any deprecated options.
Congratulations, your JupyterHub has been upgraded!

15
docs/source/api/app.rst Normal file
View File

@@ -0,0 +1,15 @@
=========================
Application configuration
=========================
Module: :mod:`jupyterhub.app`
=============================
.. automodule:: jupyterhub.app
.. currentmodule:: jupyterhub.app
:class:`JupyterHub`
-------------------
.. autoconfigurable:: JupyterHub

View File

@@ -9,13 +9,24 @@ Module: :mod:`jupyterhub.auth`
.. currentmodule:: jupyterhub.auth
:class:`Authenticator`
----------------------
.. autoclass:: Authenticator
.. autoconfigurable:: Authenticator
:members:
.. autoclass:: LocalAuthenticator
:class:`LocalAuthenticator`
---------------------------
.. autoconfigurable:: LocalAuthenticator
:members:
.. autoclass:: PAMAuthenticator
:class:`PAMAuthenticator`
-------------------------
.. autoconfigurable:: PAMAuthenticator
:class:`DummyAuthenticator`
---------------------------
.. autoconfigurable:: DummyAuthenticator

View File

@@ -1,14 +1,38 @@
.. _api-index:
####################
The JupyterHub API
####################
##############
JupyterHub API
##############
:Release: |release|
:Date: |today|
JupyterHub also provides a REST API for administration of the Hub and users.
The documentation on `Using JupyterHub's REST API <../reference/rest.html>`_ provides
information on:
- what you can do with the API
- creating an API token
- adding API tokens to the config files
- making an API request programmatically using the requests library
- learning more about JupyterHub's API
The same JupyterHub API spec, as found here, is available in an interactive form
`here (on swagger's petstore) <http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/master/docs/rest-api.yml#!/default>`__.
The `OpenAPI Initiative`_ (fka Swagger™) is a project used to describe
and document RESTful APIs.
JupyterHub API Reference:
.. toctree::
app
auth
spawner
proxy
user
service
services.auth
.. _OpenAPI Initiative: https://www.openapis.org/

22
docs/source/api/proxy.rst Normal file
View File

@@ -0,0 +1,22 @@
=======
Proxies
=======
Module: :mod:`jupyterhub.proxy`
===============================
.. automodule:: jupyterhub.proxy
.. currentmodule:: jupyterhub.proxy
:class:`Proxy`
--------------
.. autoconfigurable:: Proxy
:members:
:class:`ConfigurableHTTPProxy`
------------------------------
.. autoconfigurable:: ConfigurableHTTPProxy
:members: debug, auth_token, check_running_interval, api_url, command

View File

@@ -0,0 +1,16 @@
========
Services
========
Module: :mod:`jupyterhub.services.service`
==========================================
.. automodule:: jupyterhub.services.service
.. currentmodule:: jupyterhub.services.service
:class:`Service`
----------------
.. autoconfigurable:: Service
:members: name, admin, url, api_token, managed, kind, command, cwd, environment, user, oauth_client_id, server, prefix, proxy_spec

View File

@@ -0,0 +1,40 @@
=======================
Services Authentication
=======================
Module: :mod:`jupyterhub.services.auth`
=======================================
.. automodule:: jupyterhub.services.auth
.. currentmodule:: jupyterhub.services.auth
:class:`HubAuth`
----------------
.. autoconfigurable:: HubAuth
:members:
:class:`HubOAuth`
-----------------
.. autoconfigurable:: HubOAuth
:members:
:class:`HubAuthenticated`
-------------------------
.. autoclass:: HubAuthenticated
:members:
:class:`HubOAuthenticated`
--------------------------
.. autoclass:: HubOAuthenticated
:class:`HubOAuthCallbackHandler`
--------------------------------
.. autoclass:: HubOAuthCallbackHandler

View File

@@ -1,6 +1,6 @@
==============
Spawners
==============
========
Spawners
========
Module: :mod:`jupyterhub.spawner`
=================================
@@ -12,7 +12,10 @@ Module: :mod:`jupyterhub.spawner`
:class:`Spawner`
----------------
.. autoclass:: Spawner
:members: options_from_form, poll, start, stop, get_args, get_env, get_state
.. autoconfigurable:: Spawner
:members: options_from_form, poll, start, stop, get_args, get_env, get_state, template_namespace, format_string, create_certs, move_certs
.. autoclass:: LocalProcessSpawner
:class:`LocalProcessSpawner`
----------------------------
.. autoconfigurable:: LocalProcessSpawner

View File

@@ -1,6 +1,6 @@
=============
Users
=============
=====
Users
=====
Module: :mod:`jupyterhub.user`
==============================
@@ -9,11 +9,16 @@ Module: :mod:`jupyterhub.user`
.. currentmodule:: jupyterhub.user
:class:`UserDict`
-----------------
.. autoclass:: UserDict
:members:
:class:`User`
-------------
.. class:: Server
.. autoclass:: User
:members: escaped_name

View File

@@ -1,111 +0,0 @@
# Writing a custom Authenticator
The [Authenticator][] is the mechanism for authorizing users.
Basic authenticators use simple username and password authentication.
JupyterHub ships only with a [PAM][]-based Authenticator,
for logging in with local user accounts.
You can use custom Authenticator subclasses to enable authentication via other systems.
One such example is using [GitHub OAuth][].
Because the username is passed from the Authenticator to the Spawner,
a custom Authenticator and Spawner are often used together.
See a list of custom Authenticators [on the wiki](https://github.com/jupyter/jupyterhub/wiki/Authenticators).
## Basics of Authenticators
A basic Authenticator has one central method:
### Authenticator.authenticate
Authenticator.authenticate(handler, data)
This method is passed the tornado RequestHandler and the POST data from the login form.
Unless the login form has been customized, `data` will have two keys:
- `username` (self-explanatory)
- `password` (also self-explanatory)
`authenticate`'s job is simple:
- return a username (non-empty str)
of the authenticated user if authentication is successful
- return `None` otherwise
Writing an Authenticator that looks up passwords in a dictionary
requires only overriding this one method:
```python
from tornado import gen
from IPython.utils.traitlets import Dict
from jupyterhub.auth import Authenticator
class DictionaryAuthenticator(Authenticator):
passwords = Dict(config=True,
help="""dict of username:password for authentication"""
)
@gen.coroutine
def authenticate(self, handler, data):
if self.passwords.get(data['username']) == data['password']:
return data['username']
```
### Authenticator.whitelist
Authenticators can specify a whitelist of usernames to allow authentication.
For local user authentication (e.g. PAM), this lets you limit which users
can login.
## Normalizing and validating usernames
Since the Authenticator and Spawner both use the same username,
sometimes you want to transform the name coming from the authentication service
(e.g. turning email addresses into local system usernames) before adding them to the Hub service.
Authenticators can define `normalize_username`, which takes a username.
The default normalization is to cast names to lowercase
For simple mappings, a configurable dict `Authenticator.username_map` is used to turn one name into another:
```python
c.Authenticator.username_map = {
'service-name': 'localname'
}
```
### Validating usernames
In most cases, there is a very limited set of acceptable usernames.
Authenticators can define `validate_username(username)`,
which should return True for a valid username and False for an invalid one.
The primary effect this has is improving error messages during user creation.
The default behavior is to use configurable `Authenticator.username_pattern`,
which is a regular expression string for validation.
To only allow usernames that start with 'w':
c.Authenticator.username_pattern = r'w.*'
## OAuth and other non-password logins
Some login mechanisms, such as [OAuth][], don't map onto username+password.
For these, you can override the login handlers.
You can see an example implementation of an Authenticator that uses [GitHub OAuth][]
at [OAuthenticator][].
[Authenticator]: https://github.com/jupyter/jupyterhub/blob/master/jupyterhub/auth.py
[PAM]: https://en.wikipedia.org/wiki/Pluggable_authentication_module
[OAuth]: https://en.wikipedia.org/wiki/OAuth
[GitHub OAuth]: https://developer.github.com/v3/oauth/
[OAuthenticator]: https://github.com/jupyter/oauthenticator

File diff suppressed because one or more lines are too long

View File

@@ -1,59 +1,27 @@
# -*- coding: utf-8 -*-
#
# JupyterHub documentation build configuration file, created by
# sphinx-quickstart on Mon Jan 4 16:31:09 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
import sys
# Needed for conversion from markdown to html
import recommonmark.parser
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# Set paths
sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = '1.3'
# Minimal Sphinx version
needs_sphinx = '1.4'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
# Sphinx extension modules
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
'sphinx.ext.napoleon',
'autodoc_traits',
'sphinx_copybutton',
'sphinx-jsonschema',
'recommonmark',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# Jupyter uses recommonmark's parser to convert markdown
source_parsers = {
'.md': 'recommonmark.parser.CommonMarkParser',
}
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = ['.rst', '.md']
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
@@ -62,246 +30,173 @@ project = u'JupyterHub'
copyright = u'2016, Project Jupyter team'
author = u'Project Jupyter team'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
# Project Jupyter uses the following to autopopulate version
# Autopopulate version
from os.path import dirname
root = dirname(dirname(dirname(__file__)))
docs = dirname(dirname(__file__))
root = dirname(docs)
sys.path.insert(0, root)
import jupyterhub
# The short X.Y version.
version = '%i.%i' % jupyterhub.version_info[:2]
# The full version, including alpha/beta/rc tags.
release = jupyterhub.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# Set the default role so we can use `foo` instead of ``foo``
default_role = 'literal'
# -- Source -------------------------------------------------------------
import recommonmark
from recommonmark.transform import AutoStructify
# -- Config -------------------------------------------------------------
from jupyterhub.app import JupyterHub
from docutils import nodes
from sphinx.directives.other import SphinxDirective
from contextlib import redirect_stdout
from io import StringIO
# create a temp instance of JupyterHub just to get the output of the generate-config
# and help --all commands.
jupyterhub_app = JupyterHub()
class ConfigDirective(SphinxDirective):
"""Generate the configuration file output for use in the documentation."""
has_content = False
required_arguments = 0
optional_arguments = 0
final_argument_whitespace = False
option_spec = {}
def run(self):
# The generated configuration file for this version
generated_config = jupyterhub_app.generate_config_file()
# post-process output
home_dir = os.environ['HOME']
generated_config = generated_config.replace(home_dir, '$HOME', 1)
par = nodes.literal_block(text=generated_config)
return [par]
class HelpAllDirective(SphinxDirective):
"""Print the output of jupyterhub help --all for use in the documentation."""
has_content = False
required_arguments = 0
optional_arguments = 0
final_argument_whitespace = False
option_spec = {}
def run(self):
# The output of the help command for this version
buffer = StringIO()
with redirect_stdout(buffer):
jupyterhub_app.print_help('--help-all')
all_help = buffer.getvalue()
# post-process output
home_dir = os.environ['HOME']
all_help = all_help.replace(home_dir, '$HOME', 1)
par = nodes.literal_block(text=all_help)
return [par]
def setup(app):
app.add_config_value('recommonmark_config', {'enable_eval_rst': True}, True)
app.add_css_file('custom.css')
app.add_transform(AutoStructify)
app.add_directive('jupyterhub-generate-config', ConfigDirective)
app.add_directive('jupyterhub-help-all', HelpAllDirective)
source_suffix = ['.rst', '.md']
# source_encoding = 'utf-8-sig'
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'
# The theme to use for HTML and HTML Help pages.
html_theme = 'pydata_sphinx_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
html_logo = '_static/images/logo/logo.png'
html_favicon = '_static/images/logo/favicon.ico'
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
# Paths that contain custom static files (such as style sheets)
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'JupyterHubdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
# 'papersize': 'letterpaper',
# 'pointsize': '10pt',
# 'preamble': '',
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'JupyterHub.tex', u'JupyterHub Documentation',
u'Project Jupyter team', 'manual'),
(
master_doc,
'JupyterHub.tex',
u'JupyterHub Documentation',
u'Project Jupyter team',
'manual',
)
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# latex_logo = None
# latex_use_parts = False
# latex_show_pagerefs = False
# latex_show_urls = False
# latex_appendices = []
# latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# -- manual page output -------------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'jupyterhub', u'JupyterHub Documentation',
[author], 1)
]
man_pages = [(master_doc, 'jupyterhub', u'JupyterHub Documentation', [author], 1)]
# If true, show URL addresses after external links.
#man_show_urls = False
# man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# -- Texinfo output -----------------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'JupyterHub', u'JupyterHub Documentation',
author, 'JupyterHub', 'One line description of project.',
'Miscellaneous'),
(
master_doc,
'JupyterHub',
u'JupyterHub Documentation',
author,
'JupyterHub',
'One line description of project.',
'Miscellaneous',
)
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# texinfo_appendices = []
# texinfo_domain_indices = True
# texinfo_show_urls = 'footnote'
# texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# -- Epub output --------------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
@@ -309,78 +204,30 @@ epub_author = author
epub_publisher = author
epub_copyright = copyright
# The basename for the epub file. It defaults to the project name.
#epub_basename = project
# The HTML theme for the epub output. Since the default themes are not optimized
# for small screen space, using the same theme for HTML and epub output is
# usually not wise. This defaults to 'epub', a theme designed to save visual
# space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or 'en' if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# -- Intersphinx ----------------------------------------------------------
# Allow duplicate toc entries.
#epub_tocdup = True
intersphinx_mapping = {'https://docs.python.org/3/': None}
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# -- Read The Docs --------------------------------------------------------
# Fix unsupported image types using the Pillow.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'https://docs.python.org/': None}
# Read The Docs
# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if on_rtd:
# readthedocs.org uses their theme by default, so no need to specify it
# build both metrics and rest-api, since RTD doesn't run make
from subprocess import check_call as sh
if not on_rtd: # only import and set the theme if we're building docs locally
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
sh(['make', 'metrics', 'rest-api'], cwd=docs)
# otherwise, readthedocs.org uses their theme by default, so no need to specify it
# -- Spell checking -------------------------------------------------------
try:
import sphinxcontrib.spelling
except ImportError:
pass
else:
extensions.append("sphinxcontrib.spelling")
spelling_word_list_filename = 'spelling_wordlist.txt'

View File

@@ -0,0 +1,30 @@
.. _contributing/community:
================================
Community communication channels
================================
We use `Discourse <https://discourse.jupyter.org>` for online discussion.
Everyone in the Jupyter community is welcome to bring ideas and questions there.
In addition, we use `Gitter <https://gitter.im>`_ for online, real-time text chat,
a place for more ephemeral discussions.
The primary Gitter channel for JupyterHub is `jupyterhub/jupyterhub <https://gitter.im/jupyterhub/jupyterhub>`_.
Gitter isn't archived or searchable, so we recommend going to discourse first
to make sure that discussions are most useful and accessible to the community.
Remember that our community is distributed across the world in various
timezones, so be patient if you do not get an answer immediately!
GitHub issues are used for most long-form project discussions, bug reports
and feature requests. Issues related to a specific authenticator or
spawner should be directed to the appropriate repository for the
authenticator or spawner. If you are using a specific JupyterHub
distribution (such as `Zero to JupyterHub on Kubernetes <http://github.com/jupyterhub/zero-to-jupyterhub-k8s>`_
or `The Littlest JupyterHub <http://github.com/jupyterhub/the-littlest-jupyterhub/>`_),
you should open issues directly in their repository. If you can not
find a repository to open your issue in, do not worry! Create it in the `main
JupyterHub repository <https://github.com/jupyterhub/jupyterhub/>`_ and our
community will help you figure it out.
A `mailing list <https://groups.google.com/forum/#!forum/jupyter>`_ for all
of Project Jupyter exists, along with one for `teaching with Jupyter
<https://groups.google.com/forum/#!forum/jupyter-education>`_.

View File

@@ -0,0 +1,78 @@
.. _contributing/docs:
==========================
Contributing Documentation
==========================
Documentation is often more important than code. This page helps
you get set up on how to contribute documentation to JupyterHub.
Building documentation locally
==============================
We use `sphinx <http://sphinx-doc.org>`_ to build our documentation. It takes
our documentation source files (written in `markdown
<https://daringfireball.net/projects/markdown/>`_ or `reStructuredText
<http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_ &
stored under the ``docs/source`` directory) and converts it into various
formats for people to read. To make sure the documentation you write or
change renders correctly, it is good practice to test it locally.
#. Make sure you have successfuly completed :ref:`contributing/setup`.
#. Install the packages required to build the docs.
.. code-block:: bash
python3 -m pip install -r docs/requirements.txt
#. Build the html version of the docs. This is the most commonly used
output format, so verifying it renders as you should is usually good
enough.
.. code-block:: bash
cd docs
make html
This step will display any syntax or formatting errors in the documentation,
along with the filename / line number in which they occurred. Fix them,
and re-run the ``make html`` command to re-render the documentation.
#. View the rendered documentation by opening ``build/html/index.html`` in
a web browser.
.. tip::
On macOS, you can open a file from the terminal with ``open <path-to-file>``.
On Linux, you can do the same with ``xdg-open <path-to-file>``.
.. _contributing/docs/conventions:
Documentation conventions
=========================
This section lists various conventions we use in our documentation. This is a
living document that grows over time, so feel free to add to it / change it!
Our entire documentation does not yet fully conform to these conventions yet,
so help in making it so would be appreciated!
``pip`` invocation
------------------
There are many ways to invoke a ``pip`` command, we recommend the following
approach:
.. code-block:: bash
python3 -m pip
This invokes pip explicitly using the python3 binary that you are
currently using. This is the **recommended way** to invoke pip
in our documentation, since it is least likely to cause problems
with python3 and pip being from different environments.
For more information on how to invoke ``pip`` commands, see
`the pip documentation <https://pip.pypa.io/en/stable/>`_.

View File

@@ -0,0 +1,21 @@
============
Contributing
============
We want you to contribute to JupyterHub in ways that are most exciting
& useful to you. We value documentation, testing, bug reporting & code equally,
and are glad to have your contributions in whatever form you wish :)
Our `Code of Conduct <https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md>`_
(`reporting guidelines <https://github.com/jupyter/governance/blob/master/conduct/reporting_online.md>`_)
helps keep our community welcoming to as many people as possible.
.. toctree::
:maxdepth: 2
community
setup
docs
tests
roadmap
security

View File

@@ -0,0 +1,97 @@
# The JupyterHub roadmap
This roadmap collects "next steps" for JupyterHub. It is about creating a
shared understanding of the project's vision and direction amongst
the community of users, contributors, and maintainers.
The goal is to communicate priorities and upcoming release plans.
It is not a aimed at limiting contributions to what is listed here.
## Using the roadmap
### Sharing Feedback on the Roadmap
All of the community is encouraged to provide feedback as well as share new
ideas with the community. Please do so by submitting an issue. If you want to
have an informal conversation first use one of the other communication channels.
After submitting the issue, others from the community will probably
respond with questions or comments they have to clarify the issue. The
maintainers will help identify what a good next step is for the issue.
### What do we mean by "next step"?
When submitting an issue, think about what "next step" category best describes
your issue:
* **now**, concrete/actionable step that is ready for someone to start work on.
These might be items that have a link to an issue or more abstract like
"decrease typos and dead links in the documentation"
* **soon**, less concrete/actionable step that is going to happen soon,
discussions around the topic are coming close to an end at which point it can
move into the "now" category
* **later**, abstract ideas or tasks, need a lot of discussion or
experimentation to shape the idea so that it can be executed. Can also
contain concrete/actionable steps that have been postponed on purpose
(these are steps that could be in "now" but the decision was taken to work on
them later)
### Reviewing and Updating the Roadmap
The roadmap will get updated as time passes (next review by 1st December) based
on discussions and ideas captured as issues.
This means this list should not be exhaustive, it should only represent
the "top of the stack" of ideas. It should
not function as a wish list, collection of feature requests or todo list.
For those please create a
[new issue](https://github.com/jupyterhub/jupyterhub/issues/new).
The roadmap should give the reader an idea of what is happening next, what needs
input and discussion before it can happen and what has been postponed.
## The roadmap proper
### Project vision
JupyterHub is a dependable tool used by humans that reduces the complexity of
creating the environment in which a piece of software can be executed.
### Now
These "Now" items are considered active areas of focus for the project:
* HubShare - a sharing service for use with JupyterHub.
* Users should be able to:
- Push a project to other users.
- Get a checkout of a project from other users.
- Push updates to a published project.
- Pull updates from a published project.
- Manage conflicts/merges by simply picking a version (our/theirs)
- Get a checkout of a project from the internet. These steps are completely different from saving notebooks/files.
- Have directories that are managed by git completely separately from our stuff.
- Look at pushed content that they have access to without an explicit pull.
- Define and manage teams of users.
- Adding/removing a user to/from a team gives/removes them access to all projects that team has access to.
- Build other services, such as static HTML publishing and dashboarding on top of these things.
### Soon
These "Soon" items are under discussion. Once an item reaches the point of an
actionable plan, the item will be moved to the "Now" section. Typically,
these will be moved at a future review of the roadmap.
* resource monitoring and management:
- (prometheus?) API for resource monitoring
- tracking activity on single-user servers instead of the proxy
- notes and activity tracking per API token
### Later
The "Later" items are things that are at the back of the project's mind. At this
time there is no active plan for an item. The project would like to find the
resources and time to discuss these ideas.
- real-time collaboration
- Enter into real-time collaboration mode for a project that starts a shared execution context.
- Once the single-user notebook package supports realtime collaboration,
implement sharing mechanism integrated into the Hub.

View File

@@ -0,0 +1,10 @@
Reporting security issues in Jupyter or JupyterHub
==================================================
If you find a security vulnerability in Jupyter or JupyterHub,
whether it is a failure of the security model described in :doc:`../reference/websecurity`
or a failure in implementation,
please report it to security@ipython.org.
If you prefer to encrypt your security reports,
you can use :download:`this PGP public key </ipython_security.asc>`.

View File

@@ -0,0 +1,188 @@
.. _contributing/setup:
================================
Setting up a development install
================================
System requirements
===================
JupyterHub can only run on MacOS or Linux operating systems. If you are
using Windows, we recommend using `VirtualBox <https://virtualbox.org>`_
or a similar system to run `Ubuntu Linux <https://ubuntu.com>`_ for
development.
Install Python
--------------
JupyterHub is written in the `Python <https://python.org>`_ programming language, and
requires you have at least version 3.5 installed locally. If you havent
installed Python before, the recommended way to install it is to use
`miniconda <https://conda.io/miniconda.html>`_. Remember to get the Python 3 version,
and **not** the Python 2 version!
Install nodejs
--------------
``configurable-http-proxy``, the default proxy implementation for
JupyterHub, is written in Javascript to run on `NodeJS
<https://nodejs.org/en/>`_. If you have not installed nodejs before, we
recommend installing it in the ``miniconda`` environment you set up for
Python. You can do so with ``conda install nodejs``.
Install git
-----------
JupyterHub uses `git <https://git-scm.com>`_ & `GitHub <https://github.com>`_
for development & collaboration. You need to `install git
<https://git-scm.com/book/en/v2/Getting-Started-Installing-Git>`_ to work on
JupyterHub. We also recommend getting a free account on GitHub.com.
Setting up a development install
================================
When developing JupyterHub, you need to make changes to the code & see
their effects quickly. You need to do a developer install to make that
happen.
.. note:: This guide does not attempt to dictate *how* development
environements should be isolated since that is a personal preference and can
be achieved in many ways, for example `tox`, `conda`, `docker`, etc. See this
`forum thread <https://discourse.jupyter.org/t/thoughts-on-using-tox/3497>`_ for
a more detailed discussion.
1. Clone the `JupyterHub git repository <https://github.com/jupyterhub/jupyterhub>`_
to your computer.
.. code:: bash
git clone https://github.com/jupyterhub/jupyterhub
cd jupyterhub
2. Make sure the ``python`` you installed and the ``npm`` you installed
are available to you on the command line.
.. code:: bash
python -V
This should return a version number greater than or equal to 3.5.
.. code:: bash
npm -v
This should return a version number greater than or equal to 5.0.
3. Install ``configurable-http-proxy``. This is required to run
JupyterHub.
.. code:: bash
npm install -g configurable-http-proxy
If you get an error that says ``Error: EACCES: permission denied``,
you might need to prefix the command with ``sudo``. If you do not
have access to sudo, you may instead run the following commands:
.. code:: bash
npm install configurable-http-proxy
export PATH=$PATH:$(pwd)/node_modules/.bin
The second line needs to be run every time you open a new terminal.
4. Install the python packages required for JupyterHub development.
.. code:: bash
python3 -m pip install -r dev-requirements.txt
python3 -m pip install -r requirements.txt
5. Setup a database.
The default database engine is ``sqlite`` so if you are just trying
to get up and running quickly for local development that should be
available via `python <https://docs.python.org/3.5/library/sqlite3.html>`__.
See :doc:`/reference/database` for details on other supported databases.
6. Install the development version of JupyterHub. This lets you edit
JupyterHub code in a text editor & restart the JupyterHub process to
see your code changes immediately.
.. code:: bash
python3 -m pip install --editable .
7. You are now ready to start JupyterHub!
.. code:: bash
jupyterhub
8. You can access JupyterHub from your browser at
``http://localhost:8000`` now.
Happy developing!
Using DummyAuthenticator & SimpleLocalProcessSpawner
====================================================
To simplify testing of JupyterHub, its helpful to use
:class:`~jupyterhub.auth.DummyAuthenticator` instead of the default JupyterHub
authenticator and SimpleLocalProcessSpawner instead of the default spawner.
There is a sample configuration file that does this in
``testing/jupyterhub_config.py``. To launch jupyterhub with this
configuration:
.. code:: bash
jupyterhub -f testing/jupyterhub_config.py
The default JupyterHub `authenticator
<https://jupyterhub.readthedocs.io/en/stable/reference/authenticators.html#the-default-pam-authenticator>`_
& `spawner
<https://jupyterhub.readthedocs.io/en/stable/api/spawner.html#localprocessspawner>`_
require your system to have user accounts for each user you want to log in to
JupyterHub as.
DummyAuthenticator allows you to log in with any username & password,
while SimpleLocalProcessSpawner allows you to start servers without having to
create a unix user for each JupyterHub user. Together, these make it
much easier to test JupyterHub.
Tip: If you are working on parts of JupyterHub that are common to all
authenticators & spawners, we recommend using both DummyAuthenticator &
SimpleLocalProcessSpawner. If you are working on just authenticator related
parts, use only SimpleLocalProcessSpawner. Similarly, if you are working on
just spawner related parts, use only DummyAuthenticator.
Troubleshooting
===============
This section lists common ways setting up your development environment may
fail, and how to fix them. Please add to the list if you encounter yet
another way it can fail!
``lessc`` not found
-------------------
If the ``python3 -m pip install --editable .`` command fails and complains about
``lessc`` being unavailable, you may need to explicitly install some
additional JavaScript dependencies:
.. code:: bash
npm install
This will fetch client-side JavaScript dependencies necessary to compile
CSS.
You may also need to manually update JavaScript and CSS after some
development updates, with:
.. code:: bash
python3 setup.py js # fetch updated client-side js
python3 setup.py css # recompile CSS from LESS sources

View File

@@ -0,0 +1,68 @@
.. _contributing/tests:
==================
Testing JupyterHub
==================
Unit test help validate that JupyterHub works the way we think it does,
and continues to do so when changes occur. They also help communicate
precisely what we expect our code to do.
JupyterHub uses `pytest <https://pytest.org>`_ for all our tests. You
can find them under ``jupyterhub/tests`` directory in the git repository.
Running the tests
==================
#. Make sure you have completed :ref:`contributing/setup`. You should be able
to start ``jupyterhub`` from the commandline & access it from your
web browser. This ensures that the dev environment is properly set
up for tests to run.
#. You can run all tests in JupyterHub
.. code-block:: bash
pytest -v jupyterhub/tests
This should display progress as it runs all the tests, printing
information about any test failures as they occur.
If you wish to confirm test coverage the run tests with the `--cov` flag:
.. code-block:: bash
pytest -v --cov=jupyterhub jupyterhub/tests
#. You can also run tests in just a specific file:
.. code-block:: bash
pytest -v jupyterhub/tests/<test-file-name>
#. To run a specific test only, you can do:
.. code-block:: bash
pytest -v jupyterhub/tests/<test-file-name>::<test-name>
This runs the test with function name ``<test-name>`` defined in
``<test-file-name>``. This is very useful when you are iteratively
developing a single test.
For example, to run the test ``test_shutdown`` in the file ``test_api.py``,
you would run:
.. code-block:: bash
pytest -v jupyterhub/tests/test_api.py::test_shutdown
Troubleshooting Test Failures
=============================
All the tests are failing
-------------------------
Make sure you have completed all the steps in :ref:`contributing/setup` successfully, and
can launch ``jupyterhub`` from the terminal.

View File

@@ -0,0 +1,122 @@
# Contributors
Project Jupyter thanks the following people for their help and
contribution on JupyterHub:
- adelcast
- Analect
- anderbubble
- anikitml
- ankitksharma
- apetresc
- athornton
- barrachri
- BerserkerTroll
- betatim
- Carreau
- cfournie
- charnpreetsingh
- chicovenancio
- cikao
- ckald
- cmoscardi
- consideRatio
- cqzlxl
- CRegenschein
- cwaldbieser
- danielballen
- danoventa
- daradib
- darky2004
- datapolitan
- dblockow-d2dcrc
- DeepHorizons
- DerekHeldtWerle
- dhirschfeld
- dietmarw
- dingc3
- dmartzol
- DominicFollettSmith
- dsblank
- dtaniwaki
- echarles
- ellisonbg
- emmanuel
- evanlinde
- Fokko
- fperez
- franga2000
- GladysNalvarte
- glenak1911
- gweis
- iamed18
- jamescurtin
- JamiesHQ
- JasonJWilliamsNY
- jbweston
- jdavidheiser
- jencabral
- jhamrick
- jkinkead
- johnkpark
- josephtate
- jzf2101
- karfai
- kinuax
- KrishnaPG
- kroq-gar78
- ksolan
- mbmilligan
- mgeplf
- minrk
- mistercrunch
- Mistobaan
- mpacer
- mwmarkland
- ndly
- nthiery
- nxg
- ObiWahn
- ozancaglayan
- paccorsi
- parente
- PeterDaveHello
- peterruppel
- phill84
- pjamason
- prasadkatti
- rafael-ladislau
- rcthomas
- rgbkrk
- rkdarst
- robnagler
- rschroll
- ryanlovett
- sangramga
- Scrypy
- schon
- shreddd
- Siecje
- smiller5678
- spoorthyv
- ssanderson
- summerswallow
- syutbai
- takluyver
- temogen
- ThomasMChen
- Thoralf Gutierrez
- timfreund
- TimShawver
- tklever
- Todd-Z-Li
- toobaz
- tsaeger
- tschaume
- vilhelmen
- whitead
- willingc
- YannBrrd
- yuvipanda
- zoltan-fedor
- zonca

View File

@@ -0,0 +1,50 @@
Eventlogging and Telemetry
==========================
JupyterHub can be configured to record structured events from a running server using Jupyter's `Telemetry System`_. The types of events that JupyterHub emits are defined by `JSON schemas`_ listed below_
emitted as JSON data, defined and validated by the JSON schemas listed below.
.. _logging: https://docs.python.org/3/library/logging.html
.. _`Telemetry System`: https://github.com/jupyter/telemetry
.. _`JSON schemas`: https://json-schema.org/
How to emit events
------------------
Event logging is handled by its ``Eventlog`` object. This leverages Python's standing logging_ library to emit, filter, and collect event data.
To begin recording events, you'll need to set two configurations:
1. ``handlers``: tells the EventLog *where* to route your events. This trait is a list of Python logging handlers that route events to
2. ``allows_schemas``: tells the EventLog *which* events should be recorded. No events are emitted by default; all recorded events must be listed here.
Here's a basic example:
.. code-block::
import logging
c.EventLog.handlers = [
logging.FileHandler('event.log'),
]
c.EventLog.allowed_schemas = [
'hub.jupyter.org/server-action'
]
The output is a file, ``"event.log"``, with events recorded as JSON data.
.. _below:
Event schemas
-------------
.. toctree::
:maxdepth: 2
server-actions.rst

View File

@@ -0,0 +1 @@
.. jsonschema:: ../../../jupyterhub/event-schemas/server-actions/v1.yaml

View File

@@ -0,0 +1,191 @@
# A Gallery of JupyterHub Deployments
**A JupyterHub Community Resource**
We've compiled this list of JupyterHub deployments to help the community
see the breadth and growth of JupyterHub's use in education, research, and
high performance computing.
Please submit pull requests to update information or to add new institutions or uses.
## Academic Institutions, Research Labs, and Supercomputer Centers
### University of California Berkeley
- [BIDS - Berkeley Institute for Data Science](https://bids.berkeley.edu/)
- [Teaching with Jupyter notebooks and JupyterHub](https://bids.berkeley.edu/resources/videos/teaching-ipythonjupyter-notebooks-and-jupyterhub)
- [Data 8](http://data8.org/)
- [GitHub organization](https://github.com/data-8)
- [NERSC](http://www.nersc.gov/)
- [Press release on Jupyter and Cori](http://www.nersc.gov/news-publications/nersc-news/nersc-center-news/2016/jupyter-notebooks-will-open-up-new-possibilities-on-nerscs-cori-supercomputer/)
- [Moving and sharing data](https://www.nersc.gov/assets/Uploads/03-MovingAndSharingData-Cholia.pdf)
- [Research IT](http://research-it.berkeley.edu)
- [JupyterHub server supports campus research computation](http://research-it.berkeley.edu/blog/17/01/24/free-fully-loaded-jupyterhub-server-supports-campus-research-computation)
### University of California Davis
- [Spinning up multiple Jupyter Notebooks on AWS for a tutorial](https://github.com/mblmicdiv/course2017/blob/master/exercises/sourmash-setup.md)
Although not technically a JupyterHub deployment, this tutorial setup
may be helpful to others in the Jupyter community.
Thank you C. Titus Brown for sharing this with the Software Carpentry
mailing list.
```
* I started a big Amazon machine;
* I installed Docker and built a custom image containing my software of
interest;
* I ran multiple containers, one connected to port 8000, one on 8001,
etc. and gave each student a different port;
* students could connect in and use the Terminal program in Jupyter to
execute commands, and could upload/download files via the Jupyter
console interface;
* in theory I could have used notebooks too, but for this I didnt have
need.
I am aware that JupyterHub can probably do all of this including manage
the containers, but Im still a bit shy of diving into that; this was
fairly straightforward, gave me disposable containers that were isolated
for each individual student, and worked almost flawlessly. Should be
easy to do with RStudio too.
```
### Cal Poly San Luis Obispo
- [jupyterhub-deploy-teaching](https://github.com/jupyterhub/jupyterhub-deploy-teaching) based on work by Brian Granger for Cal Poly's Data Science 301 Course
### Clemson University
- Advanced Computing
- [Palmetto cluster and JupyterHub](http://citi.sites.clemson.edu/2016/08/18/JupyterHub-for-Palmetto-Cluster.html)
### University of Colorado Boulder
- (CU Research Computing) CURC
- [JupyterHub User Guide](https://www.rc.colorado.edu/support/user-guide/jupyterhub.html)
- Slurm job dispatched on Crestone compute cluster
- log troubleshooting
- Profiles in IPython Clusters tab
- [Parallel Processing with JupyterHub tutorial](https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-processing-with-jupyterhub.html)
- [Parallel Programming with JupyterHub document](https://www.rc.colorado.edu/book/export/html/833)
- Earth Lab at CU
- [Tutorial on Parallel R on JupyterHub](https://earthdatascience.org/tutorials/parallel-r-on-jupyterhub/)
### George Washington University
- [Jupyter Hub](http://go.gwu.edu/jupyter) with university single-sign-on. Deployed early 2017.
### HTCondor
- [HTCondor Python Bindings Tutorial from HTCondor Week 2017 includes information on their JupyterHub tutorials](https://research.cs.wisc.edu/htcondor/HTCondorWeek2017/presentations/TueBockelman_Python.pdf)
### University of Illinois
- https://datascience.business.illinois.edu (currently down; checked 04/26/19)
### IllustrisTNG Simulation Project
- [JupyterHub/Lab-based analysis platform, part of the TNG public data release](http://www.tng-project.org/data/)
### MIT and Lincoln Labs
- https://supercloud.mit.edu/
### Michigan State University
- [Setting up JupyterHub](https://mediaspace.msu.edu/media/Setting+Up+Your+JupyterHub+Password/1_hgv13aag/11980471)
### University of Minnesota
- [JupyterHub Inside HPC](https://insidehpc.com/tag/jupyterhub/)
### University of Missouri
- https://dsa.missouri.edu/faq/
### Paderborn University
- [Data Science (DICE) group](https://dice.cs.uni-paderborn.de/)
- [nbgraderutils](https://github.com/dice-group/nbgraderutils): Use JupyterHub + nbgrader + iJava kernel for online Java exercises. Used in lecture Statistical Natural Language Processing.
### Penn State University
- [Press release](https://news.psu.edu/story/523093/2018/05/24/new-open-source-web-apps-available-students-and-faculty): "New open-source web apps available for students and faculty" (but Hub is currently down; checked 04/26/19)
### University of Rochester CIRC
- [JupyterHub Userguide](https://info.circ.rochester.edu/Web_Applications/JupyterHub.html) - Slurm, beehive
### University of California San Diego
- San Diego Supercomputer Center - Andrea Zonca
- [Deploy JupyterHub on a Supercomputer with SSH](https://zonca.github.io/2017/05/jupyterhub-hpc-batchspawner-ssh.html)
- [Run Jupyterhub on a Supercomputer](https://zonca.github.io/2015/04/jupyterhub-hpc.html)
- [Deploy JupyterHub on a VM for a Workshop](https://zonca.github.io/2016/04/jupyterhub-sdsc-cloud.html)
- [Customize your Python environment in Jupyterhub](https://zonca.github.io/2017/02/customize-python-environment-jupyterhub.html)
- [Jupyterhub deployment on multiple nodes with Docker Swarm](https://zonca.github.io/2016/05/jupyterhub-docker-swarm.html)
- [Sample deployment of Jupyterhub in HPC on SDSC Comet](https://zonca.github.io/2017/02/sample-deployment-jupyterhub-hpc.html)
- Educational Technology Services - Paul Jamason
- [jupyterhub.ucsd.edu](https://jupyterhub.ucsd.edu)
### TACC University of Texas
### Texas A&M
- Kristen Thyng - Oceanography
- [Teaching with JupyterHub and nbgrader](http://kristenthyng.com/blog/2016/09/07/jupyterhub+nbgrader/)
### Elucidata
- What's new in Jupyter Notebooks @[Elucidata](https://elucidata.io/):
- Using Jupyter Notebooks with Jupyterhub on GCP, managed by GKE
- https://medium.com/elucidata/why-you-should-be-using-a-jupyter-notebook-8385a4ccd93d
## Service Providers
### AWS
- [running-jupyter-notebook-and-jupyterhub-on-amazon-emr](https://aws.amazon.com/blogs/big-data/running-jupyter-notebook-and-jupyterhub-on-amazon-emr/)
### Google Cloud Platform
- [Using Tensorflow and JupyterHub in Classrooms](https://cloud.google.com/solutions/using-tensorflow-jupyterhub-classrooms)
- [using-tensorflow-and-jupyterhub blog post](https://opensource.googleblog.com/2016/10/using-tensorflow-and-jupyterhub.html)
### Everware
[Everware](https://github.com/everware) Reproducible and reusable science powered by jupyterhub and docker. Like nbviewer, but executable. CERN, Geneva [website](http://everware.xyz/)
### Microsoft Azure
- https://docs.microsoft.com/en-us/azure/machine-learning/machine-learning-data-science-linux-dsvm-intro
### Rackspace Carina
- https://getcarina.com/blog/learning-how-to-whale/
- http://carolynvanslyck.com/talk/carina/jupyterhub/#/
### Hadoop
- [Deploying JupyterHub on Hadoop](https://jupyterhub-on-hadoop.readthedocs.io)
## Miscellaneous
- https://medium.com/@ybarraud/setting-up-jupyterhub-with-sudospawner-and-anaconda-844628c0dbee#.rm3yt87e1
- https://groups.google.com/forum/#!topic/jupyter/nkPSEeMr8c0 Mailing list UT deployment
- JupyterHub setup on Centos https://gist.github.com/johnrc/604971f7d41ebf12370bf5729bf3e0a4
- Deploy JupyterHub to Docker Swarm https://jupyterhub.surge.sh/#/welcome
- http://www.laketide.com/building-your-lab-part-3/
- http://estrellita.hatenablog.com/entry/2015/07/31/083202
- http://www.walkingrandomly.com/?p=5734
- https://wrdrd.com/docs/consulting/education-technology
- https://bitbucket.org/jackhale/fenics-jupyter
- [LinuxCluster blog](https://linuxcluster.wordpress.com/category/application/jupyterhub/)
- [Network Technology](https://arnesund.com/tag/jupyterhub/) [Spark Cluster on OpenStack with Multi-User Jupyter Notebook](https://arnesund.com/2015/09/21/spark-cluster-on-openstack-with-multi-user-jupyter-notebook/)

View File

@@ -1,439 +0,0 @@
# Getting started with JupyterHub
This document describes some of the basics of configuring JupyterHub to do what you want.
JupyterHub is highly customizable, so there's a lot to cover.
## Installation
See [the readme](https://github.com/jupyter/jupyterhub/blob/master/README.md) for help installing JupyterHub.
## Overview
JupyterHub is a set of processes that together provide a multiuser Jupyter Notebook server.
There are three main categories of processes run by the `jupyterhub` command line program:
- **Single User Server**: a dedicated, single-user, Jupyter Notebook is started for each user on the system
when they log in. The object that starts these processes is called a Spawner.
- **Proxy**: the public facing part of the server that uses a dynamic proxy to route HTTP requests
to the Hub and Single User Servers.
- **Hub**: manages user accounts and authentication and coordinates Single Users Servers using a Spawner.
## JupyterHub's default behavior
**IMPORTANT:** In its default configuration, JupyterHub requires SSL encryption (HTTPS) to run.
**You should not run JupyterHub without SSL encryption on a public network.**
See [Security documentation](#Security) for how to configure JupyterHub to use SSL, and in
certain cases, e.g. behind SSL termination in nginx, allowing the hub to run with no SSL
by requiring `--no-ssl` (as of [version 0.5](./changelog.html)).
To start JupyterHub in its default configuration, type the following at the command line:
sudo jupyterhub
The default Authenticator that ships with JupyterHub authenticates users
with their system name and password (via [PAM][]).
Any user on the system with a password will be allowed to start a single-user notebook server.
The default Spawner starts servers locally as each user, one dedicated server per user.
These servers listen on localhost, and start in the given user's home directory.
By default, the **Proxy** listens on all public interfaces on port 8000.
Thus you can reach JupyterHub through either:
http://localhost:8000
or any other public IP or domain pointing to your system.
In their default configuration, the other services, the **Hub** and **Single-User Servers**,
all communicate with each other on localhost only.
By default, starting JupyterHub will write two files to disk in the current working directory:
- `jupyterhub.sqlite` is the sqlite database containing all of the state of the **Hub**.
This file allows the **Hub** to remember what users are running and where,
as well as other information enabling you to restart parts of JupyterHub separately.
- `jupyterhub_cookie_secret` is the encryption key used for securing cookies.
This file needs to persist in order for restarting the Hub server to avoid invalidating cookies.
Conversely, deleting this file and restarting the server effectively invalidates all login cookies.
The cookie secret file is discussed in the [Cookie Secret documentation](#Cookie secret).
The location of these files can be specified via configuration, discussed below.
## How to configure JupyterHub
JupyterHub is configured in two ways:
1. Configuration file
2. Command-line arguments
### Configuration file
By default, JupyterHub will look for a configuration file (which may not be created yet)
named `jupyterhub_config.py` in the current working directory.
You can create an empty configuration file with:
jupyterhub --generate-config
This empty configuration file has descriptions of all configuration variables and their default
values. You can load a specific config file with:
jupyterhub -f /path/to/jupyterhub_config.py
See also: [general docs](http://ipython.org/ipython-doc/dev/development/config.html)
on the config system Jupyter uses.
### Command-line arguments
Type the following for brief information about the command-line arguments:
jupyterhub -h
or:
jupyterhub --help-all
for the full command line help.
All configurable options are technically configurable on the command-line,
even if some are really inconvenient to type. Just replace the desired option,
c.Class.trait, with --Class.trait. For example, to configure
c.Spawner.notebook_dir = '~/assignments' from the command-line:
jupyterhub --Spawner.notebook_dir='~/assignments'
## Networking
### Configuring the Proxy's IP address and port
The Proxy's main IP address setting determines where JupyterHub is available to users.
By default, JupyterHub is configured to be available on all network interfaces
(`''`) on port 8000. **Note**: Use of `'*'` is discouraged for IP configuration;
instead, use of `'0.0.0.0'` is preferred.
Changing the IP address and port can be done with the following command line
arguments:
jupyterhub --ip=192.168.1.2 --port=443
Or by placing the following lines in a configuration file:
```python
c.JupyterHub.ip = '192.168.1.2'
c.JupyterHub.port = 443
```
Port 443 is used as an example since 443 is the default port for SSL/HTTPS.
Configuring only the main IP and port of JupyterHub should be sufficient for most deployments of JupyterHub.
However, more customized scenarios may need additional networking details to
be configured.
### Configuring the Proxy's REST API communication IP address and port (optional)
The Hub service talks to the proxy via a REST API on a secondary port,
whose network interface and port can be configured separately.
By default, this REST API listens on port 8081 of localhost only.
If running the Proxy separate from the Hub,
configure the REST API communication IP address and port with:
```python
# ideally a private network address
c.JupyterHub.proxy_api_ip = '10.0.1.4'
c.JupyterHub.proxy_api_port = 5432
```
### Configuring the Hub if Spawners or Proxy are remote or isolated in containers
The Hub service also listens only on localhost (port 8080) by default.
The Hub needs needs to be accessible from both the proxy and all Spawners.
When spawning local servers, an IP address setting of localhost is fine.
If *either* the Proxy *or* (more likely) the Spawners will be remote or
isolated in containers, the Hub must listen on an IP that is accessible.
```python
c.JupyterHub.hub_ip = '10.0.1.4'
c.JupyterHub.hub_port = 54321
```
## Security
**IMPORTANT:** In its default configuration, JupyterHub requires SSL encryption (HTTPS) to run.
**You should not run JupyterHub without SSL encryption on a public network.**
Security is the most important aspect of configuring Jupyter. There are three main aspects of the
security configuration:
1. SSL encryption (to enable HTTPS)
2. Cookie secret (a key for encrypting browser cookies)
3. Proxy authentication token (used for the Hub and other services to authenticate to the Proxy)
## SSL encryption
Since JupyterHub includes authentication and allows arbitrary code execution, you should not run
it without SSL (HTTPS). This will require you to obtain an official, trusted SSL certificate or
create a self-signed certificate. Once you have obtained and installed a key and certificate you
need to specify their locations in the configuration file as follows:
```python
c.JupyterHub.ssl_key = '/path/to/my.key'
c.JupyterHub.ssl_cert = '/path/to/my.cert'
```
It is also possible to use letsencrypt (https://letsencrypt.org/) to obtain a free, trusted SSL
certificate. If you run letsencrypt using the default options, the needed configuration is (replace `your.domain.com` by your fully qualified domain name):
```python
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/your.domain.com/privkey.pem'
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/your.domain.com/fullchain.pem'
```
Some cert files also contain the key, in which case only the cert is needed. It is important that
these files be put in a secure location on your server, where they are not readable by regular
users.
Note: In certain cases, e.g. behind SSL termination in nginx, allowing no SSL
running on the hub may be desired. To run the Hub without SSL, you must opt
in by configuring and confirming the `--no-ssl` option, added as of [version 0.5](./changelog.html).
## Cookie secret
The cookie secret is an encryption key, used to encrypt the browser cookies used for
authentication. If this value changes for the Hub, all single-user servers must also be restarted.
Normally, this value is stored in a file, the location of which can be specified in a config file
as follows:
```python
c.JupyterHub.cookie_secret_file = '/srv/jupyterhub/cookie_secret'
```
The content of this file should be a long random string encoded in MIME Base64. An example would be to generate this file as:
```bash
openssl rand -base64 2048 > /srv/jupyterhub/cookie_secret
```
In most deployments of JupyterHub, you should point this to a secure location on the file
system, such as `/srv/jupyterhub/cookie_secret`. If the cookie secret file doesn't exist when
the Hub starts, a new cookie secret is generated and stored in the file. The
file must not be readable by group or other or the server won't start.
The recommended permissions for the cookie secret file are 600 (owner-only rw).
If you would like to avoid the need for files, the value can be loaded in the Hub process from
the `JPY_COOKIE_SECRET` environment variable, which is a hex-encoded string. You
can set it this way:
```bash
export JPY_COOKIE_SECRET=`openssl rand -hex 1024`
```
For security reasons, this environment variable should only be visible to the Hub.
If you set it dynamically as above, all users will be logged out each time the
Hub starts.
You can also set the secret in the configuration file itself as a binary string:
```python
c.JupyterHub.cookie_secret = bytes.fromhex('VERY LONG SECRET HEX STRING')
```
## Proxy authentication token
The Hub authenticates its requests to the Proxy using a secret token that the Hub and Proxy agree upon. The value of this string should be a random string (for example, generated by `openssl rand -hex 32`). You can pass this value to the Hub and Proxy using either the `CONFIGPROXY_AUTH_TOKEN` environment variable:
```bash
export CONFIGPROXY_AUTH_TOKEN=`openssl rand -hex 32`
```
This environment variable needs to be visible to the Hub and Proxy.
Or you can set the value in the configuration file:
```python
c.JupyterHub.proxy_auth_token = '0bc02bede919e99a26de1e2a7a5aadfaf6228de836ec39a05a6c6942831d8fe5'
```
If you don't set the Proxy authentication token, the Hub will generate a random key itself, which
means that any time you restart the Hub you **must also restart the Proxy**. If the proxy is a
subprocess of the Hub, this should happen automatically (this is the default configuration).
Another time you must set the Proxy authentication token yourself is if you want other services, such as [nbgrader](https://github.com/jupyter/nbgrader) to also be able to connect to the Proxy.
## Configuring authentication
The default Authenticator uses [PAM][] to authenticate system users with their username and password.
The default behavior of this Authenticator is to allow any user with an account and password on the system to login.
You can restrict which users are allowed to login with `Authenticator.whitelist`:
```python
c.Authenticator.whitelist = {'mal', 'zoe', 'inara', 'kaylee'}
```
Admin users of JupyterHub have the ability to take actions on users' behalf,
such as stopping and restarting their servers,
and adding and removing new users from the whitelist.
Any users in the admin list are automatically added to the whitelist,
if they are not already present.
The set of initial Admin users can configured as follows:
```python
c.Authenticator.admin_users = {'mal', 'zoe'}
```
If `JupyterHub.admin_access` is True (not default),
then admin users have permission to log in *as other users* on their respective machines, for debugging.
**You should make sure your users know if admin_access is enabled.**
### Adding and removing users
Users can be added and removed to the Hub via the admin panel or REST API. These users will be
added to the whitelist and database. Restarting the Hub will not require manually updating the
whitelist in your config file, as the users will be loaded from the database. This means that
after starting the Hub once, it is not sufficient to remove users from the whitelist in your
config file. You must also remove them from the database, either by discarding the database file,
or via the admin UI.
The default `PAMAuthenticator` is one case of a special kind of authenticator, called a
`LocalAuthenticator`, indicating that it manages users on the local system. When you add a user to
the Hub, a `LocalAuthenticator` checks if that user already exists. Normally, there will be an
error telling you that the user doesn't exist. If you set the configuration value
```python
c.LocalAuthenticator.create_system_users = True
```
however, adding a user to the Hub that doesn't already exist on the system will result in the Hub
creating that user via the system `adduser` command line tool. This option is typically used on
hosted deployments of JupyterHub, to avoid the need to manually create all your users before
launching the service. It is not recommended when running JupyterHub in situations where
JupyterHub users maps directly onto UNIX users.
## Configuring single-user servers
Since the single-user server is an instance of `jupyter notebook`, an entire separate
multi-process application, there are many aspect of that server can configure, and a lot of ways
to express that configuration.
At the JupyterHub level, you can set some values on the Spawner. The simplest of these is
`Spawner.notebook_dir`, which lets you set the root directory for a user's server. This root
notebook directory is the highest level directory users will be able to access in the notebook
dashboard. In this example, the root notebook directory is set to `~/notebooks`, where `~` is
expanded to the user's home directory.
```python
c.Spawner.notebook_dir = '~/notebooks'
```
You can also specify extra command-line arguments to the notebook server with:
```python
c.Spawner.args = ['--debug', '--profile=PHYS131']
```
This could be used to set the users default page for the single user server:
```python
c.Spawner.args = ['--NotebookApp.default_url=/notebooks/Welcome.ipynb']
```
Since the single-user server extends the notebook server application,
it still loads configuration from the `ipython_notebook_config.py` config file.
Each user may have one of these files in `$HOME/.ipython/profile_default/`.
IPython also supports loading system-wide config files from `/etc/ipython/`,
which is the place to put configuration that you want to affect all of your users.
## External services
JupyterHub has a REST API that can be used to run external services.
More detail on this API will be added in the future.
## File locations
It is recommended to put all of the files used by JupyterHub into standard UNIX filesystem locations.
* `/srv/jupyterhub` for all security and runtime files
* `/etc/jupyterhub` for all configuration files
* `/var/log` for log files
## Example
In the following example, we show a configuration files for a fairly standard JupyterHub deployment with the following assumptions:
* JupyterHub is running on a single cloud server
* Using SSL on the standard HTTPS port 443
* You want to use [GitHub OAuth][oauthenticator] for login
* You need the users to exist locally on the server
* You want users' notebooks to be served from `~/assignments` to allow users to browse for notebooks within
other users home directories
* You want the landing page for each user to be a Welcome.ipynb notebook in their assignments directory.
* All runtime files are put into `/srv/jupyterhub` and log files in `/var/log`.
Let's start out with `jupyterhub_config.py`:
```python
# jupyterhub_config.py
c = get_config()
import os
pjoin = os.path.join
runtime_dir = os.path.join('/srv/jupyterhub')
ssl_dir = pjoin(runtime_dir, 'ssl')
if not os.path.exists(ssl_dir):
os.makedirs(ssl_dir)
# https on :443
c.JupyterHub.port = 443
c.JupyterHub.ssl_key = pjoin(ssl_dir, 'ssl.key')
c.JupyterHub.ssl_cert = pjoin(ssl_dir, 'ssl.cert')
# put the JupyterHub cookie secret and state db
# in /var/run/jupyterhub
c.JupyterHub.cookie_secret_file = pjoin(runtime_dir, 'cookie_secret')
c.JupyterHub.db_url = pjoin(runtime_dir, 'jupyterhub.sqlite')
# or `--db=/path/to/jupyterhub.sqlite` on the command-line
# put the log file in /var/log
c.JupyterHub.log_file = '/var/log/jupyterhub.log'
# use GitHub OAuthenticator for local users
c.JupyterHub.authenticator_class = 'oauthenticator.LocalGitHubOAuthenticator'
c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']
# create system users that don't exist yet
c.LocalAuthenticator.create_system_users = True
# specify users and admin
c.Authenticator.whitelist = {'rgbkrk', 'minrk', 'jhamrick'}
c.Authenticator.admin_users = {'jhamrick', 'rgbkrk'}
# start single-user notebook servers in ~/assignments,
# with ~/assignments/Welcome.ipynb as the default landing page
# this config could also be put in
# /etc/ipython/ipython_notebook_config.py
c.Spawner.notebook_dir = '~/assignments'
c.Spawner.args = ['--NotebookApp.default_url=/notebooks/Welcome.ipynb']
```
Using the GitHub Authenticator [requires a few additional env variables][oauth-setup],
which we will need to set when we launch the server:
```bash
export GITHUB_CLIENT_ID=github_id
export GITHUB_CLIENT_SECRET=github_secret
export OAUTH_CALLBACK_URL=https://example.com/hub/oauth_callback
export CONFIGPROXY_AUTH_TOKEN=super-secret
jupyterhub -f /path/to/aboveconfig.py
```
# Further reading
- [Custom Authenticators](./authenticators.html)
- [Custom Spawners](./spawners.html)
- [Troubleshooting](./troubleshooting.html)
[oauth-setup]: https://github.com/jupyter/oauthenticator#setup
[oauthenticator]: https://github.com/jupyter/oauthenticator
[PAM]: https://en.wikipedia.org/wiki/Pluggable_authentication_module

View File

@@ -0,0 +1,119 @@
# Authentication and User Basics
The default Authenticator uses [PAM][] to authenticate system users with
their username and password. With the default Authenticator, any user
with an account and password on the system will be allowed to login.
## Create a set of allowed users
You can restrict which users are allowed to login with a set,
`Authenticator.allowed_users`:
```python
c.Authenticator.allowed_users = {'mal', 'zoe', 'inara', 'kaylee'}
```
Users in the `allowed_users` set are added to the Hub database when the Hub is
started.
## Configure admins (`admin_users`)
Admin users of JupyterHub, `admin_users`, can add and remove users from
the user `allowed_users` set. `admin_users` can take actions on other users'
behalf, such as stopping and restarting their servers.
A set of initial admin users, `admin_users` can configured be as follows:
```python
c.Authenticator.admin_users = {'mal', 'zoe'}
```
Users in the admin set are automatically added to the user `allowed_users` set,
if they are not already present.
Each authenticator may have different ways of determining whether a user is an
administrator. By default JupyterHub use the PAMAuthenticator which provide the
`admin_groups` option and can determine administrator status base on a user
groups. For example we can let any users in the `wheel` group be admin:
```python
c.PAMAuthenticator.admin_groups = {'wheel'}
```
## Give admin access to other users' notebook servers (`admin_access`)
Since the default `JupyterHub.admin_access` setting is False, the admins
do not have permission to log in to the single user notebook servers
owned by *other users*. If `JupyterHub.admin_access` is set to True,
then admins have permission to log in *as other users* on their
respective machines, for debugging. **As a courtesy, you should make
sure your users know if admin_access is enabled.**
## Add or remove users from the Hub
Users can be added to and removed from the Hub via either the admin
panel or the REST API. When a user is **added**, the user will be
automatically added to the allowed users set and database. Restarting the Hub
will not require manually updating the allowed users set in your config file,
as the users will be loaded from the database.
After starting the Hub once, it is not sufficient to **remove** a user
from the allowed users set in your config file. You must also remove the user
from the Hub's database, either by deleting the user from JupyterHub's
admin page, or you can clear the `jupyterhub.sqlite` database and start
fresh.
## Use LocalAuthenticator to create system users
The `LocalAuthenticator` is a special kind of authenticator that has
the ability to manage users on the local system. When you try to add a
new user to the Hub, a `LocalAuthenticator` will check if the user
already exists. If you set the configuration value, `create_system_users`,
to `True` in the configuration file, the `LocalAuthenticator` has
the privileges to add users to the system. The setting in the config
file is:
```python
c.LocalAuthenticator.create_system_users = True
```
Adding a user to the Hub that doesn't already exist on the system will
result in the Hub creating that user via the system `adduser` command
line tool. This option is typically used on hosted deployments of
JupyterHub, to avoid the need to manually create all your users before
launching the service. This approach is not recommended when running
JupyterHub in situations where JupyterHub users map directly onto the
system's UNIX users.
## Use OAuthenticator to support OAuth with popular service providers
JupyterHub's [OAuthenticator][] currently supports the following
popular services:
- Auth0
- Bitbucket
- CILogon
- GitHub
- GitLab
- Globus
- Google
- MediaWiki
- Okpy
- OpenShift
A generic implementation, which you can use for OAuth authentication
with any provider, is also available.
## Use DummyAuthenticator for testing
The :class:`~jupyterhub.auth.DummyAuthenticator` is a simple authenticator that
allows for any username/password unless if a global password has been set. If
set, it will allow for any username as long as the correct password is provided.
To set a global password, add this to the config file:
```python
c.DummyAuthenticator.password = "some_password"
```
[PAM]: https://en.wikipedia.org/wiki/Pluggable_authentication_module
[OAuthenticator]: https://github.com/jupyterhub/oauthenticator

View File

@@ -0,0 +1,100 @@
# Configuration Basics
The section contains basic information about configuring settings for a JupyterHub
deployment. The [Technical Reference](../reference/index)
documentation provides additional details.
This section will help you learn how to:
- generate a default configuration file, `jupyterhub_config.py`
- start with a specific configuration file
- configure JupyterHub using command line options
- find information and examples for some common deployments
## Generate a default config file
On startup, JupyterHub will look by default for a configuration file,
`jupyterhub_config.py`, in the current working directory.
To generate a default config file, `jupyterhub_config.py`:
```bash
jupyterhub --generate-config
```
This default `jupyterhub_config.py` file contains comments and guidance for all
configuration variables and their default values. We recommend storing
configuration files in the standard UNIX filesystem location, i.e.
`/etc/jupyterhub`.
## Start with a specific config file
You can load a specific config file and start JupyterHub using:
```bash
jupyterhub -f /path/to/jupyterhub_config.py
```
If you have stored your configuration file in the recommended UNIX filesystem
location, `/etc/jupyterhub`, the following command will start JupyterHub using
the configuration file:
```bash
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py
```
The IPython documentation provides additional information on the
[config system](http://ipython.readthedocs.io/en/stable/development/config)
that Jupyter uses.
## Configure using command line options
To display all command line options that are available for configuration:
```bash
jupyterhub --help-all
```
Configuration using the command line options is done when launching JupyterHub.
For example, to start JupyterHub on ``10.0.1.2:443`` with https, you
would enter:
```bash
jupyterhub --ip 10.0.1.2 --port 443 --ssl-key my_ssl.key --ssl-cert my_ssl.cert
```
All configurable options may technically be set on the command-line,
though some are inconvenient to type. To set a particular configuration
parameter, `c.Class.trait`, you would use the command line option,
`--Class.trait`, when starting JupyterHub. For example, to configure the
`c.Spawner.notebook_dir` trait from the command-line, use the
`--Spawner.notebook_dir` option:
```bash
jupyterhub --Spawner.notebook_dir='~/assignments'
```
## Configure for various deployment environments
The default authentication and process spawning mechanisms can be replaced, and
specific [authenticators](./authenticators-users-basics) and
[spawners](./spawners-basics) can be set in the configuration file.
This enables JupyterHub to be used with a variety of authentication methods or
process control and deployment environments. [Some examples](../reference/config-examples),
meant as illustration, are:
- Using GitHub OAuth instead of PAM with [OAuthenticator](https://github.com/jupyterhub/oauthenticator)
- Spawning single-user servers with Docker, using the [DockerSpawner](https://github.com/jupyterhub/dockerspawner)
## Run the proxy separately
This is *not* strictly necessary, but useful in many cases. If you
use a custom proxy (e.g. Traefik), this also not needed.
Connections to user servers go through the proxy, and *not* the hub
itself. If the proxy stays running when the hub restarts (for
maintenance, re-configuration, etc.), then use connections are not
interrupted. For simplicity, by default the hub starts the proxy
automatically, so if the hub restarts, the proxy restarts, and user
connections are interrupted. It is easy to run the proxy separately,
for information see [the separate proxy page](../reference/separate-proxy).

View File

@@ -0,0 +1,36 @@
# Frequently asked questions
### How do I share links to notebooks?
In short, where you see `/user/name/notebooks/foo.ipynb` use `/hub/user-redirect/notebooks/foo.ipynb` (replace `/user/name` with `/hub/user-redirect`).
Sharing links to notebooks is a common activity,
and can look different based on what you mean.
Your first instinct might be to copy the URL you see in the browser,
e.g. `hub.jupyter.org/user/yourname/notebooks/coolthing.ipynb`.
However, let's break down what this URL means:
`hub.jupyter.org/user/yourname/` is the URL prefix handled by *your server*,
which means that sharing this URL is asking the person you share the link with
to come to *your server* and look at the exact same file.
In most circumstances, this is forbidden by permissions because the person you share with does not have access to your server.
What actually happens when someone visits this URL will depend on whether your server is running and other factors.
But what is our actual goal?
A typical situation is that you have some shared or common filesystem,
such that the same path corresponds to the same document
(either the exact same document or another copy of it).
Typically, what folks want when they do sharing like this
is for each visitor to open the same file *on their own server*,
so Breq would open `/user/breq/notebooks/foo.ipynb` and
Seivarden would open `/user/seivarden/notebooks/foo.ipynb`, etc.
JupyterHub has a special URL that does exactly this!
It's called `/hub/user-redirect/...` and after the visitor logs in,
So if you replace `/user/yourname` in your URL bar
with `/hub/user-redirect` any visitor should get the same
URL on their own server, rather than visiting yours.
In JupyterLab 2.0, this should also be the result of the "Copy Shareable Link"
action in the file browser.

View File

@@ -0,0 +1,19 @@
Get Started
===========
This section covers how to configure and customize JupyterHub for your
needs. It contains information about authentication, networking, security, and
other topics that are relevant to individuals or organizations deploying their
own JupyterHub.
.. toctree::
:maxdepth: 2
config-basics
networking-basics
security-basics
authenticators-users-basics
spawners-basics
services-basics
faq
institutional-faq

View File

@@ -0,0 +1,266 @@
# Institutional FAQ
This page contains common questions from users of JupyterHub,
broken down by their roles within organizations.
## For all
### Is it appropriate for adoption within a larger institutional context?
Yes! JupyterHub has been used at-scale for large pools of users, as well
as complex and high-performance computing. For example, UC Berkeley uses
JupyterHub for its Data Science Education Program courses (serving over
3,000 students). The Pangeo project uses JupyterHub to provide access
to scalable cloud computing with Dask. JupyterHub is stable customizable
to the use-cases of large organizations.
### I keep hearing about Jupyter Notebook, JupyterLab, and now JupyterHub. Whats the difference?
Here is a quick breakdown of these three tools:
* **The Jupyter Notebook** is a document specification (the `.ipynb`) file that interweaves
narrative text with code cells and their outputs. It is also a graphical interface
that allows users to edit these documents. There are also several other graphical interfaces
that allow users to edit the `.ipynb` format (nteract, Jupyter Lab, Google Colab, Kaggle, etc).
* **JupyterLab** is a flexible and extendible user interface for interactive computing. It
has several extensions that are tailored for using Jupyter Notebooks, as well as extensions
for other parts of the data science stack.
* **JupyterHub** is an application that manages interactive computing sessions for **multiple users**.
It also connects them with infrastructure those users wish to access. It can provide
remote access to Jupyter Notebooks and Jupyter Lab for many people.
## For management
### Briefly, what problem does JupyterHub solve for us?
JupyterHub provides a shared platform for data science and collaboration.
It allows users to utilize familiar data science workflows (such as the scientific python stack,
the R tidyverse, and Jupyter Notebooks) on institutional infrastructure. It also allows administrators
some control over access to resources, security, environments, and authentication.
### Is JupyterHub mature? Why should we trust it?
Yes - the core JupyterHub application recently
reached 1.0 status, and is considered stable and performant for most institutions.
JupyterHub has also been deployed (along with other tools) to work on
scalable infrastructure, large datasets, and high-performance computing.
### Who else uses JupyterHub?
JupyterHub is used at a variety of institutions in academia,
industry, and government research labs. It is most-commonly used by two kinds of groups:
* Small teams (e.g., data science teams, research labs, or collaborative projects) to provide a
shared resource for interactive computing, collaboration, and analytics.
* Large teams (e.g., a department, a large class, or a large group of remote users) to provide
access to organizational hardware, data, and analytics environments at scale.
Here are a sample of organizations that use JupyterHub:
* **Universities and colleges**: UC Berkeley, UC San Diego, Cal Poly SLO, Harvard University, University of Chicago,
University of Oslo, University of Sheffield, Université Paris Sud, University of Versailles
* **Research laboratories**: NASA, NCAR, NOAA, the Large Synoptic Survey Telescope, Brookhaven National Lab,
Minnesota Supercomputing Institute, ALCF, CERN, Lawrence Livermore National Laboratory
* **Online communities**: Pangeo, Quantopian, mybinder.org, MathHub, Open Humans
* **Computing infrastructure providers**: NERSC, San Diego Supercomputing Center, Compute Canada
* **Companies**: Capital One, SANDVIK code, Globus
See the [Gallery of JupyterHub deployments](../gallery-jhub-deployments.md) for
a more complete list of JupyterHub deployments at institutions.
### How does JupyterHub compare with hosted products, like Google Colaboratory, RStudio.cloud, or Anaconda Enterprise?
JupyterHub puts you in control of your data, infrastructure, and coding environment.
In addition, it is vendor neutral, which reduces lock-in to a particular vendor or service.
JupyterHub provides access to interactive computing environments in the cloud (similar to each of these services).
Compared with the tools above, it is more flexible, more customizable, free, and
gives administrators more control over their setup and hardware.
Because JupyterHub is an open-source, community-driven tool, it can be extended and
modified to fit an institution's needs. It plays nicely with the open source data science
stack, and can serve a variety of computing enviroments, user interfaces, and
computational hardware. It can also be deployed anywhere - on enterprise cloud infrastructure, on
High-Performance-Computing machines, on local hardware, or even on a single laptop, which
is not possible with most other tools for shared interactive computing.
## For IT
### How would I set up JupyterHub on institutional hardware?
That depends on what kind of hardware you've got. JupyterHub is flexible enough to be deployed
on a variety of hardware, including in-room hardware, on-prem clusters, cloud infrastructure,
etc.
The most common way to set up a JupyterHub is to use a JupyterHub distribution, these are pre-configured
and opinionated ways to set up a JupyterHub on particular kinds of infrastructure. The two distributions
that we currently suggest are:
* [Zero to JupyterHub for Kubernetes](https://z2jh.jupyter.org) is a scalable JupyterHub deployment and
guide that runs on Kubernetes. Better for larger or dynamic user groups (50-10,000) or more complex
compute/data needs.
* [The Littlest JupyterHub](https://tljh.jupyter.org) is a lightweight JupyterHub that runs on a single
single machine (in the cloud or under your desk). Better for smaller usergroups (4-80) or more
lightweight computational resources.
### Does JupyterHub run well in the cloud?
Yes - most deployments of JupyterHub are run via cloud infrastructure and on a variety of cloud providers.
Depending on the distribution of JupyterHub that you'd like to use, you can also connect your JupyterHub
deployment with a number of other cloud-native services so that users have access to other resources from
their interactive computing sessions.
For example, if you use the [Zero to JupyterHub for Kubernetes](https://z2jh.jupyter.org) distribution,
you'll be able to utilize container-based workflows of other technologies such as the [dask-kubernetes](https://kubernetes.dask.org/en/latest/)
project for distributed computing.
The Z2JH Helm Chart also has some functionality built in for auto-scaling your cluster up and down
as more resources are needed - allowing you to utilize the benefits of a flexible cloud-based deployment.
### Is JupyterHub secure?
The short answer: yes. JupyterHub as a standalone application has been battle-tested at an institutional
level for several years, and makes a number of "default" security decisions that are reasonable for most
users.
* For security considerations in the base JupyterHub application,
[see the JupyterHub security page](https://jupyterhub.readthedocs.io/en/stable/reference/websecurity.html)
* For security considerations when deploying JupyterHub on Kubernetes, see the
[JupyterHub on Kubernetes security page](https://zero-to-jupyterhub.readthedocs.io/en/latest/security.html).
The longer answer: it depends on your deployment. Because JupyterHub is very flexible, it can be used
in a variety of deployment setups. This often entails connecting your JupyterHub to **other** infrastructure
(such as a [Dask Gateway service](https://gateway.dask.org/)). There are many security decisions to be made
in these cases, and the security of your JupyterHub deployment will often depend on these decisions.
If you are worried about security, don't hesitate to reach out to the JupyterHub community in the
[Jupyter Community Forum](https://discourse.jupyter.org/c/jupyterhub). This community of practice has many
individuals with experience running secure JupyterHub deployments.
### Does JupyterHub provide computing or data infrastructure?
No - JupyterHub manages user sessions and can *control* computing infrastructure, but it does not provide these
things itself. You are expected to run JupyterHub on your own infrastructure (local or in the cloud). Moreover,
JupyterHub has no internal concept of "data", but is designed to be able to communicate with data repositories
(again, either locally or remotely) for use within interactive computing sessions.
### How do I manage users?
JupyterHub offers a few options for managing your users. Upon setting up a JupyterHub, you can choose what
kind of **authentication** you'd like to use. For example, you can have users sign up with an institutional
email address, or choose a username / password when they first log-in, or offload authentication onto
another service such as an organization's OAuth.
The users of a JupyterHub are stored locally, and can be modified manually by an administrator of the JupyterHub.
Moreover, the *active* users on a JupyterHub can be found on the administrator's page. This page
gives you the abiltiy to stop or restart kernels, inspect user filesystems, and even take over user
sessions to assist them with debugging.
### How do I manage software environments?
A key benefit of JupyterHub is the ability for an administrator to define the environment(s) that users
have access to. There are many ways to do this, depending on what kind of infrastructure you're using for
your JupyterHub.
For example, **The Littlest JupyterHub** runs on a single VM. In this case, the administrator defines
an environment by installing packages to a shared folder that exists on the path of all users. The
**JupyterHub for Kubernetes** deployment uses Docker images to define environments. You can create your
own list of Docker images that users can select from, and can also control things like the amount of
RAM available to users, or the types of machines that their sessions will use in the cloud.
### How does JupyterHub manage computational resources?
For interactive computing sessions, JupyterHub controls computational resources via a **spawner**.
Spawners define how a new user session is created, and are customized for particular kinds of
infrastructure. For example, the KubeSpawner knows how to control a Kubernetes deployment
to create new pods when users log in.
For more sophisticated computational resources (like distributed computing), JupyterHub can
connect with other infrastructure tools (like Dask or Spark). This allows users to control
scalable or high-performance resources from within their JupyterHub sessions. The logic of
how those resources are controlled is taken care of by the non-JupyterHub application.
### Can JupyterHub be used with my high-performance computing resources?
Yes - JupyterHub can provide access to many kinds of computing infrastructure.
Especially when combined with other open-source schedulers such as Dask, you can manage fairly
complex computing infrastructure from the interactive sessions of a JupyterHub. For example
[see the Dask HPC page](https://docs.dask.org/en/latest/setup/hpc.html).
### How much resources do user sessions take?
This is highly configurable by the administrator. If you wish for your users to have simple
data analytics environments for prototyping and light data exploring, you can restrict their
memory and CPU based on the resources that you have available. If you'd like your JupyterHub
to serve as a gateway to high-performance compute or data resources, you may increase the
resources available on user machines, or connect them with computing infrastructure elsewhere.
### Can I customize the look and feel of a JupyterHub?
JupyterHub provides some customization of the graphics displayed to users. The most common
modification is to add custom branding to the JupyterHub login page, loading pages, and
various elements that persist across all pages (such as headers).
## For Technical Leads
### Will JupyterHub “just work” with our team's interactive computing setup?
Depending on the complexity of your setup, you'll have different experiences with "out of the box"
distributions of JupyterHub. If all of the resources you need will fit on a single VM, then
[The Littlest JupyterHub](https://tljh.jupyter.org) should get you up-and-running within
a half day or so. For more complex setups, such as scalable Kubernetes clusters or access
to high-performance computing and data, it will require more time and expertise with
the technologies your JupyterHub will use (e.g., dev-ops knowledge with cloud computing).
In general, the base JupyterHub deployment is not the bottleneck for setup, it is connecting
your JupyterHub with the various services and tools that you wish to provide to your users.
### How well does JupyterHub scale? What are JupyterHub's limitations?
JupyterHub works well at both a small scale (e.g., a single VM or machine) as well as a
high scale (e.g., a scalable Kubernetes cluster). It can be used for teams as small a 2, and
for user bases as large as 10,000. The scalability of JupyterHub largely depends on the
infrastructure on which it is deployed. JupyterHub has been designed to be lightweight and
flexible, so you can tailor your JupyterHub deployment to your needs.
### Is JupyterHub resilient? What happens when a machine goes down?
For JupyterHubs that are deployed in a containerized environment (e.g., Kubernetes), it is
possible to configure the JupyterHub to be fairly resistant to failures in the system.
For example, if JupyterHub fails, then user sessions will not be affected (though new
users will not be able to log in). When a JupyterHub process is restarted, it should
seamlessly connect with the user database and the system will return to normal.
Again, the details of your JupyterHub deployment (e.g., whether it's deployed on a scalable cluster)
will affect the resiliency of the deployment.
### What interfaces does JupyterHub support?
Out of the box, JupyterHub supports a variety of popular data science interfaces for user sessions,
such as JupyterLab, Jupyter Notebooks, and RStudio. Any interface that can be served
via a web address can be served with a JupyterHub (with the right setup).
### Does JupyterHub make it easier for our team to collaborate?
JupyterHub provides a standardized environment and access to shared resources for your teams.
This greatly reduces the cost associated with sharing analyses and content with other team
members, and makes it easier to collaborate and build off of one another's ideas. Combined with
access to high-performance computing and data, JupyterHub provides a common resource to
amplify your team's ability to prototype their analyses, scale them to larger data, and then
share their results with one another.
JupyterHub also provides a computational framework to share computational narratives between
different levels of an organization. For example, data scientists can share Jupyter Notebooks
rendered as [voila dashboards](https://voila.readthedocs.io/en/stable/) with those who are not
familiar with programming, or create publicly-available interactive analyses to allow others to
interact with your work.
### Can I use JupyterHub with R/RStudio or other languages and environments?
Yes, Jupyter is a polyglot project, and there are over 40 community-provided kernels for a variety
of languages (the most common being Python, Julia, and R). You can also use a JupyterHub to provide
access to other interfaces, such as RStudio, that provide their own access to a language kernel.

View File

@@ -0,0 +1,101 @@
# Networking basics
This section will help you with basic proxy and network configuration to:
- set the proxy's IP address and port
- set the proxy's REST API URL
- configure the Hub if the Proxy or Spawners are remote or isolated
- set the `hub_connect_ip` which services will use to communicate with the hub
## Set the Proxy's IP address and port
The Proxy's main IP address setting determines where JupyterHub is available to users.
By default, JupyterHub is configured to be available on all network interfaces
(`''`) on port 8000. *Note*: Use of `'*'` is discouraged for IP configuration;
instead, use of `'0.0.0.0'` is preferred.
Changing the Proxy's main IP address and port can be done with the following
JupyterHub **command line options**:
```bash
jupyterhub --ip=192.168.1.2 --port=443
```
Or by placing the following lines in a **configuration file**,
`jupyterhub_config.py`:
```python
c.JupyterHub.ip = '192.168.1.2'
c.JupyterHub.port = 443
```
Port 443 is used in the examples since 443 is the default port for SSL/HTTPS.
Configuring only the main IP and port of JupyterHub should be sufficient for
most deployments of JupyterHub. However, more customized scenarios may need
additional networking details to be configured.
Note that `c.JupyterHub.ip` and `c.JupyterHub.port` are single values,
not tuples or lists JupyterHub listens to only a single IP address and
port.
## Set the Proxy's REST API communication URL (optional)
By default, this REST API listens on port 8001 of `localhost` only.
The Hub service talks to the proxy via a REST API on a secondary port. The
API URL can be configured separately and override the default settings.
### Set api_url
The URL to access the API, `c.configurableHTTPProxy.api_url`, is configurable.
An example entry to set the proxy's API URL in `jupyterhub_config.py` is:
```python
c.ConfigurableHTTPProxy.api_url = 'http://10.0.1.4:5432'
```
### proxy_api_ip and proxy_api_port (Deprecated in 0.8)
If running the Proxy separate from the Hub, configure the REST API communication
IP address and port by adding this to the `jupyterhub_config.py` file:
```python
# ideally a private network address
c.JupyterHub.proxy_api_ip = '10.0.1.4'
c.JupyterHub.proxy_api_port = 5432
```
We recommend using the proxy's `api_url` setting instead of the deprecated
settings, `proxy_api_ip` and `proxy_api_port`.
## Configure the Hub if the Proxy or Spawners are remote or isolated
The Hub service listens only on `localhost` (port 8081) by default.
The Hub needs to be accessible from both the proxy and all Spawners.
When spawning local servers, an IP address setting of `localhost` is fine.
If *either* the Proxy *or* (more likely) the Spawners will be remote or
isolated in containers, the Hub must listen on an IP that is accessible.
```python
c.JupyterHub.hub_ip = '10.0.1.4'
c.JupyterHub.hub_port = 54321
```
**Added in 0.8:** The `c.JupyterHub.hub_connect_ip` setting is the ip address or
hostname that other services should use to connect to the Hub. A common
configuration for, e.g. docker, is:
```python
c.JupyterHub.hub_ip = '0.0.0.0' # listen on all interfaces
c.JupyterHub.hub_connect_ip = '10.0.1.4' # ip as seen on the docker network. Can also be a hostname.
```
## Adjusting the hub's URL
The hub will most commonly be running on a hostname of its own. If it
is not for example, if the hub is being reverse-proxied and being
exposed at a URL such as `https://proxy.example.org/jupyter/` then
you will need to tell JupyterHub the base URL of the service. In such
a case, it is both necessary and sufficient to set
`c.JupyterHub.base_url = '/jupyter/'` in the configuration.

View File

@@ -0,0 +1,261 @@
Security settings
=================
.. important::
You should not run JupyterHub without SSL encryption on a public network.
Security is the most important aspect of configuring Jupyter. Three
configuration settings are the main aspects of security configuration:
1. :ref:`SSL encryption <ssl-encryption>` (to enable HTTPS)
2. :ref:`Cookie secret <cookie-secret>` (a key for encrypting browser cookies)
3. Proxy :ref:`authentication token <authentication-token>` (used for the Hub and
other services to authenticate to the Proxy)
The Hub hashes all secrets (e.g., auth tokens) before storing them in its
database. A loss of control over read-access to the database should have
minimal impact on your deployment; if your database has been compromised, it
is still a good idea to revoke existing tokens.
.. _ssl-encryption:
Enabling SSL encryption
-----------------------
Since JupyterHub includes authentication and allows arbitrary code execution,
you should not run it without SSL (HTTPS).
Using an SSL certificate
~~~~~~~~~~~~~~~~~~~~~~~~
This will require you to obtain an official, trusted SSL certificate or create a
self-signed certificate. Once you have obtained and installed a key and
certificate you need to specify their locations in the ``jupyterhub_config.py``
configuration file as follows:
.. code-block:: python
c.JupyterHub.ssl_key = '/path/to/my.key'
c.JupyterHub.ssl_cert = '/path/to/my.cert'
Some cert files also contain the key, in which case only the cert is needed. It
is important that these files be put in a secure location on your server, where
they are not readable by regular users.
If you are using a **chain certificate**, see also chained certificate for SSL
in the JupyterHub `Troubleshooting FAQ <../troubleshooting.html>`_.
Using letsencrypt
~~~~~~~~~~~~~~~~~
It is also possible to use `letsencrypt <https://letsencrypt.org/>`_ to obtain
a free, trusted SSL certificate. If you run letsencrypt using the default
options, the needed configuration is (replace ``mydomain.tld`` by your fully
qualified domain name):
.. code-block:: python
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/{mydomain.tld}/privkey.pem'
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/{mydomain.tld}/fullchain.pem'
If the fully qualified domain name (FQDN) is ``example.com``, the following
would be the needed configuration:
.. code-block:: python
c.JupyterHub.ssl_key = '/etc/letsencrypt/live/example.com/privkey.pem'
c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/example.com/fullchain.pem'
If SSL termination happens outside of the Hub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In certain cases, for example if the hub is running behind a reverse proxy, and
`SSL termination is being provided by NGINX <https://www.nginx.com/resources/admin-guide/nginx-ssl-termination/>`_,
it is reasonable to run the hub without SSL.
To achieve this, simply omit the configuration settings
``c.JupyterHub.ssl_key`` and ``c.JupyterHub.ssl_cert``
(setting them to ``None`` does not have the same effect, and is an error).
.. _authentication-token:
Proxy authentication token
--------------------------
The Hub authenticates its requests to the Proxy using a secret token that
the Hub and Proxy agree upon. Note that this applies to the default
``ConfigurableHTTPProxy`` implementation. Not all proxy implementations
use an auth token.
The value of this token should be a random string (for example, generated by
``openssl rand -hex 32``). You can store it in the configuration file or an
environment variable
Generating and storing token in the configuration file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can set the value in the configuration file, ``jupyterhub_config.py``:
.. code-block:: python
c.ConfigurableHTTPProxy.api_token = 'abc123...' # any random string
Generating and storing as an environment variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can pass this value of the proxy authentication token to the Hub and Proxy
using the ``CONFIGPROXY_AUTH_TOKEN`` environment variable:
.. code-block:: bash
export CONFIGPROXY_AUTH_TOKEN=$(openssl rand -hex 32)
This environment variable needs to be visible to the Hub and Proxy.
Default if token is not set
~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you don't set the Proxy authentication token, the Hub will generate a random
key itself, which means that any time you restart the Hub you **must also
restart the Proxy**. If the proxy is a subprocess of the Hub, this should happen
automatically (this is the default configuration).
.. _cookie-secret:
Cookie secret
-------------
The cookie secret is an encryption key, used to encrypt the browser cookies
which are used for authentication. Three common methods are described for
generating and configuring the cookie secret.
Generating and storing as a cookie secret file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The cookie secret should be 32 random bytes, encoded as hex, and is typically
stored in a ``jupyterhub_cookie_secret`` file. An example command to generate the
``jupyterhub_cookie_secret`` file is:
.. code-block:: bash
openssl rand -hex 32 > /srv/jupyterhub/jupyterhub_cookie_secret
In most deployments of JupyterHub, you should point this to a secure location on
the file system, such as ``/srv/jupyterhub/jupyterhub_cookie_secret``.
The location of the ``jupyterhub_cookie_secret`` file can be specified in the
``jupyterhub_config.py`` file as follows:
.. code-block:: python
c.JupyterHub.cookie_secret_file = '/srv/jupyterhub/jupyterhub_cookie_secret'
If the cookie secret file doesn't exist when the Hub starts, a new cookie
secret is generated and stored in the file. The file must not be readable by
``group`` or ``other`` or the server won't start. The recommended permissions
for the cookie secret file are ``600`` (owner-only rw).
Generating and storing as an environment variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you would like to avoid the need for files, the value can be loaded in the
Hub process from the ``JPY_COOKIE_SECRET`` environment variable, which is a
hex-encoded string. You can set it this way:
.. code-block:: bash
export JPY_COOKIE_SECRET=$(openssl rand -hex 32)
For security reasons, this environment variable should only be visible to the
Hub. If you set it dynamically as above, all users will be logged out each time
the Hub starts.
Generating and storing as a binary string
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can also set the cookie secret in the configuration file
itself, ``jupyterhub_config.py``, as a binary string:
.. code-block:: python
c.JupyterHub.cookie_secret = bytes.fromhex('64 CHAR HEX STRING')
.. important::
If the cookie secret value changes for the Hub, all single-user notebook
servers must also be restarted.
.. _cookies:
Cookies used by JupyterHub authentication
-----------------------------------------
The following cookies are used by the Hub for handling user authentication.
This section was created based on this post_ from Discourse.
.. _post: https://discourse.jupyter.org/t/how-to-force-re-login-for-users/1998/6
jupyterhub-hub-login
~~~~~~~~~~~~~~~~~~~~
This is the login token used when visiting Hub-served pages that are
protected by authentication such as the main home, the spawn form, etc.
If this cookie is set, then the user is logged in.
Resetting the Hub cookie secret effectively revokes this cookie.
This cookie is restricted to the path ``/hub/``.
jupyterhub-user-<username>
~~~~~~~~~~~~~~~~~~~~~~~~~~
This is the cookie used for authenticating with a single-user server.
It is set by the single-user server after OAuth with the Hub.
Effectively the same as ``jupyterhub-hub-login``, but for the
single-user server instead of the Hub. It contains an OAuth access token,
which is checked with the Hub to authenticate the browser.
Each OAuth access token is associated with a session id (see ``jupyterhub-session-id`` section
below).
To avoid hitting the Hub on every request, the authentication response
is cached. And to avoid a stale cache the cache key is comprised of both
the token and session id.
Resetting the Hub cookie secret effectively revokes this cookie.
This cookie is restricted to the path ``/user/<username>``, so that
only the users server receives it.
jupyterhub-session-id
~~~~~~~~~~~~~~~~~~~~~
This is a random string, meaningless in itself, and the only cookie
shared by the Hub and single-user servers.
Its sole purpose is to coordinate logout of the multiple OAuth cookies.
This cookie is set to ``/`` so all endpoints can receive it, or clear it, etc.
jupyterhub-user-<username>-oauth-state
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A short-lived cookie, used solely to store and validate OAuth state.
It is only set while OAuth between the single-user server and the Hub
is processing.
If you use your browser development tools, you should see this cookie
for a very brief moment before your are logged in,
with an expiration date shorter than ``jupyterhub-hub-login`` or
``jupyterhub-user-<username>``.
This cookie should not exist after you have successfully logged in.
This cookie is restricted to the path ``/user/<username>``, so that only
the users server receives it.

View File

@@ -0,0 +1,121 @@
# External services
When working with JupyterHub, a **Service** is defined as a process
that interacts with the Hub's REST API. A Service may perform a specific
or action or task. For example, shutting down individuals' single user
notebook servers that have been idle for some time is a good example of
a task that could be automated by a Service. Let's look at how the
[cull_idle_servers][] script can be used as a Service.
## Real-world example to cull idle servers
JupyterHub has a REST API that can be used by external services. This
document will:
- explain some basic information about API tokens
- clarify that API tokens can be used to authenticate to
single-user servers as of [version 0.8.0](../changelog)
- show how the [cull_idle_servers][] script can be:
- used in a Hub-managed service
- run as a standalone script
Both examples for `cull_idle_servers` will communicate tasks to the
Hub via the REST API.
## API Token basics
### Create an API token
To run such an external service, an API token must be created and
provided to the service.
As of [version 0.6.0](../changelog), the preferred way of doing
this is to first generate an API token:
```bash
openssl rand -hex 32
```
In [version 0.8.0](../changelog), a TOKEN request page for
generating an API token is available from the JupyterHub user interface:
![Request API TOKEN page](../images/token-request.png)
![API TOKEN success page](../images/token-request-success.png)
### Pass environment variable with token to the Hub
In the case of `cull_idle_servers`, it is passed as the environment
variable called `JUPYTERHUB_API_TOKEN`.
### Use API tokens for services and tasks that require external access
While API tokens are often associated with a specific user, API tokens
can be used by services that require external access for activities
that may not correspond to a specific human, e.g. adding users during
setup for a tutorial or workshop. Add a service and its API token to the
JupyterHub configuration file, `jupyterhub_config.py`:
```python
c.JupyterHub.services = [
{'name': 'adding-users', 'api_token': 'super-secret-token'},
]
```
### Restart JupyterHub
Upon restarting JupyterHub, you should see a message like below in the
logs:
```
Adding API token for <username>
```
## Authenticating to single-user servers using API token
In JupyterHub 0.7, there is no mechanism for token authentication to
single-user servers, and only cookies can be used for authentication.
0.8 supports using JupyterHub API tokens to authenticate to single-user
servers.
## Configure `cull-idle` to run as a Hub-Managed Service
In `jupyterhub_config.py`, add the following dictionary for the
`cull-idle` Service to the `c.JupyterHub.services` list:
```python
c.JupyterHub.services = [
{
'name': 'cull-idle',
'admin': True,
'command': [sys.executable, 'cull_idle_servers.py', '--timeout=3600'],
}
]
```
where:
- `'admin': True` indicates that the Service has 'admin' permissions, and
- `'command'` indicates that the Service will be launched as a
subprocess, managed by the Hub.
## Run `cull-idle` manually as a standalone script
Now you can run your script, i.e. `cull_idle_servers`, by providing it
the API token and it will authenticate through the REST API to
interact with it.
This will run `cull-idle` manually. `cull-idle` can be run as a standalone
script anywhere with access to the Hub, and will periodically check for idle
servers and shut them down via the Hub's REST API. In order to shutdown the
servers, the token given to cull-idle must have admin privileges.
Generate an API token and store it in the `JUPYTERHUB_API_TOKEN` environment
variable. Run `cull_idle_servers.py` manually.
```bash
export JUPYTERHUB_API_TOKEN='token'
python3 cull_idle_servers.py [--timeout=900] [--url=http://127.0.0.1:8081/hub/api]
```
[cull_idle_servers]: https://github.com/jupyterhub/jupyterhub/blob/master/examples/cull-idle/cull_idle_servers.py

View File

@@ -0,0 +1,33 @@
# Spawners and single-user notebook servers
Since the single-user server is an instance of `jupyter notebook`, an entire separate
multi-process application, there are many aspect of that server can configure, and a lot of ways
to express that configuration.
At the JupyterHub level, you can set some values on the Spawner. The simplest of these is
`Spawner.notebook_dir`, which lets you set the root directory for a user's server. This root
notebook directory is the highest level directory users will be able to access in the notebook
dashboard. In this example, the root notebook directory is set to `~/notebooks`, where `~` is
expanded to the user's home directory.
```python
c.Spawner.notebook_dir = '~/notebooks'
```
You can also specify extra command-line arguments to the notebook server with:
```python
c.Spawner.args = ['--debug', '--profile=PHYS131']
```
This could be used to set the users default page for the single user server:
```python
c.Spawner.args = ['--NotebookApp.default_url=/notebooks/Welcome.ipynb']
```
Since the single-user server extends the notebook server application,
it still loads configuration from the `jupyter_notebook_config.py` config file.
Each user may have one of these files in `$HOME/.jupyter/`.
Jupyter also supports loading system-wide config files from `/etc/jupyter/`,
which is the place to put configuration that you want to affect all of your users.

View File

@@ -1,77 +0,0 @@
# How JupyterHub works
JupyterHub is a multi-user server that manages and proxies multiple instances of the single-user <del>IPython</del> Jupyter notebook server.
There are three basic processes involved:
- multi-user Hub (Python/Tornado)
- [configurable http proxy](https://github.com/jupyter/configurable-http-proxy) (node-http-proxy)
- multiple single-user IPython notebook servers (Python/IPython/Tornado)
The proxy is the only process that listens on a public interface.
The Hub sits behind the proxy at `/hub`.
Single-user servers sit behind the proxy at `/user/[username]`.
## Logging in
When a new browser logs in to JupyterHub, the following events take place:
- Login data is handed to the [Authenticator](#authentication) instance for validation
- The Authenticator returns the username, if login information is valid
- A single-user server instance is [Spawned](#spawning) for the logged-in user
- When the server starts, the proxy is notified to forward `/user/[username]/*` to the single-user server
- Two cookies are set, one for `/hub/` and another for `/user/[username]`,
containing an encrypted token.
- The browser is redirected to `/user/[username]`, which is handled by the single-user server
Logging into a single-user server is authenticated via the Hub:
- On request, the single-user server forwards the encrypted cookie to the Hub for verification
- The Hub replies with the username if it is a valid cookie
- If the user is the owner of the server, access is allowed
- If it is the wrong user or an invalid cookie, the browser is redirected to `/hub/login`
## Customizing JupyterHub
There are two basic extension points for JupyterHub: How users are authenticated,
and how their server processes are started.
Each is governed by a customizable class,
and JupyterHub ships with just the most basic version of each.
To enable custom authentication and/or spawning,
subclass Authenticator or Spawner,
and override the relevant methods.
### Authentication
Authentication is customizable via the Authenticator class.
Authentication can be replaced by any mechanism,
such as OAuth, Kerberos, etc.
JupyterHub only ships with [PAM](https://en.wikipedia.org/wiki/Pluggable_authentication_module) authentication,
which requires the server to be run as root,
or at least with access to the PAM service,
which regular users typically do not have
(on Ubuntu, this requires being added to the `shadow` group).
[More info on custom Authenticators](authenticators.md).
See a list of custom Authenticators [on the wiki](https://github.com/jupyter/jupyterhub/wiki/Authenticators).
### Spawning
Each single-user server is started by a Spawner.
The Spawner represents an abstract interface to a process,
and needs to be able to take three actions:
1. start the process
2. poll whether the process is still running
3. stop the process
[More info on custom Spawners](spawners.md).
See a list of custom Spawners [on the wiki](https://github.com/jupyter/jupyterhub/wiki/Spawners).

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -0,0 +1,15 @@
=====
About
=====
JupyterHub is an open source project and community. It is a part of the
`Jupyter Project <https://jupyter.org>`_. JupyterHub is an open and inclusive
community, and invites contributions from anyone. This section covers information
about our community, as well as ways that you can connect and get involved.
.. toctree::
:maxdepth: 1
contributor-list
changelog
gallery-jhub-deployments

View File

@@ -0,0 +1,13 @@
=====================
Administrator's Guide
=====================
This guide covers best-practices, tips, common questions and operations, as
well as other information relevant to running your own JupyterHub over time.
.. toctree::
:maxdepth: 2
troubleshooting
admin/upgrading
changelog

View File

@@ -1,94 +1,150 @@
==========
JupyterHub
==========
JupyterHub is a server that gives multiple users access to Jupyter notebooks,
running an independent Jupyter notebook server for each user.
`JupyterHub`_ is the best way to serve `Jupyter notebook`_ for multiple users.
It can be used in a class of students, a corporate data science group or scientific
research group. It is a multi-user **Hub** that spawns, manages, and proxies multiple
instances of the single-user `Jupyter notebook`_ server.
To use JupyterHub, you need a Unix server (typically Linux) running
somewhere that is accessible to your team on the network. The JupyterHub server
can be on an internal network at your organisation, or it can run on the public
internet (in which case, take care with `security <getting-started.html#security>`__).
Users access JupyterHub in a web browser, by going to the IP address or
domain name of the server.
To make life easier, JupyterHub has distributions. Be sure to
take a look at them before continuing with the configuration of the broad
original system of `JupyterHub`_. Today, you can find two main cases:
Different :doc:`authenticators <authenticators>` control access
to JupyterHub. The default one (pam) uses the user accounts on the server where
JupyterHub is running. If you use this, you will need to create a user account
on the system for each user on your team. Using other authenticators, you can
allow users to sign in with e.g. a Github account, or with any single-sign-on
system your organisation has.
Next, :doc:`spawners <spawners>` control how JupyterHub starts
the individual notebook server for each user. The default spawner will
start a notebook server on the same machine running under their system username.
The other main option is to start each server in a separate container, often
using Docker.
JupyterHub runs as three separate parts:
* The multi-user Hub (Python & Tornado)
* A `configurable http proxy <https://github.com/jupyter/configurable-http-proxy>`_ (NodeJS)
* Multiple single-user Jupyter notebook servers (Python & Tornado)
Basic principles:
* Hub spawns proxy
* Proxy forwards ~all requests to hub by default
* Hub handles login, and spawns single-user servers on demand
* Hub configures proxy to forward url prefixes to single-user servers
1. If you need a simple case for a small amount of users (0-100) and single server
take a look at
`The Littlest JupyterHub <https://github.com/jupyterhub/the-littlest-jupyterhub>`__ distribution.
2. If you need to allow for even more users, a dynamic amount of servers can be used on a cloud,
take a look at the `Zero to JupyterHub with Kubernetes <https://github.com/jupyterhub/zero-to-jupyterhub-k8s>`__ .
Contents:
Four subsystems make up JupyterHub:
* a **Hub** (tornado process) that is the heart of JupyterHub
* a **configurable http proxy** (node-http-proxy) that receives the requests from the client's browser
* multiple **single-user Jupyter notebook servers** (Python/IPython/tornado) that are monitored by Spawners
* an **authentication class** that manages how users can access the system
Besides these central pieces, you can add optional configurations through a `config.py` file and manage users kernels on an admin panel. A simplification of the whole system can be seen in the figure below:
.. image:: images/jhub-fluxogram.jpeg
:alt: JupyterHub subsystems
:width: 80%
:align: center
JupyterHub performs the following functions:
- The Hub launches a proxy
- The proxy forwards all requests to the Hub by default
- The Hub handles user login and spawns single-user servers on demand
- The Hub configures the proxy to forward URL prefixes to the single-user
notebook servers
For convenient administration of the Hub, its users, and services,
JupyterHub also provides a `REST API`_.
The JupyterHub team and Project Jupyter value our community, and JupyterHub
follows the Jupyter `Community Guides <https://jupyter.readthedocs.io/en/latest/community/content-community.html>`_.
Contents
========
.. _index/distributions:
Distributions
-------------
A JupyterHub **distribution** is tailored towards a particular set of
use cases. These are generally easier to set up than setting up
JupyterHub from scratch, assuming they fit your use case.
The two popular ones are:
* `Zero to JupyterHub on Kubernetes <http://z2jh.jupyter.org>`_, for
running JupyterHub on top of `Kubernetes <https://k8s.io>`_. This
can scale to large number of machines & users.
* `The Littlest JupyterHub <http://tljh.jupyter.org>`_, for an easy
to set up & run JupyterHub supporting 1-100 users on a single machine.
Installation Guide
------------------
.. toctree::
:maxdepth: 2
:caption: User Documentation
getting-started
howitworks
websecurity
installation-guide
Getting Started
---------------
.. toctree::
:maxdepth: 2
:caption: Configuration
authenticators
spawners
troubleshooting
getting-started/index
Technical Reference
-------------------
.. toctree::
:maxdepth: 1
:caption: Developer Documentation
:maxdepth: 2
reference/index
Administrators guide
--------------------
.. toctree::
:maxdepth: 2
index-admin
API Reference
-------------
.. toctree::
:maxdepth: 2
api/index
Contributing
------------
.. toctree::
:maxdepth: 1
:caption: Community documentation
We want you to contribute to JupyterHub in ways that are most exciting
& useful to you. We value documentation, testing, bug reporting & code equally,
and are glad to have your contributions in whatever form you wish :)
Our `Code of Conduct <https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md>`_
(`reporting guidelines <https://github.com/jupyter/governance/blob/master/conduct/reporting_online.md>`_)
helps keep our community welcoming to as many people as possible.
.. toctree::
:maxdepth: 2
:caption: About JupyterHub
changelog
contributing/index
About JupyterHub
----------------
.. toctree::
:maxdepth: 1
:caption: Questions? Suggestions?
Jupyter mailing list <https://groups.google.com/forum/#!forum/jupyter>
Jupyter website <https://jupyter.org>
Stack Overflow - Jupyter <https://stackoverflow.com/questions/tagged/jupyter>
Stack Overflow - Jupyter-notebook <https://stackoverflow.com/questions/tagged/jupyter-notebook>
:maxdepth: 2
index-about
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
Questions? Suggestions?
=======================
- `Jupyter mailing list <https://groups.google.com/forum/#!forum/jupyter>`_
- `Jupyter website <https://jupyter.org>`_
.. _JupyterHub: https://github.com/jupyterhub/jupyterhub
.. _Jupyter notebook: https://jupyter-notebook.readthedocs.io/en/latest/
.. _REST API: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/master/docs/rest-api.yml#!/default

View File

@@ -0,0 +1,40 @@
# Installation Basics
## Platform support
JupyterHub is supported on Linux/Unix based systems. To use JupyterHub, you need
a Unix server (typically Linux) running somewhere that is accessible to your
team on the network. The JupyterHub server can be on an internal network at your
organization, or it can run on the public internet (in which case, take care
with the Hub's [security](./getting-started/security-basics)).
JupyterHub officially **does not** support Windows. You may be able to use
JupyterHub on Windows if you use a Spawner and Authenticator that work on
Windows, but the JupyterHub defaults will not. Bugs reported on Windows will not
be accepted, and the test suite will not run on Windows. Small patches that fix
minor Windows compatibility issues (such as basic installation) **may** be accepted,
however. For Windows-based systems, we would recommend running JupyterHub in a
docker container or Linux VM.
[Additional Reference:](http://www.tornadoweb.org/en/stable/#installation)
Tornado's documentation on Windows platform support
## Planning your installation
Prior to beginning installation, it's helpful to consider some of the following:
- deployment system (bare metal, Docker)
- Authentication (PAM, OAuth, etc.)
- Spawner of singleuser notebook servers (Docker, Batch, etc.)
- Services (nbgrader, etc.)
- JupyterHub database (default SQLite; traditional RDBMS such as PostgreSQL,)
MySQL, or other databases supported by [SQLAlchemy](http://www.sqlalchemy.org))
## Folders and File Locations
It is recommended to put all of the files used by JupyterHub into standard
UNIX filesystem locations.
- `/srv/jupyterhub` for all security and runtime files
- `/etc/jupyterhub` for all configuration files
- `/var/log` for log files

View File

@@ -0,0 +1,347 @@
# Install JupyterHub and JupyterLab from the ground up
The combination of [JupyterHub](https://jupyterhub.readthedocs.io) and [JupyterLab](https://jupyterlab.readthedocs.io)
is a great way to make shared computing resources available to a group.
These instructions are a guide for a manual, 'bare metal' install of [JupyterHub](https://jupyterhub.readthedocs.io)
and [JupyterLab](https://jupyterlab.readthedocs.io). This is ideal for running on a single server: build a beast
of a machine and share it within your lab, or use a virtual machine from any VPS or cloud provider.
This guide has similar goals to [The Littlest JupyterHub](https://the-littlest-jupyterhub.readthedocs.io) setup
script. However, instead of bundling all these step for you into one installer, we will perform every step manually.
This makes it easy to customize any part (e.g. if you want to run other services on the same system and need to make them
work together), as well as giving you full control and understanding of your setup.
## Prerequisites
Your own server with administrator (root) access. This could be a local machine, a remotely hosted one, or a cloud instance
or VPS. Each user who will access JupyterHub should have a standard user account on the machine. The install will be done
through the command line - useful if you log into your machine remotely using SSH.
This tutorial was tested on **Ubuntu 18.04**. No other Linux distributions have been tested, but the instructions
should be reasonably straightforward to adapt.
## Goals
JupyterLab enables access to a multiple 'kernels', each one being a given environment for a given language. The most
common is a Python environment, for scientific computing usually one managed by the `conda` package manager.
This guide will set up JupyterHub and JupyterLab seperately from the Python environment. In other words, we treat
JupyterHub+JupyterLab as a 'app' or webservice, which will connect to the kernels available on the system. Specifically:
- We will create an installation of JupyterHub and JupyterLab using a virtualenv under `/opt` using the system Python.
- We will install conda globally.
- We will create a shared conda environment which can be used (but not modified) by all users.
- We will show how users can create their own private conda environments, where they can install whatever they like.
The default JupyterHub Authenticator uses PAM to authenticate system users with their username and password. One can
[choose the authenticator](https://jupyterhub.readthedocs.io/en/stable/reference/authenticators.html#authenticators)
that best suits their needs. In this guide we will use the default Authenticator because it makes it easy for everyone to manage data
in their home folder and to mix and match different services and access methods (e.g. SSH) which all work using the
Linux system user accounts. Therefore, each user of JupyterHub will need a standard system user account.
Another goal of this guide is to use system provided packages wherever possible. This has the advantage that these packages
get automatic patches and security updates (be sure to turn on automatic updates in Ubuntu). This means less maintenance
work and a more reliable system.
## Part 1: JupyterHub and JupyterLab
### Setup the JupyterHub and JupyterLab in a virtual environment
First we create a virtual environment under '/opt/jupyterhub'. The '/opt' folder is where apps not belonging to the operating
system are [commonly installed](https://unix.stackexchange.com/questions/11544/what-is-the-difference-between-opt-and-usr-local).
Both jupyterlab and jupyterhub will be installed into this virtualenv. Create it with the command:
```sh
sudo python3 -m venv /opt/jupyterhub/
```
Now we use pip to install the required Python packages into the new virtual environment. Be sure to install
`wheel` first. Since we are separating the user interface from the computing kernels, we don't install
any Python scientific packages here. The only exception is `ipywidgets` because this is needed to allow connection
between interactive tools running in the kernel and the user interface.
Note that we use `/opt/jupyterhub/bin/python3 -m pip install` each time - this [makes sure](https://snarky.ca/why-you-should-use-python-m-pip/)
that the packages are installed to the correct virtual environment.
Perform the install using the following commands:
```sh
sudo /opt/jupyterhub/bin/python3 -m pip install wheel
sudo /opt/jupyterhub/bin/python3 -m pip install jupyterhub jupyterlab
sudo /opt/jupyterhub/bin/python3 -m pip install ipywidgets
```
JupyterHub also currently defaults to requiring `configurable-http-proxy`, which needs `nodejs` and `npm`. The versions
of these available in Ubuntu therefore need to be installed first (they are a bit old but this is ok for our needs):
```sh
sudo apt install nodejs npm
```
Then install `configurable-http-proxy`:
```sh
sudo npm install -g configurable-http-proxy
```
### Create the configuration for JupyterHub
Now we start creating configuration files. To keep everything together, we put all the configuration into the folder
created for the virtualenv, under `/opt/jupyterhub/etc/`. For each thing needing configuration, we will create a further
subfolder and necessary files.
First create the folder for the JupyterHub configuration and navigate to it:
```sh
sudo mkdir -p /opt/jupyterhub/etc/jupyterhub/
cd /opt/jupyterhub/etc/jupyterhub/
```
Then generate the default configuration file
```sh
sudo /opt/jupyterhub/bin/jupyterhub --generate-config
```
This will produce the default configuration file `/opt/jupyterhub/etc/jupyterhub/jupyterhub_config.py`
You will need to edit the configuration file to make the JupyterLab interface by the default.
Set the following configuration option in your `jupyterhub_config.py` file:
```python
c.Spawner.default_url = '/lab'
```
Further configuration options may be found in the documentation.
### Setup Systemd service
We will setup JupyterHub to run as a system service using Systemd (which is responsible for managing all services and
servers that run on startup in Ubuntu). We will create a service file in a suitable location in the virtualenv folder
and then link it to the system services. First create the folder for the service file:
```sh
sudo mkdir -p /opt/jupyterhub/etc/systemd
```
Then create the following text file using your [favourite editor](https://micro-editor.github.io/) at
```sh
/opt/jupyterhub/etc/systemd/jupyterhub.service
```
Paste the following service unit definition into the file:
```
[Unit]
Description=JupyterHub
After=syslog.target network.target
[Service]
User=root
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/jupyterhub/bin"
ExecStart=/opt/jupyterhub/bin/jupyterhub -f /opt/jupyterhub/etc/jupyterhub/jupyterhub_config.py
[Install]
WantedBy=multi-user.target
```
This sets up the environment to use the virtual environment we created, tells Systemd how to start jupyterhub using
the configuration file we created, specifies that jupyterhub will be started as the `root` user (needed so that it can
start jupyter on behalf of other logged in users), and specifies that jupyterhub should start on boot after the network
is enabled.
Finally, we need to make systemd aware of our service file. First we symlink our file into systemd's directory:
```sh
sudo ln -s /opt/jupyterhub/etc/systemd/jupyterhub.service /etc/systemd/system/jupyterhub.service
```
Then tell systemd to reload its configuration files
```sh
sudo systemctl daemon-reload
```
And finally enable the service
```sh
sudo systemctl enable jupyterhub.service
```
The service will start on reboot, but we can start it straight away using:
```sh
sudo systemctl start jupyterhub.service
```
...and check that it's running using:
```sh
sudo systemctl status jupyterhub.service
```
You should now be already be able to access jupyterhub using `<your servers ip>:8000` (assuming you haven't already set
up a firewall or something). However, when you log in the jupyter notebooks will be trying to use the Python virtualenv
that was created to install JupyterHub, this is not what we want. So on to part 2
## Part 2: Conda environments
### Install conda for the whole system
We will use `conda` to manage Python environments. We will install the officially maintained `conda` packages for Ubuntu,
this means they will get automatic updates with the rest of the system. Setup repo for the official Conda debian packages,
instructions are copied from [here](https://docs.conda.io/projects/conda/en/latest/user-guide/install/rpm-debian.html):
Install Anacononda public gpg key to trusted store
```sh
curl https://repo.anaconda.com/pkgs/misc/gpgkeys/anaconda.asc | gpg --dearmor > conda.gpg
sudo install -o root -g root -m 644 conda.gpg /etc/apt/trusted.gpg.d/
```
Add Debian repo
```sh
echo "deb [arch=amd64] https://repo.anaconda.com/pkgs/misc/debrepo/conda stable main" | sudo tee /etc/apt/sources.list.d/conda.list
```
Install conda
```sh
sudo apt update
sudo apt install conda
```
This will install conda into the folder `/opt/conda/`, with the conda command available at `/opt/conda/bin/conda`.
Finally, we can make conda more easily available to users by symlinking the conda shell setup script to the profile
'drop in' folder so that it gets run on login
```sh
sudo ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh
```
### Install a default conda environment for all users
First create a folder for conda envs (might exist already):
```sh
sudo mkdir /opt/conda/envs/
```
Then create a conda environment to your liking within that folder. Here we have called it 'python' because it will
be the obvious default - call it whatever you like. You can install whatever you like into this environment, but you MUST at least install `ipykernel`.
```sh
sudo /opt/conda/bin/conda create --prefix /opt/conda/envs/python python=3.7 ipykernel
```
Once your env is set up as desired, make it visible to Jupyter by installing the kernel spec. There are two options here:
1 ) Install into the JupyterHub virtualenv - this ensures it overrides the default python version. It will only be visible
to the JupyterHub installation we have just created. This is useful to avoid conda environments appearing where they are not expected.
```sh
sudo /opt/conda/envs/python/bin/python -m ipykernel install --prefix=/opt/jupyterhub/ --name 'python' --display-name "Python (default)"
```
2 ) Install it system-wide by putting it into `/usr/local`. It will be visible to any parallel install of JupyterHub or
JupyterLab, and will persist even if you later delete or modify the JupyterHub installation. This is useful if the kernels
might be used by other services, or if you want to modify the JupyterHub installation independently from the conda environments.
```sh
sudo /opt/conda/envs/python/bin/python -m ipykernel install --prefix /usr/local/ --name 'python' --display-name "Python (default)"
````
### Setting up users' own conda environments
There is relatively little for the administrator to do here, as users will have to set up their own environments using the shell.
On login they should run `conda init` or `/opt/conda/bin/conda`. The can then use conda to set up their environment,
although they must also install `ipykernel`. Once done, they can enable their kernel using:
```sh
/path/to/kernel/env/bin/python -m ipykernel install --name 'python-my-env' --display-name "Python My Env"
```
This will place the kernel spec into their home folder, where Jupyter will look for it on startup.
## Setting up a reverse proxy
The guide so far results in JupyterHub running on port 8000. It is not generally advisable to run open web services in
this way - instead, use a reverse proxy running on standard HTTP/HTTPS ports.
> **Important**: Be aware of the security implications especially if you are running a server that is accessible from the open internet
> i.e. not protected within an institutional intranet or private home/office network. You should set up a firewall and
> HTTPS encryption, which is outside of the scope of this guide. For HTTPS consider using [LetsEncrypt](https://letsencrypt.org/)
> or setting up a [self-signed certificate](https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-18-04).
> Firewalls may be set up using `ufw` or `firewalld` and combined with `fail2ban`.
### Using Nginx
Nginx is a mature and established web server and reverse proxy and is easy to install using `sudo apt install nginx`.
Details on using Nginx as a reverse proxy can be found elsewhere. Here, we will only outline the additional steps needed
to setup JupyterHub with Nginx and host it at a given URL e.g. `<your-server-ip-or-url>/jupyter`.
This could be useful for example if you are running several services or web pages on the same server.
To achieve this needs a few tweaks to both the JupyterHub configuration and the Nginx config. First, edit the
configuration file `/opt/jupyterhub/etc/jupyterhub/jupyterhub_config.py` and add the line:
```python
c.JupyterHub.bind_url = 'http://:8000/jupyter'
```
where `/jupyter` will be the relative URL of the JupyterHub.
Now Nginx must be configured with a to pass all traffic from `/jupyter` to the the local address `127.0.0.1:8000`.
Add the following snippet to your nginx configuration file (e.g. `/etc/nginx/sites-available/default`).
```
location /jupyter/ {
# NOTE important to also set base url of jupyterhub to /jupyter in its config
proxy_pass http://127.0.0.1:8000;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# websocket headers
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
```
Also add this snippet before the *server* block:
```
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
```
Nginx will not run if there are errors in the configuration, check your configuration using:
```sh
nginx -t
```
If there are no errors, you can restart the Nginx service for the new configuration to take effect.
```sh
sudo systemctl restart nginx.service
```
## Getting started using your new JupyterHub
Once you have setup JupyterHub and Nginx proxy as described, you can browse to your JupyterHub IP or URL
(e.g. if your server IP address is `123.456.789.1` and you decided to host JupyterHub at the `/jupyter` URL, browse
to `123.456.789.1/jupyter`). You will find a login page where you enter your Linux username and password. On login
you will be presented with the JupyterLab interface, with the file browser pane showing the contents of your users'
home directory on the server.

View File

@@ -0,0 +1,14 @@
Installation
============
These sections cover how to get up-and-running with JupyterHub. They cover
some basics of the tools needed to deploy JupyterHub as well as how to get it
running on your own infrastructure.
.. toctree::
:maxdepth: 3
quickstart
quickstart-docker
installation-basics
installation-guide-hard

View File

@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
mQINBFMx2LoBEAC9xU8JiKI1VlCJ4PT9zqhU5nChQZ06/bj1BBftiMJG07fdGVO0
ibOn4TrCoRYaeRlet0UpHzxT4zDa5h3/usJaJNTSRwtWePw2o7Lik8J+F3LionRf
8Jz81WpJ+81Klg4UWKErXjBHsu/50aoQm6ZNYG4S2nwOmMVEC4nc44IAA0bb+6kW
saFKKzEDsASGyuvyutdyUHiCfvvh5GOC2h9mXYvl4FaMW7K+d2UgCYERcXDNy7C1
Bw+uepQ9ELKdG4ZpvonO6BNr1BWLln3wk93AQfD5qhfsYRJIyj0hJlaRLtBU3i6c
xs+gQNF4mPmybpPSGuOyUr4FYC7NfoG7IUMLj+DYa6d8LcMJO+9px4IbdhQvzGtC
qz5av1TX7/+gnS4L8C9i1g8xgI+MtvogngPmPY4repOlK6y3l/WtxUPkGkyYkn3s
RzYyE/GJgTwuxFXzMQs91s+/iELFQq/QwmEJf+g/QYfSAuM+lVGajEDNBYVAQkxf
gau4s8Gm0GzTZmINilk+7TxpXtKbFc/Yr4A/fMIHmaQ7KmJB84zKwONsQdVv7Jjj
0dpwu8EIQdHxX3k7/Q+KKubEivgoSkVwuoQTG15X9xrOsDZNwfOVQh+JKazPvJtd
SNfep96r9t/8gnXv9JI95CGCQ8lNhXBUSBM3BDPTbudc4b6lFUyMXN0mKQARAQAB
tCxJUHl0aG9uIFNlY3VyaXR5IFRlYW0gPHNlY3VyaXR5QGlweXRob24ub3JnPokC
OAQTAQIAIgUCUzHYugIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQEwJc
LcmZYkjuXg//R/t6nMNQmf9W1h52IVfUbRAVmvZ5d063hQHKV2dssxtnA2dRm/x5
JZu8Wz7ZrEZpyqwRJO14sxN1/lC3v+zs9XzYXr2lBTZuKCPIBypYVGIynCuWJBQJ
rWnfG4+u1RHahnjqlTWTY1C/le6v7SjAvCb6GbdA6k4ZL2EJjQlRaHDmzw3rV/+l
LLx6/tYzIsotuflm/bFumyOMmpQQpJjnCkWIVjnRICZvuAn97jLgtTI0+0Rzf4Zb
k2BwmHwDRqWCTTcRI9QvTl8AzjW+dNImN22TpGOBPfYj8BCZ9twrpKUbf+jNqJ1K
THQzFtpdJ6SzqiFVm74xW4TKqCLkbCQ/HtVjTGMGGz/y7KTtaLpGutQ6XE8SSy6P
EffSb5u+kKlQOWaH7Mc3B0yAojz6T3j5RSI8ts6pFi6pZhDg9hBfPK2dT0v/7Mkv
E1Z7q2IdjZnhhtGWjDAMtDDn2NbY2wuGoa5jAWAR0WvIbEZ3kOxuLE5/ZOG1FyYm
noJRliBz7038nT92EoD5g1pdzuxgXtGCpYyyjRZwaLmmi4CvA+oThKmnqWNY5lyY
ricdNHDiyEXK0YafJL1oZgM86MSb0jKJMp5U11nUkUGzkroFfpGDmzBwAzEPgeiF
40+qgsKB9lqwb3G7PxvfSi3XwxfXgpm1cTyEaPSzsVzve3d1xeqb7Yq5Ag0EUzHY
ugEQALQ5FtLdNoxTxMsgvrRr1ejLiUeRNUfXtN1TYttOfvAhfBVnszjtkpIW8DCB
JF/bA7ETiH8OYYn/Fm6MPI5H64IHEncpzxjf57jgpXd9CA9U2OMk/P1nve5zYchP
QmP2fJxeAWr0aRH0Mse5JS5nCkh8Xv4nAjsBYeLTJEVOb1gPQFXOiFcVp3gaKAzX
GWOZ/mtG/uaNsabH/3TkcQQEgJefd11DWgMB7575GU+eME7c6hn3FPITA5TC5HUX
azvjv/PsWGTTVAJluJ3fUDvhpbGwYOh1uV0rB68lPpqVIro18IIJhNDnccM/xqko
4fpJdokdg4L1wih+B04OEXnwgjWG8OIphR/oL/+M37VV2U7Om/GE6LGefaYccC9c
tIaacRQJmZpG/8RsimFIY2wJ07z8xYBITmhMmOt0bLBv0mU0ym5KH9Dnru1m9QDO
AHwcKrDgL85f9MCn+YYw0d1lYxjOXjf+moaeW3izXCJ5brM+MqVtixY6aos3YO29
J7SzQ4aEDv3h/oKdDfZny21jcVPQxGDui8sqaZCi8usCcyqWsKvFHcr6vkwaufcm
3Knr2HKVotOUF5CDZybopIz1sJvY/5Dx9yfRmtivJtglrxoDKsLi1rQTlEQcFhCS
ACjf7txLtv03vWHxmp4YKQFkkOlbyhIcvfPVLTvqGerdT2FHABEBAAGJAh8EGAEC
AAkFAlMx2LoCGwwACgkQEwJcLcmZYkgK0BAAny0YUugpZldiHzYNf8I6p2OpiDWv
ZHaguTTPg2LJSKaTd+5UHZwRFIWjcSiFu+qTGLNtZAdcr0D5f991CPvyDSLYgOwb
Jm2p3GM2KxfECWzFbB/n/PjbZ5iky3+5sPlOdBR4TkfG4fcu5GwUgCkVe5u3USAk
C6W5lpeaspDz39HAPRSIOFEX70+xV+6FZ17B7nixFGN+giTpGYOEdGFxtUNmHmf+
waJoPECyImDwJvmlMTeP9jfahlB6Pzaxt6TBZYHetI/JR9FU69EmA+XfCSGt5S+0
Eoc330gpsSzo2VlxwRCVNrcuKmG7PsFFANok05ssFq1/Djv5rJ++3lYb88b8HSP2
3pQJPrM7cQNU8iPku9yLXkY5qsoZOH+3yAia554Dgc8WBhp6fWh58R0dIONQxbbo
apNdwvlI8hKFB7TiUL6PNShE1yL+XD201iNkGAJXbLMIC1ImGLirUfU267A3Cop5
hoGs179HGBcyj/sKA3uUIFdNtP+NndaP3v4iYhCitdVCvBJMm6K3tW88qkyRGzOk
4PW422oyWKwbAPeMk5PubvEFuFAIoBAFn1zecrcOg85RzRnEeXaiemmmH8GOe1Xu
Kh+7h8XXyG6RPFy8tCcLOTk+miTqX+4VWy+kVqoS2cQ5IV8WsJ3S7aeIy0H89Z8n
5vmLc+Ibz+eT+rM=
=XVDe
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -0,0 +1,49 @@
Using Docker
============
.. important::
We highly recommend following the `Zero to JupyterHub`_ tutorial for
installing JupyterHub.
Alternate installation using Docker
-----------------------------------
A ready to go `docker image <https://hub.docker.com/r/jupyterhub/jupyterhub/>`_
gives a straightforward deployment of JupyterHub.
.. note::
This ``jupyterhub/jupyterhub`` docker image is only an image for running
the Hub service itself. It does not provide the other Jupyter components,
such as Notebook installation, which are needed by the single-user servers.
To run the single-user servers, which may be on the same system as the Hub or
not, Jupyter Notebook version 4 or greater must be installed.
Starting JupyterHub with docker
-------------------------------
The JupyterHub docker image can be started with the following command::
docker run -d -p 8000:8000 --name jupyterhub jupyterhub/jupyterhub jupyterhub
This command will create a container named ``jupyterhub`` that you can
**stop and resume** with ``docker stop/start``.
The Hub service will be listening on all interfaces at port 8000, which makes
this a good choice for **testing JupyterHub on your desktop or laptop**.
If you want to run docker on a computer that has a public IP then you should
(as in MUST) **secure it with ssl** by adding ssl options to your docker
configuration or using a ssl enabled proxy.
`Mounting volumes <https://docs.docker.com/engine/admin/volumes/volumes/>`_
will allow you to store data outside the docker image (host system) so it will
be persistent, even when you start a new image.
The command ``docker exec -it jupyterhub bash`` will spawn a root shell in your
docker container. You can use the root shell to **create system users in the container**.
These accounts will be used for authentication in JupyterHub's default
configuration.
.. _Zero to JupyterHub: https://zero-to-jupyterhub.readthedocs.io/en/latest/

89
docs/source/quickstart.md Normal file
View File

@@ -0,0 +1,89 @@
# Quickstart
## Prerequisites
Before installing JupyterHub, you will need:
- a Linux/Unix based system
- [Python](https://www.python.org/downloads/) 3.5 or greater. An understanding
of using [`pip`](https://pip.pypa.io/en/stable/) or
[`conda`](https://conda.io/docs/get-started.html) for
installing Python packages is helpful.
- [nodejs/npm](https://www.npmjs.com/). [Install nodejs/npm](https://docs.npmjs.com/getting-started/installing-node),
using your operating system's package manager.
* If you are using **`conda`**, the nodejs and npm dependencies will be installed for
you by conda.
* If you are using **`pip`**, install a recent version of
[nodejs/npm](https://docs.npmjs.com/getting-started/installing-node).
For example, install it on Linux (Debian/Ubuntu) using:
```
sudo apt-get install npm nodejs-legacy
```
The `nodejs-legacy` package installs the `node` executable and is currently
required for npm to work on Debian/Ubuntu.
- A [pluggable authentication module (PAM)](https://en.wikipedia.org/wiki/Pluggable_authentication_module)
to use the [default Authenticator](./getting-started/authenticators-users-basics.md).
PAM is often available by default on most distributions, if this is not the case it can be installed by
using the operating system's package manager.
- TLS certificate and key for HTTPS communication
- Domain name
Before running the single-user notebook servers (which may be on the same
system as the Hub or not), you will need:
- [Jupyter Notebook](https://jupyter.readthedocs.io/en/latest/install.html)
version 4 or greater
## Installation
JupyterHub can be installed with `pip` (and the proxy with `npm`) or `conda`:
**pip, npm:**
```bash
python3 -m pip install jupyterhub
npm install -g configurable-http-proxy
python3 -m pip install notebook # needed if running the notebook servers locally
```
**conda** (one command installs jupyterhub and proxy):
```bash
conda install -c conda-forge jupyterhub # installs jupyterhub and proxy
conda install notebook # needed if running the notebook servers locally
```
Test your installation. If installed, these commands should return the packages'
help contents:
```bash
jupyterhub -h
configurable-http-proxy -h
```
## Start the Hub server
To start the Hub server, run the command:
```bash
jupyterhub
```
Visit `https://localhost:8000` in your browser, and sign in with your unix
credentials.
To **allow multiple users to sign in** to the Hub server, you must start
`jupyterhub` as a *privileged user*, such as root:
```bash
sudo jupyterhub
```
The [wiki](https://github.com/jupyterhub/jupyterhub/wiki/Using-sudo-to-run-JupyterHub-without-root-privileges)
describes how to run the server as a *less privileged user*. This requires
additional configuration of the system.

View File

@@ -0,0 +1,278 @@
# Authenticators
The [Authenticator][] is the mechanism for authorizing users to use the
Hub and single user notebook servers.
## The default PAM Authenticator
JupyterHub ships with the default [PAM][]-based Authenticator, for
logging in with local user accounts via a username and password.
## The OAuthenticator
Some login mechanisms, such as [OAuth][], don't map onto username and
password authentication, and instead use tokens. When using these
mechanisms, you can override the login handlers.
You can see an example implementation of an Authenticator that uses
[GitHub OAuth][] at [OAuthenticator][].
JupyterHub's [OAuthenticator][] currently supports the following
popular services:
- Auth0
- Bitbucket
- CILogon
- GitHub
- GitLab
- Globus
- Google
- MediaWiki
- Okpy
- OpenShift
A generic implementation, which you can use for OAuth authentication
with any provider, is also available.
## The Dummy Authenticator
When testing, it may be helpful to use the
:class:`~jupyterhub.auth.DummyAuthenticator`. This allows for any username and
password unless if a global password has been set. Once set, any username will
still be accepted but the correct password will need to be provided.
## Additional Authenticators
A partial list of other authenticators is available on the
[JupyterHub wiki](https://github.com/jupyterhub/jupyterhub/wiki/Authenticators).
## Technical Overview of Authentication
### How the Base Authenticator works
The base authenticator uses simple username and password authentication.
The base Authenticator has one central method:
#### Authenticator.authenticate method
Authenticator.authenticate(handler, data)
This method is passed the Tornado `RequestHandler` and the `POST data`
from JupyterHub's login form. Unless the login form has been customized,
`data` will have two keys:
- `username`
- `password`
The `authenticate` method's job is simple:
- return the username (non-empty str) of the authenticated user if
authentication is successful
- return `None` otherwise
Writing an Authenticator that looks up passwords in a dictionary
requires only overriding this one method:
```python
from IPython.utils.traitlets import Dict
from jupyterhub.auth import Authenticator
class DictionaryAuthenticator(Authenticator):
passwords = Dict(config=True,
help="""dict of username:password for authentication"""
)
async def authenticate(self, handler, data):
if self.passwords.get(data['username']) == data['password']:
return data['username']
```
#### Normalize usernames
Since the Authenticator and Spawner both use the same username,
sometimes you want to transform the name coming from the authentication service
(e.g. turning email addresses into local system usernames) before adding them to the Hub service.
Authenticators can define `normalize_username`, which takes a username.
The default normalization is to cast names to lowercase
For simple mappings, a configurable dict `Authenticator.username_map` is used to turn one name into another:
```python
c.Authenticator.username_map = {
'service-name': 'localname'
}
```
When using `PAMAuthenticator`, you can set
`c.PAMAuthenticator.pam_normalize_username = True`, which will
normalize usernames using PAM (basically round-tripping them: username
to uid to username), which is useful in case you use some external
service that allows multiple usernames mapping to the same user (such
as ActiveDirectory, yes, this really happens). When
`pam_normalize_username` is on, usernames are *not* normalized to
lowercase.
#### Validate usernames
In most cases, there is a very limited set of acceptable usernames.
Authenticators can define `validate_username(username)`,
which should return True for a valid username and False for an invalid one.
The primary effect this has is improving error messages during user creation.
The default behavior is to use configurable `Authenticator.username_pattern`,
which is a regular expression string for validation.
To only allow usernames that start with 'w':
```python
c.Authenticator.username_pattern = r'w.*'
```
### How to write a custom authenticator
You can use custom Authenticator subclasses to enable authentication
via other mechanisms. One such example is using [GitHub OAuth][].
Because the username is passed from the Authenticator to the Spawner,
a custom Authenticator and Spawner are often used together.
For example, the Authenticator methods, [pre_spawn_start(user, spawner)][]
and [post_spawn_stop(user, spawner)][], are hooks that can be used to do
auth-related startup (e.g. opening PAM sessions) and cleanup
(e.g. closing PAM sessions).
See a list of custom Authenticators [on the wiki](https://github.com/jupyterhub/jupyterhub/wiki/Authenticators).
If you are interested in writing a custom authenticator, you can read
[this tutorial](http://jupyterhub-tutorial.readthedocs.io/en/latest/authenticators.html).
### Registering custom Authenticators via entry points
As of JupyterHub 1.0, custom authenticators can register themselves via
the `jupyterhub.authenticators` entry point metadata.
To do this, in your `setup.py` add:
```python
setup(
...
entry_points={
'jupyterhub.authenticators': [
'myservice = mypackage:MyAuthenticator',
],
},
)
```
If you have added this metadata to your package,
users can select your authenticator with the configuration:
```python
c.JupyterHub.authenticator_class = 'myservice'
```
instead of the full
```python
c.JupyterHub.authenticator_class = 'mypackage:MyAuthenticator'
```
previously required.
Additionally, configurable attributes for your authenticator will
appear in jupyterhub help output and auto-generated configuration files
via `jupyterhub --generate-config`.
### Authentication state
JupyterHub 0.8 adds the ability to persist state related to authentication,
such as auth-related tokens.
If such state should be persisted, `.authenticate()` should return a dictionary of the form:
```python
{
'name': username,
'auth_state': {
'key': 'value',
}
}
```
where `username` is the username that has been authenticated,
and `auth_state` is any JSON-serializable dictionary.
Because `auth_state` may contain sensitive information,
it is encrypted before being stored in the database.
To store auth_state, two conditions must be met:
1. persisting auth state must be enabled explicitly via configuration
```python
c.Authenticator.enable_auth_state = True
```
2. encryption must be enabled by the presence of `JUPYTERHUB_CRYPT_KEY` environment variable,
which should be a hex-encoded 32-byte key.
For example:
```bash
export JUPYTERHUB_CRYPT_KEY=$(openssl rand -hex 32)
```
JupyterHub uses [Fernet](https://cryptography.io/en/latest/fernet/) to encrypt auth_state.
To facilitate key-rotation, `JUPYTERHUB_CRYPT_KEY` may be a semicolon-separated list of encryption keys.
If there are multiple keys present, the **first** key is always used to persist any new auth_state.
#### Using auth_state
Typically, if `auth_state` is persisted it is desirable to affect the Spawner environment in some way.
This may mean defining environment variables, placing certificate in the user's home directory, etc.
The `Authenticator.pre_spawn_start` method can be used to pass information from authenticator state
to Spawner environment:
```python
class MyAuthenticator(Authenticator):
@gen.coroutine
def authenticate(self, handler, data=None):
username = yield identify_user(handler, data)
upstream_token = yield token_for_user(username)
return {
'name': username,
'auth_state': {
'upstream_token': upstream_token,
},
}
@gen.coroutine
def pre_spawn_start(self, user, spawner):
"""Pass upstream_token to spawner via environment variable"""
auth_state = yield user.get_auth_state()
if not auth_state:
# auth_state not enabled
return
spawner.environment['UPSTREAM_TOKEN'] = auth_state['upstream_token']
```
## pre_spawn_start and post_spawn_stop hooks
Authenticators uses two hooks, [pre_spawn_start(user, spawner)][] and
[post_spawn_stop(user, spawner)][] to add pass additional state information
between the authenticator and a spawner. These hooks are typically used auth-related
startup, i.e. opening a PAM session, and auth-related cleanup, i.e. closing a
PAM session.
## JupyterHub as an OAuth provider
Beginning with version 0.8, JupyterHub is an OAuth provider.
[Authenticator]: https://github.com/jupyterhub/jupyterhub/blob/master/jupyterhub/auth.py
[PAM]: https://en.wikipedia.org/wiki/Pluggable_authentication_module
[OAuth]: https://en.wikipedia.org/wiki/OAuth
[GitHub OAuth]: https://developer.github.com/v3/oauth/
[OAuthenticator]: https://github.com/jupyterhub/oauthenticator
[pre_spawn_start(user, spawner)]: https://jupyterhub.readthedocs.io/en/latest/api/auth.html#jupyterhub.auth.Authenticator.pre_spawn_start
[post_spawn_stop(user, spawner)]: https://jupyterhub.readthedocs.io/en/latest/api/auth.html#jupyterhub.auth.Authenticator.post_spawn_stop

View File

@@ -0,0 +1,8 @@
# Configuration examples
The following sections provide examples, including configuration files and tips, for the
following:
- Configuring GitHub OAuth
- Using reverse proxy (nginx and Apache)
- Run JupyterHub without root privileges using `sudo`

View File

@@ -0,0 +1,82 @@
# Configure GitHub OAuth
In this example, we show a configuration file for a fairly standard JupyterHub
deployment with the following assumptions:
* Running JupyterHub on a single cloud server
* Using SSL on the standard HTTPS port 443
* Using GitHub OAuth (using oauthenticator) for login
* Using the default spawner (to configure other spawners, uncomment and edit
`spawner_class` as well as follow the instructions for your desired spawner)
* Users exist locally on the server
* Users' notebooks to be served from `~/assignments` to allow users to browse
for notebooks within other users' home directories
* You want the landing page for each user to be a `Welcome.ipynb` notebook in
their assignments directory.
* All runtime files are put into `/srv/jupyterhub` and log files in `/var/log`.
The `jupyterhub_config.py` file would have these settings:
```python
# jupyterhub_config.py file
c = get_config()
import os
pjoin = os.path.join
runtime_dir = os.path.join('/srv/jupyterhub')
ssl_dir = pjoin(runtime_dir, 'ssl')
if not os.path.exists(ssl_dir):
os.makedirs(ssl_dir)
# Allows multiple single-server per user
c.JupyterHub.allow_named_servers = True
# https on :443
c.JupyterHub.port = 443
c.JupyterHub.ssl_key = pjoin(ssl_dir, 'ssl.key')
c.JupyterHub.ssl_cert = pjoin(ssl_dir, 'ssl.cert')
# put the JupyterHub cookie secret and state db
# in /var/run/jupyterhub
c.JupyterHub.cookie_secret_file = pjoin(runtime_dir, 'cookie_secret')
c.JupyterHub.db_url = pjoin(runtime_dir, 'jupyterhub.sqlite')
# or `--db=/path/to/jupyterhub.sqlite` on the command-line
# use GitHub OAuthenticator for local users
c.JupyterHub.authenticator_class = 'oauthenticator.LocalGitHubOAuthenticator'
c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']
# create system users that don't exist yet
c.LocalAuthenticator.create_system_users = True
# specify users and admin
c.Authenticator.allowed_users = {'rgbkrk', 'minrk', 'jhamrick'}
c.Authenticator.admin_users = {'jhamrick', 'rgbkrk'}
# uses the default spawner
# To use a different spawner, uncomment `spawner_class` and set to desired
# spawner (e.g. SudoSpawner). Follow instructions for desired spawner
# configuration.
# c.JupyterHub.spawner_class = 'sudospawner.SudoSpawner'
# start single-user notebook servers in ~/assignments,
# with ~/assignments/Welcome.ipynb as the default landing page
# this config could also be put in
# /etc/jupyter/jupyter_notebook_config.py
c.Spawner.notebook_dir = '~/assignments'
c.Spawner.args = ['--NotebookApp.default_url=/notebooks/Welcome.ipynb']
```
Using the GitHub Authenticator requires a few additional
environment variable to be set prior to launching JupyterHub:
```bash
export GITHUB_CLIENT_ID=github_id
export GITHUB_CLIENT_SECRET=github_secret
export OAUTH_CALLBACK_URL=https://example.com/hub/oauth_callback
export CONFIGPROXY_AUTH_TOKEN=super-secret
# append log output to log file /var/log/jupyterhub.log
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py &>> /var/log/jupyterhub.log
```

View File

@@ -0,0 +1,231 @@
# Using a reverse proxy
In the following example, we show configuration files for a JupyterHub server
running locally on port `8000` but accessible from the outside on the standard
SSL port `443`. This could be useful if the JupyterHub server machine is also
hosting other domains or content on `443`. The goal in this example is to
satisfy the following:
* JupyterHub is running on a server, accessed *only* via `HUB.DOMAIN.TLD:443`
* On the same machine, `NO_HUB.DOMAIN.TLD` strictly serves different content,
also on port `443`
* `nginx` or `apache` is used as the public access point (which means that
only nginx/apache will bind to `443`)
* After testing, the server in question should be able to score at least an A on the
Qualys SSL Labs [SSL Server Test](https://www.ssllabs.com/ssltest/)
Let's start out with needed JupyterHub configuration in `jupyterhub_config.py`:
```python
# Force the proxy to only listen to connections to 127.0.0.1 (on port 8000)
c.JupyterHub.bind_url = 'http://127.0.0.1:8000'
```
(For Jupyterhub < 0.9 use `c.JupyterHub.ip = '127.0.0.1'`.)
For high-quality SSL configuration, we also generate Diffie-Helman parameters.
This can take a few minutes:
```bash
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
```
## nginx
This **`nginx` config file** is fairly standard fare except for the two
`location` blocks within the main section for HUB.DOMAIN.tld.
To create a new site for jupyterhub in your nginx config, make a new file
in `sites.enabled`, e.g. `/etc/nginx/sites.enabled/jupyterhub.conf`:
```bash
# top-level http config for websocket headers
# If Upgrade is defined, Connection = upgrade
# If Upgrade is empty, Connection = close
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# HTTP server to redirect all 80 traffic to SSL/HTTPS
server {
listen 80;
server_name HUB.DOMAIN.TLD;
# Tell all requests to port 80 to be 302 redirected to HTTPS
return 302 https://$host$request_uri;
}
# HTTPS server to handle JupyterHub
server {
listen 443;
ssl on;
server_name HUB.DOMAIN.TLD;
ssl_certificate /etc/letsencrypt/live/HUB.DOMAIN.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/HUB.DOMAIN.TLD/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
# Managing literal requests to the JupyterHub front end
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# websocket headers
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
}
# Managing requests to verify letsencrypt host
location ~ /.well-known {
allow all;
}
}
```
If `nginx` is not running on port 443, substitute `$http_host` for `$host` on
the lines setting the `Host` header.
`nginx` will now be the front facing element of JupyterHub on `443` which means
it is also free to bind other servers, like `NO_HUB.DOMAIN.TLD` to the same port
on the same machine and network interface. In fact, one can simply use the same
server blocks as above for `NO_HUB` and simply add line for the root directory
of the site as well as the applicable location call:
```bash
server {
listen 80;
server_name NO_HUB.DOMAIN.TLD;
# Tell all requests to port 80 to be 302 redirected to HTTPS
return 302 https://$host$request_uri;
}
server {
listen 443;
ssl on;
# INSERT OTHER SSL PARAMETERS HERE AS ABOVE
# SSL cert may differ
# Set the appropriate root directory
root /var/www/html
# Set URI handling
location / {
try_files $uri $uri/ =404;
}
# Managing requests to verify letsencrypt host
location ~ /.well-known {
allow all;
}
}
```
Now restart `nginx`, restart the JupyterHub, and enjoy accessing
`https://HUB.DOMAIN.TLD` while serving other content securely on
`https://NO_HUB.DOMAIN.TLD`.
### SELinux permissions for nginx
On distributions with SELinux enabled (e.g. Fedora), one may encounter permission errors
when the nginx service is started.
We need to allow nginx to perform network relay and connect to the jupyterhub port. The
following commands do that:
```bash
semanage port -a -t http_port_t -p tcp 8000
setsebool -P httpd_can_network_relay 1
setsebool -P httpd_can_network_connect 1
```
Replace 8000 with the port the jupyterhub server is running from.
## Apache
As with nginx above, you can use [Apache](https://httpd.apache.org) as the reverse proxy.
First, we will need to enable the apache modules that we are going to need:
```bash
a2enmod ssl rewrite proxy proxy_http proxy_wstunnel
```
Our Apache configuration is equivalent to the nginx configuration above:
- Redirect HTTP to HTTPS
- Good SSL Configuration
- Support for websockets on any proxied URL
- JupyterHub is running locally at http://127.0.0.1:8000
```bash
# redirect HTTP to HTTPS
Listen 80
<VirtualHost HUB.DOMAIN.TLD:80>
ServerName HUB.DOMAIN.TLD
Redirect / https://HUB.DOMAIN.TLD/
</VirtualHost>
Listen 443
<VirtualHost HUB.DOMAIN.TLD:443>
ServerName HUB.DOMAIN.TLD
# configure SSL
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/HUB.DOMAIN.TLD/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/HUB.DOMAIN.TLD/privkey.pem
SSLProtocol All -SSLv2 -SSLv3
SSLOpenSSLConfCmd DHParameters /etc/ssl/certs/dhparam.pem
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
# Use RewriteEngine to handle websocket connection upgrades
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:8000/$1 [P,L]
<Location "/">
# preserve Host header to avoid cross-origin problems
ProxyPreserveHost on
# proxy to JupyterHub
ProxyPass http://127.0.0.1:8000/
ProxyPassReverse http://127.0.0.1:8000/
</Location>
</VirtualHost>
```
In case of the need to run the jupyterhub under /jhub/ or other location please use the below configurations:
- JupyterHub running locally at http://127.0.0.1:8000/jhub/ or other location
httpd.conf amendments:
```bash
RewriteRule /jhub/(.*) ws://127.0.0.1:8000/jhub/$1 [NE.P,L]
RewriteRule /jhub/(.*) http://127.0.0.1:8000/jhub/$1 [NE,P,L]
ProxyPass /jhub/ http://127.0.0.1:8000/jhub/
ProxyPassReverse /jhub/ http://127.0.0.1:8000/jhub/
```
jupyterhub_config.py amendments:
```bash
--The public facing URL of the whole JupyterHub application.
--This is the address on which the proxy will bind. Sets protocol, ip, base_url
c.JupyterHub.bind_url = 'http://127.0.0.1:8000/jhub/'
```

View File

@@ -0,0 +1,30 @@
==============================
Configuration Reference
==============================
.. important::
Make sure the version of JupyterHub for this documentation matches your
installation version, as the output of this command may change between versions.
JupyterHub configuration
------------------------
As explained in the `Configuration Basics <../getting-started/config-basics.html#generate-a-default-config-file>`_
section, the ``jupyterhub_config.py`` can be automatically generated via
.. code-block:: bash
jupyterhub --generate-config
The following contains the output of that command for reference.
.. jupyterhub-generate-config::
JupyterHub help command output
------------------------------
This section contains the output of the command ``jupyterhub --help-all``.
.. jupyterhub-help-all::

View File

@@ -0,0 +1,259 @@
# Run JupyterHub without root privileges using `sudo`
**Note:** Setting up `sudo` permissions involves many pieces of system
configuration. It is quite easy to get wrong and very difficult to debug.
Only do this if you are very sure you must.
## Overview
There are many Authenticators and Spawners available for JupyterHub. Some, such
as DockerSpawner or OAuthenticator, do not need any elevated permissions. This
document describes how to get the full default behavior of JupyterHub while
running notebook servers as real system users on a shared system without
running the Hub itself as root.
Since JupyterHub needs to spawn processes as other users, the simplest way
is to run it as root, spawning user servers with [setuid](http://linux.die.net/man/2/setuid).
But this isn't especially safe, because you have a process running on the
public web as root.
A **more prudent way** to run the server while preserving functionality is to
create a dedicated user with `sudo` access restricted to launching and
monitoring single-user servers.
## Create a user
To do this, first create a user that will run the Hub:
```bash
sudo useradd rhea
```
This user shouldn't have a login shell or password (possible with -r).
## Set up sudospawner
Next, you will need [sudospawner](https://github.com/jupyter/sudospawner)
to enable monitoring the single-user servers with sudo:
```bash
sudo python3 -m pip install sudospawner
```
Now we have to configure sudo to allow the Hub user (`rhea`) to launch
the sudospawner script on behalf of our hub users (here `zoe` and `wash`).
We want to confine these permissions to only what we really need.
## Edit `/etc/sudoers`
To do this we add to `/etc/sudoers` (use `visudo` for safe editing of sudoers):
- specify the list of users `JUPYTER_USERS` for whom `rhea` can spawn servers
- set the command `JUPYTER_CMD` that `rhea` can execute on behalf of users
- give `rhea` permission to run `JUPYTER_CMD` on behalf of `JUPYTER_USERS`
without entering a password
For example:
```bash
# comma-separated list of users that can spawn single-user servers
# this should include all of your Hub users
Runas_Alias JUPYTER_USERS = rhea, zoe, wash
# the command(s) the Hub can run on behalf of the above users without needing a password
# the exact path may differ, depending on how sudospawner was installed
Cmnd_Alias JUPYTER_CMD = /usr/local/bin/sudospawner
# actually give the Hub user permission to run the above command on behalf
# of the above users without prompting for a password
rhea ALL=(JUPYTER_USERS) NOPASSWD:JUPYTER_CMD
```
It might be useful to modify `secure_path` to add commands in path.
As an alternative to adding every user to the `/etc/sudoers` file, you can
use a group in the last line above, instead of `JUPYTER_USERS`:
```bash
rhea ALL=(%jupyterhub) NOPASSWD:JUPYTER_CMD
```
If the `jupyterhub` group exists, there will be no need to edit `/etc/sudoers`
again. A new user will gain access to the application when added to the group:
```bash
$ adduser -G jupyterhub newuser
```
## Test `sudo` setup
Test that the new user doesn't need to enter a password to run the sudospawner
command.
This should prompt for your password to switch to rhea, but *not* prompt for
any password for the second switch. It should show some help output about
logging options:
```bash
$ sudo -u rhea sudo -n -u $USER /usr/local/bin/sudospawner --help
Usage: /usr/local/bin/sudospawner [OPTIONS]
Options:
--help show this help information
...
```
And this should fail:
```bash
$ sudo -u rhea sudo -n -u $USER echo 'fail'
sudo: a password is required
```
## Enable PAM for non-root
By default, [PAM authentication](http://en.wikipedia.org/wiki/Pluggable_authentication_module)
is used by JupyterHub. To use PAM, the process may need to be able to read
the shadow password database.
### Shadow group (Linux)
**Note:** On Fedora based distributions there is no clear way to configure
the PAM database to allow sufficient access for authenticating with the target user's password
from JupyterHub. As a workaround we recommend use an
[alternative authentication method](https://github.com/jupyterhub/jupyterhub/wiki/Authenticators).
```bash
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 2197 Jul 21 13:41 shadow
```
If there's already a shadow group, you are set. If its permissions are more like:
```bash
$ ls -l /etc/shadow
-rw------- 1 root wheel 2197 Jul 21 13:41 shadow
```
Then you may want to add a shadow group, and make the shadow file group-readable:
```bash
$ sudo groupadd shadow
$ sudo chgrp shadow /etc/shadow
$ sudo chmod g+r /etc/shadow
```
We want our new user to be able to read the shadow passwords, so add it to the shadow group:
```bash
$ sudo usermod -a -G shadow rhea
```
If you want jupyterhub to serve pages on a restricted port (such as port 80 for http),
then you will need to give `node` permission to do so:
```bash
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/node
```
However, you may want to further understand the consequences of this.
You may also be interested in limiting the amount of CPU any process can use
on your server. `cpulimit` is a useful tool that is available for many Linux
distributions' packaging system. This can be used to keep any user's process
from using too much CPU cycles. You can configure it accoring to [these
instructions](http://ubuntuforums.org/showthread.php?t=992706).
### Shadow group (FreeBSD)
**NOTE:** This has not been tested and may not work as expected.
```bash
$ ls -l /etc/spwd.db /etc/master.passwd
-rw------- 1 root wheel 2516 Aug 22 13:35 /etc/master.passwd
-rw------- 1 root wheel 40960 Aug 22 13:35 /etc/spwd.db
```
Add a shadow group if there isn't one, and make the shadow file group-readable:
```bash
$ sudo pw group add shadow
$ sudo chgrp shadow /etc/spwd.db
$ sudo chmod g+r /etc/spwd.db
$ sudo chgrp shadow /etc/master.passwd
$ sudo chmod g+r /etc/master.passwd
```
We want our new user to be able to read the shadow passwords, so add it to the
shadow group:
```bash
$ sudo pw user mod rhea -G shadow
```
## Test that PAM works
We can verify that PAM is working, with:
```bash
$ sudo -u rhea python3 -c "import pamela, getpass; print(pamela.authenticate('$USER', getpass.getpass()))"
Password: [enter your unix password]
```
## Make a directory for JupyterHub
JupyterHub stores its state in a database, so it needs write access to a directory.
The simplest way to deal with this is to make a directory owned by your Hub user,
and use that as the CWD when launching the server.
```bash
$ sudo mkdir /etc/jupyterhub
$ sudo chown rhea /etc/jupyterhub
```
## Start jupyterhub
Finally, start the server as our newly configured user, `rhea`:
```bash
$ cd /etc/jupyterhub
$ sudo -u rhea jupyterhub --JupyterHub.spawner_class=sudospawner.SudoSpawner
```
And try logging in.
## Troubleshooting: SELinux
If you still get a generic `Permission denied` `PermissionError`, it's possible SELinux is blocking you.
Here's how you can make a module to allow this.
First, put this in a file named `sudo_exec_selinux.te`:
```bash
module sudo_exec_selinux 1.1;
require {
type unconfined_t;
type sudo_exec_t;
class file { read entrypoint };
}
#============= unconfined_t ==============
allow unconfined_t sudo_exec_t:file entrypoint;
```
Then run all of these commands as root:
```bash
$ checkmodule -M -m -o sudo_exec_selinux.mod sudo_exec_selinux.te
$ semodule_package -o sudo_exec_selinux.pp -m sudo_exec_selinux.mod
$ semodule -i sudo_exec_selinux.pp
```
## Troubleshooting: PAM session errors
If the PAM authentication doesn't work and you see errors for
`login:session-auth`, or similar, considering updating to a more recent version
of jupyterhub and disabling the opening of PAM sessions with
`c.PAMAuthenticator.open_sessions=False`.

View File

@@ -0,0 +1,181 @@
# Configuring user environments
Deploying JupyterHub means you are providing Jupyter notebook environments for
multiple users. Often, this includes a desire to configure the user
environment in some way.
Since the `jupyterhub-singleuser` server extends the standard Jupyter notebook
server, most configuration and documentation that applies to Jupyter Notebook
applies to the single-user environments. Configuration of user environments
typically does not occur through JupyterHub itself, but rather through system-
wide configuration of Jupyter, which is inherited by `jupyterhub-singleuser`.
**Tip:** When searching for configuration tips for JupyterHub user
environments, try removing JupyterHub from your search because there are a lot
more people out there configuring Jupyter than JupyterHub and the
configuration is the same.
This section will focus on user environments, including:
- Installing packages
- Configuring Jupyter and IPython
- Installing kernelspecs
- Using containers vs. multi-user hosts
## Installing packages
To make packages available to users, you generally will install packages
system-wide or in a shared environment.
This installation location should always be in the same environment that
`jupyterhub-singleuser` itself is installed in, and must be *readable and
executable* by your users. If you want users to be able to install additional
packages, it must also be *writable* by your users.
If you are using a standard system Python install, you would use:
```bash
sudo python3 -m pip install numpy
```
to install the numpy package in the default system Python 3 environment
(typically `/usr/local`).
You may also use conda to install packages. If you do, you should make sure
that the conda environment has appropriate permissions for users to be able to
run Python code in the env.
## Configuring Jupyter and IPython
[Jupyter](https://jupyter-notebook.readthedocs.io/en/stable/config_overview.html)
and [IPython](https://ipython.readthedocs.io/en/stable/development/config.html)
have their own configuration systems.
As a JupyterHub administrator, you will typically want to install and configure
environments for all JupyterHub users. For example, you wish for each student in
a class to have the same user environment configuration.
Jupyter and IPython support **"system-wide"** locations for configuration, which
is the logical place to put global configuration that you want to affect all
users. It's generally more efficient to configure user environments "system-wide",
and it's a good idea to avoid creating files in users' home directories.
The typical locations for these config files are:
- **system-wide** in `/etc/{jupyter|ipython}`
- **env-wide** (environment wide) in `{sys.prefix}/etc/{jupyter|ipython}`.
### Example: Enable an extension system-wide
For example, to enable the `cython` IPython extension for all of your users,
create the file `/etc/ipython/ipython_config.py`:
```python
c.InteractiveShellApp.extensions.append("cython")
```
### Example: Enable a Jupyter notebook configuration setting for all users
To enable Jupyter notebook's internal idle-shutdown behavior (requires
notebook ≥ 5.4), set the following in the `/etc/jupyter/jupyter_notebook_config.py`
file:
```python
# shutdown the server after no activity for an hour
c.NotebookApp.shutdown_no_activity_timeout = 60 * 60
# shutdown kernels after no activity for 20 minutes
c.MappingKernelManager.cull_idle_timeout = 20 * 60
# check for idle kernels every two minutes
c.MappingKernelManager.cull_interval = 2 * 60
```
## Installing kernelspecs
You may have multiple Jupyter kernels installed and want to make sure that
they are available to all of your users. This means installing kernelspecs
either system-wide (e.g. in /usr/local/) or in the `sys.prefix` of JupyterHub
itself.
Jupyter kernelspec installation is system wide by default, but some kernels
may default to installing kernelspecs in your home directory. These will need
to be moved system-wide to ensure that they are accessible.
You can see where your kernelspecs are with:
```bash
jupyter kernelspec list
```
### Example: Installing kernels system-wide
Assuming I have a Python 2 and Python 3 environment that I want to make
sure are available, I can install their specs system-wide (in /usr/local) with:
```bash
/path/to/python3 -m IPython kernel install --prefix=/usr/local
/path/to/python2 -m IPython kernel install --prefix=/usr/local
```
## Multi-user hosts vs. Containers
There are two broad categories of user environments that depend on what
Spawner you choose:
- Multi-user hosts (shared system)
- Container-based
How you configure user environments for each category can differ a bit
depending on what Spawner you are using.
The first category is a **shared system (multi-user host)** where
each user has a JupyterHub account and a home directory as well as being
a real system user. In this example, shared configuration and installation
must be in a 'system-wide' location, such as `/etc/` or `/usr/local`
or a custom prefix such as `/opt/conda`.
When JupyterHub uses **container-based** Spawners (e.g. KubeSpawner or
DockerSpawner), the 'system-wide' environment is really the container image
which you are using for users.
In both cases, you want to *avoid putting configuration in user home
directories* because users can change those configuration settings. Also,
home directories typically persist once they are created, so they are
difficult for admins to update later.
## Named servers
By default, in a JupyterHub deployment each user has exactly one server.
JupyterHub can, however, have multiple servers per user.
This is most useful in deployments where users can configure the environment
in which their server will start (e.g. resource requests on an HPC cluster),
so that a given user can have multiple configurations running at the same time,
without having to stop and restart their one server.
To allow named servers:
```python
c.JupyterHub.allow_named_servers = True
```
Named servers were implemented in the REST API in JupyterHub 0.8,
and JupyterHub 1.0 introduces UI for managing named servers via the user home page:
![named servers on the home page](../images/named-servers-home.png)
as well as the admin page:
![named servers on the admin page](../images/named-servers-admin.png)
Named servers can be accessed, created, started, stopped, and deleted
from these pages. Activity tracking is now per-server as well.
The number of named servers per user can be limited by setting
```python
c.JupyterHub.named_server_limit_per_user = 5
```

Some files were not shown because too many files have changed in this diff Show More