Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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'))
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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'))
Beispiel #11
0
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)
Beispiel #12
0
def check_login(error=None):
    tools.Async_log(g.user, request.url)
Beispiel #13
0
def check_login(error=None):
    tools.Async_log(g.user, request.url)
    importlib.reload(MyForm)
Beispiel #14
0
def check_login(exception=None):
    try:
        tools.Async_log(g.user, request.url)
    except:
        pass
Beispiel #15
0
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)
Beispiel #16
0
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)
Beispiel #17
0
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)
Beispiel #18
0
def webssh():
    tools.Async_log(g.user, request.url)
    return render_template('webssh.html',url=app.config.get('WEBSSH_URL'))