Skip to content

Commit

Permalink
Present menu of lab environments
Browse files Browse the repository at this point in the history
  • Loading branch information
William Strecker-Kellogg committed May 27, 2021
1 parent 2c30244 commit c54a3e8
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 9 deletions.
24 changes: 24 additions & 0 deletions sdccjupyter/conf/lab-locations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Map "English Location Name" -> "Path" of virtualenv where jupyterlab lives
locations:
USATLAS: /cvmfs/atlas.sdcc.bnl.gov/jupyter/venv/notebook
sPHENIX: /cvmfs/sphenix.sdcc.bnl.gov/foo
PHENIX: /cvmfs/phenix.sdcc.bnl.gov/bar
Default Condor: /cvmfs/sdcc.bnl.gov/jupyter/virtualenv/labenv
Default HPC: /u0b/software/jupyter/virtenvs/labenv3/
CFN: /hpcgpfs01/software/jupyter/what

# Map GID -> list of jupyterlab locations available
groups:
rhphenix:
- PHENIX
- sPHENIX
sphenix:
- sPHENIX
usatlas:
- USATLAS
rhstaff:
- USATLAS
all:
- Default Condor
- Default HPC
- CFN
13 changes: 11 additions & 2 deletions sdccjupyter/forms/omniform.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from tornado.log import app_log

from ..formspawners import ParamForm
from ..spawners.laboverride import get_lab_locations


class OmniForm(ParamForm):
Expand Down Expand Up @@ -49,10 +50,14 @@ def massage_options(self, formdata):

if data['spawntype'] == 'lbpool':
data['req_options'] = 'Requirements = (IsJupyterSlot =?= True)'
data['req_nbenv'] = data['lbpool_nbenv']
elif data['spawntype'] == 'htc':
data['req_options'] = 'Requirements = (IsJupyterSlot =!= True)'
data['req_nprocs'] = data['cpus']
data['req_memory'] = data['ram']
data['req_nbenv'] = data['htc_nbenv']
else:
data['req_nbenv'] = data['ic_nbenv']

def no_req(k):
return k[4:] if k.startswith('req_') else k
Expand All @@ -72,10 +77,14 @@ def generate(self):
row[3] -= row[3] % 30
slurm_params.append(row)

vars = {
labs = get_lab_locations(self.spawner.user.name)

template_vars = {
'partitions': list(sorted({(x[0], x[3]) for x in slurm_params})),
'slurm': slurm_params,
'hpcenvs': [(a, b) for a, b in labs if not b.startswith('/cvmfs/')],
'htcenvs': [(a, b) for a, b in labs if not b.startswith('/hpcgpfs')],
}
db.close()

return Template(super().generate()).render(**vars)
return Template(super().generate()).render(**template_vars)
2 changes: 1 addition & 1 deletion sdccjupyter/spawners/condor.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class SDCCCondorSpawner(FormMixin, PathOverrideMixin, CondorSpawner):
# Maybe allow singularity-image selection logic some day too?
req_scontainer = Unicode('')

req_nbenv = Unicode('/u0b/software/jupyter/virtenvs/labenv3')
req_nbenv = Unicode('/cvmfs/sdcc.bnl.gov/jupyter/virtualenv/labenv')

startup_poll_interval = 1.5

Expand Down
25 changes: 25 additions & 0 deletions sdccjupyter/spawners/laboverride.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

import os

from tornado.log import app_log
from ruamel.yaml import YAML
from .utils import get_all_groupnames


def get_lab_locations(user, cfg="../conf/lab-locations.yml"):
cfgpath = os.path.join(os.path.dirname(__file__), cfg)

yaml = YAML(typ='safe')
with open(cfgpath) as fp:
data = yaml.load(fp)
locations = data['locations']
group_map = data['groups']

available_labs = set()

for group in get_all_groupnames(user):
if group in group_map:
for lab in group_map[group]:
available_labs.add(lab)

return [(x, locations[x]) for x in group_map['all'] + list(available_labs)]
9 changes: 3 additions & 6 deletions sdccjupyter/spawners/pathoverride.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@

import os
import re
import grp
import pwd

from tornado.log import app_log

from .utils import primary_group


def override(key, file):
def parse_pathlist(paths):
Expand All @@ -28,11 +28,8 @@ def parse_pathlist(paths):

return jupyter_path

def override_path_uid(username, cfgpath="../conf/pathoverride.cfg"):

def primary_group(user):
gid = pwd.getpwnam(user).pw_gid
return grp.getgrgid(gid).gr_name
def override_path_uid(username, cfgpath="../conf/pathoverride.cfg"):

group = primary_group(username)

Expand Down
13 changes: 13 additions & 0 deletions sdccjupyter/spawners/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import pwd
import grp
import os


def primary_group(user):
gid = pwd.getpwnam(user).pw_gid
return grp.getgrgid(gid).gr_name


def get_all_groupnames(user):
gids = [x for x in os.getgrouplist(user, 0) if x > 0]
return [grp.getgrgid(gid).gr_name for gid in gids]
19 changes: 19 additions & 0 deletions sdccjupyter/static/sdcc.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
{% macro nbenvs(var, name) %}

<div class="form-group row">
<div class="col-lg-6 col-md-8">
<label>Select JupyterLab Environment</label>
{% for k, v in var %}
<div class="radio">
<label>
<input type="radio" name="{{ name }}" value="{{ v }}" {% if loop.first %}checked{% endif %}/>
{{ k }}
</label>
</div>
{% endfor %}
</div>
</div>
{% endmacro %}
<hr />
<div>
<!-- Nav tabs -->
Expand Down Expand Up @@ -72,6 +88,7 @@ <h4>Run a notebook on the IC Cluster</h4>
</div>
</div>
</div>
{{ nbenvs(hpcenvs, "ic_nbenv") }}
</fieldset>
{% else -%}
<div class="form-group row warning">
Expand Down Expand Up @@ -103,11 +120,13 @@ <h4>Run a notebook on the HTCondor batch-farm requesting CPU/RAM</h4>
WARNING: This may time-out if the condor farm is very busy and/or if you request a lot of resources
</p>
</div>
{{ nbenvs(htcenvs, "htc_nbenv") }}
</div>

<!-- ******************** No Form Just Spawn ******************* -->
<div role="tabpanel" class="tab-pane active" id="lbpool">
<h4>Run a notebook on a standard interactive HTCondor submit-node</h4>
{{ nbenvs(htcenvs, "lbpool_nbenv") }}
</div>
</div>
</div>
Expand Down

0 comments on commit c54a3e8

Please sign in to comment.