").reference(ctx._get(false, ["message"]),ctx,"h").write("
Project name | ").reference(ctx._get(false, ["projectName"]),ctx,"h").write(" |
Job Types Used | ").section(ctx._get(false, ["jobTypes"]),ctx,{"block":body_1},null).write(" |
This flow has not been scheduled.
Schedule ID | ").reference(ctx._get(false,["schedule","scheduleId"]),ctx,"h").write(" | Submitted By | ").reference(ctx._get(false,["schedule","submitUser"]),ctx,"h").write(" |
First Scheduled to Run | ").reference(ctx._get(false,["schedule","firstSchedTime"]),ctx,"h").write(" | Repeats Every | ").reference(ctx._get(false,["schedule","period"]),ctx,"h").write(" |
Next Execution Time | ").reference(ctx._get(false,["schedule","nextExecTime"]),ctx,"h").write(" | SLA | ").exists(ctx._get(false,["schedule","slaOptions"]),ctx,{"else":body_5,"block":body_6},null).write(" |
%s' %str(job)) 35 | return 36 | 37 | title = '任务配置' 38 | #需要先从azkaban登陆 39 | session_id = self.get_argument('session_id','') 40 | login_user = self.get_argument('login_user','') 41 | if session_id=='' or login_user=='': 42 | self.render('to_login.html') 43 | return 44 | #参数 45 | query_name = self.get_argument('query_name','') 46 | query_project_name = self.get_argument('query_project_name','') 47 | query_server_host = self.get_argument('query_server_host','') 48 | query_user = self.get_argument('query_user','') 49 | #任务 50 | name = self.get_argument('name','') 51 | is_copy = self.get_argument('is_copy','false') 52 | job = Job() 53 | if name !='': 54 | job = Job.get_job_fromdb(name) 55 | if is_copy == 'true': 56 | job.name = '' 57 | job.loc = '' 58 | projects = Job.get_projects(login_user) 59 | jobs = Job.get_alljobs(login_user=login_user) 60 | all_jobs = Job.get_alljobs() 61 | 62 | query_dict = { 63 | 'query_name':query_name, 64 | 'query_project_name':query_project_name, 65 | 'query_server_host':query_server_host, 66 | 'query_user':query_user, 67 | 'session_id':session_id, 68 | 'login_user':login_user 69 | } 70 | 71 | logging.info('to update job [%s]' % name) 72 | self.render('to_update.html',title=title,job=job,jobs=jobs,all_jobs=all_jobs,projects=projects,query_dict=query_dict) 73 | 74 | 75 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_update.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务更新 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | import time 17 | 18 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 19 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 20 | 21 | from job_define import Job 22 | 23 | #指标处理类 24 | class JobUpdateHandler(tornado.web.RequestHandler): 25 | #统一调用post方法 26 | def get(self): 27 | self.post() 28 | 29 | #action为操作类型 30 | def post(self): 31 | #更新完跳转到列表页 32 | title = '调度任务列表' 33 | #需要先从azkaban登陆 34 | session_id = self.get_argument('session_id','') 35 | login_user = self.get_argument('login_user','') 36 | if session_id=='' or login_user=='': 37 | self.render('to_login.html') 38 | return 39 | #参数 40 | query_name = self.get_argument('query_name','') 41 | query_project_name = self.get_argument('query_project_name','') 42 | query_server_host = self.get_argument('query_server_host','') 43 | query_user = self.get_argument('query_user','') 44 | #生成job 45 | attr_list = Job.get_attr_list() 46 | dependencies_box = self.get_argument('dependencies_box','') 47 | logging.info('>>>>>>>>>>>'+str(type(dependencies_box))) 48 | logging.info('>>>>>>>>>>>'+str(dependencies_box)) 49 | job = Job() 50 | #动态加载字段,默认均为字符串 51 | for attr in attr_list: 52 | value = str(self.get_argument(attr,'')).strip() 53 | if value!='': 54 | setattr(job,attr,value) 55 | logging.info(attr+':'+value) 56 | #默认设置 57 | job.name = job.name.replace('.','-') 58 | job.updater = login_user 59 | job.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 60 | if job.creator == '': 61 | job.creator = job.updater 62 | job.create_time = job.update_time 63 | #更新 64 | job.update_job() 65 | 66 | #列表 67 | jobs = Job.get_alljobs(query_name,query_project_name,query_server_host,query_user,login_user) 68 | 69 | query_dict = { 70 | 'query_name':query_name, 71 | 'query_project_name':query_project_name, 72 | 'query_server_host':query_server_host, 73 | 'query_user':query_user, 74 | 'session_id':session_id, 75 | 'login_user':login_user 76 | } 77 | 78 | logging.info('[%s] update job [%s]' % (login_user,job.name)) 79 | self.render('list.html',title=title,jobs=jobs,query_dict=query_dict) 80 | 81 | 82 | -------------------------------------------------------------------------------- /schedule/webapp/handler/job_upload.py: -------------------------------------------------------------------------------- 1 | #!/usrbin/python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | 任务上传 7 | ''' 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import tornado.web 14 | import json 15 | import os 16 | import time 17 | 18 | CURRENTPATH = os.path.dirname(os.path.abspath(__file__)) 19 | sys.path.append(os.path.join(CURRENTPATH, '../../')) 20 | 21 | from generate_files import login_and_upload 22 | 23 | #指标处理类 24 | class JobUploadHandler(tornado.web.RequestHandler): 25 | #统一调用post方法 26 | def get(self): 27 | self.post() 28 | 29 | #action为操作类型 30 | def post(self): 31 | #更新完跳转到列表页 32 | title = '任务上传' 33 | #需要先从azkaban登陆 34 | #session_id = self.get_argument('session_id','') 35 | #login_user = self.get_argument('login_user','') 36 | #if session_id=='' or login_user=='': 37 | # self.render('to_login.html') 38 | # return 39 | #上传结果 40 | username = self.get_argument('username','') 41 | login_user = username 42 | password = self.get_argument('password','') 43 | session_id,result_list = login_and_upload(username,password) 44 | 45 | query_dict = { 46 | 'session_id':session_id, 47 | 'login_user':login_user 48 | } 49 | 50 | logging.info('[%s] upload jobs' % (login_user)) 51 | self.render('upload.html',title=title,result_list=result_list,query_dict=query_dict) 52 | 53 | 54 | -------------------------------------------------------------------------------- /schedule/webapp/model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/model/__init__.py -------------------------------------------------------------------------------- /schedule/webapp/restart.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sh shutdown.sh 4 | sh startup.sh 5 | -------------------------------------------------------------------------------- /schedule/webapp/router/schedule_router.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #encoding:utf-8 3 | ''' 4 | Author: wangxu 5 | Email: wangxu@oneniceapp.com 6 | ''' 7 | 8 | import sys 9 | reload(sys) 10 | sys.setdefaultencoding("utf-8") 11 | 12 | import logging 13 | import os 14 | import tornado.ioloop 15 | import tornado.web 16 | import tornado.options 17 | import tornado.httpserver 18 | from handler.job_list import JobListHandler 19 | from handler.job_to_update import JobToUpdateHandler 20 | from handler.job_update import JobUpdateHandler 21 | from handler.job_delete import JobDeleteHandler 22 | from handler.job_upload import JobUploadHandler 23 | from handler.job_check_exist import JobCheckExistHandler 24 | from handler.dag_edit import DagOpHandler 25 | from handler.job_api import JobApiHandler 26 | from handler.job_status_handler import JobStatusHandler 27 | 28 | #默认端口 29 | from tornado.options import define, options 30 | define("port", default=8445, help="run on the given port", type=int) 31 | 32 | #log日志配置 33 | def init_logconfig(): 34 | log_file = 'schedule_web.log' 35 | logging.basicConfig(level=logging.INFO, 36 | format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s', 37 | datefmt='', 38 | filename=log_file, 39 | filemode='a') 40 | 41 | settings = { 42 | "template_path":os.path.join(os.path.dirname(__file__), "../templates"), 43 | "static_path": os.path.join(os.path.dirname(__file__), "../static") 44 | } 45 | 46 | #路径路由 47 | application = tornado.web.Application([ 48 | #(r"/upload", UploadHandler), 49 | (r"/job_list", JobListHandler), 50 | (r"/job_to_update", JobToUpdateHandler), 51 | (r"/job_update", JobUpdateHandler), 52 | (r"/job_delete", JobDeleteHandler), 53 | (r"/job_upload", JobUploadHandler), 54 | (r"/job_check_exist", JobCheckExistHandler), 55 | (r"/job_api",JobApiHandler), 56 | (r"/job_status",JobStatusHandler), 57 | (r"/dag",DagOpHandler), 58 | ],**settings) 59 | 60 | if __name__ == "__main__": 61 | #初始化logging 62 | init_logconfig() 63 | # logging.info(template_path) 64 | logging.info('-----quality monitor service startup-------') 65 | tornado.options.parse_command_line() 66 | logging.info('port:%s' % options.port) 67 | 68 | server = tornado.httpserver.HTTPServer(application) 69 | server.bind(options.port) 70 | server.start(5) 71 | tornado.ioloop.IOLoop.instance().start() 72 | #logging.info('----------service startup---------') 73 | -------------------------------------------------------------------------------- /schedule/webapp/shutdown.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/sh 2 | 3 | pid=`ps aux | grep "router/schedule_router.py" |grep -v grep |awk '{print $2}'` 4 | [ "$pid" != "" ] && kill -9 $pid 5 | echo $pid 6 | 7 | -------------------------------------------------------------------------------- /schedule/webapp/startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CURDIR=`pwd` 4 | #export CONF_HOME=$CURDIR/conf 5 | export PYTHONPATH=$CURDIR:$PYTHONPATH 6 | 7 | nohup python router/schedule_router.py --port=8445 > schedule_web.log 2>&1 & 8 | -------------------------------------------------------------------------------- /schedule/webapp/static/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Base structure 3 | */ 4 | 5 | /* Move down content because we have a fixed navbar that is 50px tall */ 6 | body { 7 | padding-top: 50px; 8 | } 9 | 10 | 11 | /* 12 | * Global add-ons 13 | */ 14 | 15 | .sub-header { 16 | padding-bottom: 10px; 17 | border-bottom: 1px solid #eee; 18 | } 19 | 20 | /* 21 | * Top navigation 22 | * Hide default border to remove 1px line. 23 | */ 24 | .navbar-fixed-top { 25 | border: 0; 26 | } 27 | 28 | /* 29 | * Sidebar 30 | */ 31 | 32 | /* Hide for mobile, show later */ 33 | .sidebar { 34 | display: none; 35 | } 36 | @media (min-width: 768px) { 37 | .sidebar { 38 | position: fixed; 39 | top: 51px; 40 | bottom: 0; 41 | left: 0; 42 | z-index: 1000; 43 | display: block; 44 | padding: 20px; 45 | overflow-x: hidden; 46 | overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ 47 | background-color: #f5f5f5; 48 | border-right: 1px solid #eee; 49 | } 50 | } 51 | 52 | /* Sidebar navigation */ 53 | .nav-sidebar { 54 | margin-right: -21px; /* 20px padding + 1px border */ 55 | margin-bottom: 20px; 56 | margin-left: -20px; 57 | } 58 | .nav-sidebar > li > a { 59 | padding-right: 20px; 60 | padding-left: 20px; 61 | } 62 | .nav-sidebar > .active > a, 63 | .nav-sidebar > .active > a:hover, 64 | .nav-sidebar > .active > a:focus { 65 | color: #fff; 66 | background-color: #428bca; 67 | } 68 | 69 | 70 | /* 71 | * Main content 72 | */ 73 | 74 | .main { 75 | padding: 20px; 76 | } 77 | @media (min-width: 768px) { 78 | .main { 79 | padding-right: 40px; 80 | padding-left: 40px; 81 | } 82 | } 83 | .main .page-header { 84 | margin-top: 0; 85 | } 86 | 87 | 88 | /* 89 | * Placeholder dashboard ideas 90 | */ 91 | 92 | .placeholders { 93 | margin-bottom: 30px; 94 | text-align: center; 95 | } 96 | .placeholders h4 { 97 | margin-bottom: 0; 98 | } 99 | .placeholder { 100 | margin-bottom: 20px; 101 | } 102 | .placeholder img { 103 | display: inline-block; 104 | border-radius: 50%; 105 | } 106 | -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /schedule/webapp/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cocofree/azkaban_assistant/8ab3d518f5750caccd77b19f69e559a8b805b9dd/schedule/webapp/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /schedule/webapp/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
# | 73 |啊 | 74 |Header | 75 |Header | 76 |Header | 77 |Header | 78 |
---|---|---|---|---|---|
1,001 | 83 |Lorem | 84 |ipsum | 85 |dolor | 86 |sit | 87 |sit | 88 | 89 |
1,002 | 92 |amet | 93 |consectetur | 94 |adipiscing | 95 |elit | 96 |
{{ result_dict['mes'] }}73 |