Compare commits

...

1703 Commits
0.9.0 ... 1.5.0

Author SHA1 Message Date
Min RK
bf73e6f7b7 fix 1.5.0 link in changelog 2021-11-04 13:56:40 +01:00
Min RK
e2631b302a import commands from setuptools
importing build_py from distutils breaks in setuptools 58
2021-11-04 13:55:41 +01:00
Min RK
0d89241c9f release 1.5.0 2021-11-04 13:22:53 +01:00
Min RK
5ac9e7f73a Merge branch 'fix-set-cookie' into 1.4.x
Prepare to release 1.5.0

Fixes GHSA-cw7p-q79f-m2v7
2021-11-04 13:21:52 +01:00
Min RK
9672b534ec changelog for 1.5.0 2021-11-03 16:16:48 +01:00
Min RK
254365716d jupyterlab: don't use $JUPYTERHUB_API_TOKEN in PageConfig.token 2021-11-03 15:52:00 +01:00
Min RK
dcac8c4efe Revert "store tokens passed via url or header, not only url."
This reverts commit 53c3201c17.

Only tokens in URLs should be persisted in cookies.
Tokens in headers should not have any effect on cookies.
2021-11-03 15:52:00 +01:00
Min RK
0611169dea Merge pull request #3677 from minrk/doc-requirements-1x
1.4.x: update doc requirements
2021-11-02 10:38:16 +01:00
Min RK
a432fa3bb6 Merge pull request #3676 from manics/1-use_legacy_stopped_server_status_code
use_legacy_stopped_server_status_code: use 1.* language
2021-11-02 10:35:09 +01:00
Min RK
44141ae025 1.4.x: update doc requirements
pin down docutils, unpin autodoc-traits
2021-11-02 10:35:04 +01:00
Simon Li
04ae25d2c2 use_legacy_stopped_server_status_code: use 1.* language
Also fixes the JupyterHub 2.0 default: will be False not True
2021-11-01 22:14:59 +00:00
Min RK
69a1e97fbe Merge pull request #3639 from yuvipanda/404-1.4.x
Backport #3636 to 1.4.x
2021-10-06 16:08:00 +02:00
YuviPanda
eb0c6514af Set use_legacy_stopped_server_status_code to True for 1.4.x 2021-10-06 17:25:10 +05:30
YuviPanda
d03fc8c531 Update tests that were looking for 503s 2021-10-05 20:19:59 +05:30
YuviPanda
1c8dce533b Preserve older 503 behavior behind a flag 2021-10-05 20:19:59 +05:30
YuviPanda
bbfbc47bb3 Use 424 rather than 404 to indicate non-running server
404 is also used to identify that a particular resource
(like a kernel or terminal) is not present, maybe because
it is deleted. That comes from the notebook server, while
here we are responding from JupyterHub. Saying that the
user server they are trying to request the resource (kernel, etc)
from does not exist seems right.
2021-10-05 20:19:59 +05:30
YuviPanda
be6ec28dab Fail suspected API requests with 404, not 503
Non-running user servers making requests is a fairly
common occurance - user servers get culled while their
browser tabs are left open. So we now have a background level
of 503s responses on the hub *all* the time, making it
very difficult to detect *real* 503s, which should ideally
be closely monitored and alerted on.

I *think* 404 is a more appropriate response, as the resource
(API) being requested is no longer present.
2021-10-05 20:19:59 +05:30
Min RK
bd3a215c9e Merge pull request #3580 from meeseeksmachine/auto-backport-of-pr-3552-on-1.4.x
Backport PR #3552 on branch 1.4.x (Add expiration date dropdown to Token page)
2021-08-23 12:08:56 +02:00
Min RK
3783a1bc6c Backport PR #3552: Add expiration date dropdown to Token page 2021-08-23 09:42:15 +00:00
Min RK
7b0f29b340 Merge pull request #3579 from meeseeksmachine/auto-backport-of-pr-3488-on-1.4.x
Backport PR #3488 on branch 1.4.x (Support auto login when used as a OAuth2 provider)
2021-08-23 10:32:15 +02:00
Min RK
f63e810dfe Backport PR #3488: Support auto login when used as a OAuth2 provider 2021-08-20 08:30:04 +00:00
Min RK
909b3ad4d7 Merge pull request #3538 from consideRatio/pr/release-1.4.2
Release 1.4.2
2021-07-16 10:57:54 +00:00
Erik Sundell
114493be9b release 1.4.2 2021-07-15 16:57:54 +02:00
Erik Sundell
4c0ac5ba91 changelog for 1.4.2 2021-07-15 16:57:52 +02:00
Erik Sundell
52793d65bd Backport PR #3531: Fix regression where external services api_token became required
Issue background

Registering an external service means it won't be run as a process by JupyterHub or similar as I understand it, and such external services may be registered only to get a /services/<service_name> route registered with JupyterHub's configured proxy rather than to actually use an api_token and speak with JupyterHub.

In the past, it was okay for a external service without an api_token to be registered, but not it isn't. This PR fixes that.

The situation when I run into this is when I register grafana as an external service like this (but in reality via a z2jh config with slightly different syntax).

```python
c.JupyterHub.services = [
    {
        "name": "grafana",
        "url": "http://grafana",
    }
]
```

JupyterHub has a [documentation about Services](https://jupyterhub.readthedocs.io/en/stable/reference/services.html properties-of-a-service), where one can see that the default value of api_token is None.

    Issue details

This is an error me and  GeorgianaElena have run into using JupyterHub 1.4.1, but I'm not sure at what point the regression was introduced besides it was around in 1.4.1.

I wrote some notes tracking this issue down. This is the summary I wrote.

```
    This test was made to reproduce an error like this:

        ValueError: Tokens must be at least 8 characters, got ''

    The error had the following stack trace in 1.4.1:

        jupyterhub/app.py:2213: in init_api_tokens
            await self._add_tokens(self.service_tokens, kind='service')
        jupyterhub/app.py:2182: in _add_tokens
            obj.new_api_token(
        jupyterhub/orm.py:424: in new_api_token
            return APIToken.new(token=token, service=self, **kwargs)
        jupyterhub/orm.py:699: in new
            cls.check_token(db, token)

    This test also make _add_tokens receive a token_dict that is buggy:

        {"": "external_2"}

    It turned out that whatever passes token_dict to _add_tokens failed to
    ignore service's api_tokens that were None, and instead passes them as blank
    strings.

    It turned out that init_api_tokens was passing self.service_tokens, and that
    self.service_tokens had been populated with blank string tokens for external
    services registered with JupyterHub.
```

Signed-off-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-07-15 10:16:18 +02:00
passer
320e1924a7 Backport PR #3521: Fix contributor documentation's link
Clicking the contributor documentation's link [https://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html](https://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html) will get an error

This link needs to be replaced with [https://jupyter.readthedocs.io/en/latest/contributing/content-contributor.html](https://jupyter.readthedocs.io/en/latest/contributing/content-contributor.html)

Signed-off-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-07-15 10:16:16 +02:00
Min RK
2c90715c8d Backport PR #3510: bump autodoc-traits
for sphinx compatibility fix, to get docs building again

Signed-off-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-07-15 10:16:13 +02:00
David Brochart
c99bb32e12 Backport PR #3494: Fix typo
Signed-off-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-07-15 10:16:11 +02:00
Igor Beliakov
fee4ee23c0 Backport PR #3484: Bug: save_bearer_token (provider.py) passes a float value to the expires_at field (int)
**Environment**

* image: k8s-hub (`jupyterhub/k8s-hub:0.11.1`);
* `authenticator_class: dummy`;
* db: cocroachdb (`sqlalchemy-cocroachdb`).

**Description:**

`save_bearer_token` method (`provider.py`) passes a float value to the `expires_at` field (int).

A user can create a notebook, it gets successfully scheduled, and then, once the pod is up and ready, the user is unable to enter the notebook, because jupyterhub cannot save a token. In logs, we can see the following:

```
[I 2021-05-29 14:45:04.302 JupyterHub log:181] 302 GET /hub/api/oauth2/authorize?client_id=jupyterhub-user-user2&redirect_uri=%2Fuser%2Fuser2%2Foauth_callback&response_type=code&state=[secret] -> /user/user2/oauth_callback?code=[secret]&state=[secret] (user2 40.113.125.116) 73.98ms
[E 2021-05-29 14:45:04.424 JupyterHub web:1789] Uncaught exception POST /hub/api/oauth2/token (10.42.80.10)
    HTTPServerRequest(protocol='http', host='hub:8081', method='POST', uri='/hub/api/oauth2/token', version='HTTP/1.1', remote_ip='10.42.80.10')
    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/dist-packages/tornado/web.py", line 1702, in _execute
        result = method(*self.path_args, **self.path_kwargs)
      File "/usr/local/lib/python3.8/dist-packages/jupyterhub/apihandlers/auth.py", line 324, in post
        headers, body, status = self.oauth_provider.create_token_response(
      File "/usr/local/lib/python3.8/dist-packages/oauthlib/oauth2/rfc6749/endpoints/base.py", line 116, in wrapper
        return f(endpoint, uri, *args, **kwargs)
      File "/usr/local/lib/python3.8/dist-packages/oauthlib/oauth2/rfc6749/endpoints/token.py", line 118, in create_token_response
        return grant_type_handler.create_token_response(
      File "/usr/local/lib/python3.8/dist-packages/oauthlib/oauth2/rfc6749/grant_types/authorization_code.py", line 313, in create_token_response
        self.request_validator.save_token(token, request)
      File "/usr/local/lib/python3.8/dist-packages/jupyterhub/oauth/provider.py", line 281, in save_token
        return self.save_bearer_token(token, request, *args, **kwargs)
      File "/usr/local/lib/python3.8/dist-packages/jupyterhub/oauth/provider.py", line 354, in save_bearer_token
        self.db.commit()
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 1042, in commit
        self.transaction.commit()
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 504, in commit
        self._prepare_impl()
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 483, in _prepare_impl
        self.session.flush()
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 2536, in flush
        self._flush(objects)
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 2678, in _flush
        transaction.rollback(_capture_exception=True)
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
        compat.raise_(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/compat.py", line 182, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/session.py", line 2638, in _flush
        flush_context.execute()
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
        rec.execute(self)
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/unitofwork.py", line 586, in execute
        persistence.save_obj(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/persistence.py", line 239, in save_obj
        _emit_insert_statements(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/orm/persistence.py", line 1135, in _emit_insert_statements
        result = cached_connections[connection].execute(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1011, in execute
        return meth(self, multiparams, params)
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
        return connection._execute_clauseelement(self, multiparams, params)
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1124, in _execute_clauseelement
        ret = self._execute_context(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1316, in _execute_context
        self._handle_dbapi_exception(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1510, in _handle_dbapi_exception
        util.raise_(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/util/compat.py", line 182, in raise_
        raise exception
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
        self.dialect.do_execute(
      File "/usr/local/lib/python3.8/dist-packages/sqlalchemy/engine/default.py", line 593, in do_execute
        cursor.execute(statement, parameters)
    sqlalchemy.exc.ProgrammingError: (psycopg2.errors.DatatypeMismatch) value type decimal doesn't match type int of column "expires_at"
    HINT:  you will need to rewrite or cast the expression

    [SQL: INSERT INTO oauth_access_tokens (client_id, grant_type, expires_at, refresh_token, refresh_expires_at, user_id, session_id, hashed, prefix, created, last_activity) VALUES (%(client_id)s, %(grant_type)s, %(expires_at)s, %(refresh_token)s, %(refresh_expires_at)s, %(user_id)s, %(session_id)s, %(hashed)s, %(prefix)s, %(created)s, %(last_activity)s) RETURNING oauth_access_tokens.id]
    [parameters: {'client_id': 'jupyterhub-user-user2', 'grant_type': 'authorization_code', 'expires_at': 1622303104.418992, 'refresh_token': 'FVJ8S4is0367LlEMnxIiEIoTOeoxhf', 'refresh_expires_at': None, 'user_id': 662636890939424770, 'session_id': '4e041a2bfcb34a34a00033a281bc1236', 'hashed': 'sha512:1:3b18deae37fbf50a:03df035736960af14e19196e1d13fd74f55c21f17405119f80e75817ff37c7567fab089a3d40b97a57f94b54065ee56f7260895352516b9facb989d656f05be8', 'prefix': 't11z', 'created': datetime.datetime(2021, 5, 29, 14, 45, 4, 421305), 'last_activity': None}]
    (Background on this error at: http://sqlalche.me/e/13/f405)

[W 2021-05-29 14:45:04.430 JupyterHub base:110] Rolling back session due to database error (psycopg2.errors.DatatypeMismatch) value type decimal doesn't match type int of column "expires_at"
    HINT:  you will need to rewrite or cast the expression

    [SQL: INSERT INTO oauth_access_tokens (client_id, grant_type, expires_at, refresh_token, refresh_expires_at, user_id, session_id, hashed, prefix, created, last_activity) VALUES (%(client_id)s, %(grant_type)s, %(expires_at)s, %(refresh_token)s, %(refresh_expires_at)s, %(user_id)s, %(session_id)s, %(hashed)s, %(prefix)s, %(created)s, %(last_activity)s) RETURNING oauth_access_tokens.id]
    [parameters: {'client_id': 'jupyterhub-user-user2', 'grant_type': 'authorization_code', 'expires_at': 1622303104.418992, 'refresh_token': 'FVJ8S4is0367LlEMnxIiEIoTOeoxhf', 'refresh_expires_at': None, 'user_id': 662636890939424770, 'session_id': '4e041a2bfcb34a34a00033a281bc1236', 'hashed': 'sha512:1:3b18deae37fbf50a:03df035736960af14e19196e1d13fd74f55c21f17405119f80e75817ff37c7567fab089a3d40b97a57f94b54065ee56f7260895352516b9facb989d656f05be8', 'prefix': 't11z', 'created': datetime.datetime(2021, 5, 29, 14, 45, 4, 421305), 'last_activity': None}]
    (Background on this error at: http://sqlalche.me/e/13/f405)
[E 2021-05-29 14:45:04.443 JupyterHub log:173] {
      "Host": "hub:8081",
      "User-Agent": "python-requests/2.25.1",
      "Accept-Encoding": "gzip, deflate",
      "Accept": "*/*",
      "Connection": "keep-alive",
      "Content-Type": "application/x-www-form-urlencoded",
      "Authorization": "token [secret]",
      "Content-Length": "190"
    }
[E 2021-05-29 14:45:04.444 JupyterHub log:181] 500 POST /hub/api/oauth2/token (user2 10.42.80.10) 63.28ms
```

Everything went well, when I changed:
`expires_at=orm.OAuthAccessToken.now() + token['expires_in'],`
to:
`expires_at=int(orm.OAuthAccessToken.now() + token['expires_in']),`
That's what this PR is about.

As a sidenote, `black` formatter adjusted the `orm_client = orm.OAuthClient(identifier=client_id,)` line, but I guess it should be fine. Please, feel free to revert this change if needed.

(Upd): added the missing `int` conversion.

Signed-off-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-07-15 10:16:08 +02:00
Min RK
2c8b29b6bb Merge pull request #3467 from minrk/1.4.x
Prepare for 1.4.1
2021-05-12 17:16:58 +02:00
Min RK
a53178a92b Backport PR #3462: prepare to rename default branch to main
- update references to default branch name in docs, workflows
- use HEAD in github urls, which always works regardless of default branch name
- fix petstore URLs since the old petstore links seem to have stopped working

to merge, in order:

- [x] approve this PR
- [x] rename the default branch to main in settings
- [x] merge this PR

Related tangent: I've been using [this git default-branch](https://github.com/minrk/git-stuff/blob/main/bin/git-default-branch) to help with my aliases and friends working with repos with different branch names.

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:51:06 +02:00
Min RK
e032cda638 release 1.4.1 2021-05-12 15:45:27 +02:00
Min RK
40820b3489 changelog for 1.4.1 2021-05-12 15:42:21 +02:00
Min RK
80f4454371 Backport PR #3457: ci: fix typo in environment variable
When i setup the release workflow i made a typo in an environment variable so signing into Docker Hub now fails.

Observed in https://github.com/jupyterhub/jupyterhub/pull/3456 issuecomment-832923798.

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:39 +02:00
Erik Sundell
4d0005b0b7 Backport PR #3454: define Spawner.delete_forever on base Spawner
...where I thought it already was! Instead of on the test class.

and fix the logic for when it is called a bit:

- call on *all* Spawners, not just the default
- call on named server deletion when remove=True

closes  3451, finishes  3337

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:36 +02:00
Erik Sundell
86761ff0d4 Backport PR #3456: avoid re-using asyncio.Locks across event loops
should never occur in real applications where only one loop is run, but may occur in tests if the Proxy object lives longer than the loop that is running when it's created (imported?).

I *suspect* this is the source of our intermittent test failures with:

> got Future <Future pending> attached to a different loop

But since they are intermittent, it's hard to be sure, even if this PR passes.

The issue: we were allocating an asyncio.Lock(), which in turn grabs a handle on the current event loop, at *method definition time* in the decorator, instead of *call time*.

The solution: allocate the method at call time *and* double-check to ensure we never use a lock across event loops by storing the locks per-loop.

This should change nothing for 'real' hub instances, where only one loop is ever running, only tests where we start and stop loops a bunch.

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:34 +02:00
Min RK
32a2a3031c Backport PR #3437: patch base handlers from both jupyter_server and notebook
and clarify warning when a base handler isn't patched that auth is still being applied

- reorganize patch steps into functions for easier re-use
- patch notebook and jupyter_server handlers if they are already imported
- run patch after initialize to ensure extensions have done their importing before we check what's present
- apply class-level patch even when instance-level patch is happening to avoid triggering patch on every request

This change isn't as big as it looks, because it's mostly moving some re-used code to a couple of functions.

closes https://github.com/jupyter-server/jupyter_server/issues/488

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:31 +02:00
Min RK
16352496da Backport PR #3452: Fix documentation
Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:28 +02:00
Min RK
2259f57772 Backport PR #3436: ci: github workflow security, pin action to sha etc
Pin references to github actions we rely on in workflows with jobs that reference GitHub secrets that could get exposed.

Signed-off-by: Min RK <benjaminrk@gmail.com>
2021-05-12 15:36:26 +02:00
Min RK
574d343881 release 1.4.0 2021-04-19 13:41:28 +02:00
Yuvi Panda
c205385023 Merge pull request #3424 from minrk/changelog-1.4
more changelog for 1.4
2021-04-19 17:06:23 +05:30
Min RK
9e0ac1594c more changelog for 1.4 2021-04-19 13:13:29 +02:00
Min RK
2fd434f511 Merge pull request #3430 from yuvipanda/additional_routes
Support Proxy.extra_routes
2021-04-19 13:12:11 +02:00
YuviPanda
af39f39082 Mark extra proxy routes properly 2021-04-19 16:27:05 +05:30
YuviPanda
ab751bda5c Accomodate for host based routing 2021-04-19 16:26:09 +05:30
YuviPanda
f84078627f Add a little more documentation to extra_routes 2021-04-19 16:16:03 +05:30
YuviPanda
3ec3dc5195 Support Proxy.extra_routes
When the hub is running in API-only mode, it's
very useful to have the proxy know where to send
URLs that would normally be serviced by the hub.
For example, / might go to a service that renders
a home page, while `/user` might go to a service that
tells the user their server is dead.

Right now, this happens 'out of band', with a process
that has to talk to the proxy directly. This is a
bit messy - the routes need to be re-added when the
proxy restarts, the hub might try to remove them, etc.
By adding support for this in the hub itself, all
this complexity is now removed and the hub continues
to own all the routes in the proxy
2021-04-19 16:14:28 +05:30
Simon Li
73102e7aeb Merge pull request #3429 from minrk/push-auth
typos in onbuild, demo images for push
2021-04-19 09:19:57 +01:00
Min RK
b039e2985b typos in onbuild, demo images for push
it's jupyterhub/jupyterhub-onbuild not jupyterthub-onbuild/jupyterhub
2021-04-19 09:09:49 +02:00
Min RK
6d7863d56a Merge pull request #3428 from Carreau/doc-1
DOC: Conform to numpydoc.
2021-04-19 08:56:42 +02:00
Min RK
aba32e7200 Merge pull request #3425 from manics/docker-arm64
Disable docker jupyterhub-demo arm64 build
2021-04-19 08:33:45 +02:00
Matthias Bussonnier
a71823c5ab DOC: Conform to numpydoc.
Minor syntax update
2021-04-18 21:23:03 -07:00
Simon Li
fcf9122519 jupyterhub/action-major-minor-tag-calculator@v1
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-04-15 20:35:21 +01:00
Simon Li
6c3fc41176 jupyterhub/action-major-minor-tag-calculator@main 2021-04-15 16:14:51 +01:00
Simon Li
0bdb1bac4d GHW docker: use default tag for PRs
This allows testing with a localhost:5000 registry
2021-04-15 11:11:12 +01:00
Simon Li
35c76221fe Disable linux/arm64 jupyterhub-demo build
Installing notebook requires additional compilation dependencies
2021-04-15 10:21:32 +01:00
Simon Li
ffb092721c GHW docker: push to localhost if not releasing 2021-04-15 10:19:06 +01:00
Min RK
8758b3af27 Merge pull request #3422 from olifre/login-page-customization
login-template: Add a "login_container" block inside the div-container.
2021-04-15 09:31:23 +02:00
Min RK
5202cdff8c Merge pull request #3421 from manics/docker-arm64
Docker arm64 builds
2021-04-15 09:31:04 +02:00
Simon Li
ce0cb95282 docker release: fix build-arg BASE_IMAGE tag 2021-04-14 23:17:16 +01:00
Simon Li
ee421f6427 GHW: Remove unnecessary echo, add docker test timeout 2021-04-14 22:47:17 +01:00
Simon Li
268da21bbf GH workflow docker: 'input device is not a TTY' 2021-04-14 22:44:34 +01:00
Simon Li
4ad5f61bc7 Bump onbuild/README.md example version 2021-04-14 22:28:27 +01:00
Simon Li
3df3850b3a Remove Docker hub automated build hooks 2021-04-14 22:28:07 +01:00
Simon Li
50733efa1b Move circleci docker test to gh workflow 2021-04-14 22:27:28 +01:00
Simon Li
98230ee770 docker release: jupyterhub-onbuild jupyterhub-demo 2021-04-14 22:26:25 +01:00
Simon Li
37f250b4d7 Push some branches, use variable to determine whether to push 2021-04-14 22:26:21 +01:00
Oliver Freyermuth
869661bf25 login-template: Add a "login_container" block inside the div-container.
This allows for more flexible customization of the login page,
since it allows to re-use the login form in an extending template
by reusing the new block.

This was not cleanly possible before since the main container
was part of the very same block as the form code.

fixes #3414
2021-04-14 20:11:04 +02:00
Simon Li
009fa955ed Add Docker multi-arch publish 2021-04-13 15:35:03 +01:00
Simon Li
7c8f7e9fcb Don't pin Dockerfile parent hash 2021-04-13 15:34:14 +01:00
Yuvi Panda
14539c4e0f Merge pull request #3373 from minrk/only-hub-route
allow the hub to not be the default route
2021-04-13 17:12:21 +05:30
Min RK
a11a292cd9 test custom hub routespecs 2021-04-13 13:16:59 +02:00
Min RK
5890064191 duplicate metrics, health handlers on /api/
these should probably have been on `/api/` all along,
but must be on /api/ for api-only hub routing
2021-04-13 13:16:59 +02:00
Min RK
1f30e693ad allow overriding JupyterHub.hub_routespec
Rare, but can make sense for api-only deployments

allows easier override of the default route,
e.g. for mybinder.org custom error pages
2021-04-13 13:16:59 +02:00
Min RK
32976f3d42 Merge pull request #3403 from kafonek/fastapi-example
Fastapi example
2021-04-13 12:58:43 +02:00
Min RK
30bc23f102 Merge pull request #3418 from jiajunjie/log-exception
Log the exception raised in Spawner.post_stop_hook instead of raising it
2021-04-13 12:56:38 +02:00
Jia Junjie
786c7039d6 Log the exception raised in Spawner.post_stop_hook instead of raising it 2021-04-13 08:01:59 +00:00
Erik Sundell
19c3b02155 Merge pull request #3417 from manics/fix-hard-way-link
Fix link to jupyterhub/jupyterhub-the-hard-way
2021-04-13 07:49:33 +02:00
Simon Li
1a80524772 Fix link to jupyterhub/jupyterhub-the-hard-way 2021-04-12 21:49:59 +01:00
Erik Sundell
699a1cc01b Merge pull request #3415 from minrk/changelog-1.4
Changelog for 1.4
2021-04-12 17:26:33 +02:00
Min RK
29ae04c921 Changelog for 1.4 2021-04-12 16:57:26 +02:00
Matt Kafonek
62a1652cc9 Add files via upload 2021-04-11 21:41:45 -04:00
Kafonek, Matt
290e031034 updating gif 2021-04-11 21:40:11 -04:00
Kafonek, Matt
7642302d17 docs 2021-04-09 15:01:59 +00:00
Kafonek, Matt
aebf833530 Hit /user instead of /authorizations/token/<token> 2021-04-09 15:01:48 +00:00
Kafonek, Matt
86b51804c1 comment update 2021-04-09 15:01:22 +00:00
Kafonek, Matt
aa12afa34d User groups is List[str] not List[Group] 2021-04-09 15:01:03 +00:00
Yuvi Panda
2ff6d2b36c Merge pull request #3411 from minrk/oauth-token-expiry-config
make oauth token expiry configurable
2021-04-09 18:14:56 +05:30
Min RK
e5f7aa6c2a default oauth token expiry to cookie_max_age_days
so changing cookie age changes oauth token expiry,
since these are what are stored in those cookies anyway,
it makes sense for them to expire at the same time
2021-04-09 14:35:09 +02:00
Min RK
e3811edd87 make oauth token expiry configurable
and default to 1 day instead of 1 hour
2021-04-09 14:06:38 +02:00
Min RK
55cd9d806b Merge pull request #3407 from yuvipanda/upsert-oauth-clients
Don't delete all oauth clients on startup
2021-04-09 09:26:54 +02:00
YuviPanda
96789f5945 Add oauth client to orm only when it's new
- Existing orm_client objects are updated automatically
  in the session.
- Add some logging
- Remove TODO about safety in doing updates without upsert
  in JupyterHub, per @minrk:
  https://github.com/jupyterhub/jupyterhub/pull/3407#discussion_r610390785
2021-04-09 12:50:02 +05:30
kafonek
81d481a110 pre-commit run -a 2021-04-08 09:28:46 -04:00
YuviPanda
054c7f276e Don't delete all oauth clients on startup
When an oauth client changes, we delete all the tokens
associated with that client. This invalidates all user sessions
for that oauth client, and the oauth client's users will need to
go through the OAuth workflow again after the cache period (specified
by cache_max_age in HubAuth, 5min by default). This is fine in theory,
since oauth client information doesn't change frequently.

However, we were deleting and re-adding all oauth clients each time
the hub started! This was unnecessary, since the data was going to
be the same 99% of the time. Rest of the time, we should just update,
preventing unnecessary churn.

This PR does that.

Ref https://github.com/yuvipanda/jupyterhub-configurator/issues/2
Ref https://github.com/berkeley-dsep-infra/datahub/issues/2284
2021-04-08 17:55:28 +05:30
Matt Kafonek
1220673e61 Add files via upload 2021-04-07 14:34:10 -04:00
Kafonek, Matt
815274e966 please to be deleted old gif. 2021-04-07 18:33:32 +00:00
Kafonek, Matt
f1503b5a21 trying to get this new gif up
Merge branch 'fastapi-example' of github.com:kafonek/jupyterhub into fastapi-example
2021-04-07 18:31:30 +00:00
Kafonek, Matt
4dcdf84d32 remove old gif 2021-04-07 18:27:40 +00:00
Matt Kafonek
dda0b611e2 Add files via upload 2021-04-07 14:26:09 -04:00
Kafonek, Matt
a23bfd1769 raise warning if PUBLIC_HOST is not set 2021-04-07 18:18:02 +00:00
Kafonek, Matt
a55ccce64e Use Pydantic models 2021-04-07 18:17:25 +00:00
Kafonek, Matt
42c5030b0e Add models, remove cookie auth
get_current_user returns a User model instead of a dict.
using cookies for Hub auth is deprecated, so removed
that option and refactored get_current_user
2021-04-07 18:15:48 +00:00
Kafonek, Matt
be3df52b4f Add Pydantic models for Hub objects and exceptions 2021-04-07 18:15:26 +00:00
Kafonek, Matt
0ca5eb4997 updated docs 2021-04-07 18:15:10 +00:00
Yuvi Panda
9eeb84158e Merge pull request #3401 from maxshowarth/master
Added Azure AD as a supported authenticator.
2021-04-07 17:37:32 +05:30
Kafonek, Matt
37c2be778c pre-commit formatting 2021-04-07 02:14:54 +00:00
Kafonek, Matt
dc1b2c810d review 2021-04-07 02:13:12 +00:00
Kafonek, Matt
88c7f188e0 Merge branch 'fastapi-example' of github.com:kafonek/jupyterhub into fastapi-example 2021-04-07 02:06:45 +00:00
Kafonek, Matt
4181cc7065 add gif 2021-04-07 02:05:07 +00:00
Matt Kafonek
69e3fc2016 demo.gif 2021-04-06 22:00:42 -04:00
Kafonek, Matt
56269f0226 fastapi service example 2021-04-07 01:55:43 +00:00
Max
e446eff311 Added Azure AD as a supported authenticator. 2021-04-06 09:48:37 -07:00
Max
00042de04c remove 2021-04-06 09:41:29 -07:00
Max
82e0af763d Added AzureAD to list of supported authenticators. 2021-04-06 09:40:07 -07:00
Tim Head
c5bfd28005 Merge pull request #3394 from yuvipanda/secreter-secret 2021-03-31 13:47:07 +02:00
YuviPanda
0ffa5715fd Fix formatting to make pre-commit happy 2021-03-30 12:59:52 +05:30
Yuvi Panda
139312149e Merge pull request #3392 from minrk/deprecated-tablenames 2021-03-29 17:09:23 +05:30
Yuvi Panda
29740b0af6 Merge branch 'master' into secreter-secret 2021-03-29 17:08:17 +05:30
YuviPanda
9f6467be05 Use 'secrets' module to generate secrets
Python 3.6+ has this
2021-03-29 17:07:03 +05:30
Min RK
caae99aa09 avoid deprecated engine.table_names
deprecated in sqlalchemy 1.4

use recommended inspect(engine).get_table_names() instead
2021-03-26 12:54:40 +01:00
Min RK
8f2b14429f Merge pull request #3386 from minrk/bump-alpine
alpine dockerfile: avoid compilation by getting some deps from apk
2021-03-23 09:28:48 +01:00
Min RK
af0d81436d alpine dockerfile: avoid compilation by getting some deps from apk
cryptography is the big one, which needs rust and is a huge pain
2021-03-22 12:17:47 +01:00
Min RK
477ee23ad3 Merge pull request #3383 from IvanaH8/fix-sqlalchemy-interfaces-deprecation 2021-03-18 14:25:01 +01:00
IvanaH8
27bcac5e8b Fix sqlachemy.interfaces.PoolListener deprecation for testing older JupyterHub versions 2021-03-18 14:13:10 +01:00
Erik Sundell
6535cc6bab Merge pull request #3377 from minrk/count-redirects-differently
always start redirect count at 1 when redirecting /hub/user/:name -> /user/:name
2021-03-09 14:04:16 +01:00
Min RK
8173bbbf75 always start redirect count at 1 when redirecting /hub/user/:name -> /user/:name
/hub/user/:name is now only reasonably visited as a result of redirect from /user/:name
2021-03-09 09:57:04 +01:00
Min RK
2146eef150 Merge pull request #3375 from manics/remove-hard-way
Remove the hard way guide
2021-03-08 13:28:34 +01:00
Simon Li
97b7ccbee4 Mark installation-guide-hard orphan 2021-03-05 19:13:55 +00:00
Simon Li
8eb98409d5 Remove installation-guide-hard 2021-03-05 19:08:26 +00:00
Min RK
a4390a1f4f Merge pull request #3370 from minrk/raise-failed-tokens
Always raise on failed token creation
2021-03-05 11:02:03 +01:00
Min RK
f42f7dd01f raise on failed token creation
the logic was there but at the wrong indentation level
causing it to only raise sometimes
2021-03-02 14:32:33 +01:00
Min RK
0ca2ef68f0 Merge pull request #3326 from dtaniwaki/docker-host
Allow to set spawner-specific hub connect URL
2021-02-26 12:57:22 +01:00
Min RK
c3ca924ba8 Merge pull request #3362 from consideRatio/pr/pre-commit-maintenance
Update pre-commit hooks versions
2021-02-17 13:11:40 +00:00
Erik Sundell
0155e6dc34 Run pre-commit requirements-txt-fixer 2021-02-12 19:24:22 +01:00
Erik Sundell
727f9a0d49 Update pre-commit hook versions 2021-02-12 19:23:46 +01:00
Erik Sundell
d31af27888 Merge pull request #3360 from minrk/prettier
add (and run) prettier pre-commit hook
2021-02-12 19:21:29 +01:00
Min RK
9331dd13da run pre-commit (prettier) 2021-02-12 15:25:58 +01:00
Min RK
3c7203741f add prettier pre-commit hook
will autoformat md, js, yaml, etc.
2021-02-12 15:22:26 +01:00
Erik Sundell
4e79360567 Merge pull request #3359 from minrk/move-custom-html
move get_custom_html to base Authenticator class
2021-02-11 22:41:17 +01:00
Min RK
529273d105 move get_custom_html to base Authenticator class
so it's always available

it was accidentally added to PAM instead of the base
2021-02-11 21:42:02 +01:00
Min RK
2e198396c1 Merge pull request #3347 from minrk/mixin-get-user
make_singleuser_app: patch-in HubAuthenticatedHandler at lower priority
2021-02-04 13:41:39 +00:00
Daisuke Taniwaki
259c7512b8 Fix a lint issue 2021-02-02 00:30:59 +09:00
Daisuke Taniwaki
59b29f4c42 Refactor the code 2021-02-02 00:27:34 +09:00
Daisuke Taniwaki
bf3615aa96 Fix path 2021-02-02 00:11:43 +09:00
Daisuke Taniwaki
06a505f6df Fix comment 2021-02-02 00:09:25 +09:00
Daisuke Taniwaki
c8d6c6aaa8 Fix spawner hub connect URL 2021-02-02 00:04:42 +09:00
Daisuke Taniwaki
cc2859a826 Merge remote-tracking branch 'upstream/master' into docker-host 2021-02-01 22:35:46 +09:00
Daisuke Taniwaki
26ccf6fd57 Fix hub_connect_url 2021-02-01 22:29:43 +09:00
Min RK
f220bbca84 Merge pull request #3315 from dtaniwaki/improve-handler
Make Authenticator Custom HTML Flexible
2021-02-01 11:42:27 +00:00
Min RK
4fb3f02870 Merge pull request #3349 from minrk/pr-artifacts
publish release outputs as artifacts
2021-02-01 11:20:03 +00:00
Min RK
471d1f0a2f simplify and clarify override of methods that could be defined on BaseHandler 2021-02-01 11:40:11 +01:00
Min RK
1b12107c54 specify that mock.patch is temporary
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-02-01 07:05:24 +00:00
Min RK
b3a4adcbdd add link to action
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2021-02-01 07:03:31 +00:00
Min RK
12c69c6a94 publish release outputs as artifacts
makes testing a PR even easier since we build an sdist and wheel for every PR and push

since artifacts are double-archived, it's not quite as simple as giving a URL to install from,
but this at least makes it available. To use:

- download and unpack zip
- `pip install path/to/whl`
2021-01-29 14:32:18 +01:00
Min RK
d3147f3fb7 make_singleuser_app: patch-in HubAuthenticatedHandler at lower priority
apply patch directly to BaseHandler instead of each handler instance
so that overrides can still take effect (i.e. APIHandler raising 403 instead of redirecting)
2021-01-29 14:07:05 +01:00
Daisuke Taniwaki
47265786e3 Add versionadded 2021-01-27 20:49:47 +09:00
Min RK
1d9795c577 Merge pull request #3345 from stv0g/service-template
Allow customization of service menu via templates
2021-01-27 11:39:55 +00:00
Steffen Vogel
e35b84b419 convert tabs to whitespaces 2021-01-26 17:42:35 +01:00
Steffen Vogel
5a57b03b61 allow customization of service menu via templates 2021-01-26 17:39:48 +01:00
Min RK
e526f36b81 Merge pull request #3344 from minrk/no-auth-header-create
[TST] Do not implicitly create users in auth_header
2021-01-26 13:42:32 +00:00
Min RK
d289cd1e02 Merge pull request #3343 from consideRatio/pr/cookie-secret-as-hex
Allow cookie_secret to be set to a hexadecimal string
2021-01-26 12:11:10 +00:00
Erik Sundell
4c3a32b51f Apply suggestions from code review
Co-authored-by: Min RK <benjaminrk@gmail.com>
2021-01-26 12:44:17 +01:00
Min RK
6c65624942 [TST] Do not implicitly create users in auth_header
implicit user creation results in surprising behavior when the user shouldn't exist
2021-01-26 11:54:47 +01:00
Erik Sundell
cba22751b4 Test setting cookie_secret to a hexadecimal string 2021-01-25 22:29:48 +01:00
Erik Sundell
c5d0265984 Allow cookie_secret to be a hexadecimal string
With this, we coerce hexadecimal strings into Bytes. This can be helpful
as YAML/JSON cannot represent raw bytes.
2021-01-25 22:28:50 +01:00
Daisuke Taniwaki
fc772e1c39 Fix a lint issue 2021-01-25 23:33:17 +09:00
Daisuke Taniwaki
d70157e72a Fix the spawner test 2021-01-25 23:30:11 +09:00
Min RK
91359bcaa7 Merge pull request #3337 from nsshah1288/feature/shahn3_pvcDeletion
Add Spawner.delete_forever
2021-01-25 13:59:54 +00:00
Min RK
22fc580275 Merge pull request #3341 from dtaniwaki/clear-cookie
Clear tornado xsrf cookie on logout
2021-01-25 13:58:36 +00:00
Daisuke Taniwaki
2f304bffcc Clear tornado cookie on logout 2021-01-24 20:21:17 +09:00
SHAHN3
162076c5dd added docstring 2021-01-23 15:58:32 -05:00
SHAHN3
9bd97db90b added try except, also changed to await and async 2021-01-21 16:21:18 -05:00
Daisuke Taniwaki
3a25b32ce6 Update Spawner.hub_connect_url help message 2021-01-21 10:32:37 +09:00
SHAHN3
8fcc4b48a5 removed await 2021-01-20 14:44:03 -05:00
SHAHN3
289dee5996 new method delete_forever 2021-01-20 14:34:32 -05:00
Min RK
b1b7954e93 Merge pull request #3338 from minrk/log-slow-responses
always log slow requests at least at info-level
2021-01-20 09:18:41 +00:00
Erik Sundell
35a55c6cbf Merge pull request #3339 from minrk/alembic-min
specify minimum alembic 1.4
2021-01-20 09:50:24 +01:00
Min RK
cd06f3fb12 specify minimum alembic
this gets us *older* alembic in the old-dependencies test

since alembic 1.5 doesn't support sqlalchemy 1.1
2021-01-20 09:34:42 +01:00
Min RK
796d22d0d8 Merge pull request #3335 from rcthomas/pagination-named-servers
Fix pagination with named servers
2021-01-20 08:29:44 +00:00
Min RK
be4357ad7a Merge pull request #3332 from jiajunjie/fix-help
Fix the help related to the proxy check
2021-01-20 08:27:25 +00:00
Min RK
202d6f93d4 always log slow requests at least at info-level
if health or static responses are taking longer than 1s, it's useful to know
2021-01-20 09:23:26 +01:00
SHAHN3
8b9b69ce22 trying to mock 2021-01-19 17:40:59 -05:00
SHAHN3
c40b3a4ad6 reformatted code 2021-01-19 16:32:59 -05:00
SHAHN3
c7f1b89f6c delete user's PVC when delete user is called 2021-01-19 16:08:33 -05:00
Rollin Thomas
dcff08ae13 Add back outerjoin that made spawner sorts work 2021-01-16 09:15:34 -08:00
Rollin Thomas
b0bf348908 Need to format as subquery 2021-01-15 22:53:12 -08:00
Rollin Thomas
b73eca91ca Fix pagination with named servers 2021-01-15 11:19:57 -08:00
Jia Junjie
3db5eae9a9 Run pre-commit 2021-01-14 20:52:59 +08:00
Min RK
adb5f6ab2a Merge pull request #3333 from trallard/trallard-patch-1
📝 Fix telemetry section
2021-01-14 12:01:24 +01:00
Min RK
2a84353a51 Merge pull request #3329 from Zsailer/docs-jupyter_server
Mention Jupyter Server as optional single-user backend in documentation
2021-01-13 15:04:48 +01:00
Jia Junjie
ca4fb3187f Fix the help related to the proxy check 2021-01-13 21:59:38 +08:00
Tania Allard
8ab25e7c3d 📝 Fix telemetry section 2021-01-13 11:43:05 +00:00
Zsailer
f69ef9f846 add docs describing jupyter_server 2021-01-12 09:11:23 -08:00
Daisuke Taniwaki
ba2608c643 Allow to set spawner-specific hub connect URL 2021-01-08 23:39:05 +09:00
Erik Sundell
c3f5ad8b6d Merge pull request #3325 from andrewisplinghoff/master
Fix mixup in comment regarding the sync parameter
2021-01-08 11:46:37 +01:00
Andre Wisplinghoff
4dbe5490f8 Fix mixup in comment regarding the sync parameter 2021-01-08 11:39:09 +01:00
Erik Sundell
711080616e Merge pull request #3324 from consideRatio/pr/manually-trigger-tests-and-readme-badge
ci: github actions, allow for manual test runs and fix badge in readme
2021-01-08 01:28:27 +01:00
Erik Sundell
8e603e5212 docs: update README.md badge for github actions 2021-01-08 01:16:29 +01:00
Erik Sundell
147167e589 ci: allow tests to be run manually through github UI 2021-01-08 01:16:06 +01:00
Erik Sundell
cebb1f3e22 Merge pull request #3314 from timgates42/bugfix_typo_function
docs: fix simple typo, funciton -> function
2020-12-23 10:24:50 +01:00
Daisuke Taniwaki
0b085a91b6 Fix format issues 2020-12-23 13:50:27 +09:00
Daisuke Taniwaki
ca3ceac4f3 Add comment 2020-12-23 13:42:51 +09:00
Daisuke Taniwaki
c833fae901 Allow to use base URL in custom HTML 2020-12-23 13:39:59 +09:00
Daisuke Taniwaki
8d3a7b704c Render custom html 2020-12-23 13:03:27 +09:00
Tim Gates
1e53fd1f8c docs: fix simple typo, funciton -> function
There is a small typo in jupyterhub/orm.py.

Should read `function` rather than `funciton`.
2020-12-23 11:54:51 +11:00
Erik Sundell
166b00867f Merge pull request #3305 from minrk/github-release
publish releases from github actions
2020-12-11 16:39:42 +01:00
Min RK
7c474396f1 publish releases from github actions 2020-12-11 12:27:34 +01:00
Min RK
f6f6b3afa3 back to dev 2020-12-11 12:08:22 +01:00
Min RK
a91197635a release 1.3.0 2020-12-11 12:07:55 +01:00
Min RK
88706d4c27 final changelog edits for 1.3.0 2020-12-11 12:07:06 +01:00
Min RK
29fac11bfe Merge pull request #3295 from minrk/changelog-1.3
begin changelog for 1.3
2020-12-11 12:02:15 +01:00
Erik Sundell
947ef67184 Merge pull request #3303 from Sangarshanan/patch-1
Remove the extra parenthesis in service.md
2020-12-11 09:39:28 +01:00
sangarshanan
8ede924956 Remove extra paranthesis 2020-12-11 13:15:13 +05:30
sangarshanan
55c2d3648e Add the missing parenthesis in service.md 2020-12-11 01:53:35 +05:30
Min RK
2cf8e48fb5 start changelog for 1.3
I noticed that our jinja async feature is new in 2.9, and matured in 2.11, so explicitly require that
2020-12-09 14:31:10 +01:00
Min RK
ae77038a64 Merge pull request #3293 from minrk/services-whoami
allow services to call /api/user to identify themselves
2020-12-09 13:25:46 +01:00
Min RK
ffed8f67a0 Merge pull request #3294 from minrk/paginate-per-page
fix increasing pagination limits
2020-12-08 10:03:51 +01:00
Erik Sundell
1efd7da6ee Merge pull request #3300 from mxjeff/fixed-doc-services
Fixed idle-culler references.
2020-12-04 11:46:04 +01:00
Geoffroy Youri Berret
6e161d0140 Fixed idle-culler references.
Merge request #3257 fixed #3256 only on getting-started/services-basics.md
There is still a reference to jupyterhub example cull-idle in reference/services.md
2020-12-04 09:28:02 +01:00
Min RK
5f4144cc98 Merge pull request #3298 from coffeebenzene/master
Fix asyncio deprecation asyncio.Task.all_tasks
2020-12-03 11:16:46 +01:00
coffeebenzene
f866bbcf45 Use variable instead of monkey patching asyncio 2020-12-02 19:50:49 +00:00
coffeebenzene
ed6231d3aa Fix asyncio deprecation asyncio.Task.all_tasks 2020-12-02 17:57:28 +00:00
Min RK
9d38259ad7 fix increasing pagination limits
setting per_page in constructor resolves before max_per_page limit is updated from config,
preventing max_per_page from being increased beyond the default limit

we already loaded these values anyway in the first instance,
so remove the redundant Pagination object
2020-12-02 12:52:42 +01:00
Min RK
4b254fe5ed Merge pull request #3243 from agp8x/master
[Metrics] Add prefix to prometheus metrics to group all jupyterhub metrics
2020-12-02 12:22:32 +01:00
Min RK
f8040209b0 allow services to call /api/user to identify themselves 2020-12-02 12:21:25 +01:00
Min RK
e59ee33a6e note versionchanged in metrics module docstring 2020-12-02 11:36:13 +01:00
Min RK
ff15ced3ce Merge pull request #3225 from cbanek/configurable_options_from_form
Allow options_from_form to be configurable
2020-12-02 11:32:24 +01:00
Min RK
75acd6a67b Merge pull request #3264 from tlvu/add-user-agreement-to-login-screen
Add optional user agreement to login screen
2020-12-02 11:31:23 +01:00
Min RK
73ac6207af Merge pull request #3244 from mhwasil/fix-https-redirect-issues
[Docs] Fix https reverse proxy redirect issues
2020-12-02 11:30:09 +01:00
Min RK
e435fe66a5 Merge pull request #3292 from minrk/oldest-metrics
bump oldest-required prometheus-client
2020-12-02 11:27:27 +01:00
Min RK
d7569d6f8e bump oldest-required prometheus-client
oldest-dependency tests caught an error with our base required version
2020-12-02 11:20:30 +01:00
Min RK
ba6c2cf854 Merge pull request #3266 from 0mar/reduce_ssl_testing
Test internal_ssl separately
2020-12-02 10:59:39 +01:00
0mar
970b25d017 Added docstrings 2020-12-01 10:49:10 +01:00
0mar
671ef0d5ef Moved ssl options to proxy 2020-12-01 10:30:44 +01:00
Erik Sundell
77220d6662 Merge pull request #3289 from minrk/user-count
fix and test TOTAL_USERS count
2020-11-30 15:21:48 +01:00
Min RK
7e469f911d fix and test TOTAL_USERS count
Don't assume UserDict contains all users

which assumption led to double-counting when a user in the db was loaded into the dict cache
2020-11-30 13:27:52 +01:00
Erik Sundell
18393ec6b4 Merge pull request #3287 from minrk/bump-black
bump black pre-commit hook to 20.8
2020-11-30 10:26:55 +01:00
Min RK
28fdbeb0c0 update back pre-commit hook
specify minimum target_version as py36

results in some churn
2020-11-30 10:13:10 +01:00
Tim Head
5664e4d318 Merge pull request #3286 from Sangarshanan/patch-1
Fix curl in jupyter announcements
2020-11-30 07:47:27 +01:00
sangarshanan
24c83e721f Fix curl in jupyter announcements
Running the Curl as is return a 500 with ```json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
```  Converting the payload to a proper Json
2020-11-28 17:50:44 +05:30
0mar
cc73ab711e Disabled ssl testing 2020-11-27 17:50:47 +01:00
0mar
2cfe4474ac Submitting reason for skiptest 2020-11-27 17:26:44 +01:00
0mar
74766e4786 Resolving merge conflichts 2020-11-27 17:18:40 +01:00
0mar
ed461ff4a7 Merge branch 'tmp' into reduce_ssl_testing
# Conflicts:
#	jupyterhub/tests/test_proxy.py
2020-11-27 17:05:26 +01:00
0mar
184d87ff2a Skip SSL-free tests if not on SSL matrix 2020-11-27 17:00:09 +01:00
Min RK
06ed7dc0cf Merge pull request #3284 from minrk/12-cl
Changelog for 1.2.2
2020-11-27 14:41:08 +01:00
Min RK
a0b229431c Update docs/source/changelog.md
Co-authored-by: Erik Sundell <erik.i.sundell@gmail.com>
2020-11-27 14:40:59 +01:00
0mar
2a06c8a94c WIP: Attempt to access SSL parameters, failing due to self-signed certificate error 2020-11-27 13:26:32 +01:00
Min RK
91159d08d3 Changelog for 1.2.2 2020-11-27 10:09:54 +01:00
Erik Sundell
06a83f146b Merge pull request #3281 from olifre/patch-1
CONTRIBUTING: Fix contributor guide URL
2020-11-27 09:53:41 +01:00
Oliver Freyermuth
7b66d1656b CONTRIBUTING: Fix contributor guide URL
The link has been changed.
2020-11-27 09:39:29 +01:00
0mar
40176a667f Attempt to patch proxy, unsuccessful 2020-11-26 12:22:43 +01:00
Omar Richardson
e02345a4e8 WIP: Moved ssl options to new method 2020-11-26 09:24:44 +01:00
Long Vu
1408e9f5f4 Merge remote-tracking branch 'origin/master' into add-user-agreement-to-login-screen 2020-11-25 10:31:38 -05:00
Long Vu
b66d204d69 login page: no javascript needed for the optional accept terms and conditions feature
Bonus user gets a pop-up notification to check the checkbox.

Tested on Mozilla Firefox
(https://user-images.githubusercontent.com/11966697/100246404-18115e00-2f07-11eb-9061-d35434ace3aa.gif)
and Google Chrome.

Feedback from @minrk.
2020-11-25 10:30:22 -05:00
Omar Richardson
164447717f Fix formulation 2020-11-20 15:30:23 +01:00
Omar Richardson
0472ef0533 Central internal_ssl switch 2020-11-20 15:27:50 +01:00
Erik Sundell
202efae6d8 Merge pull request #3177 from minrk/user-state-filter
add ?state= filter for GET /users
2020-11-20 11:06:15 +01:00
Min RK
2e043241fb Merge pull request #3261 from minrk/next-append-query
Only preserve params when ?next= is unspecified
2020-11-20 09:47:20 +01:00
Min RK
fa61f06fed Merge pull request #3237 from alexweav/cleanup-leftover-proxy
[proxy.py] Improve robustness when detecting and closing existing proxy processes
2020-11-20 09:45:53 +01:00
Min RK
8b19413fa1 Merge pull request #3242 from consideRatio/pr/py36-async-await
Assume py36 and remove @gen.coroutine etc.
2020-11-20 09:31:43 +01:00
Min RK
7c2e7692b0 Merge pull request #3265 from ideonate/master
Fix RootHandler when default_url is a callable
2020-11-20 09:14:46 +01:00
Tim Head
ce11959b1a Merge pull request #3267 from slemonide/patch-1
Update services.md
2020-11-19 14:07:56 +01:00
fyrzbavqr
097974d57d Update services.md
Fix small typo
2020-11-19 04:14:54 -08:00
Omar Richardson
09ff03ca4f Superfluous import statement 2020-11-19 13:10:48 +01:00
Omar Richardson
313f050c42 Reduced ssl on for active tests only 2020-11-19 12:58:38 +01:00
Omar Richardson
4862831f71 Trying with different configuration 2020-11-19 12:08:10 +01:00
Omar Richardson
c46beb976a Moving ssl tests to testing matrix 2020-11-19 11:59:03 +01:00
Long Vu
11a85d1dc5 login page: allow full override of the optional accept terms and conditions feature
The text was already overridable but the endblock was at the wrong
location.

Now the javascript can also be overridden.
2020-11-18 14:25:49 -05:00
Dan Lester
67c4a86376 Fix RootHandler when default_url is a callable 2020-11-18 12:55:44 +00:00
Long Vu
e00ef1aef1 Merge remote-tracking branch 'origin/master' into add-user-agreement-to-login-screen 2020-11-17 17:27:30 -05:00
Long Vu
fb5f98f2fa login page: add optional feature to accept terms and conditions in order to login
The feature is disabled by default.

If enabled (by setting `login_term_url`), user will have to check the
checkbox to accept the terms and conditions in order to login.
2020-11-17 17:24:38 -05:00
Alex Weaver
82a1ba8402 Import psutil and perform cmdline check on Windows onlyy 2020-11-17 13:02:35 -06:00
Alex Weaver
7f53ad52fb Assume that fapermission errors when getting process metadata indicate a non-running proxy 2020-11-17 12:55:34 -06:00
agp8x
73cdd687e9 fix formatting 2020-11-17 15:36:30 +01:00
agp8x
af09bc547a change metric prefix to jupyterhub 2020-11-17 15:29:37 +01:00
Min RK
3ddc796068 verify that tornado gen.coroutine and run_on_executor are awaitable
- our APIs require that methods return 'awaitables'
- make sure that the older ways to create tornado 'yieldables' still produce 'awaitables'
2020-11-17 12:38:42 +01:00
Min RK
3c071467bb require tornado 5.1, async_generator 1.9
- maybe_future relies on changes in 5.1, not in 5.0
- async_generator.asynccontextmanager is new in 1.9
2020-11-17 12:23:39 +01:00
Min RK
0c43feee1b run tests with oldest-supported versions
to catch any cases where we make assumptions about more recent versions than we claim to support
2020-11-17 12:22:46 +01:00
Min RK
5bcbc8b328 Merge pull request #3252 from cmd-ntrf/signin
Standardize "Sign in" capitalization on the login page
2020-11-17 11:59:26 +01:00
Min RK
87e4f458fb only preserve params when ?next= is not specified 2020-11-17 11:58:28 +01:00
Min RK
808e8711e1 Merge pull request #3176 from yuvipanda/async_template
Enable async support in jinja2 templates
2020-11-17 11:46:23 +01:00
YuviPanda
19935254a7 Fix pre-commit errors 2020-11-17 15:58:38 +05:30
YuviPanda
a499940309 Remove extreneous coroutine creation
You can 'pass through' coroutines like this without
yield.
2020-11-17 15:41:40 +05:30
YuviPanda
74544009ca Remove extreneous print statement
Was a debugging aid
2020-11-17 15:41:22 +05:30
YuviPanda
665f9fa693 Drop Python 3.5 support
See https://github.com/jupyterhub/jupyterhub/pull/3176#issuecomment-694315759

For Travis, I push the version cascade down one step.
Should preserve our test coverage while conserving test
duration
2020-11-17 15:39:55 +05:30
YuviPanda
24b555185a Revert "Run templates synchronously for Python 3.5"
This reverts commit f1155d6c2afbcbd875c7addc88784313c77da8e9.

Instead, let's stop supporting 3.5!
2020-11-17 15:39:26 +05:30
YuviPanda
24f4b7b6b6 Run templates synchronously for Python 3.5
jinja2's async support requires Python 3.6+. That should
be an implementation detail - so we render it in the main
thread (current behavior) but pretend we did not
2020-11-17 15:39:26 +05:30
YuviPanda
217dffa845 Fix typo in format string 2020-11-17 15:39:26 +05:30
YuviPanda
a7b796fa57 Autoformat with black 2020-11-17 15:39:21 +05:30
YuviPanda
6c5fb5fe97 F-strings are Python 3.6, not 3.5 2020-11-17 15:38:29 +05:30
Yuvi Panda
20ea322e25 Fix typo
Co-authored-by: Tim Head <betatim@gmail.com>
2020-11-17 15:38:29 +05:30
YuviPanda
4f9664cfe2 Provide sync versions of render_template too
write_error is a synchronous method called by an async
method from inside the event loop. This means we can't just
schedule an async render_templates in the same loop and wait
for it - that would deadlock.

jinja2 compiled your code differently based on wether you
enable async support or not. Templates compiled with async
support can't be used in cases like ours, where we already
have an event loop running and calling a sync function. So
we maintain two almost identical jinja2 environments
2020-11-17 15:38:29 +05:30
YuviPanda
be211a48ef Enable async jinja2 template rendering
Follows https://jinja.palletsprojects.com/en/2.11.x/api/#async-support

- This blocks the main thread fewer times
- We can use async methods inside templates too
2020-11-17 15:38:29 +05:30
Min RK
553ee26312 preserve url params in ?next from root page 2020-11-17 10:45:11 +01:00
Erik Sundell
7e6111448a Merge pull request #3253 from minrk/wait-admin-form
wait for pending spawns in spawn_form_admin_access
2020-11-16 02:39:11 +01:00
Erik Sundell
ccc0294f2e Merge pull request #3257 from manics/jupyterhub_idle_culler
Update services-basics.md to ues jupyterhub_idle_culler
2020-11-14 17:37:17 +01:00
Simon Li
3232ad61aa Update services-basics.md to ues jupyterhub_idle_culler
Closes https://github.com/jupyterhub/jupyterhub/issues/3256
2020-11-14 15:59:56 +00:00
Min RK
202a5bf9a5 Merge pull request #3255 from fcollonval/patch-1
Environment marker on pamela
2020-11-13 10:28:28 +01:00
Frédéric Collonval
47136f6a3c Environment marker on pamela 2020-11-13 09:57:20 +01:00
Min RK
5d3161c6ef wait for pending spawns in spawn_form_admin_access
copy logic from test_spawn_admin_access
2020-11-12 10:16:48 +01:00
Félix-Antoine Fortin
9da4aa236e Standardize Sign in capitalization on the login page 2020-11-11 13:01:14 -05:00
Erik Sundell
d581cf54cb Retain an assertion and update comments 2020-11-11 15:40:54 +01:00
Erik Sundell
fca2528332 Retain explicit pytest mark asyncio of our coroutines 2020-11-11 14:47:41 +01:00
Erik Sundell
5edd246474 Replace @async_generator/yeild_ with async/yeild 2020-11-11 14:47:29 +01:00
Erik Sundell
77ed2faf31 Replace gen.multi(futures) with asyncio.gather(*futures) 2020-11-11 14:47:24 +01:00
Erik Sundell
4a17441e5a Replace gen.sleep with asyncio.sleep 2020-11-11 14:40:59 +01:00
Erik Sundell
e1166ec834 Replace @gen.coroutine/yield with async/await 2020-11-11 14:36:56 +01:00
Erik Sundell
2a1d341586 Merge pull request #3250 from minrk/test-condition
remove push-branch conditions for CI
2020-11-11 12:21:52 +01:00
Min RK
55a59a2e43 remove push-branch conditions for CI
testing other branches is useful, and there's little cost to removing the conditions:

- we don't run PRs from our repo, so test runs aren't duplicated on the repo
- testing on a fork without opening a PR is still useful (I use this often)
- if we push a branch, it should probably be tested (e.g. backport branch), and filters make this extra work
- the cost of running a few extra tests is low, especially given actions' current quotas and parallelism
2020-11-11 09:12:58 +01:00
Min RK
e019a33509 Merge pull request #3246 from consideRatio/pr/migrate-to-gh-actions-from-travis
Migrate from travis to GitHub actions
2020-11-11 09:06:58 +01:00
Erik Sundell
737dcf65eb Fix mysql/postgresql auth and comment struggles 2020-11-10 19:20:47 +01:00
Erik Sundell
9deaeb1fa9 Final variable name update 2020-11-10 16:19:22 +01:00
Erik Sundell
bcfc2c1b0d Cleanup use of database related environment variables 2020-11-10 16:16:28 +01:00
Erik Sundell
f71bacc998 Apply suggestions from code review
Co-authored-by: Min RK <benjaminrk@gmail.com>
2020-11-10 15:39:46 +01:00
Erik Sundell
ff14b1aa71 CI: use --maxfail=2 2020-11-10 11:14:59 +01:00
Erik Sundell
ebbbdcb2b1 Refactor ci/docker-db and ci/init-db 2020-11-10 11:14:40 +01:00
Erik Sundell
d0fca9e56b Reword comment 2020-11-10 10:03:53 +01:00
Erik Sundell
517737aa0b Add notes about not needing "set -e" etc. 2020-11-10 02:17:44 +01:00
Erik Sundell
5dadd34a87 Help GitHub UI present the job parameterization + inline comments 2020-11-10 02:17:40 +01:00
Erik Sundell
df134fefd0 Refactor pre-commit to its own job 2020-11-10 01:17:30 +01:00
Erik Sundell
47cec97e63 Let pytest fail on first error 2020-11-10 01:16:12 +01:00
Erik Sundell
0b8b87d7d0 Remove debugging trigger 2020-11-09 07:43:42 +01:00
Erik Sundell
3bf1d72905 Test in Ubuntu 20.04 2020-11-09 07:42:45 +01:00
Erik Sundell
8cdd449cca Unpin mysql-connector-python and resolve errors 2020-11-09 07:42:12 +01:00
Erik Sundell
6fc3c19763 For CI readability, exit on first failure 2020-11-09 07:41:05 +01:00
Erik Sundell
265dc07c78 Remove .travis.yml, add GitHub workflow 2020-11-09 07:40:15 +01:00
Erik Sundell
1ae039ddef Remove py3.7+ breaking test variation (has~x)
The jupyterhub/tests/test_spawner.py::test_spawner_routing[has~x] test
failed in py37+ but not in py36, and I think it is foundational to the
socket library of Python that has changed.

This is a stacktrace from Python/3.7.9/x64/lib/python3.7/site-packages/urllib3/util/connection.py:61

```
>       for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
E       socket.gaierror: [Errno -2] Name or service not known
```

Here is relevant documentation about socket.getaddrinfo.

https://docs.python.org/3.7/library/socket.html#socket.getaddrinfo
2020-11-09 07:32:11 +01:00
Erik Sundell
378d34b213 Don't ignore outer env vars 2020-11-09 07:31:16 +01:00
Mohammad Wasil
9657430cac Fix reverse proxy redirect from https 2020-11-04 17:59:28 +01:00
Mohammad Wasil
6271535f46 Merge pull request #1 from jupyterhub/master
Merge from jupyterhub/jupyterhub master
2020-11-04 17:02:28 +01:00
agp8x
2bef5ba981 Add prefix to prometheus metrics to group all jupyter metrics (see #1585) 2020-11-04 13:54:31 +01:00
Alex Weaver
efb1f3c824 Run precommit hooks, fix formatting issue 2020-10-30 12:35:01 -05:00
Alex Weaver
53050a5836 Merge branch 'master' of https://github.com/jupyterhub/jupyterhub into cleanup-leftover-proxy 2020-10-30 12:14:08 -05:00
Alex Weaver
6428ad9f0b Check proxy cmd before shutting down, cleaner shutdown on Windows 2020-10-30 12:13:50 -05:00
Min RK
9068ff2239 back to dev 2020-10-30 13:22:14 +01:00
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
Christine Banek
b2e7b474ff Allow options_from_form to be configurable 2020-10-27 12:11:48 -07: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
Min RK
30b8bc3664 add ?state= filter for GET /users
allows selecting users based on the 'ready' 'active' or 'inactive' states of their servers

- ready: users who have any servers in the 'ready' state
- active: users who have any servers in the 'active' state (i.e. ready OR pending)
- inactive: users who have *no* servers in the 'active' state (inactive + active = all users, no overlap)

Does not change the user model, so a user with *any* ready servers will still return all their servers
2020-09-17 12:31:16 +02:00
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
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
278 changed files with 19384 additions and 7499 deletions

View File

@@ -1,21 +0,0 @@
# 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

View File

@@ -1,4 +1,5 @@
[run]
parallel = True
branch = False
omit =
jupyterhub/tests/*

View File

@@ -10,13 +10,12 @@
# 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
ignore = E, C, W, F401, F403, F811, F841, E402, I100, I101, D400
builtins = c, get_config
exclude =
.cache,
.github,
docs,
examples,
jupyterhub/alembic*,
onbuild,
scripts,

View File

@@ -1,37 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
---
Hi! Thanks for using JupyterHub.
If you are reporting an issue with JupyterHub, please use the [GitHub issue](https://github.com/jupyterhub/jupyterhub/issues) search feature to check if your issue has been asked already. If it has, please add your comments to the existing issue.
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
- Running `jupyter troubleshoot` from the command line, if possible, and posting
its output would also be helpful.
- Running in `--debug` mode can also be helpful for troubleshooting.

View File

@@ -1,7 +0,0 @@
---
name: Installation and configuration issues
about: Installation and configuration assistance
---
If you are having issues with installation or configuration, you may ask for help on the JupyterHub gitter channel or file an issue here.

185
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,185 @@
# Build releases and (on tags) publish to PyPI
name: Release
# always build releases (to make sure wheel-building works)
# but only publish to PyPI on tags
on:
push:
pull_request:
jobs:
build-release:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: 3.8
- uses: actions/setup-node@v1
with:
node-version: "14"
- name: install build package
run: |
pip install --upgrade pip
pip install build
pip freeze
- name: build release
run: |
python -m build --sdist --wheel .
ls -l dist
- name: verify wheel
run: |
cd dist
pip install ./*.whl
# verify data-files are installed where they are found
cat <<EOF | python
import os
from jupyterhub._data import DATA_FILES_PATH
print(f"DATA_FILES_PATH={DATA_FILES_PATH}")
assert os.path.exists(DATA_FILES_PATH), DATA_FILES_PATH
for subpath in (
"templates/page.html",
"static/css/style.min.css",
"static/components/jquery/dist/jquery.js",
):
path = os.path.join(DATA_FILES_PATH, subpath)
assert os.path.exists(path), path
print("OK")
EOF
# ref: https://github.com/actions/upload-artifact#readme
- uses: actions/upload-artifact@v2
with:
name: jupyterhub-${{ github.sha }}
path: "dist/*"
if-no-files-found: error
- name: Publish to PyPI
if: startsWith(github.ref, 'refs/tags/')
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
pip install twine
twine upload --skip-existing dist/*
publish-docker:
runs-on: ubuntu-20.04
services:
# So that we can test this in PRs/branches
local-registry:
image: registry:2
ports:
- 5000:5000
steps:
- name: Should we push this image to a public registry?
run: |
if [ "${{ startsWith(github.ref, 'refs/tags/') || (github.ref == 'refs/heads/main') }}" = "true" ]; then
# Empty => Docker Hub
echo "REGISTRY=" >> $GITHUB_ENV
else
echo "REGISTRY=localhost:5000/" >> $GITHUB_ENV
fi
- uses: actions/checkout@v2
# Setup docker to build for multiple platforms, see:
# https://github.com/docker/build-push-action/tree/v2.4.0#usage
# https://github.com/docker/build-push-action/blob/v2.4.0/docs/advanced/multi-platform.md
- name: Set up QEMU (for docker buildx)
uses: docker/setup-qemu-action@25f0500ff22e406f7191a2a8ba8cda16901ca018 # associated tag: v1.0.2
- name: Set up Docker Buildx (for multi-arch builds)
uses: docker/setup-buildx-action@2a4b53665e15ce7d7049afb11ff1f70ff1610609 # associated tag: v1.1.2
with:
# Allows pushing to registry on localhost:5000
driver-opts: network=host
- name: Setup push rights to Docker Hub
# This was setup by...
# 1. Creating a Docker Hub service account "jupyterhubbot"
# 2. Creating a access token for the service account specific to this
# repository: https://hub.docker.com/settings/security
# 3. Making the account part of the "bots" team, and granting that team
# permissions to push to the relevant images:
# https://hub.docker.com/orgs/jupyterhub/teams/bots/permissions
# 4. Registering the username and token as a secret for this repo:
# https://github.com/jupyterhub/jupyterhub/settings/secrets/actions
if: env.REGISTRY != 'localhost:5000/'
run: |
docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" -p "${{ secrets.DOCKERHUB_TOKEN }}"
# https://github.com/jupyterhub/action-major-minor-tag-calculator
# If this is a tagged build this will return additional parent tags.
# E.g. 1.2.3 is expanded to Docker tags
# [{prefix}:1.2.3, {prefix}:1.2, {prefix}:1, {prefix}:latest] unless
# this is a backported tag in which case the newer tags aren't updated.
# For branches this will return the branch name.
# If GITHUB_TOKEN isn't available (e.g. in PRs) returns no tags [].
- name: Get list of jupyterhub tags
id: jupyterhubtags
uses: jupyterhub/action-major-minor-tag-calculator@v1
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
prefix: "${{ env.REGISTRY }}jupyterhub/jupyterhub:"
defaultTag: "${{ env.REGISTRY }}jupyterhub/jupyterhub:noref"
- name: Build and push jupyterhub
uses: docker/build-push-action@e1b7f96249f2e4c8e4ac1519b9608c0d48944a1f # associated tag: v2.4.0
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
# tags parameter must be a string input so convert `gettags` JSON
# array into a comma separated list of tags
tags: ${{ join(fromJson(steps.jupyterhubtags.outputs.tags)) }}
# jupyterhub-onbuild
- name: Get list of jupyterhub-onbuild tags
id: onbuildtags
uses: jupyterhub/action-major-minor-tag-calculator@v1
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
prefix: "${{ env.REGISTRY }}jupyterhub/jupyterhub-onbuild:"
defaultTag: "${{ env.REGISTRY }}jupyterhub/jupyterhub-onbuild:noref"
- name: Build and push jupyterhub-onbuild
uses: docker/build-push-action@e1b7f96249f2e4c8e4ac1519b9608c0d48944a1f # associated tag: v2.4.0
with:
build-args: |
BASE_IMAGE=${{ fromJson(steps.jupyterhubtags.outputs.tags)[0] }}
context: onbuild
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ join(fromJson(steps.onbuildtags.outputs.tags)) }}
# jupyterhub-demo
- name: Get list of jupyterhub-demo tags
id: demotags
uses: jupyterhub/action-major-minor-tag-calculator@v1
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
prefix: "${{ env.REGISTRY }}jupyterhub/jupyterhub-demo:"
defaultTag: "${{ env.REGISTRY }}jupyterhub/jupyterhub-demo:noref"
- name: Build and push jupyterhub-demo
uses: docker/build-push-action@e1b7f96249f2e4c8e4ac1519b9608c0d48944a1f # associated tag: v2.4.0
with:
build-args: |
BASE_IMAGE=${{ fromJson(steps.onbuildtags.outputs.tags)[0] }}
context: demo-image
# linux/arm64 currently fails:
# ERROR: Could not build wheels for argon2-cffi which use PEP 517 and cannot be installed directly
# ERROR: executor failed running [/bin/sh -c python3 -m pip install notebook]: exit code: 1
platforms: linux/amd64
push: true
tags: ${{ join(fromJson(steps.demotags.outputs.tags)) }}

246
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,246 @@
# This is a GitHub workflow defining a set of jobs with a set of steps.
# ref: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions
#
name: Test
# Trigger the workflow's on all PRs but only on pushed tags or commits to
# main/master branch to avoid PRs developed in a GitHub fork's dedicated branch
# to trigger.
on:
pull_request:
push:
workflow_dispatch:
defaults:
run:
# Declare bash be used by default in this workflow's "run" steps.
#
# NOTE: bash will by default run with:
# --noprofile: Ignore ~/.profile etc.
# --norc: Ignore ~/.bashrc etc.
# -e: Exit directly on errors
# -o pipefail: Don't mask errors from a command piped into another command
shell: bash
env:
# UTF-8 content may be interpreted as ascii and causes errors without this.
LANG: C.UTF-8
jobs:
# Run "pre-commit run --all-files"
pre-commit:
runs-on: ubuntu-20.04
timeout-minutes: 2
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: 3.8
# ref: https://github.com/pre-commit/action
- uses: pre-commit/action@v2.0.0
- name: Help message if pre-commit fail
if: ${{ failure() }}
run: |
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"
# Run "pytest jupyterhub/tests" in various configurations
pytest:
runs-on: ubuntu-20.04
timeout-minutes: 10
strategy:
# Keep running even if one variation of the job fail
fail-fast: false
matrix:
# We run this job multiple times with different parameterization
# specified below, these parameters have no meaning on their own and
# gain meaning on how job steps use them.
#
# subdomain:
# Tests everything when JupyterHub is configured to add routes for
# users with dedicated subdomains like user1.jupyter.example.com
# rather than jupyter.example.com/user/user1.
#
# db: [mysql/postgres]
# Tests everything when JupyterHub works against a dedicated mysql or
# postgresql server.
#
# jupyter_server:
# Tests everything when the user instances are started with
# jupyter_server instead of notebook.
#
# ssl:
# Tests everything using internal SSL connections instead of
# unencrypted HTTP
#
# main_dependencies:
# Tests everything when the we use the latest available dependencies
# from: ipytraitlets.
#
# NOTE: Since only the value of these parameters are presented in the
# GitHub UI when the workflow run, we avoid using true/false as
# values by instead duplicating the name to signal true.
include:
- python: "3.6"
oldest_dependencies: oldest_dependencies
- python: "3.6"
subdomain: subdomain
- python: "3.7"
db: mysql
- python: "3.7"
ssl: ssl
- python: "3.8"
db: postgres
- python: "3.8"
jupyter_server: jupyter_server
- python: "3.9"
main_dependencies: main_dependencies
steps:
# NOTE: In GitHub workflows, environment variables are set by writing
# assignment statements to a file. They will be set in the following
# steps as if would used `export MY_ENV=my-value`.
- name: Configure environment variables
run: |
if [ "${{ matrix.subdomain }}" != "" ]; then
echo "JUPYTERHUB_TEST_SUBDOMAIN_HOST=http://localhost.jovyan.org:8000" >> $GITHUB_ENV
fi
if [ "${{ matrix.db }}" == "mysql" ]; then
echo "MYSQL_HOST=127.0.0.1" >> $GITHUB_ENV
echo "JUPYTERHUB_TEST_DB_URL=mysql+mysqlconnector://root@127.0.0.1:3306/jupyterhub" >> $GITHUB_ENV
fi
if [ "${{ matrix.ssl }}" == "ssl" ]; then
echo "SSL_ENABLED=1" >> $GITHUB_ENV
fi
if [ "${{ matrix.db }}" == "postgres" ]; then
echo "PGHOST=127.0.0.1" >> $GITHUB_ENV
echo "PGUSER=test_user" >> $GITHUB_ENV
echo "PGPASSWORD=hub[test/:?" >> $GITHUB_ENV
echo "JUPYTERHUB_TEST_DB_URL=postgresql://test_user:hub%5Btest%2F%3A%3F@127.0.0.1:5432/jupyterhub" >> $GITHUB_ENV
fi
if [ "${{ matrix.jupyter_server }}" != "" ]; then
echo "JUPYTERHUB_SINGLEUSER_APP=jupyterhub.tests.mockserverapp.MockServerApp" >> $GITHUB_ENV
fi
- uses: actions/checkout@v2
# NOTE: actions/setup-node@v1 make use of a cache within the GitHub base
# environment and setup in a fraction of a second.
- name: Install Node v14
uses: actions/setup-node@v1
with:
node-version: "14"
- name: Install Node dependencies
run: |
npm install
npm install -g configurable-http-proxy
npm list
# NOTE: actions/setup-python@v2 make use of a cache within the GitHub base
# environment and setup in a fraction of a second.
- name: Install Python ${{ matrix.python }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python }}
- name: Install Python dependencies
run: |
pip install --upgrade pip
pip install --upgrade . -r dev-requirements.txt
if [ "${{ matrix.oldest_dependencies }}" != "" ]; then
# take any dependencies in requirements.txt such as tornado>=5.0
# and transform them to tornado==5.0 so we can run tests with
# the earliest-supported versions
cat requirements.txt | grep '>=' | sed -e 's@>=@==@g' > oldest-requirements.txt
pip install -r oldest-requirements.txt
fi
if [ "${{ matrix.main_dependencies }}" != "" ]; then
pip install git+https://github.com/ipython/traitlets#egg=traitlets --force
fi
if [ "${{ matrix.jupyter_server }}" != "" ]; then
pip uninstall notebook --yes
pip install jupyter_server
fi
if [ "${{ matrix.db }}" == "mysql" ]; then
pip install mysql-connector-python
fi
if [ "${{ matrix.db }}" == "postgres" ]; then
pip install psycopg2-binary
fi
pip freeze
# NOTE: If you need to debug this DB setup step, consider the following.
#
# 1. mysql/postgressql are database servers we start as docker containers,
# and we use clients named mysql/psql.
#
# 2. When we start a database server we need to pass environment variables
# explicitly as part of the `docker run` command. These environment
# variables are named differently from the similarly named environment
# variables used by the clients.
#
# - mysql server ref: https://hub.docker.com/_/mysql/
# - mysql client ref: https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html
# - postgres server ref: https://hub.docker.com/_/postgres/
# - psql client ref: https://www.postgresql.org/docs/9.5/libpq-envars.html
#
# 3. When we connect, they should use 127.0.0.1 rather than the
# default way of connecting which leads to errors like below both for
# mysql and postgresql unless we set MYSQL_HOST/PGHOST to 127.0.0.1.
#
# - ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
#
- name: Start a database server (${{ matrix.db }})
if: ${{ matrix.db }}
run: |
if [ "${{ matrix.db }}" == "mysql" ]; then
sudo apt-get update
sudo apt-get install -y mysql-client
DB=mysql bash ci/docker-db.sh
DB=mysql bash ci/init-db.sh
fi
if [ "${{ matrix.db }}" == "postgres" ]; then
sudo apt-get update
sudo apt-get install -y postgresql-client
DB=postgres bash ci/docker-db.sh
DB=postgres bash ci/init-db.sh
fi
- name: Run pytest
# FIXME: --color=yes explicitly set because:
# https://github.com/actions/runner/issues/241
run: |
pytest -v --maxfail=2 --color=yes --cov=jupyterhub jupyterhub/tests
- name: Submit codecov report
run: |
codecov
docker-build:
runs-on: ubuntu-20.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v2
- name: build images
run: |
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
- name: smoke test jupyterhub
run: |
docker run --rm -t jupyterhub/jupyterhub jupyterhub --help
- name: verify static files
run: |
docker run --rm -t -v $PWD/dockerfiles:/io jupyterhub/jupyterhub python3 /io/test.py

5
.gitignore vendored
View File

@@ -21,6 +21,11 @@ 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
oldest-requirements.txt

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

@@ -0,0 +1,24 @@
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: 20.8b1
hooks:
- id: black
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.2.1
hooks:
- id: prettier
- repo: https://gitlab.com/pycqa/flake8
rev: "3.8.4"
hooks:
- id: flake8
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.4.0
hooks:
- id: end-of-file-fixer
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: requirements-txt-fixer

1
.prettierignore Normal file
View File

@@ -0,0 +1 @@
share/jupyterhub/templates/

View File

@@ -1,66 +0,0 @@
language: python
sudo: false
cache:
- pip
python:
- 3.6
- 3.5
- nightly
env:
global:
- ASYNC_TEST_TIMEOUT=15
- MYSQL_HOST=127.0.0.1
- MYSQL_TCP_PORT=13306
services:
- postgres
- docker
# installing dependencies
before_install:
- 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
pip install 'mysql-connector<2.2'
elif [[ $JUPYTERHUB_TEST_DB_URL == postgresql* ]]; then
DB=postgres bash ci/init-db.sh
pip install psycopg2-binary
fi
install:
- pip install --upgrade pip
- pip install --pre -r dev-requirements.txt .
- pip freeze
# running tests
script:
- |
# run tests
set -e
pytest -v --maxfail=2 --cov=jupyterhub jupyterhub/tests
- |
# build docs
pushd docs
pip install -r requirements.txt
make html
popd
after_success:
- codecov
matrix:
fast_finish: true
include:
- python: 3.6
env: JUPYTERHUB_TEST_SUBDOMAIN_HOST=http://localhost.jovyan.org:8000
- python: 3.6
env:
- JUPYTERHUB_TEST_DB_URL=mysql+mysqlconnector://root@127.0.0.1:$MYSQL_TCP_PORT/jupyterhub
- python: 3.6
env:
- JUPYTERHUB_TEST_DB_URL=postgresql://postgres@127.0.0.1/jupyterhub
allow_failures:
- python: nightly

View File

@@ -2,24 +2,24 @@
- [ ] Upgrade Docs prior to Release
- [ ] Change log
- [ ] New features documented
- [ ] Update the contributor list - thank you page
- [ ] 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
- [ ] 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)
- [ ] Email Jupyter and Jupyter In Education mailing lists
- [ ] Tweet (optional)
- [ ] Increment the version number for the next release

View File

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

View File

@@ -1,98 +1,139 @@
# Contributing
# Contributing to JupyterHub
Welcome! As a [Jupyter](https://jupyter.org) project, we follow the [Jupyter contributor guide](https://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html).
Welcome! As a [Jupyter](https://jupyter.org) project,
you can follow the [Jupyter contributor guide](https://jupyter.readthedocs.io/en/latest/contributing/content-contributor.html).
Make sure to also follow [Project Jupyter's Code of Conduct](https://github.com/jupyter/governance/blob/HEAD/conduct/code_of_conduct.md)
for a friendly and welcoming collaborative environment.
## Set up your development system
## Setting up a development environment
For a development install, clone the [repository](https://github.com/jupyterhub/jupyterhub)
and then install from source:
<!--
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
git clone https://github.com/jupyterhub/jupyterhub
cd jupyterhub
npm install -g configurable-http-proxy
pip3 install -r dev-requirements.txt -e .
pre-commit run
```
### Troubleshooting a development install
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 the `pip3 install` command fails and complains about `lessc` being
unavailable, you may need to explicitly install some additional JavaScript
dependencies:
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.
npm install
## Testing
This will fetch client-side JavaScript dependencies necessary to compile CSS.
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 may also need to manually update JavaScript and CSS after some development
updates, with:
You can run the tests with:
```bash
python3 setup.py js # fetch updated client-side js
python3 setup.py css # recompile CSS from LESS sources
pytest -v
```
## Running the test suite
We use [pytest](http://doc.pytest.org/en/latest/) for running tests.
1. Set up a development install as described above.
2. Set environment variable for `ASYNC_TEST_TIMEOUT` to 15 seconds:
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
export ASYNC_TEST_TIMEOUT=15
pytest -v -k spawn jupyterhub/tests/test_api.py
```
3. Run tests.
The tests live in `jupyterhub/tests` and are organized roughly into:
To run all the tests:
1. `test_api.py` tests the REST API
2. `test_pages.py` tests loading the HTML pages
```bash
pytest -v jupyterhub/tests
```
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.
To run an individual test file (i.e. `test_api.py`):
The fixtures live in `jupyterhub/tests/conftest.py`. There are
fixtures that can be used for JupyterHub components, such as:
```bash
pytest -v jupyterhub/tests/test_api.py
```
- `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
### Troubleshooting tests
And fixtures to add functionality or spawning behavior:
If you see test failures because of timeouts, you may wish to increase the
`ASYNC_TEST_TIMEOUT` used by the
[pytest-tornado-plugin](https://github.com/eugeniy/pytest-tornado/blob/c79f68de2222eb7cf84edcfe28650ebf309a4d0c/README.rst#markers)
from the default of 5 seconds:
- `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)
```bash
export ASYNC_TEST_TIMEOUT=15
```
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.
If you see many test errors and failures, double check that you have installed
`configurable-http-proxy`.
## Building the Docs locally
1. Install the development system as described above.
2. Install the dependencies for documentation:
```bash
python3 -m pip install -r docs/requirements.txt
```
3. Build the docs:
```bash
cd docs
make clean
make html
```
4. View the docs:
```bash
open build/html/index.html
```
When in doubt, feel free to [ask](https://gitter.im/jupyterhub/jupyterhub).

View File

@@ -24,7 +24,7 @@ software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
@@ -46,8 +46,8 @@ Jupyter uses a shared copyright model. Each contributor maintains copyright
over their contributions to Jupyter. But, it is important to note that these
contributions are typically only changes to the repositories. Thus, the Jupyter
source code, in its entirety is not the copyright of any single person or
institution. Instead, it is the collective copyright of the entire Jupyter
Development Team. If individual contributors want to maintain a record of what
institution. Instead, it is the collective copyright of the entire Jupyter
Development Team. If individual contributors want to maintain a record of what
changes/contributions they have specific copyright on, they should indicate
their copyright in the commit message of the change, when they commit the
change to one of the Jupyter repositories.

View File

@@ -21,40 +21,81 @@
# your jupyterhub_config.py will be added automatically
# from your docker directory.
FROM ubuntu:18.04
LABEL maintainer="Jupyter Project <jupyter@googlegroups.com>"
ARG BASE_IMAGE=ubuntu:focal-20200729
FROM $BASE_IMAGE AS builder
USER root
# install nodejs, utf8 locale, set CDN because default httpredir is unreliable
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get -y install wget git bzip2 && \
apt-get purge && \
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 + NodeJS with conda
RUN wget -q https://repo.continuum.io/miniconda/Miniconda3-4.5.1-Linux-x86_64.sh -O /tmp/miniconda.sh && \
echo '0c28787e3126238df24c5d4858bd0744 */tmp/miniconda.sh' | md5sum -c - && \
bash /tmp/miniconda.sh -f -b -p /opt/conda && \
/opt/conda/bin/conda install --yes -c conda-forge \
python=3.6 sqlalchemy tornado jinja2 traitlets requests pip pycurl \
nodejs configurable-http-proxy && \
/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
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 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 +0,0 @@

View File

@@ -6,17 +6,18 @@
**[License](#license)** |
**[Help and Resources](#help-and-resources)**
# [JupyterHub](https://github.com/jupyterhub/jupyterhub)
[![PyPI](https://img.shields.io/pypi/v/jupyterhub.svg)](https://pypi.python.org/pypi/jupyterhub)
[![Documentation Status](https://readthedocs.org/projects/jupyterhub/badge/?version=latest)](http://jupyterhub.readthedocs.org/en/latest/?badge=latest)
[![Documentation Status](http://readthedocs.org/projects/jupyterhub/badge/?version=0.7.2)](http://jupyterhub.readthedocs.io/en/0.7.2/?badge=0.7.2)
[![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)
[![codecov.io](https://codecov.io/github/jupyterhub/jupyterhub/coverage.svg?branch=master)](https://codecov.io/github/jupyterhub/jupyterhub?branch=master)
[![Google Group](https://img.shields.io/badge/google-group-blue.svg)](https://groups.google.com/forum/#!forum/jupyter)
[![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/)
[![GitHub Workflow Status - Test](https://img.shields.io/github/workflow/status/jupyterhub/jupyterhub/Test?logo=github&label=tests)](https://github.com/jupyterhub/jupyterhub/actions)
[![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/main/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)
With [JupyterHub](https://jupyterhub.readthedocs.io) you can create a
**multi-user Hub** which spawns, manages, and proxies multiple instances of the
@@ -45,22 +46,21 @@ Basic principles for operation are:
servers.
JupyterHub also provides a
[REST API](http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/master/docs/rest-api.yml#/default)
[REST API](https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/HEAD/docs/rest-api.yml#/default)
for administration of the Hub and its users.
## Installation
### Check prerequisites
- A Linux/Unix based system
- [Python](https://www.python.org/downloads/) 3.5 or greater
- [nodejs/npm](https://www.npmjs.com/)
* If you are using **`conda`**, the nodejs and npm dependencies will be installed for
- 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
- 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:
@@ -71,6 +71,7 @@ for administration of the Hub and its users.
The `nodejs-legacy` package installs the `node` executable and is currently
required for npm to work on Debian/Ubuntu.
- 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
@@ -98,7 +99,7 @@ JupyterHub can be installed with `pip`, and the proxy with `npm`:
```bash
npm install -g configurable-http-proxy
python3 -m pip install jupyterhub
python3 -m pip install jupyterhub
```
If you plan to run notebook servers locally, you will need to install the
@@ -116,15 +117,15 @@ To start the Hub server, run the command:
Visit `https://localhost:8000` in your browser, and sign in with your unix
PAM credentials.
*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.
_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/jupyterhub/jupyterhub/wiki/Using-sudo-to-run-JupyterHub-without-root-privileges)
describes how to run the server as a *less privileged user*, which requires
describes how to run the server as a _less privileged user_, which requires
more configuration of the system.
## Configuration
The [Getting Started](http://jupyterhub.readthedocs.io/en/latest/getting-started/index.html) section of the
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.
The [**JupyterHub tutorial**](https://github.com/jupyterhub/jupyterhub-tutorial)
@@ -138,18 +139,18 @@ To generate a default config file with settings and descriptions:
### Start the Hub
To start the Hub on a specific url and port ``10.0.1.2:443`` with **https**:
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
### Authenticators
| 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 |
| [kdcAuthenticator](https://github.com/bloomberg/jupyterhub-kdcauthenticator)| Kerberos Authenticator Plugin for JupyterHub |
| 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 |
### Spawners
@@ -161,6 +162,7 @@ To start the Hub on a specific url and port ``10.0.1.2:443`` with **https**:
| [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
@@ -199,11 +201,14 @@ These accounts will be used for authentication in JupyterHub's default configura
## Contributing
If you would like to contribute to the project, please read our
[contributor documentation](http://jupyter.readthedocs.io/en/latest/contributor/content-contributor.html)
[contributor documentation](https://jupyter.readthedocs.io/en/latest/contributing/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.
@@ -233,10 +238,13 @@ 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](http://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 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](https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/HEAD/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)
- [Project Jupyter community](https://jupyter.org/community)
JupyterHub follows the Jupyter [Community Guides](https://jupyter.readthedocs.io/en/latest/community/content-community.html).
---

View File

@@ -1,19 +1,16 @@
#!/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
from os.path import join
import shutil
from os.path import join
HERE = os.path.abspath(os.path.dirname(__file__))

View File

@@ -1,50 +1,60 @@
#!/usr/bin/env bash
# source this file to setup postgres and mysql
# for local testing (as similar as possible to docker)
# The goal of this script is to start a database server as a docker container.
#
# Required environment variables:
# - DB: The database server to start, either "postgres" or "mysql".
#
# - PGUSER/PGPASSWORD: For the creation of a postgresql user with associated
# password.
set -e
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"
# Stop and remove any existing database container
DOCKER_CONTAINER="hub-test-$DB"
docker rm -f "$DOCKER_CONTAINER" 2>/dev/null || true
docker rm -f "$NAME" 2>/dev/null || true
# Prepare environment variables to startup and await readiness of either a mysql
# or postgresql server.
if [[ "$DB" == "mysql" ]]; then
# Environment variables can influence both the mysql server in the docker
# container and the mysql client.
#
# ref server: https://hub.docker.com/_/mysql/
# ref client: https://dev.mysql.com/doc/refman/5.7/en/setting-environment-variables.html
#
DOCKER_RUN_ARGS="-p 3306:3306 --env MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql:5.7"
READINESS_CHECK="mysql --user root --execute \q"
elif [[ "$DB" == "postgres" ]]; then
# Environment variables can influence both the postgresql server in the
# docker container and the postgresql client (psql).
#
# ref server: https://hub.docker.com/_/postgres/
# ref client: https://www.postgresql.org/docs/9.5/libpq-envars.html
#
# POSTGRES_USER / POSTGRES_PASSWORD will create a user on startup of the
# postgres server, but PGUSER and PGPASSWORD are the environment variables
# used by the postgresql client psql, so we configure the user based on how
# we want to connect.
#
DOCKER_RUN_ARGS="-p 5432:5432 --env "POSTGRES_USER=${PGUSER}" --env "POSTGRES_PASSWORD=${PGPASSWORD}" postgres:9.5"
READINESS_CHECK="psql --command \q"
else
echo '$DB must be mysql or postgres'
exit 1
fi
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
# Start the database server
docker run --detach --name "$DOCKER_CONTAINER" $DOCKER_RUN_ARGS
# Wait for the database server to start
echo -n "waiting for $DB "
for i in {1..60}; do
if $CHECK; then
echo 'done'
break
else
echo -n '.'
sleep 1
fi
if $READINESS_CHECK; then
echo 'done'
break
else
echo -n '.'
sleep 1
fi
done
$CHECK
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
"
$READINESS_CHECK

View File

@@ -1,27 +1,26 @@
#!/usr/bin/env bash
# initialize jupyterhub databases for testing
# The goal of this script is to initialize a running database server with clean
# databases for use during tests.
#
# Required environment variables:
# - DB: The database server to start, either "postgres" or "mysql".
set -e
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
# Prepare env vars SQL_CLIENT and EXTRA_CREATE_DATABASE_ARGS
if [[ "$DB" == "mysql" ]]; then
SQL_CLIENT="mysql --user root --execute "
EXTRA_CREATE_DATABASE_ARGS='CHARACTER SET utf8 COLLATE utf8_general_ci'
elif [[ "$DB" == "postgres" ]]; then
SQL_CLIENT="psql --command "
else
echo '$DB must be mysql or postgres'
exit 1
fi
# Configure a set of databases in the database server for upgrade tests
set -x
for SUFFIX in '' _upgrade_072 _upgrade_081; do
$SQL "DROP DATABASE jupyterhub${SUFFIX};" 2>/dev/null || true
$SQL "CREATE DATABASE jupyterhub${SUFFIX} ${EXTRA_CREATE};"
for SUFFIX in '' _upgrade_072 _upgrade_081 _upgrade_094; do
$SQL_CLIENT "DROP DATABASE jupyterhub${SUFFIX};" 2>/dev/null || true
$SQL_CLIENT "CREATE DATABASE jupyterhub${SUFFIX} ${EXTRA_CREATE_DATABASE_ARGS:-};"
done

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

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

@@ -0,0 +1,26 @@
## 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,10 +1,20 @@
-r requirements.txt
mock
# temporary pin of attrs for jsonschema 0.3.0a1
# seems to be a pip bug
attrs>=17.4.0
beautifulsoup4
codecov
coverage
cryptography
pytest-cov
pytest-tornado
pytest>=3.3
html5lib # needed for beautifulsoup
mock
notebook
pre-commit
pytest>=3.3
pytest-asyncio
pytest-cov
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

@@ -1,11 +1,14 @@
FROM python:3.6.3-alpine3.6
ARG JUPYTERHUB_VERSION=0.8.1
RUN pip3 install --no-cache jupyterhub==${JUPYTERHUB_VERSION}
FROM alpine:3.13
ENV LANG=en_US.UTF-8
RUN apk add --no-cache \
python3 \
py3-pip \
py3-ruamel.yaml \
py3-cryptography \
py3-sqlalchemy
ARG JUPYTERHUB_VERSION=1.3.0
RUN pip3 install --no-cache jupyterhub==${JUPYTERHUB_VERSION}
USER nobody
CMD ["jupyterhub"]

View File

@@ -1,21 +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
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.
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 create network 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"
- 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

@@ -48,6 +48,7 @@ help:
@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)/*
@@ -60,7 +61,12 @@ rest-api: source/_static/rest-api/index.html
source/_static/rest-api/index.html: rest-api.yml node_modules
npm run rest-api
html: 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."

View File

@@ -1,19 +0,0 @@
name: jhub_docs
channels:
- conda-forge
dependencies:
- nodejs
- python=3.6
- alembic
- jinja2
- pamela
- requests
- sqlalchemy>=1
- tornado>=5.0
- traitlets>=4.1
- sphinx>=1.7
- pip:
- python-oauth2
- recommonmark==0.4.0
- async_generator
- prometheus_client

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()

View File

@@ -1,3 +1,11 @@
-r ../requirements.txt
alabaster_jupyterhub
autodoc-traits
docutils<0.18
pydata-sphinx-theme
pytablewriter>=0.56
recommonmark>=0.6
sphinx>=1.7
recommonmark==0.4.0
sphinx-copybutton
sphinx-jsonschema

View File

@@ -1,13 +1,12 @@
# see me at: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/jupyterhub/master/docs/rest-api.yml#/default
swagger: '2.0'
# see me at: https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/HEAD/docs/rest-api.yml#/default
swagger: "2.0"
info:
title: JupyterHub
description: The REST API for JupyterHub
version: 0.9.0dev
version: 1.5.0
license:
name: BSD-3-Clause
schemes:
- [http, https]
schemes: [http, https]
securityDefinitions:
token:
type: apiKey
@@ -28,7 +27,7 @@ paths:
This endpoint is not authenticated for the purpose of clients and user
to identify the JupyterHub version before setting up authentication.
responses:
'200':
"200":
description: The JupyterHub version
schema:
type: object
@@ -44,7 +43,7 @@ paths:
JupyterHub's version and executable path,
and which Authenticator and Spawner are active.
responses:
'200':
"200":
description: Detailed JupyterHub info
schema:
type: object
@@ -79,17 +78,32 @@ paths:
/users:
get:
summary: List users
parameters:
- name: state
in: query
required: false
type: string
enum: ["inactive", "active", "ready"]
description: |
Return only users who have servers in the given state.
If unspecified, return all users.
active: all users with any active servers (ready OR pending)
ready: all users who have any ready servers (running, not pending)
inactive: all users who have *no* active servers (complement of active)
Added in JupyterHub 1.3
responses:
'200':
"200":
description: The Hub's user list
schema:
type: array
items:
$ref: '#/definitions/User'
$ref: "#/definitions/User"
post:
summary: Create multiple users
parameters:
- name: data
- name: body
in: body
required: true
schema:
@@ -104,13 +118,13 @@ paths:
description: whether the created users should be admins
type: boolean
responses:
'201':
"201":
description: The users have been created
schema:
type: array
description: The created users
items:
$ref: '#/definitions/User'
$ref: "#/definitions/User"
/users/{name}:
get:
summary: Get a user by name
@@ -121,10 +135,10 @@ paths:
required: true
type: string
responses:
'200':
"200":
description: The User model
schema:
$ref: '#/definitions/User'
$ref: "#/definitions/User"
post:
summary: Create a single user
parameters:
@@ -134,10 +148,10 @@ paths:
required: true
type: string
responses:
'201':
"201":
description: The user has been created
schema:
$ref: '#/definitions/User'
$ref: "#/definitions/User"
patch:
summary: Modify a user
description: Change a user's name or admin status
@@ -147,7 +161,7 @@ paths:
in: path
required: true
type: string
- name: data
- name: body
in: body
required: true
description: Updated user info. At least one key to be updated (name or admin) is required.
@@ -161,10 +175,10 @@ paths:
type: boolean
description: update admin (optional, if another key is updated i.e. name)
responses:
'200':
"200":
description: The updated user info
schema:
$ref: '#/definitions/User'
$ref: "#/definitions/User"
delete:
summary: Delete a user
parameters:
@@ -174,8 +188,63 @@ paths:
required: true
type: string
responses:
'204':
"204":
description: The user has been deleted
/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: body
in: body
schema:
type: object
properties:
last_activity:
type: string
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:
"401":
$ref: "#/responses/Unauthorized"
"404":
description: No such user
/users/{name}/server:
post:
summary: Start a user's single-user notebook server
@@ -185,10 +254,23 @@ paths:
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':
"201":
description: The user's notebook server has started
'202':
"202":
description: The user's notebook server has not yet started, but has been requested
delete:
summary: Stop a user's server
@@ -199,9 +281,9 @@ paths:
required: true
type: string
responses:
'204':
"204":
description: The user's notebook server has stopped
'202':
"202":
description: The user's notebook server has not yet stopped as it is taking a while to stop
/users/{name}/servers/{server_name}:
post:
@@ -213,14 +295,27 @@ paths:
required: true
type: string
- name: server_name
description: name given to a named-server
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':
"201":
description: The user's notebook named-server has started
'202':
"202":
description: The user's notebook named-server has not yet started, but has been requested
delete:
summary: Stop a user's named-server
@@ -235,69 +330,106 @@ paths:
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':
"204":
description: The user's notebook named-server has stopped
'202':
"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':
"200":
description: The list of tokens
schema:
type: array
items:
$ref: '#/definitions/Token'
$ref: "#/definitions/Token"
"401":
$ref: "#/responses/Unauthorized"
"404":
description: No such user
post:
summary: Create a new token for the user
parameters:
- name: expires_in
type: number
required: false
- name: token_params
in: body
description: lifetime (in seconds) after which the requested token will expire.
- name: note
type: string
required: false
in: body
description: A note attached to the token for future bookkeeping
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':
"201":
description: The newly created token
schema:
$ref: '#/definitions/Token'
$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':
"200":
description: The info for the new token
schema:
$ref: '#/definitions/Token'
$ref: "#/definitions/Token"
delete:
summary: Delete (revoke) a token by id
responses:
'204':
"204":
description: The token has been deleted
/user:
summary: Return authenticated user's model
description:
parameters:
responses:
'200':
description: The authenticated user's model is returned.
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':
"200":
description: The list of groups
schema:
type: array
items:
$ref: '#/definitions/Group'
$ref: "#/definitions/Group"
/groups/{name}:
get:
summary: Get a group by name
@@ -308,10 +440,10 @@ paths:
required: true
type: string
responses:
'200':
"200":
description: The group model
schema:
$ref: '#/definitions/Group'
$ref: "#/definitions/Group"
post:
summary: Create a group
parameters:
@@ -321,10 +453,10 @@ paths:
required: true
type: string
responses:
'201':
"201":
description: The group has been created
schema:
$ref: '#/definitions/Group'
$ref: "#/definitions/Group"
delete:
summary: Delete a group
parameters:
@@ -334,7 +466,7 @@ paths:
required: true
type: string
responses:
'204':
"204":
description: The group has been deleted
/groups/{name}/users:
post:
@@ -345,7 +477,7 @@ paths:
in: path
required: true
type: string
- name: data
- name: body
in: body
required: true
description: The users to add to the group
@@ -358,10 +490,10 @@ paths:
items:
type: string
responses:
'200':
"200":
description: The users have been added to the group
schema:
$ref: '#/definitions/Group'
$ref: "#/definitions/Group"
delete:
summary: Remove users from a group
parameters:
@@ -370,7 +502,7 @@ paths:
in: path
required: true
type: string
- name: data
- name: body
in: body
required: true
description: The users to remove from the group
@@ -383,18 +515,18 @@ paths:
items:
type: string
responses:
'200':
"200":
description: The users have been removed from the group
/services:
get:
summary: List services
responses:
'200':
"200":
description: The service list
schema:
type: array
items:
$ref: '#/definitions/Service'
$ref: "#/definitions/Service"
/services/{name}:
get:
summary: Get a service by name
@@ -405,16 +537,16 @@ paths:
required: true
type: string
responses:
'200':
"200":
description: The Service model
schema:
$ref: '#/definitions/Service'
$ref: "#/definitions/Service"
/proxy:
get:
summary: Get the proxy's routing table
description: A convenience alias for getting the routing table directly from the proxy
responses:
'200':
"200":
description: Routing table
schema:
type: object
@@ -422,13 +554,13 @@ paths:
post:
summary: Force the Hub to sync with the proxy
responses:
'200':
"200":
description: Success
patch:
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.
@@ -448,7 +580,7 @@ paths:
type: string
description: CONFIGPROXY_AUTH_TOKEN for the new proxy
responses:
'200':
"200":
description: Success
/authorizations/token:
post:
@@ -460,16 +592,17 @@ paths:
Logging in via this method is only available when the active Authenticator
accepts passwords (e.g. not OAuth).
parameters:
- name: username
- name: credentials
in: body
required: false
type: string
- name: password
in: body
required: false
type: string
schema:
type: object
properties:
username:
type: string
password:
type: string
responses:
'200':
"200":
description: The new API token
schema:
type: object
@@ -477,44 +610,44 @@ paths:
token:
type: string
description: The new API token.
'403':
"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
- name: token
in: path
required: true
type: string
responses:
'200':
"200":
description: The user or service identified by the API token
'404':
"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 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':
"200":
description: The user identified by the cookie
schema:
$ref: '#/definitions/User'
'404':
$ref: "#/definitions/User"
"404":
description: A user is not found.
/oauth2/authorize:
get:
summary: 'OAuth 2.0 authorize endpoint'
summary: "OAuth 2.0 authorize endpoint"
description: |
Redirect users to this URL to begin the OAuth process.
It is not an API endpoint.
@@ -539,6 +672,11 @@ paths:
in: query
required: true
type: string
responses:
"200":
description: Success
"400":
description: OAuth2Error
/oauth2/token:
post:
summary: Request an OAuth2 token
@@ -550,31 +688,31 @@ paths:
parameters:
- name: client_id
description: The client id
in: form
in: formData
required: true
type: string
- name: client_secret
description: The client secret
in: form
in: formData
required: true
type: string
- name: grant_type
description: The grant type (always 'authorization_code')
in: form
in: formData
required: true
type: string
- name: code
description: The code provided by the authorization redirect
in: form
in: formData
required: true
type: string
- name: redirect_uri
description: The redirect url
in: form
in: formData
required: true
type: string
responses:
'200':
"200":
description: JSON response including the token
schema:
type: object
@@ -589,14 +727,28 @@ paths:
post:
summary: Shutdown the Hub
parameters:
- name: proxy
- name: body
in: body
type: boolean
description: Whether the proxy should be shutdown as well (default from Hub config)
- name: servers
in: body
type: boolean
description: Whether users' notebook servers should be shutdown as well (default from Hub config)
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:
"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
@@ -624,11 +776,10 @@ definitions:
format: date-time
description: Timestamp of last-seen activity from the user
servers:
type: object
type: array
description: The active servers for this user.
items:
schema:
$ref: '#/definitions/Server'
$ref: "#/definitions/Server"
Server:
type: object
properties:
@@ -666,6 +817,9 @@ definitions:
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:
@@ -719,7 +873,7 @@ definitions:
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)
description: The service that owns the token (undefined if owned by a user)
note:
type: string
description: A note about the token, typically describing what it was created for.

View File

@@ -1,106 +1,4 @@
div#helm-chart-schema h2,
div#helm-chart-schema h3,
div#helm-chart-schema h4,
div#helm-chart-schema h5,
div#helm-chart-schema h6 {
font-family: courier new;
}
h3, h3 ~ * {
margin-left: 3% !important;
}
h4, h4 ~ * {
margin-left: 6% !important;
}
h5, h5 ~ * {
margin-left: 9% !important;
}
h6, h6 ~ * {
margin-left: 12% !important;
}
h7, h7 ~ * {
margin-left: 15% !important;
}
img.logo {
width:100%
}
.right-next {
float: right;
max-width: 45%;
overflow: auto;
text-overflow: ellipsis;
white-space: nowrap;
}
.right-next::after{
content: ' »';
}
.left-prev {
float: left;
max-width: 45%;
overflow: auto;
text-overflow: ellipsis;
white-space: nowrap;
}
.left-prev::before{
content: '« ';
}
.prev-next-bottom {
margin-top: 3em;
}
.prev-next-top {
margin-bottom: 1em;
}
/* Sidebar TOC and headers */
div.sphinxsidebarwrapper div {
margin-bottom: .8em;
}
div.sphinxsidebar h3 {
font-size: 1.3em;
padding-top: 0px;
font-weight: 800;
margin-left: 0px !important;
}
div.sphinxsidebar p.caption {
font-size: 1.2em;
margin-bottom: 0px;
margin-left: 0px !important;
font-weight: 900;
color: #767676;
}
div.sphinxsidebar ul {
font-size: .8em;
margin-top: 0px;
padding-left: 3%;
margin-left: 0px !important;
}
div.relations ul {
font-size: 1em;
margin-left: 0px !important;
}
div#searchbox form {
margin-left: 0px !important;
}
/* body elements */
.toctree-wrapper span.caption-text {
color: #767676;
font-style: italic;
font-weight: 300;
}
/* Added to avoid logo being too squeezed */
.navbar-brand {
height: 4rem !important;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -1,16 +0,0 @@
{# Custom template for navigation.html
alabaster theme does not provide blocks for titles to
be overridden so this custom theme handles title and
toctree for sidebar
#}
<h3>{{ _('Table of Contents') }}</h3>
{{ toctree(includehidden=theme_sidebar_includehidden, collapse=theme_sidebar_collapse) }}
{% if theme_extra_nav_links %}
<hr />
<ul>
{% for text, uri in theme_extra_nav_links.items() %}
<li class="toctree-l1"><a href="{{ uri }}">{{ text }}</a></li>
{% endfor %}
</ul>
{% endif %}

View File

@@ -1,30 +0,0 @@
{% extends '!page.html' %}
{# Custom template for page.html
Alabaster theme does not provide blocks for prev/next at bottom of each page.
This is _in addition_ to the prev/next in the sidebar. The "Prev/Next" text
or symbols are handled by CSS classes in _static/custom.css
#}
{% macro prev_next(prev, next, prev_title='', next_title='') %}
{%- if prev %}
<a class='left-prev' href="{{ prev.link|e }}" title="{{ _('previous chapter')}}">{{ prev_title or prev.title }}</a>
{%- endif %}
{%- if next %}
<a class='right-next' href="{{ next.link|e }}" title="{{ _('next chapter')}}">{{ next_title or next.title }}</a>
{%- endif %}
<div style='clear:both;'></div>
{% endmacro %}
{% block body %}
<div class='prev-next-top'>
{{ prev_next(prev, next, 'Previous', 'Next') }}
</div>
{{super()}}
<div class='prev-next-bottom'>
{{ prev_next(prev, next) }}
</div>
{% endblock %}

View File

@@ -1,17 +0,0 @@
{# Custom template for relations.html
alabaster theme does not provide previous/next page by default
#}
<div class="relations">
<h3>Navigation</h3>
<ul>
<li><a href="{{ pathto(master_doc) }}">Documentation Home</a><ul>
{%- if prev %}
<li><a href="{{ prev.link|e }}" title="Previous">Previous topic</a></li>
{%- endif %}
{%- if next %}
<li><a href="{{ next.link|e }}" title="Next">Next topic</a></li>
{%- endif %}
</ul>
</ul>
</div>

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!

View File

@@ -13,4 +13,3 @@ Module: :mod:`jupyterhub.app`
-------------------
.. autoconfigurable:: JupyterHub

View File

@@ -26,3 +26,7 @@ Module: :mod:`jupyterhub.auth`
.. autoconfigurable:: PAMAuthenticator
:class:`DummyAuthenticator`
---------------------------
.. autoconfigurable:: DummyAuthenticator

View File

@@ -1,8 +1,8 @@
.. _api-index:
##################
The JupyterHub API
##################
##############
JupyterHub API
##############
:Release: |release|
:Date: |today|
@@ -18,7 +18,7 @@ information on:
- 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>`__.
`here (on swagger's petstore) <https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/HEAD/docs/rest-api.yml#!/default>`__.
The `OpenAPI Initiative`_ (fka Swagger™) is a project used to describe
and document RESTful APIs.

View File

@@ -20,4 +20,3 @@ Module: :mod:`jupyterhub.proxy`
.. autoconfigurable:: ConfigurableHTTPProxy
:members: debug, auth_token, check_running_interval, api_url, command

View File

@@ -14,4 +14,3 @@ Module: :mod:`jupyterhub.services.service`
.. autoconfigurable:: Service
:members: name, admin, url, api_token, managed, kind, command, cwd, environment, user, oauth_client_id, server, prefix, proxy_spec

View File

@@ -38,4 +38,3 @@ Module: :mod:`jupyterhub.services.auth`
--------------------------------
.. autoclass:: HubOAuthCallbackHandler

View File

@@ -13,10 +13,9 @@ Module: :mod:`jupyterhub.spawner`
----------------
.. autoconfigurable:: Spawner
:members: options_from_form, poll, start, stop, get_args, get_env, get_state, template_namespace, format_string
:members: options_from_form, poll, start, stop, get_args, get_env, get_state, template_namespace, format_string, create_certs, move_certs
:class:`LocalProcessSpawner`
----------------------------
.. autoconfigurable:: LocalProcessSpawner

View File

@@ -34,4 +34,3 @@ Module: :mod:`jupyterhub.user`
.. attribute:: spawner
The user's :class:`~.Spawner` instance.

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +1,7 @@
# -*- coding: utf-8 -*-
#
import sys
import os
import shlex
# For conversion from markdown to html
import recommonmark.parser
import sys
# Set paths
sys.path.insert(0, os.path.abspath('.'))
@@ -21,10 +17,11 @@ extensions = [
'sphinx.ext.intersphinx',
'sphinx.ext.napoleon',
'autodoc_traits',
'sphinx_copybutton',
'sphinx-jsonschema',
'recommonmark',
]
templates_path = ['_templates']
# The master toctree document.
master_doc = 'index'
@@ -39,7 +36,6 @@ from os.path import dirname
docs = dirname(dirname(__file__))
root = dirname(docs)
sys.path.insert(0, root)
sys.path.insert(0, os.path.join(docs, 'sphinxext'))
import jupyterhub
@@ -58,7 +54,69 @@ default_role = 'literal'
# -- Source -------------------------------------------------------------
source_parsers = {'.md': 'recommonmark.parser.CommonMarkParser'}
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'
@@ -66,7 +124,7 @@ source_suffix = ['.rst', '.md']
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages.
html_theme = 'alabaster'
html_theme = 'pydata_sphinx_theme'
html_logo = '_static/images/logo/logo.png'
html_favicon = '_static/images/logo/favicon.ico'
@@ -74,31 +132,6 @@ html_favicon = '_static/images/logo/favicon.ico'
# Paths that contain custom static files (such as style sheets)
html_static_path = ['_static']
html_theme_options = {
'show_related': True,
'description': 'Documentation for JupyterHub',
'github_user': 'jupyterhub',
'github_repo': 'jupyterhub',
'github_banner': False,
'github_button': True,
'github_type': 'star',
'show_powered_by': False,
'extra_nav_links': {
'GitHub Repo': 'http://github.com/jupyterhub/jupyterhub',
'Issue Tracker': 'http://github.com/jupyterhub/jupyterhub/issues',
},
}
html_sidebars = {
'**': [
'about.html',
'searchbox.html',
'navigation.html',
'relations.html',
'sourcelink.html',
]
}
htmlhelp_basename = 'JupyterHubdoc'
# -- Options for LaTeX output ---------------------------------------------
@@ -181,14 +214,12 @@ intersphinx_mapping = {'https://docs.python.org/3/': None}
# -- Read The Docs --------------------------------------------------------
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd:
html_theme = 'alabaster'
else:
if on_rtd:
# readthedocs.org uses their theme by default, so no need to specify it
# build rest-api, since RTD doesn't run make
# build both metrics and rest-api, since RTD doesn't run make
from subprocess import check_call as sh
sh(['make', 'rest-api'], cwd=docs)
sh(['make', 'metrics', 'rest-api'], cwd=docs)
# -- Spell checking -------------------------------------------------------

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
<https://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/HEAD/conduct/code_of_conduct.md>`_
(`reporting guidelines <https://github.com/jupyter/governance/blob/HEAD/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,95 @@
# 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,46 @@
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 at the bottom of this page_.
.. _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.
.. _page:
Event schemas
-------------
.. toctree::
:maxdepth: 2
server-actions.rst

View File

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

View File

@@ -8,27 +8,29 @@ 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)
- [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)
- [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)
- [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)
- [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)
- [Spinning up multiple Jupyter Notebooks on AWS for a tutorial](https://github.com/mblmicdiv/course2017/blob/HEAD/exercises/sourmash-setup.md)
Although not technically a JupyterHub deployment, this tutorial setup
may be helpful to others in the Jupyter community.
@@ -62,20 +64,25 @@ easy to do with RStudio too.
### Clemson University
- Advanced Computing
- [Palmetto cluster and JupyterHub](http://citi.sites.clemson.edu/2016/08/18/JupyterHub-for-Palmetto-Cluster.html)
- [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)
- (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/)
- [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
@@ -83,10 +90,15 @@ easy to do with RStudio too.
### University of Illinois
- https://datascience.business.illinois.edu
- 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
@@ -100,31 +112,44 @@ easy to do with RStudio too.
- https://dsa.missouri.edu/faq/
### University of Rochester CIRC
### 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)
- [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)
- [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/)
- [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
@@ -141,7 +166,6 @@ easy to do with RStudio too.
[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
@@ -151,9 +175,10 @@ easy to do with RStudio too.
- https://getcarina.com/blog/learning-how-to-whale/
- http://carolynvanslyck.com/talk/carina/jupyterhub/#/
### jcloud.io
- Open to public JupyterHub server
- https://jcloud.io
### 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

View File

@@ -4,39 +4,48 @@ 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 whitelist of users
You can restrict which users are allowed to login with a whitelist,
`Authenticator.whitelist`:
## Create a set of allowed users
You can restrict which users are allowed to login with a set,
`Authenticator.allowed_users`:
```python
c.Authenticator.whitelist = {'mal', 'zoe', 'inara', 'kaylee'}
c.Authenticator.allowed_users = {'mal', 'zoe', 'inara', 'kaylee'}
```
Users in the whitelist are added to the Hub database when the Hub is
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 `whitelist`. `admin_users` can take actions on other users'
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:
A set of initial admin users, `admin_users` can be configured as follows:
```python
c.Authenticator.admin_users = {'mal', 'zoe'}
```
Users in the admin list are automatically added to the user `whitelist`,
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 uses the PAMAuthenticator which provides the
`admin_groups` option and can set administrator status based on a user
group. For example we can let any user 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
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
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.**
@@ -44,12 +53,12 @@ sure your users know if admin_access is enabled.**
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 whitelist and database. Restarting the Hub
will not require manually updating the whitelist in your config file,
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 whitelist in your config file. You must also remove the 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.
@@ -82,6 +91,7 @@ JupyterHub's [OAuthenticator][] currently supports the following
popular services:
- Auth0
- Azure AD
- Bitbucket
- CILogon
- GitHub
@@ -95,5 +105,16 @@ popular services:
A generic implementation, which you can use for OAuth authentication
with any provider, is also available.
[PAM]: https://en.wikipedia.org/wiki/Pluggable_authentication_module
[OAuthenticator]: https://github.com/jupyterhub/oauthenticator
## Use DummyAuthenticator for testing
The `DummyAuthenticator` is a simple authenticator that
allows for any username/password unless 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

@@ -1,7 +1,7 @@
# Configuration Basics
The section contains basic information about configuring settings for a JupyterHub
deployment. The [Technical Reference](../reference/index.html)
deployment. The [Technical Reference](../reference/index)
documentation provides additional details.
This section will help you learn how to:
@@ -56,18 +56,18 @@ To display all command line options that are available for configuration:
```
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
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,
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
`c.Spawner.notebook_dir` trait from the command line, use the
`--Spawner.notebook_dir` option:
```bash
@@ -77,11 +77,24 @@ 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.html) and
[spawners](./spawners-basics.html) can be set in the configuration file.
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.html),
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 is 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 user 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,35 @@
# 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/...`.
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

@@ -1,5 +1,10 @@
Getting Started
===============
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
@@ -10,3 +15,5 @@ Getting Started
authenticators-users-basics
spawners-basics
services-basics
faq
institutional-faq

View File

@@ -0,0 +1,260 @@
# 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 and 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 JupyterLab 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 is 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 user groups (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 infrastructures 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 infrastructures 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 as 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 [Voilà 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

@@ -11,7 +11,7 @@ This section will help you with basic proxy and network configuration to:
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;
(`''`) 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
@@ -41,9 +41,9 @@ port.
## Set the Proxy's REST API communication URL (optional)
By default, this REST API listens on port 8081 of `localhost` only.
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.
API URL can be configured separately to override the default settings.
### Set api_url
@@ -74,7 +74,7 @@ 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
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
@@ -82,20 +82,20 @@ 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
**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.
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
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
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

@@ -45,7 +45,7 @@ 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>`_.
in the JupyterHub `Troubleshooting FAQ <../troubleshooting.html>`_.
Using letsencrypt
~~~~~~~~~~~~~~~~~
@@ -80,6 +80,49 @@ 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
@@ -124,7 +167,7 @@ hex-encoded string. You can set it this way:
.. code-block:: bash
export JPY_COOKIE_SECRET=`openssl rand -hex 32`
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
@@ -146,41 +189,73 @@ itself, ``jupyterhub_config.py``, as a binary string:
If the cookie secret value changes for the Hub, all single-user notebook
servers must also be restarted.
.. _cookies:
.. _authentication-token:
Cookies used by JupyterHub authentication
-----------------------------------------
Proxy authentication token
--------------------------
The following cookies are used by the Hub for handling user authentication.
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``).
This section was created based on this post_ from Discourse.
Generating and storing token in the configuration file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. _post: https://discourse.jupyter.org/t/how-to-force-re-login-for-users/1998/6
Or you can set the value in the configuration file, ``jupyterhub_config.py``:
jupyterhub-hub-login
~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
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.
c.JupyterHub.proxy_auth_token = '0bc02bede919e99a26de1e2a7a5aadfaf6228de836ec39a05a6c6942831d8fe5'
Resetting the Hub cookie secret effectively revokes this cookie.
Generating and storing as an environment variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This cookie is restricted to the path ``/hub/``.
You can pass this value of the proxy authentication token to the Hub and Proxy
using the ``CONFIGPROXY_AUTH_TOKEN`` environment variable:
jupyterhub-user-<username>
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
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.
export CONFIGPROXY_AUTH_TOKEN='openssl rand -hex 32'
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.
This environment variable needs to be visible to the Hub and Proxy.
Each OAuth access token is associated with a session id (see ``jupyterhub-session-id`` section
below).
Default if token is not set
~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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).
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

@@ -2,10 +2,10 @@
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 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.
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
[jupyterhub_idle_culler][] script can be used as a Service.
## Real-world example to cull idle servers
@@ -14,12 +14,12 @@ 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.html)
- show how the [cull_idle_servers][] script can be:
- used in a Hub-managed service
- run as a standalone script
single-user servers as of [version 0.8.0](../changelog)
- show how the [jupyterhub_idle_culler][] 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
Both examples for `jupyterhub_idle_culler` will communicate tasks to the
Hub via the REST API.
## API Token basics
@@ -29,14 +29,14 @@ Hub via the REST API.
To run such an external service, an API token must be created and
provided to the service.
As of [version 0.6.0](../changelog.html), the preferred way of doing
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.html), a TOKEN request page for
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)
@@ -78,17 +78,23 @@ 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
## Configure the idle culler to run as a Hub-Managed Service
Install the idle culler:
```
pip install jupyterhub-idle-culler
```
In `jupyterhub_config.py`, add the following dictionary for the
`cull-idle` Service to the `c.JupyterHub.services` list:
`idle-culler` Service to the `c.JupyterHub.services` list:
```python
c.JupyterHub.services = [
{
'name': 'cull-idle',
'name': 'idle-culler',
'admin': True,
'command': 'python3 cull_idle_servers.py --timeout=3600'.split(),
'command': [sys.executable, '-m', 'jupyterhub_idle_culler', '--timeout=3600'],
}
]
```
@@ -101,21 +107,21 @@ where:
## Run `cull-idle` manually as a standalone script
Now you can run your script, i.e. `cull_idle_servers`, by providing it
Now you can run your script 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
This will run the idle culler service manually. It 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.
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.
variable. Run `jupyterhub_idle_culler` manually.
```bash
export JUPYTERHUB_API_TOKEN='token'
python3 cull_idle_servers.py [--timeout=900] [--url=http://127.0.0.1:8081/hub/api]
python -m jupyterhub_idle_culler [--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
[jupyterhub_idle_culler]: https://github.com/jupyterhub/jupyterhub-idle-culler

View File

@@ -1,8 +1,8 @@
# 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.
multi-process application, there are many aspects of that server that can be configured, 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
@@ -14,7 +14,7 @@ expanded to the user's home directory.
c.Spawner.notebook_dir = '~/notebooks'
```
You can also specify extra command-line arguments to the notebook server with:
You can also specify extra command line arguments to the notebook server with:
```python
c.Spawner.args = ['--debug', '--profile=PHYS131']

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 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: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 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,21 +1,38 @@
==========
JupyterHub
==========
`JupyterHub`_, a multi-user **Hub**, spawns, manages, and proxies multiple
`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.
JupyterHub can be used to serve notebooks to a class of students, a corporate
data science group, or a scientific research group.
.. image:: images/jhub-parts.png
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:
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>`__ .
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: 40%
:align: right
:width: 80%
:align: center
Three subsystems make up JupyterHub:
* a multi-user **Hub** (tornado process)
* a **configurable http proxy** (node-http-proxy)
* multiple **single-user Jupyter notebook servers** (Python/IPython/tornado)
JupyterHub performs the following functions:
@@ -28,96 +45,106 @@ JupyterHub performs the following functions:
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
--------
========
**Installation Guide**
.. _index/distributions:
* :doc:`installation-guide`
* :doc:`quickstart`
* :doc:`quickstart-docker`
* :doc:`installation-basics`
Distributions
-------------
**Getting Started**
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.
* :doc:`getting-started/index`
* :doc:`getting-started/config-basics`
* :doc:`getting-started/networking-basics`
* :doc:`getting-started/security-basics`
* :doc:`getting-started/authenticators-users-basics`
* :doc:`getting-started/spawners-basics`
* :doc:`getting-started/services-basics`
The two popular ones are:
**Technical Reference**
* `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.
* :doc:`reference/index`
* :doc:`reference/technical-overview`
* :doc:`reference/websecurity`
* :doc:`reference/authenticators`
* :doc:`reference/spawners`
* :doc:`reference/services`
* :doc:`reference/rest`
* :doc:`reference/upgrading`
* :doc:`reference/config-examples`
* :doc:`reference/config-ghoauth`
* :doc:`reference/config-proxy`
* :doc:`reference/config-sudo`
Installation Guide
------------------
**API Reference**
.. toctree::
:maxdepth: 2
* :doc:`api/index`
installation-guide
**Tutorials**
Getting Started
---------------
* :doc:`tutorials/index`
* :doc:`tutorials/upgrade-dot-eight`
* `Zero to JupyterHub with Kubernetes <https://zero-to-jupyterhub.readthedocs.io/en/latest/>`_
.. toctree::
:maxdepth: 2
**Troubleshooting**
getting-started/index
* :doc:`troubleshooting`
Technical Reference
-------------------
**About JupyterHub**
.. toctree::
:maxdepth: 2
* :doc:`contributor-list`
* :doc:`gallery-jhub-deployments`
reference/index
**Changelog**
Administrators guide
--------------------
* :doc:`changelog`
.. toctree::
:maxdepth: 2
index-admin
API Reference
-------------
.. toctree::
:maxdepth: 2
api/index
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/HEAD/conduct/code_of_conduct.md>`_
(`reporting guidelines <https://github.com/jupyter/governance/blob/HEAD/conduct/reporting_online.md>`_)
helps keep our community welcoming to as many people as possible.
.. toctree::
:maxdepth: 2
contributing/index
About JupyterHub
----------------
.. toctree::
:maxdepth: 2
index-about
Indices and tables
------------------
==================
* :ref:`genindex`
* :ref:`modindex`
Questions? Suggestions?
-----------------------
=======================
- `Jupyter mailing list <https://groups.google.com/forum/#!forum/jupyter>`_
- `Jupyter website <https://jupyter.org>`_
.. _contents:
Full Table of Contents
----------------------
.. toctree::
:maxdepth: 2
installation-guide
getting-started/index
reference/index
api/index
tutorials/index
troubleshooting
contributor-list
gallery-jhub-deployments
changelog
.. _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
.. _REST API: https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/HEAD/docs/rest-api.yml#!/default

View File

@@ -6,7 +6,7 @@ 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](./security-basics.html)).
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
@@ -28,7 +28,7 @@ Prior to beginning installation, it's helpful to consider some of the following:
- 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))
MySQL, or other databases supported by [SQLAlchemy](http://www.sqlalchemy.org))
## Folders and File Locations

View File

@@ -0,0 +1,6 @@
:orphan:
JupyterHub the hard way
=======================
This guide has moved to https://github.com/jupyterhub/jupyterhub-the-hard-way/blob/HEAD/docs/installation-guide-hard.md

View File

@@ -1,5 +1,9 @@
Installation Guide
==================
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

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

@@ -25,7 +25,7 @@ Starting JupyterHub with docker
The JupyterHub docker image can be started with the following command::
docker run -d --name jupyterhub jupyterhub/jupyterhub jupyterhub
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``.

View File

@@ -12,20 +12,24 @@ Before installing JupyterHub, you will need:
- [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
- 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
- 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
@@ -74,12 +78,12 @@ 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:
`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
describes how to run the server as a _less privileged user_. This requires
additional configuration of the system.

View File

@@ -5,8 +5,8 @@ Hub and single user notebook servers.
## The default PAM Authenticator
JupyterHub ships only with the default [PAM][]-based Authenticator,
for logging in with local user accounts via a username and password.
JupyterHub ships with the default [PAM][]-based Authenticator, for
logging in with local user accounts via a username and password.
## The OAuthenticator
@@ -34,12 +34,17 @@ popular services:
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
- ldapauthenticator for LDAP
- tmpauthenticator for temporary accounts
- For Shibboleth, [jhub_shibboleth_auth](https://github.com/gesiscss/jhub_shibboleth_auth)
and [jhub_remote_user_authenticator](https://github.com/cwaldbieser/jhub_remote_user_authenticator)
A partial list of other authenticators is available on the
[JupyterHub wiki](https://github.com/jupyterhub/jupyterhub/wiki/Authenticators).
## Technical Overview of Authentication
@@ -70,7 +75,6 @@ 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
@@ -80,13 +84,11 @@ class DictionaryAuthenticator(Authenticator):
help="""dict of username:password for authentication"""
)
@gen.coroutine
def authenticate(self, handler, data):
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,
@@ -103,6 +105,15 @@ c.Authenticator.username_map = {
}
```
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.
@@ -119,7 +130,6 @@ To only allow usernames that start with 'w':
c.Authenticator.username_pattern = r'w.*'
```
### How to write a custom authenticator
You can use custom Authenticator subclasses to enable authentication
@@ -132,12 +142,45 @@ 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
@@ -172,12 +215,10 @@ To store auth_state, two conditions must be met:
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.
@@ -187,10 +228,9 @@ 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)
async def authenticate(self, handler, data=None):
username = await identify_user(handler, data)
upstream_token = await token_for_user(username)
return {
'name': username,
'auth_state': {
@@ -198,10 +238,9 @@ class MyAuthenticator(Authenticator):
},
}
@gen.coroutine
def pre_spawn_start(self, user, spawner):
async def pre_spawn_start(self, user, spawner):
"""Pass upstream_token to spawner via environment variable"""
auth_state = yield user.get_auth_state()
auth_state = await user.get_auth_state()
if not auth_state:
# auth_state not enabled
return
@@ -220,11 +259,10 @@ PAM session.
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)]: http://jupyterhub.readthedocs.io/en/latest/api/auth.html#jupyterhub.auth.Authenticator.pre_spawn_start
[post_spawn_stop(user, spawner)]: http://jupyterhub.readthedocs.io/en/latest/api/auth.html#jupyterhub.auth.Authenticator.post_spawn_stop
[authenticator]: https://github.com/jupyterhub/jupyterhub/blob/HEAD/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

@@ -3,18 +3,17 @@
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
- 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
- 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
- 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`.
- All runtime files are put into `/srv/jupyterhub` and log files in `/var/log`.
The `jupyterhub_config.py` file would have these settings:
@@ -52,7 +51,7 @@ c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']
c.LocalAuthenticator.create_system_users = True
# specify users and admin
c.Authenticator.whitelist = {'rgbkrk', 'minrk', 'jhamrick'}
c.Authenticator.allowed_users = {'rgbkrk', 'minrk', 'jhamrick'}
c.Authenticator.admin_users = {'jhamrick', 'rgbkrk'}
# uses the default spawner
@@ -79,4 +78,4 @@ 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

@@ -6,21 +6,23 @@ 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,
- 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
- `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
c.JupyterHub.ip = '127.0.0.1'
# 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:
@@ -81,8 +83,12 @@ server {
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_set_header X-Scheme $scheme;
proxy_buffering off;
}
# Managing requests to verify letsencrypt host
@@ -137,6 +143,21 @@ 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
@@ -190,3 +211,25 @@ Listen 443
</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

@@ -9,7 +9,7 @@ Only do this if you are very sure you must.
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 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
@@ -37,7 +37,7 @@ Next, you will need [sudospawner](https://github.com/jupyter/sudospawner)
to enable monitoring the single-user servers with sudo:
```bash
sudo pip install sudospawner
sudo python3 -m pip install sudospawner
```
Now we have to configure sudo to allow the Hub user (`rhea`) to launch
@@ -50,14 +50,13 @@ 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`
- give `rhea` permission to run `JUPYTER_CMD` on behalf of `JUPYTER_USERS`
without entering a password
For example:
```bash
# comma-separated whitelist of users that can spawn single-user servers
# 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
@@ -70,7 +69,7 @@ Cmnd_Alias JUPYTER_CMD = /usr/local/bin/sudospawner
rhea ALL=(JUPYTER_USERS) NOPASSWD:JUPYTER_CMD
```
It might be useful to modifiy `secure_path` to add commands in path.
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`:
@@ -91,16 +90,16 @@ $ adduser -G jupyterhub newuser
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
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
...
```
@@ -120,6 +119,11 @@ 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
@@ -146,12 +150,13 @@ We want our new user to be able to read the shadow passwords, so add it to the s
$ sudo usermod -a -G shadow rhea
```
If you want jupyterhub to serve pages on a restricted port (such as port 80 for http),
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
@@ -160,7 +165,6 @@ 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.
@@ -181,7 +185,7 @@ $ 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
We want our new user to be able to read the shadow passwords, so add it to the
shadow group:
```bash
@@ -204,8 +208,8 @@ 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
$ sudo mkdir /etc/jupyterhub
$ sudo chown rhea /etc/jupyterhub
```
## Start jupyterhub
@@ -213,20 +217,20 @@ and use that as the CWD when launching the server.
Finally, start the server as our newly configured user, `rhea`:
```bash
$ cd /etc/jupyterhub
$ sudo -u rhea jupyterhub --JupyterHub.spawner_class=sudospawner.SudoSpawner
$ cd /etc/jupyterhub
$ sudo -u rhea jupyterhub --JupyterHub.spawner_class=sudospawner.SudoSpawner
```
And try logging in.
### Troubleshooting: SELinux
## 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 sudo_exec_selinux.te:
First, put this in a file named `sudo_exec_selinux.te`:
```bash
module sudo_exec 1.1;
module sudo_exec_selinux 1.1;
require {
type unconfined_t;
@@ -246,9 +250,9 @@ $ semodule_package -o sudo_exec_selinux.pp -m sudo_exec_selinux.mod
$ semodule -i sudo_exec_selinux.pp
```
### Troubleshooting: PAM session errors
## Troubleshooting: PAM session errors
If the PAM authentication doesn't work and you see errors for
`login:session-auth`, or similar, considering updating to `master`
and/or incorporating this commit https://github.com/jupyter/jupyterhub/commit/40368b8f555f04ffdd662ffe99d32392a088b1d2
and configuration option, `c.PAMAuthenticator.open_sessions = False`.
`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

@@ -22,20 +22,18 @@ This section will focus on user environments, including:
- 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.
`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
```
@@ -47,7 +45,6 @@ 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)
@@ -64,6 +61,7 @@ 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}`.
@@ -91,7 +89,6 @@ c.MappingKernelManager.cull_idle_timeout = 20 * 60
c.MappingKernelManager.cull_interval = 2 * 60
```
## Installing kernelspecs
You may have multiple Jupyter kernels installed and want to make sure that
@@ -119,13 +116,12 @@ sure are available, I can install their specs system-wide (in /usr/local) with:
/path/to/python2 -m IPython kernel install --prefix=/usr/local
```
## Multi-user hosts vs. Containers
## Multi-user hosts vs. Containers
There are two broad categories of user environments that depend on what
Spawner you choose:
- Multi-user hosts (shared sytem)
- Multi-user hosts (shared system)
- Container-based
How you configure user environments for each category can differ a bit
@@ -141,7 +137,51 @@ 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,
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
```
## Switching to Jupyter Server
[Jupyter Server](https://jupyter-server.readthedocs.io/en/latest/) is a new Tornado Server backend for Jupyter web applications (e.g. JupyterLab 3.0 uses this package as its default backend).
By default, the single-user notebook server uses the (old) `NotebookApp` from the [notebook](https://github.com/jupyter/notebook) package. You can switch to using Jupyter Server's `ServerApp` backend (this will likely become the default in future releases) by setting the `JUPYTERHUB_SINGLEUSER_APP` environment variable to:
```bash
export JUPYTERHUB_SINGLEUSER_APP='jupyter_server.serverapp.ServerApp'
```

View File

@@ -46,8 +46,8 @@ additional configuration required for MySQL that is not needed for PostgreSQL.
- You should use the `pymysql` sqlalchemy provider (the other one, MySQLdb,
isn't available for py3).
- You also need to set `pool_recycle` to some value (typically 60 - 300)
which depends on your MySQL setup. This is necessary since MySQL kills
- You also need to set `pool_recycle` to some value (typically 60 - 300)
which depends on your MySQL setup. This is necessary since MySQL kills
connections serverside if they've been idle for a while, and the connection
from the hub will be idle for longer than most connections. This behavior
will lead to frustrating 'the connection has gone away' errors from

View File

@@ -1,21 +1,28 @@
Technical Reference
===================
This section covers more of the details of the JupyterHub architecture, as well as
what happens under-the-hood when you deploy and configure your JupyterHub.
.. toctree::
:maxdepth: 2
technical-overview
urls
websecurity
authenticators
spawners
services
proxy
separate-proxy
rest
monitoring
database
upgrading
templates
../events/index
config-user-env
config-examples
config-ghoauth
config-proxy
config-sudo
config-reference

View File

@@ -0,0 +1,20 @@
Monitoring
==========
This section covers details on monitoring the state of your JupyterHub installation.
JupyterHub expose the ``/metrics`` endpoint that returns text describing its current
operational state formatted in a way `Prometheus <https://prometheus.io/docs/introduction/overview/>`_ understands.
Prometheus is a separate open source tool that can be configured to repeatedly poll
JupyterHub's ``/metrics`` endpoint to parse and save its current state.
By doing so, Prometheus can describe JupyterHub's evolving state over time.
This evolving state can then be accessed through Prometheus that expose its underlying
storage to those allowed to access it, and be presented with dashboards by a
tool like `Grafana <https://grafana.com/docs/grafana/latest/getting-started/what-is-grafana/>`_.
.. toctree::
:maxdepth: 2
metrics

View File

@@ -2,7 +2,7 @@
JupyterHub 0.8 introduced the ability to write a custom implementation of the
proxy. This enables deployments with different needs than the default proxy,
configurable-http-proxy (CHP). CHP is a single-process nodejs proxy that they
configurable-http-proxy (CHP). CHP is a single-process nodejs proxy that the
Hub manages by default as a subprocess (it can be run externally, as well, and
typically is in production deployments).
@@ -19,7 +19,7 @@ In general, for a proxy to be usable by JupyterHub, it must:
1. support websockets without prior knowledge of the URL where websockets may
occur
2. support trie-based routing (i.e. allow different routes on `/foo` and
2. support trie-based routing (i.e. allow different routes on `/foo` and
`/foo/bar` and route based on specificity)
3. adding or removing a route should not cause existing connections to drop
@@ -45,23 +45,32 @@ If your proxy should be launched when the Hub starts, you must define how
to start and stop your proxy:
```python
from tornado import gen
class MyProxy(Proxy):
...
@gen.coroutine
def start(self):
async def start(self):
"""Start the proxy"""
@gen.coroutine
def stop(self):
async def stop(self):
"""Stop the proxy"""
```
These methods **may** be coroutines.
These methods **may** be coroutines.
`c.Proxy.should_start` is a configurable flag that determines whether the
Hub should call these methods when the Hub itself starts and stops.
## Encryption
When using `internal_ssl` to encrypt traffic behind the proxy, at minimum,
your `Proxy` will need client ssl certificates which the `Hub` must be made
aware of. These can be generated with the command `jupyterhub --generate-certs`
which will write them to the `internal_certs_location` in folders named
`proxy_api` and `proxy_client`. Alternatively, these can be provided to the
hub via the `jupyterhub_config.py` file by providing a `dict` of named paths
to the `external_authorities` option. The hub will include all certificates
provided in that `dict` in the trust bundle utilized by all internal
components.
### Purely external proxies
Probably most custom proxies will be externally managed,
@@ -93,15 +102,14 @@ route to be proxied, such as `/user/name/`. A routespec will:
### Adding a route
When adding a route, JupyterHub may pass a JSON-serializable dict as a `data`
argument that should be attacked to the proxy route. When that route is
retrieved, the `data` argument should be returned as well. If your proxy
argument that should be attached to the proxy route. When that route is
retrieved, the `data` argument should be returned as well. If your proxy
implementation doesn't support storing data attached to routes, then your
Python wrapper may have to handle storing the `data` piece itself, e.g in a
simple file or database.
```python
@gen.coroutine
def add_route(self, routespec, target, data):
async def add_route(self, routespec, target, data):
"""Proxy `routespec` to `target`.
Store `data` associated with the routespec
@@ -112,7 +120,7 @@ def add_route(self, routespec, target, data):
Adding a route for a user looks like this:
```python
proxy.add_route('/user/pgeorgiou/', 'http://127.0.0.1:1227',
await proxy.add_route('/user/pgeorgiou/', 'http://127.0.0.1:1227',
{'user': 'pgeorgiou'})
```
@@ -122,21 +130,19 @@ proxy.add_route('/user/pgeorgiou/', 'http://127.0.0.1:1227',
`delete_route` should still succeed, but a warning may be issued.
```python
@gen.coroutine
def delete_route(self, routespec):
async def delete_route(self, routespec):
"""Delete the route"""
```
### Retrieving routes
For retrieval, you only *need* to implement a single method that retrieves all
For retrieval, you only _need_ to implement a single method that retrieves all
routes. The return value for this function should be a dictionary, keyed by
`routespect`, of dicts whose keys are the same three arguments passed to
`add_route` (`routespec`, `target`, `data`)
```python
@gen.coroutine
def get_all_routes(self):
async def get_all_routes(self):
"""Return all routes, keyed by routespec"""
```
@@ -179,3 +185,38 @@ tracked, and services such as cull-idle will not work.
Now that `notebook-5.0` tracks activity internally, we can retrieve activity
information from the single-user servers instead, removing the need to track
activity in the proxy. But this is not yet implemented in JupyterHub 0.8.0.
### Registering custom Proxies via entry points
As of JupyterHub 1.0, custom proxy implementations can register themselves via
the `jupyterhub.proxies` entry point metadata.
To do this, in your `setup.py` add:
```python
setup(
...
entry_points={
'jupyterhub.proxies': [
'mything = mypackage:MyProxy',
],
},
)
```
If you have added this metadata to your package,
users can select your proxy with the configuration:
```python
c.JupyterHub.proxy_class = 'mything'
```
instead of the full
```python
c.JupyterHub.proxy_class = 'mypackage:MyProxy'
```
previously required.
Additionally, configurable attributes for your proxy will
appear in jupyterhub help output and auto-generated configuration files
via `jupyterhub --generate-config`.

View File

@@ -0,0 +1,14 @@
:orphan:
===================
JupyterHub REST API
===================
.. this doc exists as a resolvable link target
.. which _static files are not
.. meta::
:http-equiv=refresh: 0;url=../_static/rest-api/index.html
The rest API docs are `here <../_static/rest-api/index.html>`_
if you are not redirected automatically.

View File

@@ -27,7 +27,7 @@ Hub.
To send requests using JupyterHub API, you must pass an API token with
the request.
As of [version 0.6.0](../changelog.html), the preferred way of
As of [version 0.6.0](../changelog.md), the preferred way of
generating an API token is:
```bash
@@ -48,7 +48,7 @@ jupyterhub token <username>
This command generates a random string to use as a token and registers
it for the given user with the Hub's database.
In [version 0.8.0](../changelog.html), a TOKEN request page for
In [version 0.8.0](../changelog.md), a TOKEN request page for
generating an API token is available from the JupyterHub user interface:
![Request API TOKEN page](../images/token-request.png)
@@ -57,6 +57,9 @@ generating an API token is available from the JupyterHub user interface:
## Add API tokens to the config file
**This is deprecated. We are in no rush to remove this feature,
but please consider if service tokens are right for you.**
You may also add a dictionary of API tokens and usernames to the hub's
configuration file, `jupyterhub_config.py` (note that
the **key** is the 'secret-token' while the **value** is the 'username'):
@@ -67,6 +70,41 @@ c.JupyterHub.api_tokens = {
}
```
### Updating to admin services
The `api_tokens` configuration has been softly deprecated since the introduction of services.
We have no plans to remove it,
but users are encouraged to use service configuration instead.
If you have been using `api_tokens` to create an admin user
and a token for that user to perform some automations,
the services mechanism may be a better fit.
If you have the following configuration:
```python
c.JupyterHub.admin_users = {"service-admin",}
c.JupyterHub.api_tokens = {
"secret-token": "service-admin",
}
```
This can be updated to create an admin service, with the following configuration:
```python
c.JupyterHub.services = [
{
"name": "service-token",
"admin": True,
"api_token": "secret-token",
},
]
```
The token will have the same admin permissions,
but there will no longer be a user account created to house it.
The main noticeable difference is that there will be no notebook server associated with the account
and the service will not show up in the various user list pages and APIs.
## Make an API request
To authenticate your requests, pass the API token in the request's
@@ -131,15 +169,15 @@ curl -X POST -H "Authorization: token <token>" "http://127.0.0.1:8081/hub/api/us
```
With the named-server functionality, it's now possible to launch more than one
specifically named servers against a given user. This could be used, for instance,
specifically named servers against a given user. This could be used, for instance,
to launch each server based on a different image.
First you must enable named-servers by including the following setting in the `jupyterhub_config.py` file.
`c.JupyterHub.allow_named_servers = True`
If using the [zero-to-jupyterhub-k8s](https://github.com/jupyterhub/zero-to-jupyterhub-k8s) set-up to run JupyterHub,
then instead of editing the `jupyterhub_config.py` file directly, you could pass
If using the [zero-to-jupyterhub-k8s](https://github.com/jupyterhub/zero-to-jupyterhub-k8s) set-up to run JupyterHub,
then instead of editing the `jupyterhub_config.py` file directly, you could pass
the following as part of the `config.yaml` file, as per the [tutorial](https://zero-to-jupyterhub.readthedocs.io/en/latest/):
```bash
@@ -149,6 +187,7 @@ hub:
```
With that setting in place, a new named-server is activated like this:
```bash
curl -X POST -H "Authorization: token <token>" "http://127.0.0.1:8081/hub/api/users/<user>/servers/<serverA>"
curl -X POST -H "Authorization: token <token>" "http://127.0.0.1:8081/hub/api/users/<user>/servers/<serverB>"
@@ -158,17 +197,11 @@ The same servers can be stopped by substituting `DELETE` for `POST` above.
### Some caveats for using named-servers
The named-server capabilities are not fully implemented for JupyterHub as yet.
While it's possible to start/stop a server via the API, the UI on the
JupyterHub control-panel has not been implemented, and so it may not be obvious
to those viewing the panel that a named-server may be running for a given user.
For named-servers via the API to work, the spawner used to spawn these servers
will need to be able to handle the case of multiple servers per user and ensure
uniqueness of names, particularly if servers are spawned via docker containers
or kubernetes pods.
## Learn more about the API
You can see the full [JupyterHub REST API][] for details. This REST API Spec can
@@ -176,7 +209,7 @@ be viewed in a more [interactive style on swagger's petstore][].
Both resources contain the same information and differ only in its display.
Note: The Swagger specification is being renamed the [OpenAPI Initiative][].
[interactive style on swagger's petstore]: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/master/docs/rest-api.yml#!/default
[OpenAPI Initiative]: https://www.openapis.org/
[JupyterHub REST API]: ../_static/rest-api/index.html
[Jupyter Notebook REST API]: http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/notebook/master/notebook/services/api/api.yaml
[interactive style on swagger's petstore]: https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyterhub/jupyterhub/HEAD/docs/rest-api.yml#!/default
[openapi initiative]: https://www.openapis.org/
[jupyterhub rest api]: ./rest-api
[jupyter notebook rest api]: https://petstore3.swagger.io/?url=https://raw.githubusercontent.com/jupyter/notebook/HEAD/notebook/services/api/api.yaml

View File

@@ -0,0 +1,72 @@
# Running proxy separately from the hub
## Background
The thing which users directly connect to is the proxy, by default
`configurable-http-proxy`. The proxy either redirects users to the
hub (for login and managing servers), or to their own single-user
servers. Thus, as long as the proxy stays running, access to existing
servers continues, even if the hub itself restarts or goes down.
When you first configure the hub, you may not even realize this
because the proxy is automatically managed by the hub. This is great
for getting started and even most use, but everytime you restart the
hub, all user connections also get restarted. But it's also simple to
run the proxy as a service separate from the hub, so that you are free
to reconfigure the hub while only interrupting users who are currently
actively starting the hub.
The default JupyterHub proxy is
[configurable-http-proxy](https://github.com/jupyterhub/configurable-http-proxy),
and that page has some docs. If you are using a different proxy, such
as Traefik, these instructions are probably not relevant to you.
## Configuration options
`c.JupyterHub.cleanup_servers = False` should be set, which tells the
hub to not stop servers when the hub restarts (this is useful even if
you don't run the proxy separately).
`c.ConfigurableHTTPProxy.should_start = False` should be set, which
tells the hub that the proxy should not be started (because you start
it yourself).
`c.ConfigurableHTTPProxy.auth_token = "CONFIGPROXY_AUTH_TOKEN"` should be set to a
token for authenticating communication with the proxy.
`c.ConfigurableHTTPProxy.api_url = 'http://localhost:8001'` should be
set to the URL which the hub uses to connect _to the proxy's API_.
## Proxy configuration
You need to configure a service to start the proxy. An example
command line for this is `configurable-http-proxy --ip=127.0.0.1 --port=8000 --api-ip=127.0.0.1 --api-port=8001 --default-target=http://localhost:8081 --error-target=http://localhost:8081/hub/error`. (Details for how to
do this is out of scope for this tutorial - for example it might be a
systemd service on within another docker cotainer). The proxy has no
configuration files, all configuration is via the command line and
environment variables.
`--api-ip` and `--api-port` (which tells the proxy where to listen) should match the hub's `ConfigurableHTTPProxy.api_url`.
`--ip`, `-port`, and other options configure the _user_ connections to the proxy.
`--default-target` and `--error-target` should point to the hub, and used when users navigate to the proxy originally.
You must define the environment variable `CONFIGPROXY_AUTH_TOKEN` to
match the token given to `c.ConfigurableHTTPProxy.auth_token`.
You should check the [configurable-http-proxy
options](https://github.com/jupyterhub/configurable-http-proxy) to see
what other options are needed, for example SSL options. Note that
these are configured in the hub if the hub is starting the proxy - you
need to move the options to here.
## Docker image
You can use [jupyterhub configurable-http-proxy docker
image](https://hub.docker.com/r/jupyterhub/configurable-http-proxy/)
to run the proxy.
## See also
- [jupyterhub configurable-http-proxy](https://github.com/jupyterhub/configurable-http-proxy)

View File

@@ -15,7 +15,7 @@ This section provides the following information about Services:
## Definition of a Service
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
with the Hub's REST API. A Service may perform a specific
action or task. For example, the following tasks can each be a unique Service:
- shutting down individuals' single user notebook servers that have been idle
@@ -45,17 +45,14 @@ A Service may have the following properties:
- `url: str (default - None)` - The URL where the service is/should be. If a
url is specified for where the Service runs its own web server,
the service will be added to the proxy at `/services/:name`
- `api_token: str (default - None)` - For Externally-Managed Services you need to specify
- `api_token: str (default - None)` - For Externally-Managed Services you need to specify
an API token to perform API requests to the Hub
If a service is also to be managed by the Hub, it has a few extra options:
- `command: (str/Popen list`) - Command for JupyterHub to spawn the service.
- Only use this if the service should be a subprocess.
- If command is not specified, the Service is assumed to be managed
externally.
- If a command is specified for launching the Service, the Service will
be started and managed by the Hub.
- `command: (str/Popen list)` - Command for JupyterHub to spawn the service. - Only use this if the service should be a subprocess. - If command is not specified, the Service is assumed to be managed
externally. - If a command is specified for launching the Service, the Service will
be started and managed by the Hub.
- `environment: dict` - additional environment variables for the Service.
- `user: str` - the name of a system user to manage the Service. If
unspecified, run as the same user as the Hub.
@@ -91,9 +88,9 @@ This example would be configured as follows in `jupyterhub_config.py`:
```python
c.JupyterHub.services = [
{
'name': 'cull-idle',
'name': 'idle-culler',
'admin': True,
'command': ['python', '/path/to/cull-idle.py', '--timeout']
'command': [sys.executable, '-m', 'jupyterhub_idle_culler', '--timeout=3600']
}
]
```
@@ -103,9 +100,9 @@ parameters, which describe the environment needed to start the Service process:
- `environment: dict` - additional environment variables for the Service.
- `user: str` - name of the user to run the server if different from the Hub.
Requires Hub to be root.
Requires Hub to be root.
- `cwd: path` directory in which to run the Service, if different from the
Hub directory.
Hub directory.
The Hub will pass the following environment variables to launch the Service:
@@ -123,15 +120,14 @@ For the previous 'cull idle' Service example, these environment variables
would be passed to the Service when the Hub starts the 'cull idle' Service:
```bash
JUPYTERHUB_SERVICE_NAME: 'cull-idle'
JUPYTERHUB_SERVICE_NAME: 'idle-culler'
JUPYTERHUB_API_TOKEN: API token assigned to the service
JUPYTERHUB_API_URL: http://127.0.0.1:8080/hub/api
JUPYTERHUB_BASE_URL: https://mydomain[:port]
JUPYTERHUB_SERVICE_PREFIX: /services/cull-idle/
JUPYTERHUB_SERVICE_PREFIX: /services/idle-culler/
```
See the JupyterHub GitHub repo for additional information about the
[`cull-idle` example](https://github.com/jupyterhub/jupyterhub/tree/master/examples/cull-idle).
See the GitHub repo for additional information about the [jupyterhub_idle_culler][].
## Externally-Managed Services
@@ -151,6 +147,8 @@ c.JupyterHub.services = [
{
'name': 'my-web-service',
'url': 'https://10.0.1.1:1984',
# any secret >8 characters, you'll use api_token to
# authenticate api requests to the hub from your service
'api_token': 'super-secret',
}
]
@@ -198,16 +196,16 @@ can be used by services. You may go beyond this reference implementation and
create custom hub-authenticating clients and services. We describe the process
below.
The reference, or base, implementation is the [`HubAuth`][HubAuth] class,
The reference, or base, implementation is the [`HubAuth`][hubauth] class,
which implements the requests to the Hub.
To use HubAuth, you must set the `.api_token`, either programmatically when constructing the class,
or via the `JUPYTERHUB_API_TOKEN` environment variable.
Most of the logic for authentication implementation is found in the
[`HubAuth.user_for_cookie`](services.auth.html#jupyterhub.services.auth.HubAuth.user_for_cookie)
[`HubAuth.user_for_cookie`][hubauth.user_for_cookie]
and in the
[`HubAuth.user_for_token`](services.auth.html#jupyterhub.services.auth.HubAuth.user_for_token)
[`HubAuth.user_for_token`][hubauth.user_for_token]
methods, which makes a request of the Hub, and returns:
- None, if no user could be identified, or
@@ -232,7 +230,7 @@ configurable by the `cookie_cache_max_age` setting (default: five minutes).
For example, you have a Flask service that returns information about a user.
JupyterHub's HubAuth class can be used to authenticate requests to the Flask
service. See the `service-whoami-flask` example in the
[JupyterHub GitHub repo](https://github.com/jupyterhub/jupyterhub/tree/master/examples/service-whoami-flask)
[JupyterHub GitHub repo](https://github.com/jupyterhub/jupyterhub/tree/HEAD/examples/service-whoami-flask)
for more details.
```python
@@ -249,7 +247,7 @@ prefix = os.environ.get('JUPYTERHUB_SERVICE_PREFIX', '/')
auth = HubAuth(
api_token=os.environ['JUPYTERHUB_API_TOKEN'],
cookie_cache_max_age=60,
cache_max_age=60,
)
app = Flask(__name__)
@@ -284,11 +282,10 @@ def whoami(user):
)
```
### Authenticating tornado services with JupyterHub
Since most Jupyter services are written with tornado,
we include a mixin class, [`HubAuthenticated`][HubAuthenticated],
we include a mixin class, [`HubAuthenticated`][hubauthenticated],
for quickly authenticating your own tornado services with JupyterHub.
Tornado's `@web.authenticated` method calls a Handler's `.get_current_user`
@@ -309,64 +306,65 @@ class MyHandler(HubAuthenticated, web.RequestHandler):
...
```
The HubAuth will automatically load the desired configuration from the Service
environment variables.
If you want to limit user access, you can whitelist users through either the
If you want to limit user access, you can specify allowed users through either the
`.hub_users` attribute or `.hub_groups`. These are sets that check against the
username and user group list, respectively. If a user matches neither the user
list nor the group list, they will not be allowed access. If both are left
undefined, then any user will be allowed.
### Implementing your own Authentication with JupyterHub
If you don't want to use the reference implementation
(e.g. you find the implementation a poor fit for your Flask app),
you can implement authentication via the Hub yourself.
We recommend looking at the [`HubAuth`][HubAuth] class implementation for reference,
We recommend looking at the [`HubAuth`][hubauth] class implementation for reference,
and taking note of the following process:
1. retrieve the cookie `jupyterhub-services` from the request.
2. Make an API request `GET /hub/api/authorizations/cookie/jupyterhub-services/cookie-value`,
where cookie-value is the url-encoded value of the `jupyterhub-services` cookie.
This request must be authenticated with a Hub API token in the `Authorization` header.
For example, with [requests][]:
where cookie-value is the url-encoded value of the `jupyterhub-services` cookie.
This request must be authenticated with a Hub API token in the `Authorization` header,
for example using the `api_token` from your [external service's configuration](#externally-managed-services).
```python
r = requests.get(
'/'.join((["http://127.0.0.1:8081/hub/api",
"authorizations/cookie/jupyterhub-services",
quote(encrypted_cookie, safe=''),
]),
headers = {
'Authorization' : 'token %s' % api_token,
},
)
r.raise_for_status()
user = r.json()
```
For example, with [requests][]:
```python
r = requests.get(
'/'.join(["http://127.0.0.1:8081/hub/api",
"authorizations/cookie/jupyterhub-services",
quote(encrypted_cookie, safe=''),
]),
headers = {
'Authorization' : 'token %s' % api_token,
},
)
r.raise_for_status()
user = r.json()
```
3. On success, the reply will be a JSON model describing the user:
```json
{
"name": "inara",
"groups": ["serenity", "guild"],
"groups": ["serenity", "guild"]
}
```
An example of using an Externally-Managed Service and authentication is
in [nbviewer README]_ section on securing the notebook viewer,
and an example of its configuration is found [here](https://github.com/jupyter/nbviewer/blob/master/nbviewer/providers/base.py#L94).
nbviewer can also be run as a Hub-Managed Service as described [nbviewer README]_
in [nbviewer README][nbviewer example] section on securing the notebook viewer,
and an example of its configuration is found [here](https://github.com/jupyter/nbviewer/blob/ed942b10a52b6259099e2dd687930871dc8aac22/nbviewer/providers/base.py#L95).
nbviewer can also be run as a Hub-Managed Service as described [nbviewer README][nbviewer example]
section on securing the notebook viewer.
[requests]: http://docs.python-requests.org/en/master/
[services_auth]: ../api/services.auth.html
[HubAuth]: ../api/services.auth.html#jupyterhub.services.auth.HubAuth
[HubAuthenticated]: ../api/services.auth.html#jupyterhub.services.auth.HubAuthenticated
[hubauth]: ../api/services.auth.html#jupyterhub.services.auth.HubAuth
[hubauth.user_for_cookie]: ../api/services.auth.html#jupyterhub.services.auth.HubAuth.user_for_cookie
[hubauth.user_for_token]: ../api/services.auth.html#jupyterhub.services.auth.HubAuth.user_for_token
[hubauthenticated]: ../api/services.auth.html#jupyterhub.services.auth.HubAuthenticated
[nbviewer example]: https://github.com/jupyter/nbviewer#securing-the-notebook-viewer
[jupyterhub_idle_culler]: https://github.com/jupyterhub/jupyterhub-idle-culler

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