Skip to content
Snippets Groups Projects
my_spawner.py 6.5 KiB
Newer Older
# The spawner is based on PRP's https://gitlab.nrp-nautilus.io/vpeddu/jupyterlab-west.git
# This file is managed by [youngsu.kim|dung.vu]@csusb.edu
from kubespawner import KubeSpawner

class MySpawner(KubeSpawner):
    with open('/etc/jupyterhub/custom/my_spawner.html', 'r') as f:
        profile_form_template = f.readlines()
    profile_form_template = "".join(profile_form_template)

    def options_from_form(self, formdata):
        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])
        
youngsuKim-CSUSB's avatar
youngsuKim-CSUSB committed
        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',
Dung Vu's avatar
Dung Vu committed
            'values': ["us-central"]
            }]

        if formdata.get('gputype', [0])[0]:
            nodeSelectorTermsExpressions.append({
                'key': 'nvidia.com/gpu.product',
                'operator': 'In',
                'values': formdata.get('gputype', [0])
            })

Dung Vu's avatar
Dung Vu committed
        tolerationsExpression = [{
            'key': 'nautilus.io/nrp-testing',
            'operator': 'Exists',
            'effect': 'NoSchedule',
            }]

        setattr(self, 'extra_pod_config', {
            'affinity': {
                'nodeAffinity': {
                    'requiredDuringSchedulingIgnoredDuringExecution': {
                        'nodeSelectorTerms': [{
                            'matchExpressions': nodeSelectorTermsExpressions,
                        }],
                    },
                },
Dung Vu's avatar
Dung Vu committed
            },
            'tolerations': tolerationsExpression,
Dung Vu's avatar
Dung Vu committed
        })
     
        setattr(self, 'startTimeout', 1200)
        
        self.volume_mounts = [
            {
                'name': 'volume-{username}',
                'mountPath': '/home/jovyan',
            },
            {
                'name': 'csusb-hpc-share',
                'mountPath': '/home/jovyan/shared',
            },
            {
                'name': 'shm-volume',
                'mountPath': '/dev/shm',
            },
            ]
        self.volumes = [
            {
                'name': 'volume-{username}',
                'persistentVolumeClaim': {
                    'claimName': 'claim-{username}'
                    }
Dung Vu's avatar
Dung Vu committed
            {
                'name': 'csusb-hpc-share',
                'persistentVolumeClaim': {
                    'claimName': 'csusb-hpc-share'
                    }
            },
            {
                'name': 'shm-volume',
                'emptyDir': {
                    'medium': 'Memory'
                    }
            }
youngsuKim-CSUSB's avatar
youngsuKim-CSUSB committed
        {
            'display_name': 'Stack Minimal',
        },
            'display_name': 'Stack Datascience',
            'kubespawner_override': {
Youngsu Kim's avatar
Youngsu Kim committed
                'image_spec': 'localhost:30081/prp/jupyter-stack/datascience:16ecc4c5',
            }
        },
        {
            'display_name': 'Stack Desktop Apps - VS Code',
Dung Vu's avatar
Dung Vu committed
            'kubespawner_override': {
                'image': 'localhost:30081/prp/jupyter-stack/5g-desktop:ab90e952',
                'lifecycle_hooks': {
                    'postStart': {
                        'exec': {
                            'command': [
                                'sh',
                                '-c',
                                'mkdir -p /home/jovyan/Desktop && cp /home/jovyan/shared/.software/desktopInit.desktop /home/jovyan/Desktop/ || true'
                            ]
                        }
                    }
                }
            }
        },

Dung Vu's avatar
Dung Vu committed
            'display_name': 'Nrp-Stack Datascience',
youngsuKim-CSUSB's avatar
youngsuKim-CSUSB committed
            'kubespawner_override': {
Dung Vu's avatar
Dung Vu committed
                'image_spec': 'localhost:30081/prp/jupyter-stack/datascience:16ecc4c5',
            'display_name': 'Stack PySpark',
Dung Vu's avatar
Dung Vu committed
            'kubespawner_override': {
Dung Vu's avatar
Dung Vu committed
                'image_spec': 'localhost:30081/prp/jupyter-stack/pyspark:16ecc4c5',
Dung Vu's avatar
Dung Vu committed
            }
        },
Dung Vu's avatar
Dung Vu committed
        {
            'display_name': 'Stack PyTorch2',
Dung Vu's avatar
Dung Vu committed
            'kubespawner_override': {
                'image': 'localhost:30081/prp/jupyter-stack/prp-pytorch2:0addcd15',
            }
        },       
            'display_name': 'Stack R-Studio',
Youngsu Kim's avatar
Youngsu Kim committed
            'kubespawner_override': {
                'image_spec': 'localhost:30081/prp/jupyter-stack/r-studio:ab90e952',
Youngsu Kim's avatar
Youngsu Kim committed
            }
        },
        {
            'display_name': 'Stack R-Studio (Becerra)',
            'kubespawner_override': {
                'image_spec': 'gitlab-registry.nrp-nautilus.io/youngsu_kim/csusb-jupyter-stack/stack-rstudio-becerra-class',
            'display_name': 'Stack SageMath',
            'kubespawner_override': {
                'image_spec': 'gitlab-registry.nrp-nautilus.io/youngsu_kim/csusb-jupyter-stack/stack-sagemath',
youngsuKim-CSUSB's avatar
youngsuKim-CSUSB committed
            'kubespawner_override': {
Youngsu Kim's avatar
Youngsu Kim committed
                'image': 'localhost:30081/prp/jupyter-stack/scipy:ab90e952',
        {
            'display_name': 'Stack Tensorflow + PRP Packages',
youngsuKim-CSUSB's avatar
youngsuKim-CSUSB committed
            'kubespawner_override': {
                'image_spec': 'localhost:30081/prp/jupyter-stack/prp:0addcd15',
            'display_name': 'Stack Zeus-Cling',
            'kubespawner_override': {
Youngsu Kim's avatar
Youngsu Kim committed
                'image_spec': 'gitlab-registry.nrp-nautilus.io/youngsu_kim/csusb-jupyter-stack/stack-xeus-cling',
    ]

c.JupyterHub.spawner_class = MySpawner