class ClusterHelper(object):

    logger = Util.ibm_logger()
    base_url = "https://crl.ptopenlab.com:8800/restful/supernova"

    def __init__(self, conf_id, num, token, username, pwd):
        #self.logger.info("ClusterHelper.__init__")
        self._conf_id = conf_id
        self._num = num
        #self._token = token
        #self._username = username
        #self._pwd = pwd
        self._headers = {
            "Content-Type": "application/json",
            "Authorization": token,
            "username": username,
            "password": pwd
        }

    def cluster_create(self):
        url = self.base_url + "/cluster/create"
        body = json.dumps({
            "cluster_config_id": self._conf_id,
            "cluster_number": self._num,
        })

        ret = requests.post(url, headers=self._headers, data=body)
        ret = json.loads(ret.text)
        return ret

    def cluster_list(self):
        url = self.base_url + "/cluster/list"
        ret = requests.get(url, headers=self._headers)
        ret = json.loads(ret.text)
        return ret

    def cluster_delete(self, cluster_id):
        url = self.base_url + "/cluster/delete/{0}".format(cluster_id)
        ret = requests.delete(url, headers=self._headers)
        ret = json.loads(ret.text)
        return ret

    def cluster_show(self, cluster_id):
        #url = self.base_url + "/cluster/show/{0}".format(cluster_id)
        url = self.base_url + "/cluster/show/" + cluster_id
        ret = requests.get(url, headers=self._headers)
        ret = json.loads(ret.text)
        return ret

    def get_webshell(self, user_Authorization, ip):
        headers = {
            "Content-Type": "application/json",
            "Authorization": user_Authorization
        }
        url = "https://dashboard.ptopenlab.com:443/restful/supernova/web_shell/get/Beijing/" + ip
        ret = requests.get(url, headers=headers)
        ret = json.loads(ret.text)
        return ret
Exemple #2
0
class DockerHelper(object):

    logger = Util.ibm_logger()

    def __init__(self, git_host, init_user, init_pwd):
        self._git_host = git_host
        self._init_user = init_user
        self._init_pwd = init_pwd

    #create user for student
    def init_user(self, host, user_name, user_pwd):
        self.logger.info("init_user " + host + " " + user_name + " " +
                         user_pwd)
        cmd = "./myuseradd-ibm " + user_name + " " + user_pwd
        print cmd
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host, username=self._init_user, password=self._init_pwd)
        stdin, stdout, stderr = ssh.exec_command(cmd)
        print stdout.read()
        ssh.close()

    #initialize git config
    def init_git(self, host, user_name, user_pwd, email, git_name, private_key,
                 public_key):
        self.logger.info("init docker git" + " " + email + " " + user_name)
        cmd = "umask 0002 ; mkdir .ssh ; "
        cmd += "echo -ne '" + private_key + "' >~/.ssh/id_rsa ; "
        cmd += "echo '" + public_key + "' >~/.ssh/id_rsa.pub ; "
        cmd += "chmod 0600 ~/.ssh/id_rsa ; "
        cmd += "eval 'ssh-agent -s' ; "
        cmd += "ssh-add ~/.ssh/id_rsa ; "
        cmd += "git config --global user.name '" + user_name + "' ; "
        cmd += "git config --global user.email " + email + " ; "
        #cmd += "sudo echo -ne 'StrictHostKeyChecking no\\nUserKnownHostsFile /dev/null\\n' >> /etc/ssh/ssh_config && "
        cmd += "mkdir ucore_lab ; cd ./ucore_lab && git init ; "
        #cmd += "git remote add origin_edx " + repo_url +"; "
        cmd += "git remote add origin_edx git@" + self._git_host + ":" + git_name + "/ucore_lab.git ; "
        cmd += "git pull origin_edx master"
        self.logger.info("cmd" + cmd)
        print cmd
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host, username=user_name, password=user_pwd)
        stdin, stdout, stderr = ssh.exec_command(cmd)
        print stdout.read()
        ssh.close()
Exemple #3
0
class IBMDockerTestXBlock(XBlock):

    logger = Util.ibm_logger()

    is_new = Boolean(default=True, scope=Scope.user_state, help="is new")
    is_empty = Boolean(default=True,
                       scope=Scope.user_state,
                       help="do not have docker")
    private_key = String(default="",
                         scope=Scope.user_state,
                         help="SHH Private Key")
    public_key = String(default="",
                        scope=Scope.user_state,
                        help="SHH Public Key")
    cluster_id = String(default="",
                        scope=Scope.user_state,
                        help="user cluster id")
    git_id = Integer(default="", scope=Scope.user_state, help="Git id")
    #repo url may be different from username/repo.git,so get it from api
    git_name = String(default="", scope=Scope.user_state, help="git repo")
    ldap_name = String(default="", scope=Scope.user_state, help="ldap name")
    ldap_pwd = String(default="", scope=Scope.user_state, help="ldap password")
    #student only own one cluster
    clusters = List(default=[], scope=Scope.user_state, help="clusters")

    # config
    CONFIG = Config.CONFIG
    git_host = CONFIG["GIT"]["HOST"]
    git_port = CONFIG["GIT"]["PORT"]
    git_admin_token = CONFIG["GIT"]["ADMIN_TOKEN"]
    git_import_url = CONFIG["GIT"]["IMPORT_URL"]
    git_project_name = CONFIG["GIT"]["PROJECT_NAME"]
    git_teacher_token = CONFIG["GIT"]["TEACHER"]["TOKEN"]

    cluster_conf_id = CONFIG["CLUSTER"]["CLUSTER_CONFIG_ID"]
    cluster_num = CONFIG["CLUSTER"]["CLUSTER_NUM"]
    delete_time = CONFIG["CLUSTER"]["DELETE_TIME"]
    init_user = CONFIG["CLUSTER"]["INIT_USER"]
    init_pwd = CONFIG["CLUSTER"]["INIT_PWD"]

    ibm_username = CONFIG["IBM_ACCOUNT"]["ACCOUNT"]
    ibm_pwd = CONFIG["IBM_ACCOUNT"]["PASSWORD"]

    mongo_admin = CONFIG["MONGO"]["ADMIN"]
    mongo_pwd = CONFIG["MONGO"]["PASSWORD"]

    user_Authorization = CONFIG["AUTHORIZATION"]["USER"]
    cluster_Authorization = CONFIG["AUTHORIZATION"]["CLUSTER"]

    cluster_helper = ClusterHelper(cluster_conf_id, cluster_num,
                                   cluster_Authorization, ibm_username,
                                   ibm_pwd)
    docker_helper = DockerHelper(git_host, init_user, init_pwd)

    def student_view(self, context=None):

        # runtime error
        if not hasattr(self.runtime, "anonymous_student_id"):
            return self.message_view(
                "Error in ibm_docker (get anonymous student id)" +
                "Cannot get anonymous_student_id in runtime", None)

        # preview in studio
        if self.runtime.anonymous_student_id == "student":
            cluster_list = []

            conn = pymongo.Connection('localhost', 27017)
            db = conn.test
            db.authenticate(self.mongo_admin, self.mongo_pwd)
            cluster = db.cluster
            for i in cluster.find():
                new_cluster = Cluster()
                new_cluster.set_name(i["cluster_name"])
                new_cluster.set_user(i["username"])
                new_cluster.set_id(i["cluster_id"])
                new_cluster.set_creation_time(i["creation_time"])
                new_cluster.set_status(i["status"])
                new_cluster.set_ip(i["ip"])
                cluster_list.append(new_cluster.object_to_dict())

            context_dict = {"clusters": cluster_list, "message": ""}
            fragment = Fragment()
            fragment.add_content(
                Util.render_template('static/html/ibm_clusters.html',
                                     context_dict))
            fragment.add_css(Util.load_resource("static/css/ibm_docker.css"))
            #fragment.add_javascript(Util.load_resource("static/js/src/uc_lab.js"))
            fragment.initialize_js("IBMDockerTestXBlock")
            return fragment

        student = self.runtime.get_real_user(self.runtime.anonymous_student_id)
        email = student.email
        name = student.first_name + " " + student.last_name
        username = student.username

        # temporary code ,not used in next course
        conn = pymongo.Connection('localhost', 27017)
        db = conn.test
        db.authenticate(self.mongo_admin, self.mongo_pwd)
        token = db.token
        result = token.find_one({"username": username})
        conn.disconnect()

        #I dont now why the cluster cannot be shown in page directly
        temp_clusters = self.clusters

        if self.is_new and not result:
            # create git account when first visiting

            # get teacher id
            #result, message = GitLabUtil.get_user(self.git_host, self.git_port, self.git_teacher_token)
            #self.logger.info("get teacher id")
            #self.logger.info(result)
            #self.logger.info(message)
            #if not result:
            #    return self.message_view("Error in get teacher info")
            #try:
            #    message = json.loads(message)
            #    teacher_id = message["id"]
            #except Exception:
            #    return self.message_view("Error in uc_docker (load json string)", message, context)

            #add teacher to developer
            #result, message = GitLabUtil.add_project_developer(self.git_host, self.git_port, self.git_user_token, username, self.git_project_name, teacher_id)
            #self.logger.info("add developer result:")
            #self.logger.info(result)
            #self.logger.info(message)
            #if not result:
            #    return self.message_view("Error in uc_docker (add teacher to developer)", message, context)
            conn = pymongo.Connection('localhost', 27017)
            db = conn.test
            db.authenticate(self.mongo_admin, self.mongo_pwd)
            ibm = db.ibm
            result = ibm.find_one({"email": email})
            if not result:
                return self.message_view(
                    "Error in ibm_docker (get shibboleth account info). detail"
                    + message, temp_clusters)

            self.ldap_name = result["name"]
            self.ldap_pwd = result["password"]

            #get user id by email
            result, message = GitLabUtil.get_userid(self.git_host,
                                                    self.git_port,
                                                    self.git_admin_token,
                                                    self.ldap_name)
            self.logger.info("get user id result:")
            self.logger.info(result)
            self.logger.info(message)
            if not result:
                return self.message_view(
                    "Error in ibm_docker (get user id). detail" + message,
                    temp_clusters)
            self.git_id = message["id"]
            self.save()

            result, message = GitLabUtil.create_project(
                self.git_host, self.git_port, self.git_admin_token,
                self.git_import_url, self.git_project_name, self.git_id)
            self.logger.info("add project result:")
            self.logger.info(result)
            self.logger.info(message)
            if not result:
                return self.message_view(
                    "Error in ibm_docker (add project). detail:" + message,
                    temp_clusters)

            try:
                conn = pymongo.Connection('localhost', 27017)
                db = conn.test
                db.authenticate(self.mongo_admin, self.mongo_pwd)
                token = db.token
                result = token.find_one({"username": username})
                if not result:
                    self.private_key, self.public_key = Util.gen_ssh_keys(
                        email)
                    #self.logger.info("private_key:" + self.private_key)
                    self.save()
                    token.insert({
                        "username": username,
                        "private_key": self.private_key,
                        "public_key": self.public_key
                    })
                else:
                    self.private_key = result["private_key"]
                    self.public_key = result["public_key"]
                    self.save()
                conn.disconnect()

            except Exception, ex:
                return self.message_view(
                    "Error in ibm_docker (gen ssh key). detail:" + ex, context)

            result, message = GitLabUtil.add_ssh_key(
                self.git_host, self.git_port, self.git_admin_token,
                "ucore default", self.public_key, self.git_id)
            self.logger.info("add_ssh_key result:")
            self.logger.info(result)
            self.logger.info(message)
            if not result:
                return self.message_view(
                    "Error in ibm_docker (add git ssh key). detail:" + message,
                    temp_clusters)

            self.is_new = False
            self.save()

        context_dict = {"dockers": self.clusters, "message": "", "report": ""}
        fragment = Fragment()
        fragment.add_content(
            Util.render_template('static/html/ibm_docker.html', context_dict))
        fragment.add_css(Util.load_resource("static/css/ibm_docker.css"))
        fragment.add_javascript(
            Util.load_resource("static/js/src/ibm_docker.js"))
        fragment.initialize_js("IBMDockerTestXBlock")
        return fragment