#coding=utf-8 module JupyterService def _open_shixun_jupyter(shixun) if shixun.is_jupyter? shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/get" tpiID = "tpm#{shixun.id}" mount = shixun.data_sets.present? gitUrl = "#{edu_setting('git_address_domain')}/#{shixun.repo_path}" params = {tpiID: tpiID, identifier: shixun.identifier, needMount: mount, gitUrl: gitUrl, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"} logger.info "test_juypter: uri->#{uri}, params->#{params}" res = uri_post uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:99)") end logger.info "test_juypter: #{res}" @shixun_jupyter_port = res['port'] "#{jupyter_service(res['port'])}/notebooks/data/workspace/myshixun_#{tpiID}/01.ipynb" end end def jupyter_url_with_shixun(shixun) #打开tpm - juypter接口 _open_shixun_jupyter(shixun) end def jupyter_port_with_shixun(shixun) if @shixun_jupyter_port.to_i <=0 _open_shixun_jupyter(shixun) end @shixun_jupyter_port end def _open_game_jupyter(myshixun) ## 打开tpi shixun = myshixun.shixun if shixun.is_jupyter? shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/get" tpiID = myshixun.id mount = myshixun.shixun.data_sets.present? gitUrl = "#{edu_setting('git_address_domain')}/#{myshixun.repo_path}" params = { tpiID: tpiID, identifier: shixun.identifier, myshixunIdentifier: myshixun.identifier, gitUrl: gitUrl, needMount: mount, :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"} res = uri_post uri, params logger.info "test_juypter: #{res}" if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:99)") end @game_jupyter_port = res['port'] repo_save_path = myshixun.repo_save_path "#{jupyter_service(res['port'])}/notebooks/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb" end end def jupyter_url_with_game(myshixun) _open_game_jupyter(myshixun) end def jupyter_port_with_game(myshixun) if @game_jupyter_port.to_i <=0 _open_game_jupyter(myshixun) end @game_jupyter_port end def jupyter_save_with_shixun(shixun,jupyter_port) author_name = current_user.real_name author_email = current_user.git_mail message = "User submitted" tpiID = "tpm#{shixun.id}" src_url = "#{jupyter_service(jupyter_port)}/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/01.ipynb?download=true" response = Faraday.get(src_url) if response.status.to_i != 200 raise("获取文件内容失败:#{response.status}") end content = response.body.force_encoding('utf-8') c = GitService.update_file(repo_path: shixun.repo_path, file_path: "01.ipynb", message: message, content: content, author_name: author_name, author_email: author_email) return c.size end def jupyter_save_with_game(myshixun,jupyter_port) author_name = current_user.real_name author_email = current_user.git_mail message = "User submitted" tpiID = myshixun.id repo_save_path = myshixun.repo_save_path src_url = "#{jupyter_service(jupyter_port)}/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb?download=true" response = Faraday.get(src_url) if response.status.to_i != 200 raise("获取文件内容失败:#{response.status}") end content = response.body.force_encoding('utf-8') c = GitService.update_file(repo_path: myshixun.repo_path, file_path: "01.ipynb", message: message, content: content, author_name: author_name, author_email: author_email) return c.size end ##重置jupyter环境 def jupyter_tpi_reset(myshixun) jupyter_delete_tpi(myshixun) url = jupyter_url_with_game(myshixun) port = jupyter_port_with_game(myshixun) {url: url, port: port} end ## 重置tpm环境 def jupyter_tpm_reset(shixun) jupyter_delete_tpm(shixun) url = jupyter_url_with_shixun(shixun) port = jupyter_port_with_shixun(shixun) {url: url, port: port} end # 删除pod def jupyter_delete_tpi(myshixun) myshixun_id = myshixun.id digest = myshixun.identifier + edu_setting('bridge_secret_key') digest_key = Digest::SHA1.hexdigest("#{digest}") begin shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/delete" Rails.logger.info("#{current_user} => cloese_jupyter digest is #{digest}") params = {:tpiID => myshixun_id, :digestKey => digest_key, :identifier => myshixun.identifier} res = uri_post uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:110)") end end end def jupyter_delete_tpm(shixun) tpiID = "tpm#{shixun.id}" digest = shixun.identifier + edu_setting('bridge_secret_key') digest_key = Digest::SHA1.hexdigest("#{digest}") begin shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/delete" Rails.logger.info("#{current_user} => cloese_jupyter digest is #{digest}") params = {:tpiID => tpiID, :digestKey => digest_key, :identifier => shixun.identifier} res = uri_post uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:110)") end end end def jupyter_service jupyter_port edu_setting('jupyter_service').gsub("PORT", jupyter_port) end def _jupyter_active(tpiID) shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/active" params = {:tpiID => tpiID} res = uri_post uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:120)") end end # tpm 延时 def jupyter_active_tpm(shixun) tpiID = "tpm#{shixun.id}" _jupyter_active(tpiID) end # tpi 延时 def jupyter_active_tpi(myshixun) tpiID = myshixun.id _jupyter_active(tpiID) end def _jupyter_timeinfo(tpiID) shixun_tomcat = edu_setting('cloud_bridge') uri = "#{shixun_tomcat}/bridge/jupyter/getTimeInfo" params = {:tpiID => tpiID} res = uri_post uri, params if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:130)") end res['data'] end # 获取时间参数 def jupyter_timeinfo_tpm(shixun) tpiID = "tpm#{shixun.id}" _jupyter_timeinfo(tpiID) end # 获取时间参数 def jupyter_timeinfo_tpi(myshixun) tpiID = myshixun.id _jupyter_timeinfo(tpiID) end end