# # 添加api class Task_ModelView_Api(Task_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(Task) route_base = '/task_modelview/api' # list_columns = ['name','label','job_template_url','volume_mount','debug'] list_columns = [ 'name', 'label', 'pipeline', 'job_template', 'volume_mount', 'node_selector', 'command', 'overwrite_entrypoint', 'working_dir', 'args', 'resource_memory', 'resource_cpu', 'resource_gpu', 'timeout', 'retry', 'created_by', 'changed_by', 'created_on', 'changed_on', 'monitoring', 'expand' ] add_columns = [ 'name', 'label', 'job_template', 'pipeline', 'working_dir', 'command', 'args', 'volume_mount', 'node_selector', 'resource_memory', 'resource_cpu', 'resource_gpu', 'timeout', 'retry', 'expand' ] edit_columns = add_columns show_columns = [ 'name', 'label', 'pipeline', 'job_template', 'volume_mount', 'node_selector', 'command', 'overwrite_entrypoint', 'working_dir', 'args', 'resource_memory', 'resource_cpu', 'resource_gpu', 'timeout', 'retry', 'created_by', 'changed_by', 'created_on', 'changed_on', 'monitoring', 'expand' ] appbuilder.add_api(Task_ModelView_Api)
from flask_appbuilder import ModelRestApi from flask_appbuilder.models.sqla.interface import SQLAInterface from myapp import app, appbuilder from myapp.models.log import Log from . import LogMixin class LogRestApi(LogMixin, ModelRestApi): datamodel = SQLAInterface(Log) class_permission_name = "LogModelView" method_permission_name = { "get_list": "list", "get": "show", "post": "add", "put": "edit", "delete": "delete", "info": "list", } resource_name = "log" allow_browser_login = True list_columns = ("user.username", "action", "dttm") if (not app.config.get("FAB_ADD_SECURITY_VIEWS") is False or app.config.get("MYAPP_LOG_VIEW") is False): appbuilder.add_api(LogRestApi)
@expose('/link/<service_id>') def link(self, service_id): service = db.session.query(Service).filter_by(id=service_id).first() url = "http://" + service.name + "." + conf.get('SERVICE_DOMAIN') if service.host: if 'http://' in service.host or 'https://' in service.host: url = service.host else: url = "http://"+service.host data={ "url":url # 'http://127.0.0.1:8080/video_sample/' # } # 返回模板 return self.render_template('link.html', data=data) class Service_ModelView(Service_ModelView_base,MyappModelView,DeleteMixin): datamodel = SQLAInterface(Service) appbuilder.add_view(Service_ModelView,"内部服务",icon = 'fa-internet-explorer',category = '服务化') class Service_ModelView_Api(Service_ModelView_base,MyappModelRestApi): datamodel = SQLAInterface(Service) route_base = '/service_modelview/api' appbuilder.add_api(Service_ModelView_Api)
class Project_User_ModelView(Project_User_ModelView_Base, CompactCRUDMixin, MyappModelView): datamodel = SQLAInterface(Project_User) appbuilder.add_view_no_menu(Project_User_ModelView) # 添加api class Project_User_ModelView_Api(Project_User_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(Project_User) route_base = '/project_user_modelview/api' appbuilder.add_api(Project_User_ModelView_Api) # 获取某类project分组 class Project_Filter(MyappFilter): # @pysnooper.snoop() def apply(self, query, value): # user_roles = [role.name.lower() for role in list(get_user_roles())] # if "admin" in user_roles: # return query.filter(Project.type == value).order_by(Project.id.desc()) return query.filter(self.model.type == value).order_by( self.model.id.desc()) # 获取自己参加的某类project分组 class Project_Join_Filter(MyappFilter):
href="/job_template_modelview/list/?_flt_2_name=", icon='fa-flag-o', category='训练', category_icon='fa-envelope') # 添加api class Job_Template_ModelView_Api(Job_Template_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(Job_Template) route_base = '/job_template_modelview/api' add_columns = [ 'project', 'images', 'name', 'version', 'describe', 'args', 'env', 'hostAliases', 'privileged', 'accounts', 'demo', 'expand' ] edit_columns = add_columns list_columns = [ 'project', 'name', 'version', 'describe', 'images', 'workdir', 'entrypoint', 'args', 'demo', 'env', 'hostAliases', 'privileged', 'accounts', 'created_by', 'changed_by', 'created_on', 'changed_on', 'expand' ] show_columns = [ 'project', 'name', 'version', 'describe', 'images_url', 'workdir', 'entrypoint', 'args', 'demo', 'env', 'hostAliases', 'privileged', 'expand' ] appbuilder.add_api(Job_Template_ModelView_Api)
# 添加视图和菜单 appbuilder.add_view(Repository_ModelView, "仓库", icon='fa-shopping-basket', category='训练', category_icon='fa-sitemap') # 添加api class Repository_ModelView_Api(Repository_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(Repository) route_base = '/repository_modelview/api' appbuilder.add_api(Repository_ModelView_Api) # 只能查看到自己归属的项目组的镜像 class Images_Filter(MyappFilter): # @pysnooper.snoop(watch_explode=('result')) def apply(self, query, func): user_roles = [ role.name.lower() for role in list(self.get_user_roles()) ] if "admin" in user_roles: return query result = query.order_by(self.model.id.desc()) return result
icon='fa-shopping-basket', category='训练') # 添加api class NNI_ModelView_Api(NNI_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(NNI) conv = GeneralModelConverter(datamodel) route_base = '/nni_modelview/api' list_columns = [ 'created_by', 'changed_by', 'created_on', 'changed_on', 'job_type', 'name', 'namespace', 'describe', 'parallel_trial_count', 'max_trial_count', 'objective_type', 'objective_goal', 'objective_metric_name', 'objective_additional_metric_names', 'algorithm_name', 'algorithm_setting', 'parameters', 'job_json', 'trial_spec', 'working_dir', 'node_selector', 'image_pull_policy', 'resource_memory', 'resource_cpu', 'experiment', 'alert_status' ] add_columns = [ 'job_type', 'name', 'namespace', 'describe', 'parallel_trial_count', 'max_trial_count', 'objective_type', 'objective_goal', 'objective_metric_name', 'objective_additional_metric_names', 'algorithm_name', 'algorithm_setting', 'parameters', 'job_json', 'working_dir', 'node_selector', 'image_pull_policy', 'resource_memory', 'resource_cpu' ] edit_columns = add_columns appbuilder.add_api(NNI_ModelView_Api)
list_columns = ['project','pipeline_url', 'create_time','change_time','elapsed_time', 'final_status','status', 'username', 'log','stop'] show_columns = ['name', 'namespace', 'create_time', 'status','task_status', 'annotations_html', 'labels_html', 'spec_html','status_more_html', 'info_json_html'] crd_name = 'workflow' appbuilder.add_view(Workflow_ModelView,"运行实例",href='/workflow_modelview/list/?_flt_2_name=&_flt_2_labels=',icon = 'fa-tasks',category = '训练') # 添加api class Workflow_ModelView_Api(Crd_ModelView_Base,MyappModelRestApi): datamodel = SQLAInterface(Workflow) route_base = '/workflow_modelview/api' list_columns = ['name', 'namespace_url', 'create_time', 'status', 'username', 'log'] crd_name = 'workflow' appbuilder.add_api(Workflow_ModelView_Api) # appbuilder.add_separator("训练") # 在指定菜单栏下面的每个子菜单中间添加一个分割线的显示。 # # # # list正在运行的tfjob # class Tfjob_ModelView(Crd_ModelView_Base,MyappModelView,DeleteMixin): # label_title = 'tf分布式任务' # datamodel = SQLAInterface(Tfjob) # crd_name = 'tfjob' # list_columns = ['name','pipeline_url','run_instance','namespace_url','create_time','status','username','stop']
__("Stop"), __("Stop all Really?"), "fa-trash", single=False) def stop_all(self, items): self.base_muldelete(items) self.update_redirect() return redirect(self.get_redirect()) class Notebook_ModelView(Notebook_ModelView_Base, MyappModelView, DeleteMixin): datamodel = SQLAInterface(Notebook) # 添加视图和菜单 appbuilder.add_view(Notebook_ModelView, "notebook", href="/notebook_modelview/list/?_flt_0_created_by=", icon='fa-file-code-o', category='在线开发', category_icon='fa-code') # 添加api class Notebook_ModelView_Api(Notebook_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(Notebook) route_base = '/notebook_modelview/api' appbuilder.add_api(Notebook_ModelView_Api)
class Hyperparameter_Tuning_ModelView_Api(Hyperparameter_Tuning_ModelView_Base,MyappModelRestApi): datamodel = SQLAInterface(Hyperparameter_Tuning) conv = GeneralModelConverter(datamodel) route_base = '/hyperparameter_tuning_modelview/api' list_columns = ['created_by','changed_by','created_on','changed_on','job_type','name','namespace','describe', 'parallel_trial_count','max_trial_count','max_failed_trial_count','objective_type', 'objective_goal','objective_metric_name','objective_additional_metric_names','algorithm_name', 'algorithm_setting','parameters','job_json','trial_spec','working_dir','node_selector', 'image_pull_policy','resource_memory','resource_cpu','experiment','alert_status'] add_columns = ['job_type','name','namespace','describe', 'parallel_trial_count','max_trial_count','max_failed_trial_count','objective_type', 'objective_goal','objective_metric_name','objective_additional_metric_names','algorithm_name', 'algorithm_setting','parameters','job_json','working_dir','node_selector','image_pull_policy', 'resource_memory','resource_cpu'] edit_columns = add_columns appbuilder.add_api(Hyperparameter_Tuning_ModelView_Api) # list正在运行的Experiments from myapp.views.view_workflow import Crd_ModelView_Base from myapp.models.model_katib import Experiments class Experiments_ModelView(Crd_ModelView_Base,MyappModelView,DeleteMixin): label_title='超参调度' datamodel = SQLAInterface(Experiments) list_columns = ['url','namespace_url','create_time','status','username'] crd_name = 'experiment' appbuilder.add_view(Experiments_ModelView,"katib超参调度",icon = 'fa-tasks',category = '超参搜索')
edit_columns = ['status'] base_filters = [["id", RunHistory_Filter, lambda: []]] # 设置权限过滤器 add_form_extra_fields = { "status": SelectField(_(datamodel.obj.lab('status')), description="状态comed为已识别未提交,created为已提交", widget=Select2Widget(), choices=[['comed', 'comed'], ['created', 'created']]), } edit_form_extra_fields = add_form_extra_fields class RunHistory_ModelView(RunHistory_ModelView_Base, MyappModelView, DeleteMixin): datamodel = SQLAInterface(RunHistory) appbuilder.add_view(RunHistory_ModelView, "定时调度记录", icon='fa-clock-o', category='训练') # 添加api class RunHistory_ModelView_Api(RunHistory_ModelView_Base, MyappModelRestApi): datamodel = SQLAInterface(RunHistory) route_base = '/runhistory_modelview/api' appbuilder.add_api(RunHistory_ModelView_Api)