diff --git a/.gitignore b/.gitignore index 480d253894128be0fc9ae6b5026260d102e0ff95..b4e83454dfbc77b754c463799ceb8de77388e966 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ cilogon_idp_selector.txt style.min.css -style.min.css.map \ No newline at end of file +style.min.css.map +.DS_Store \ No newline at end of file diff --git a/py/test_defaulty.py b/py/test_defaulty.py deleted file mode 100644 index 98350f18fef776793bdf98b4af18887c0a6862d6..0000000000000000000000000000000000000000 --- a/py/test_defaulty.py +++ /dev/null @@ -1,236 +0,0 @@ -from kubespawner import KubeSpawner -class MySpawner(KubeSpawner): -profile_form_template = """ - <style> - /* The profile description should not be bold, even though it is inside the <label> tag */ - font-weight: normal; - } - </style> - - <p>/home/jovyan is persistent volume, 5GB by default. Make sure you don't fill it up - jupyter won't start next time. You can request increasing the size in <a href="https://ucsd-prp.gitlab.io/userdocs/start/contact/">Matrix</a></p> - - <label for="gpus">GPUs</label> - <input class="form-control input-lg" type="number" name="gpus" value="0" min="0" max="8"/> - <br/> - <label for="ram">Cores</label> - <input class="form-control input-lg" type="number" name="cores" value="1" min="0" max="96"/> - <br/> - <label for="ram">RAM, GB</label> - <input class="form-control input-lg" type="number" name="ram" value="8" min="1" max="512"/> - <br/> - <label for="gputype">GPU type</label> - <select class="form-control input-lg" name="gputype"> - <option value="" selected="selected">Any</option> - <option value="NVIDIA-GeForce-GTX-1070">1070</option> - <option value="NVIDIA-GeForce-GTX-1080">1080</option> - <option value="NVIDIA-GeForce-GTX-1080-Ti">1080Ti</option> - <option value="NVIDIA-GeForce-RTX-2080-Ti">2080Ti</option> - <option value="NVIDIA-GeForce-RTX-3090">3090</option> - <option value="NVIDIA-TITAN-Xp">TITAN XP</option> - <option value="Tesla-K40c">Tesla K40</option> - <option value="Tesla-T4">Tesla T4</option> - <option value="NVIDIA-TITAN-RTX">TITAN RTX</option> - <option value="NVIDIA-GeForce-RTX-3090">3090</option> - <option value="Tesla-V100-SXM2-32GB">Tesla V100</option> - <option value="NVIDIA-A100-PCIE-40GB-MIG-2g.10gb">RTX A100</option> - <option value="Quadro-RTX-6000">RTX6000</option> - <option value="NVIDIA-A40">RTX A40</option> - - </select> - <br/> - <label for="shm">/dev/shm for pytorch</label> <input class="form-control" type="checkbox" name="shm"> - <br/> - <label for="cephfs">Mount CephFS (if assigned)</label> <input class="form-control" type="checkbox" name="cephfs"> - <p>You can request assignment in <a href='https://ucsd-prp.gitlab.io/userdocs/start/contact/'>Matrix</a></p> - <br/> - - <div class='form-group' id='kubespawner-profiles-list'> - <p>Stack options are described in <a href="https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html">docker-stacks</a></p> - - <label>Image</label> - {% for profile in profile_list %} - <label for='profile-item-{{ loop.index0 }}' class='form-control input-group'> - <div class='col-md-1'> - <input type='radio' name='profile' id='profile-item-{{ loop.index0 }}' value='{{ loop.index0 }}' {% if profile.default %}checked{% endif %} /> - </div> - <div class='col-md-11'> - <strong>{{ profile.display_name }}</strong> - {% if profile.description %} - <p>{{ profile.description }}</p> - {% endif %} - </div> - </label> - {% endfor %} - </div>""" - -def options_from_form(self, formdata): - cephfs_pvc_users = {"wweijia@eng.ucsd.edu":"wweijia", "zil058@ucsd.edu":"zil058", - "000065181@csusb.edu":"csusb-dungvu-share", "dung.vu@csusb.edu":"csusb-dungvu-share", "dvu@csusb.edu":"csusb-dungvu-share", - "006501270@csusb.edu":"csusb-dungvu-share", "youngsu.kim@csusb.edu":"csusb-dungvu-share", - "dmishin@ucsd.edu":"csusb-dungvu-share" - } - - if not self.profile_list or not hasattr(self, '_profile_list'): - return formdata - selected_profile = int(formdata.get('profile', [0])[0]) - options = self._profile_list[selected_profile] - self.log.debug("Applying KubeSpawner override for profile '%s'", options['display_name']) - kubespawner_override = options.get('kubespawner_override', {}) - for k, v in kubespawner_override.items(): - if callable(v): - v = v(self) - self.log.debug(".. overriding KubeSpawner value %s=%s (callable result)", k, v) - else: - self.log.debug(".. overriding KubeSpawner value %s=%s", k, v) - setattr(self, k, v) - - gpus = int(formdata.get('gpus', [0])[0]) - setattr(self, "extra_resource_limits", {"nvidia.com/gpu": gpus}) - - setattr(self, "mem_guarantee", formdata.get('ram', [0])[0]+"G") - - setattr(self, "cpu_guarantee", float(formdata.get('cores', [0])[0])) - - setattr(self, "mem_limit", formdata.get('ram', [0])[0]+"G") - - setattr(self, "cpu_limit", float(formdata.get('cores', [0])[0])) - - nodeSelectorTermsExpressions = [{ - 'key': 'topology.kubernetes.io/region', - 'operator': 'In', - 'values': ["us-west"] - }] - - if formdata.get('gputype', [0])[0]: - nodeSelectorTermsExpressions.append({ - 'key': 'nvidia.com/gpu.product', - 'operator': 'In', - 'values': formdata.get('gputype', [0]) - }) - - setattr(self, 'extra_pod_config', { - 'affinity': { - 'nodeAffinity': { - 'requiredDuringSchedulingIgnoredDuringExecution': { - 'nodeSelectorTerms': [{ - 'matchExpressions': nodeSelectorTermsExpressions, - }], - }, - }, - } - }) - - self.volume_mounts = [ - { - 'name': 'volume-{username}', - 'mountPath': '/home/jovyan', - } - ] - self.volumes = [ - { - 'name': 'volume-{username}', - 'persistentVolumeClaim': { - 'claimName': 'claim-{username}' - } - } - ] - - if formdata.get('shm', [0])[0]: - self.volume_mounts.append({ - 'name': 'dshm', - 'mountPath': '/dev/shm', - }) - self.volumes.append({ - 'name': 'dshm', - 'emptyDir': {'medium': 'Memory'} - }) - - if formdata.get('cephfs', [0])[0] and self.user.name in cephfs_pvc_users: - self.volume_mounts.append({ - 'name': 'cephfs', - 'mountPath': '/home/jovyan/cephfs', - }) - self.volumes.append({ - 'name': 'cephfs', - 'persistentVolumeClaim': { - 'claimName': cephfs_pvc_users[self.user.name] - } - }) - - - return options - -profile_list = [ - { - 'display_name': 'Stack Minimal', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/minimal', - } - }, - { - 'display_name': 'Stack Minimal + Desktop GUI', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/desktop', - } - }, - { - 'display_name': 'Stack Minimal + Desktop GUI + Relion', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/relion-desktop', - } - }, - { - 'display_name': 'Stack Scipy', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/scipy', - } - }, - { - 'display_name': 'Stack R', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/r', - } - }, - { - 'display_name': 'R Studio Server', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/r-studio', - } - }, - { - 'display_name': 'Stack Tensorflow', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/tensorflow', - } - }, - { - 'display_name': 'Stack Tensorflow + PRP added libs', - 'default': 'true', - }, - { - 'display_name': 'Stack Datascience', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/datascience', - } - }, - { - 'display_name': 'Stack Pyspark', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/pyspark', - } - }, - { - 'display_name': 'Stack All Spark', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/all-spark', - } - }, - { - 'display_name': 'Test', - 'kubespawner_override': { - 'image_spec': 'localhost:30081/prp/jupyter-stack/prp:ce563778', - } - } -] -c.JupyterHub.spawner_class = MySpawner -c.JupyterHub.template_vars = {'announcement_login': 'New users can ask to be added to the users list in <a href="https://ucsd-prp.gitlab.io/userdocs/start/contact/">[matrix]</a>. K8s namespace membership doesn\'t grant you access to jupyterhub.'} \ No newline at end of file