예제 #1
0
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
예제 #2
0
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
예제 #4
0
    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