diff --git a/common/deployments/hub-staging.yaml b/common/deployments/hub-staging.yaml index 8221c595a9e24a02cc3ce8aa8c0634226937249f..f2eb7e5824de6b2ef3332ed8e002f0ff5db3666a 100644 --- a/common/deployments/hub-staging.yaml +++ b/common/deployments/hub-staging.yaml @@ -204,84 +204,11 @@ hub: c.JupyterHub.extra_handlers = [(r'/welcome', WelcomeHandler)] egi-notebooks-b2drop: |- {%- raw %} - import base64 import json - from jinja2 import BaseLoader - from jinja2 import Environment from egi_notebooks_hub.onedata import OnedataSpawner - from kubernetes_asyncio.client.rest import ApiException from tornado.httpclient import AsyncHTTPClient, HTTPClientError, HTTPRequest - - class B2DropSpawner(OnedataSpawner): - async def auth_state_hook(self, spawner, auth_state): - await super().auth_state_hook(spawner, auth_state) - self.b2drop_ready = False - self.b2drop_user = "" - self.b2drop_pwd = "" - try: - secret = await self.api.read_namespaced_secret(self.token_secret_name, self.namespace) - except ApiException: - return - if secret and secret.data: - self.b2drop_user = base64.b64decode(secret.data.get("b2drop-user", "")).decode() - self.b2drop_pwd = base64.b64decode(secret.data.get("b2drop-pwd", "")).decode() - self.b2drop_ready = (self.b2drop_user and self.b2drop_pwd) - - def _render_options_form(self, profile_list): - # old:self._profile_list = self._init_profile_list(profile_list) - self._profile_list = self._get_initialized_profile_list(profile_list) - - profile_form_template = Environment(loader=BaseLoader).from_string( - self.profile_form_template - ) - return profile_form_template.render(profile_list=self._profile_list, b2drop_ready=self.b2drop_ready, b2drop_user=self.b2drop_user, b2drop_pwd=self.b2drop_pwd) - - async def pre_spawn_hook(self, spawner): - await super(B2DropSpawner, self).pre_spawn_hook(spawner) - b2drop_user = self.user_options.get("b2drop-user", "") - b2drop_pwd = self.user_options.get("b2drop-pwd", "") - if not (b2drop_user and b2drop_pwd): - secret = await self.api.read_namespaced_secret(self.token_secret_name, self.namespace) - if secret and secret.data: - b2drop_user = base64.b64decode(secret.data.get("b2drop-user", "")).decode() - b2drop_pwd = base64.b64decode(secret.data.get("b2drop-pwd", "")).decode() - if b2drop_user and b2drop_pwd: - volume_mounts = [ - {"mountPath": "/owncloud:shared", "name": "owncloud-home"}, - ] - spawner.extra_containers.append( - { - "name": "b2drop", - "image": "eginotebooks/webdav-rclone-sidecar:sha-0a62679", - "env": [ - {"name": "WEBDAV_URL", "value": "https://b2drop.eudat.eu/remote.php/webdav"}, - {"name": "WEBDAV_PWD", "value": b2drop_pwd}, - {"name": "WEBDAV_USER", "value": b2drop_user}, - {"name": "WEBDAV_VENDOR", "value": "other"}, - {"name": "MOUNT_PATH", "value": "/owncloud/b2drop"}, - {"name": "MOUNT_WAIT_POINT", "value": "webdav-fs: /owncloud fuse.rclone"}, - ], - "resources": self.sidecar_resources, - "securityContext": { - "runAsUser": 1000, - "fsUser": 1000, - "fsGroup": 100, - "privileged": True, - "capabilities": {"add": ["SYS_ADMIN"]}, - }, - "volumeMounts": volume_mounts, - } - ) - - def options_from_form(self, formdata): - data = super(B2DropSpawner, self)._options_from_form(formdata) - data.update({'b2drop-user': formdata.get('b2drop-user', [None])[0], - 'b2drop-pwd': formdata.get('b2drop-pwd', [None])[0]}) - return data - - - class WebDavOIDCSpawner(B2DropSpawner): + class WebDavOIDCSpawner(OneDataSpawner): # ownCloud Infinite Scale parameters # (https://owncloud.dev/apis/http/graph/spaces/#list-my-spaces-get-medrives) OCIS_URL = "https://ocis-staging.apps.bst2-test.paas.psnc.pl" @@ -376,100 +303,9 @@ hub: else: self.log.info("No auth state, skipping ownCloud") - c.JupyterHub.spawner_class = WebDavOIDCSpawner - c.B2DropSpawner.token_mount_path = "/var/run/secrets/oidc/" - c.B2DropSpawner.http_timeout = 90 - c.B2DropSpawner.profile_form_template = """ - <style> - /* - .profile divs holds two div tags: one for a radio button, and one - for the profile's content. - */ - #kubespawner-profiles-list .profile { - display: flex; - flex-direction: row; - font-weight: normal; - border-bottom: 1px solid #ccc; - padding-bottom: 12px; - } - - #kubespawner-profiles-list .profile .radio { - padding: 12px; - } - - /* .option divs holds a label and a select tag */ - #kubespawner-profiles-list .profile .option { - display: flex; - flex-direction: row; - align-items: center; - padding-bottom: 12px; - } - - #kubespawner-profiles-list .profile .option label { - font-weight: normal; - margin-right: 8px; - min-width: 96px; - } - </style> - - <div class='form-group' id='kubespawner-profiles-list'> - {%- for profile in profile_list %} - {#- Wrap everything in a <label> so clicking anywhere selects the option #} - <label for='profile-item-{{ profile.slug }}' class='profile'> - <div class='radio'> - <input type='radio' name='profile' id='profile-item-{{ profile.slug }}' value='{{ profile.slug }}' {% if profile.default %}checked{% endif %} /> - </div> - <div> - <h3>{{ profile.display_name }}</h3> - - {%- if profile.description %} - <p>{{ profile.description }}</p> - {%- endif %} - - {%- if profile.profile_options %} - <div> - {%- for k, option in profile.profile_options.items() %} - <div class='option'> - <label for='profile-option-{{profile.slug}}-{{k}}'>{{option.display_name}}</label> - <select name="profile-option-{{profile.slug}}-{{k}}" class="form-control"> - {%- for k, choice in option['choices'].items() %} - <option value="{{ k }}" {% if choice.default %}selected{%endif %}>{{ choice.display_name }}</option> - {%- endfor %} - </select> - </div> - {%- endfor %} - </div> - {%- endif %} - </div> - </label> - {%- endfor %} - <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> - <div class="panel panel-default"> - <div class="panel-heading" role="tab" id="headingOne"> - <h4 class="panel-title"> - <a class="collabpsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne"> - B2DROP connection - </a> - {%if b2drop_ready %}<span class="label label-success">Already configured!</span>{% endif %} - </h4> - </div> - <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne"> - <div class="panel-body"> - <div class='form-group'> - <label for="b2drop-user" class="form-label">B2DROP app Username</label> - <input type="text" class="form-control" name="b2drop-user" id="b2drop-user" aria-describedby="b2drop-user-help" value="{{ b2drop_user }}"> - <div id="b2drop-user-help" class="form-text">Create new app password at <a href="https://b2drop.eudat.eu/settings/user/security">B2DROP security configuration</a></div> - </div> - <div class='form-group'> - <label for="b2drop-pwd" class="form-label">B2DROP app Password</label> - <input type="password" class="form-control" name="b2drop-pwd" id="b2drop-pwd" value="{{ b2drop_pwd }}"> - </div> - </div> - </div> - </div> - </div> - """ + c.WebDavOIDCSpawner.token_mount_path = "/var/run/secrets/oidc/" + c.WebDavOIDCSpawner.http_timeout = 90 {% endraw %} extraFiles: welcome.html: