def create_user(app_logger, uuidcode, app_database, quota_config, email, basefolder, userfolder, basehome="base_home"): user_id = utils_db.get_user_id(app_logger, uuidcode, app_database, email) if user_id != 0: return user_id, False utils_db.create_user(app_logger, uuidcode, app_database, email) user_id = utils_db.get_user_id(app_logger, uuidcode, app_database, email) create_base_dirs(app_logger, uuidcode, basefolder, userfolder, basehome) #setup_base_quota(app_logger, uuidcode, quota_config, basefolder, userfolder, email) return user_id, True
def get_slave_infos(app_logger, uuidcode, app_database, servername, email): user_id = utils_db.get_user_id(app_logger, uuidcode, app_database, email) results = utils_db.get_container_info(app_logger, uuidcode, app_database, user_id, servername) if len(results) > 0: slave_id, containername = results else: return [] slave_hostname = utils_db.get_slave_hostname(app_logger, uuidcode, app_database, slave_id) running_no = utils_db.get_user_running(app_logger, uuidcode, app_database, user_id) return user_id, slave_id, slave_hostname, containername, running_no
def delete(self): """ Headers Intern-Authorization uuidcode email """ try: # Track actions through different webservices. uuidcode = request.headers.get('uuidcode', '<no uuidcode>') app.log.info("uuidcode={} - Delete Account".format(uuidcode)) app.log.trace("uuidcode={} - Headers: {}".format(uuidcode, request.headers)) # Check for the J4J intern token utils_common.validate_auth(app.log, uuidcode, request.headers.get('intern-authorization', None)) request_headers = {} for key, value in request.headers.items(): if 'Token' in key: # refresh, jhub, access key = key.replace('-', '_') request_headers[key.lower()] = value config = utils_file_loads.get_general_config() email = request_headers.get('email', '<no_email_submitted>') email = email.replace("@", "_at_") basefolder = config.get('basefolder', '<no basefolder defined>') userfolder = os.path.join(basefolder, email) user_id = utils_db.get_user_id(app.log, uuidcode, app.database, email) servernames = utils_db.get_all_user_container_names(app.log, uuidcode, app.database, user_id) for servername in servernames: results = jlab_utils.get_slave_infos(app.log, uuidcode, app.database, servername, email) if len(results) > 0: user_id, slave_id, slave_hostname, containername, running_no = results else: app.log.warning("uuidcode={} - {} not in database".format(uuidcode, servername)) continue; url = app.urls.get('dockerspawner', {}).get('url_jlab_hostname', '<no_url_found>').replace('<hostname>', slave_hostname) headers = {"Intern-Authorization": utils_file_loads.get_j4j_dockerspawner_token(), "uuidcode": uuidcode, "containername": containername} try: with closing(requests.delete(url, headers=headers, verify=False)) as r: if r.status_code != 202: app.log.error("uuidcode={} - DockerSpawner delete failed: {} {}".format(uuidcode, r.text, r.status_code)) except: app.log.exception("uuidcode={} - Could not call DockerSpawner {}".format(uuidcode, slave_hostname)) serverfolder = Path(os.path.join(userfolder, '.{}'.format(containername))) utils_db.decrease_slave_running(app.log, uuidcode, app.database, slave_id) utils_db.remove_container(app.log, uuidcode, app.database, user_id, servername) log_dir = Path(os.path.join(config.get('jobs_path', '<no_jobs_path>'), "{}-{}".format(email, containername))) try: os.makedirs(log_dir, exist_ok=True) shutil.copy2(os.path.join(serverfolder, ".jupyterlabhub.log"), os.path.join(log_dir, "jupyterlabhub.log")) except: app.log.exception("uuidcode={} - Could not copy log".format(uuidcode)) jlab_output = "{};{};{}".format(userfolder, containername, running_no == 1) jlab_delete_path = config.get('jlab_delete', '<no_jlab_delete_defined>') app.log.debug("uuidcode={} - Write {} to {}".format(uuidcode, jlab_output, os.path.join(jlab_delete_path, uuidcode))) with open(os.path.join(jlab_delete_path, uuidcode), 'w') as f: f.write(jlab_output) # end for loop all containers are stopped utils_db.delete_account(app.log, uuidcode, app.database, user_id) try: #shutil.rmtree(userfolder) app.log.error("uuidcode={} - Account deletion. Please remove {} from the disk.".format(uuidcode, userfolder)) # remove user quota from xfs_quota jlab_output = "{}".format(uuidcode) jlab_delete_path = config.get('jlab_delete', '<no_jlab_delete_defined>') app.log.debug("uuidcode={} - Write {} to {}.deletion".format(uuidcode, jlab_output, os.path.join(jlab_delete_path, email))) with open('{}.deletion'.format(os.path.join(jlab_delete_path, email)), 'w') as f: f.write(jlab_output) except: app.log.exception("uuidcode={} - Could not delete the users directories".format(uuidcode)) except: app.log.exception("Deletion.delete failed. Bugfix required") return "", 500 return '', 204
def get(self): """ Headers: intern-authorization uuidcode email servername """ try: # Track actions through different webservices. uuidcode = request.headers.get('uuidcode', '<no uuidcode>') app.log.info( "uuidcode={} - Get JupyterLab Status".format(uuidcode)) app.log.trace("uuidcode={} - Headers: {}".format( uuidcode, request.headers)) # Check for the J4J intern token utils_common.validate_auth( app.log, uuidcode, request.headers.get('intern-authorization', None)) request_headers = {} for key, value in request.headers.items(): if 'Token' in key: # refresh, jhub, access key = key.replace('-', '_') request_headers[key.lower()] = value email = request_headers.get('email', '<no_email_submitted>') email = email.replace("@", "_at_") app.log.trace("uuidcode={} - Get User ID for email: {}".format( uuidcode, email)) servername = request_headers.get('servername', '<no_servername_submitted>6') user_id = utils_db.get_user_id(app.log, uuidcode, app.database, email) app.log.trace("uuidcode={} - User_id: {}".format( uuidcode, user_id)) results = utils_db.get_container_info(app.log, uuidcode, app.database, user_id, servername) if len(results) > 0: slave_id, containername = results else: app.log.error( "uuidcode={} - Containerinfo is empty for: user_id: {} , servername={}" .format(uuidcode, user_id, servername)) return "unknown", 200 if slave_id == 0: app.log.error( "uuidcode={} - Could not check if container {} is running". format(uuidcode, containername)) return "unknown", 200 slave_hostname = utils_db.get_slave_hostname( app.log, uuidcode, app.database, slave_id) url = app.urls.get('dockerspawner', {}).get( 'url_jlab_hostname', '<no_url_found>').replace('<hostname>', slave_hostname) header = { "Intern-Authorization": utils_file_loads.get_j4j_dockerspawner_token(), "uuidcode": uuidcode, "containername": containername } with closing(requests.get(url, headers=header, verify=False)) as r: if r.status_code == 200: app.log.trace( "uuidcode={} - Answer from DockerSpawner {}: {}". format(uuidcode, slave_hostname, r.text.strip())) return r.text.strip(), 200 else: app.log.error( "uuidcode={} - Could not check if container {} is running. DockerSpawner answered with: {} {}" .format(uuidcode, containername, r.text, r.status_code)) return "unknown", 200 except: app.log.exception("JLab.get failed. Bugfix required") return '', 202