def image_update(): try: tools.Async_log(g.user, request.url) reload(MyForm) form = MyForm.FormK8sUpdate() if form.submit.data: rollback = False deployment = form.deployment.data version = form.version.data context = form.contexts.data rollback_image = form.images.data if version or rollback_image: new_image = "%s/%s:%s" % (docker_registry, deployment, version) if rollback_image: rollback = True new_image = rollback_image redis_key = 'op_k8s_update_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.SchedulerPublish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_update, [context, new_image, version, rollback, redis_key, 'web']) Scheduler.start() return render_template('deploy_show.html', redis_key=redis_key) except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template('k8s_update.html', form=form)
def image_update(): try: tools.Async_log(g.user, request.url) reload(MyForm) form = MyForm.FormK8sUpdate() db_deploy = db_op.k8s_deploy rollback = False if form.submit.data: deployment = form.deployment.data version = form.version.data context = form.contexts.data action = form.action.data if version: image = "%s/%s:%s" % (docker_registry[context], deployment, version) if action == 'rollback': rollback = True val = db_deploy.query.filter( db_deploy.image == image).all() if not val: flash('%s版本镜像不存在!' % version) return render_template('Message.html') redis_key = 'op_k8s_update_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.SchedulerPublish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_update, [context, image, version, rollback, redis_key, 'web']) Scheduler.start() return render_template('deploy_show.html', redis_key=redis_key) except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template('k8s_update.html', form=form)
def check_login(error=None): tools.Async_log(g.user, request.url) _, active_contexts = config.list_kube_config_contexts(config_file) g.context = active_contexts['name'] if 'active_context' in request.cookies: g.context = request.cookies['active_context'] config.load_kube_config(config_file, g.context)
def m_image_update(): try: tools.Async_log(g.user, request.url) reload(MyForm) form = MyForm.FormK8sUpdate() if form.submit.data: deployment = form.deployment.data version = form.version.data context = form.contexts.data if version: new_image = "%s/%s:%s" % (docker_registry, deployment, version) new_replicas = form.replicas.data redis_key = 'op_k8s_update_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.SchedulerPublish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_update, [ context, new_image, new_replicas, version, redis_key, 'web' ]) Scheduler.start() return render_template('mobile/m_deploy_show.html', redis_key=redis_key) except Exception as e: logging.error(e) return render_template('mobile/m_k8s_update.html', form=form)
def apply(): try: tools.Async_log(g.user, request.url) dt = time.strftime('%Y-%m-%d', time.localtime()) ym = time.strftime('%Y', time.localtime()) db_approval = db_op.user_approval db_sso = db_op.user_sso form = MyForm.MyForm_apply() val = db_approval.query.filter(and_(db_approval.dingId == g.dingId,db_approval.status == '待审批')).all() if val: raise flash('权限还未审批,请耐心等待!') val = db_approval.query.filter(and_(db_approval.dingId == g.dingId,db_approval.status == '审批拒绝')).all() if val: raise flash('权限审批未通过!') if form.submit.data: grade = form.select.data val = db_approval.query.filter(db_approval.dingId == g.dingId).all() if val: raise flash('请勿重复提交申请!') val = db_sso.query.with_entities(db_sso.grade).filter(db_sso.dingunionid == g.dingId).all() if grade in val[0][0]: raise flash('权限已拥有,无需提交申请!') v = db_approval(dingId=g.dingId,apply_time=dt,approval_time='',approval_person='',apply_grade=grade,status='待审批') db_op.DB.session.add(v) db_op.DB.session.commit() flash('权限申请提交完成、请等待审批!') except: pass return render_template('apply.html', form=form, ym=ym)
def deployment_create(): tools.Async_log(g.user, request.url) reload(MyForm) form = MyForm.Form_k8s_deploy() if form.submit.data: project = form.projects.data version = form.version.data object = form.object.data container_port = form.container_port.data ingress_port = form.ingress_port.data replicas = form.replicas.data request_cpu = form.request_cpu.data limit_cpu = form.limit_cpu.data request_mem = form.request_mem.data limit_mem = form.limit_mem.data domain = form.domain.data re_requests = {} re_limits = {} try: if object and version and container_port and replicas: if object.endswith('.war') or object.endswith('.tar.gz') or object.endswith('.jar'): dm_name = object.split('.')[0] image = "%s/%s:%s" %(docker_registry,dm_name,version) docker_file = "%s/%s" %(dockerfile_path,dm_name) if os.path.exists(docker_file): container_port = [int(port) for port in container_port.split(',')] if request_cpu and limit_cpu and request_mem and limit_mem: if float(request_cpu) > float(limit_cpu) or float(request_mem) > float(limit_mem): raise flash('限制资源不能小于请求资源!') else: re_requests = {'cpu': request_cpu, 'memory':'%sG' %request_mem} re_limits = {'cpu': limit_cpu, 'memory':'%sG' %limit_mem} if domain and not ingress_port: raise flash('域名配置后还需配置容器对外服务端口!') redis_key = 'op_k8s_create_%s' % time.strftime('%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(k8s_resource.object_deploy, [project,object,version, image, container_port, ingress_port,replicas, domain,re_requests, re_limits,redis_key]) Scheduler.start() return render_template('deploy_show.html',redis_key=redis_key) else: flash("%s文件路径不存在!" %docker_file) else: flash("%s包名应以.war或者.tar.gz结尾或者.jar结尾!" %object) else: flash('必填项参数不完整!') return render_template('Message.html') except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template('k8s_deploy.html',form=form)
def k8s_project_offline(context=None,dm_name=None,offline=None): try: tools.Async_log(g.user, request.url) busi_data = defaultdict() mounts = None labels = None healthcheck = None sidecar = None tables = ('项目', '业务','集群', '代码包', '最近上线日期', '最近上线时间', '操作') # offline project if dm_name and context and offline: values = db_k8s.query.with_entities(db_k8s.project, db_k8s.image, db_k8s.container_port, db_k8s.replicas, db_k8s.re_requests,db_k8s.re_limits).filter(db_k8s.deployment==dm_name).order_by(desc(db_k8s.id)).limit(1).all() if values: id,project, image, container_port, replicas,re_requests,re_limits = values[0] k8s = k8s_resource.k8s_object(context,dm_name, image, container_port, replicas,mounts,labels,healthcheck,sidecar, re_requests, re_limits) if k8s.delete_hpa() and k8s.delete_ingress() and k8s.delete_service() and k8s.delete_deployment(): db_k8s.query.filter(db_k8s.deployment==dm_name).update({db_k8s.action:'delete'}) db_op.DB.session.commit() return jsonify({'result': 'offline project %s success!' % dm_name}) return jsonify({'result':'offline project %s fail!' %dm_name}) db_k8s_deploy = db_op.k8s_deploy db_project = db_op.project_list db_business = db_op.business projects = db_k8s_deploy.query.with_entities(distinct(db_k8s_deploy.deployment)).all() projects = [project[0] for project in projects] dm_names = [] for context in contexts: config.load_kube_config(config_file,context) v1 = client.AppsV1Api() ret = v1.list_deployment_for_all_namespaces() names = [[i.metadata.name] for i in ret.items if i.metadata.name in projects] dm_names.extend(names) for dm_name in names: vals = db_k8s_deploy.query.with_entities(db_k8s_deploy.project,db_k8s_deploy.context,db_k8s_deploy.war,db_k8s_deploy.update_date, db_k8s_deploy.update_time).filter(and_(db_k8s_deploy.deployment==dm_name[0], db_k8s_deploy.context==context) ).order_by(desc(db_k8s_deploy.id)).all() if vals: dm_name.extend(vals[0]) vals = db_project.query.with_entities(db_project.business_id).filter(db_project.project == vals[0][0]).limit(1).all() if vals: business = db_business.query.with_entities(db_business.business).filter(db_business.id==vals[0][0]).all() if business: dm_name[1] = business[0][0] busi_data[business[0][0]] = vals[0][0] return render_template('k8s_offline.html',dm_names=dm_names,tables=tables,busi_data=busi_data) except Exception as e: logging.error(e) return redirect(url_for('error'))
def platform_token(action=None, id=None, args=None): tools.Async_log(g.user, request.url) db_token = db_op.platform_token tm = time.strftime('%Y-%m-%d', time.localtime()) form = MyForm.Form_platform_token() tables = ['第三方平台', '连接方式', 'Token', '颁发日期', '失效日期', '管理'] if action == 'add': expire_date = "2999-12-30" if id > 0: expire_date = datetime.datetime.now() + datetime.timedelta(days=id) expire_date = expire_date.strftime('%Y-%m-%d') try: c = db_token(platform=args, channel='api', token=Md5.Md5_make(tools.Produce(8, string.digits)), award=tm, expire=expire_date) db_op.DB.session.add(c) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') if action == 'modify': try: db_token.query.filter(db_token.id == id).update( {db_token.expire: args}) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') if action == 'drop': try: v = db_token.query.filter(db_token.id == id).all() for c in v: db_op.DB.session.delete(c) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') vals = db_token.query.with_entities( db_token.id, db_token.platform, db_token.channel, db_token.token, db_token.award, db_token.expire).order_by(desc(db_token.id)).all() return render_template('platform_token.html', form=form, vals=vals, tables=tables, tm=tm)
def publish_log(flow_number=None): tools.Async_log(g.user, request.url) db_publish_log = db_op.publish_log try: if flow_number: flow_logs = db_publish_log.query.with_entities( db_publish_log.record).filter( db_publish_log.fid == int(flow_number)).all() if flow_logs: flow_logs = flow_logs[0][0].splitlines() else: flow_logs = None except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template("publish_log.html", flow_logs=flow_logs)
def k8s_project_offline(dm_name=None): try: tools.Async_log(g.user, request.url) busi_data = defaultdict() # Delete deployment if dm_name: values = db_k8s.query.with_entities(db_k8s.project, db_k8s.image, db_k8s.container_port, db_k8s.replicas, db_k8s.re_requests,db_k8s.re_limits).filter(db_k8s.deployment==dm_name).order_by(desc(db_k8s.id)).limit(1).all() if values: project, image, container_port, replicas,re_requests,re_limits = values[0] k8s = k8s_resource.k8s_object(dm_name, image, container_port, replicas, re_requests, re_limits) if k8s.delete_hpa() and k8s.delete_ingress() and k8s.delete_service() and k8s.delete_deployment(): v = db_k8s(project=project, image=image, container_port=container_port, replicas=replicas, re_requests=re_requests, re_limits=re_limits, action='delete', update_date=time.strftime('%Y-%m-%d', time.localtime()), update_time=time.strftime('%H:%M:%S', time.localtime())) db_op.DB.session.add(v) db_op.DB.session.commit() else: tables = ('项目','业务','代码包','最近上线日期','最近上线时间','操作') db_k8s_deploy = db_op.k8s_deploy db_project = db_op.project_list db_business = db_op.business projects = db_k8s_deploy.query.with_entities(distinct(db_k8s_deploy.deployment)).all() projects = [project[0] for project in projects] v1 = client.AppsV1Api() ret = v1.list_deployment_for_all_namespaces() dm_names = [[i.metadata.name] for i in ret.items if i.metadata.name in projects] for dm_name in dm_names: vals = db_k8s_deploy.query.with_entities(db_k8s_deploy.project,db_k8s_deploy.war,db_k8s_deploy.update_date, db_k8s_deploy.update_time).filter(db_k8s_deploy.deployment==dm_name[0]).order_by(desc(db_k8s_deploy.id)).all() if vals: dm_name.extend(vals[0]) vals = db_project.query.with_entities(db_project.business_id).filter(db_project.project == vals[0][0]).limit(1).all() if vals: business = db_business.query.with_entities(db_business.business).filter(db_business.id==vals[0][0]).all() if business: dm_name[1] = business[0][0] busi_data[business[0][0]] = vals[0][0] return render_template('k8s_offline.html',dm_names=dm_names,tables=tables,busi_data=busi_data) except Exception as e: logging.error(e) return redirect(url_for('error'))
def approval(): try: tools.Async_log(g.user, request.url) dt = time.strftime('%Y-%m-%d', time.localtime()) db_approval = db_op.user_approval db_sso = db_op.user_sso db_permission = db_op.permission tables = ('申请人','部门','申请日期', '申请权限', '审批状态', '操作') action = tools.http_args(request,'action') id = tools.http_args(request,'id') status = {'allow': '审批通过', 'deny': '审批拒绝'} # 判断访问参数 if action in ('allow', 'deny') and id: #验证操作人是否真实 val = db_sso.query.filter(db_sso.dingunionid == g.dingId).all() if val: # 修改申请权限表状态 db_approval.query.filter(and_(db_approval.id == id)).update({db_approval.status: status[action], db_approval.approval_time: dt,db_approval.approval_person: g.user}) db_op.DB.session.commit() if action == 'allow': # 写入授权列表 vals = db_approval.query.with_entities(db_approval.apply_grade).filter(db_approval.id == id).all() grade = vals[0][0] if int(grade) == 1: db_sso.query.filter(db_sso.dingunionid==g.dingId).update({db_sso.grade:','.join([str(x) for x in range(1, 11)])}) else: db_sso.query.filter(db_sso.dingunionid == g.dingId).update({db_sso.grade: '%s,9,10' % grade}) db_op.DB.session.commit() except Exception as e: logging.error(e) db_op.DB.session.rollback() finally: # 获取权限列表 auths = db_permission.query.with_entities(db_permission.authid, db_permission.auth).all() auths = {val[0]: val[1] for val in auths} users = db_sso.query.with_entities(db_sso.dingunionid,db_sso.realName,db_sso.department).all() users = {val[0]: val[1:] for val in users} values = db_approval.query.with_entities(db_approval.id, db_approval.dingId, db_approval.apply_time,db_approval.apply_grade, db_approval.status).filter(db_approval.status == '待审批').all() return render_template('approval.html', tables=tables, values=values, auths=auths,users=users)
def check_login(error=None): tools.Async_log(g.user, request.url)
def check_login(error=None): tools.Async_log(g.user, request.url) importlib.reload(MyForm)
def check_login(exception=None): try: tools.Async_log(g.user, request.url) except: pass
def check_login(exception=None): if g.grade == ['9', '10']: return redirect(url_for('work_order.work_order')) tools.Async_log(g.user, request.url)
def deployment_create(): tools.Async_log(g.user, request.url) reload(MyForm) form = MyForm.FormK8sDeploy() mounts = defaultdict() labels = defaultdict() if form.submit.data: context = form.contexts.data project = form.projects.data version = form.version.data object = form.object.data container_port = form.container_port.data ingress_port = form.ingress_port.data replicas = form.replicas.data request_cpu = form.request_cpu.data limit_cpu = form.limit_cpu.data request_mem = form.request_mem.data limit_mem = form.limit_mem.data domain = form.domain.data healthcheck = form.healthcheck.data label_project = form.label_project.data label_deploy = form.label_deploy.data mount_path = form.mount_path.data mount_name = form.mount_name.data sidecar = form.sidecar.data docker_args = form.docker_args.data if docker_args: docker_args = docker_args.splitlines() run_args = form.run_args.data run_args = run_args.splitlines() re_requests = {'cpu': 1, 'memory': '2G'} re_limits = {'cpu': 2, 'memory': '4G'} if mount_path: mounts[mount_path] = mount_name if label_project: labels['project'] = label_project if label_project: labels['deploy'] = label_deploy try: if object and version and replicas: if object.endswith('.war') or object.endswith( '.tar.gz') or object.endswith('.jar'): dm_name = object.split('.')[0] image = "%s/%s:%s" % (docker_registry[context], dm_name, version) docker_file = "%s/%s" % (dockerfile_path, dm_name) if not os.path.exists(docker_file): os.makedirs(docker_file) if container_port: container_port = [ int(port) for port in container_port.split(',') ] if request_cpu and limit_cpu and request_mem and limit_mem: if float(request_cpu) > float(limit_cpu) or float( request_mem) > float(limit_mem): raise flash('限制资源不能小于请求资源!') else: re_requests = { 'cpu': request_cpu, 'memory': '%sG' % request_mem } re_limits = { 'cpu': limit_cpu, 'memory': '%sG' % limit_mem } if domain and not ingress_port: raise flash('域名配置后还需配置容器对外服务端口!') redis_key = 'op_k8s_create_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.SchedulerPublish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_deploy, [ context, project, object, version, image, docker_args, run_args, container_port, ingress_port, replicas, domain, re_requests, mounts, labels, healthcheck, sidecar, re_limits, redis_key ]) Scheduler.start() return render_template('deploy_show.html', redis_key=redis_key) else: flash("%s包名应以.war或者.tar.gz结尾或者.jar结尾!" % object) else: flash('必填项参数不完整!') return render_template('Message.html') except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template('k8s_deploy.html', form=form)
def publish(): try: tools.Async_log(g.user, request.url) importlib.reload(MyForm) secret_key = tools.Produce(length=12, chars=string.digits) Msg_Key = 'op_publish_msg_%s' % secret_key form = MyForm.MyFormPublish() if form.submit.data: try: if Redis.exists(Msg_Key): raise flash('上线操作过于频繁,请稍等%s秒......' % Redis.ttl(Msg_Key)) package_url = form.package_url.data describe = form.describe.data package_md5 = form.package_md5.data package_type = form.package_type.data publish_type = form.publish_type.data check_url = form.check_url.data restart = form.restart.data execute = form.execute.data rb_project = form.project.data rb_version = form.version.data gray = form.gray.data if execute == 'rollback': if not rb_project and not rb_version: raise logging.error("choice can not be empty!") if execute == 'publish': if not package_url or not package_md5 or not check_url or not describe: raise logging.error("input can not be empty!") Package_name = package_url.split('/')[-1] package_name = Package_name.replace('.zip', '') rb_project = '-'.join(package_name.split('-')[:-1]) INFOS = { 'package_url': package_url, 'package_md5': package_md5, 'package_type': package_type, 'publish_type': publish_type, 'user': g.user, 'describe': describe.replace('"', '').replace("'", ''), 'gray': int(gray), 'restart': restart, 'execute': execute, 'check_url': check_url.replace('https', 'http'), 'project': rb_project, 'version': rb_version, 'channel': 'web', 'callback_url': 'None', 'token': 'None', 'timestamp': int(time.time()) } #启动代码分发控制中心 Scheduler = produce.SchedulerPublish() Scheduler = Scheduler.Scheduler_mem( task_publish.Publish_center, [INFOS, Msg_Key, secret_key]) Scheduler.start() return render_template('publish_show.html', secret_key=secret_key) except Exception as e: if 'old-style' not in str(e): logging.error(e) except Exception as e: logging.error(e) return redirect(url_for('error')) return render_template('publish.html', form=form)
def webssh(): tools.Async_log(g.user, request.url) return render_template('webssh.html',url=app.config.get('WEBSSH_URL'))