Django实现自动发布(3发布-安装)
相对于服务的升级、回退,新部署一个服务要复杂一些,要满足以下要求:
- 已经运行了服务实例的主机不能重复部署
- 进程启动需要的配置文件要先同步到主机上
之前的升级、回退都是指进程的操作,不涉及配置文件的变更
配置文件的管理、同步比较复杂,放到后面,这里就专注于服务的安装了
不能重复部署,这个比较容易实现,资产表和实例表做个关联查询,返回所有在实例表中不存在的资产,代码大概是这个样子:
def get(self, request, service_id):
deployed = MicroServiceInstance.objects.filter(microservice_id=service_id)
deployed_id_set = set([v.host_id for v in deployed])
data = [{
'id': item.id,
'ip': item.ip,
'hostname': item.hostname,
'enable': False if item.id in deployed_id_set else True
} for item in Asset.objects.all()]
return JsonResponse({
'data': data,
'count': len(data),
'code': 0,
})
页面与升级类似:
除了前端不能选择已部署服务的主机,当我们发送数据(以逗号分隔的主机id)给后端时,也需要进行校验:
- 这批id格式是否正确,后端能否正常解析
- 主机id中是否有已经部署了该服务的实例与之关联
- 主机id在资产表中是否存在
相应的检查代码:
def post(self, request, service_id, pk):
comma_host_ids = request.POST.get('host', '').strip()
if not comma_host_ids:
return JsonResponse({'msg': '主机不能为空'}, status=417)
elif not re.match(r'[0-9,]', comma_host_ids):
return JsonResponse({'msg': '请发送正确的主机id'}, status=417)
deployed_insts = MicroServiceInstance.objects.filter(microservice_id=service_id)
idset = set([int(x) for x in comma_host_ids.split(',') if x])
deployed_hosts = [x for x in deployed_insts if x.host_id in idset]
if deployed_hosts:
return JsonResponse({'msg': '主机{}已部署相关服务'.format(
','.join(x.host.ip for x in deployed_hosts)
)}, status=417)
q = Q()
q.connector = 'OR'
for _id in idset:
q.children.append(('id', _id))
hosts = Asset.objects.filter(q)
if hosts.count() != len(idset):
return JsonResponse({'msg': '请发送正确的主机id'}, status=417)
校验通过后,就可以在实例表中创建一条记录,并标记状态为安装中, 然后发起异步任务去做具体的操作:
installing_insts = []
for host in hosts:
d = {
'microservice_id': service.id,
'version_id': version.id,
'host_id': host.id,
'description': '{} instance'.format(service.name),
'status': InstanceStatus.installing.value, # 安装中
'locked': True,
'updated_by': request.user,
}
inst = MicroServiceInstance.objects.create(**d)
installing_insts.append(inst.id)
# TODO 发起任务
相关的页面和代码比较多,放到 这里
Django实现自动发布(3发布-安装)的更多相关文章
- wordpress自动批量定时发布插件 DX-auto-publish
DX-auto-publish是一款wordpress自动发布插件,方便实用. 该wordpress插件的主要功能如下: 1.能够自动批量定时发布wordpress站点的草稿文章,无需每篇文章都手动设 ...
- 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(二)——自定义安装
原文:使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(二)--自定义安装 自定义产品卸载方式 继续从上一次的基础上前进,现在我们已经知道了最简单的bootstr ...
- 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiX
原文:使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)--初识WiX Visual Studio 打包安装七宗罪 开发.NET的人,肯定会使用Visual ...
- 【原创】我所理解的自动更新-APP发布与后台发布
发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id. 查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新. 创建/更新APP:选择打包ios,androi ...
- 织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!
文章发布员在织梦dedecms后台添加文章时却要超级管理员审核,这无疑是增加了没必要的工作. 登录该账号发布文章你会发现该文章显示的是待审核稿件,且并没有生成静态文件,在前台是看不到这篇文章的,而多数 ...
- 织梦DedeCMS信息发布员发布文章默认自动审核更新并生成HTML页面
织梦DedeCMS信息发布员发布文章默认自动审核更新并生成HTML页面 一直以为DEDECMS的信息发布员在后台发布文章后,非要管理员审核才能显示,今天一哥们问我这个问题.问:“能不能直接发布,并自动 ...
- 再探CI,Github调戏Action手记——自动构建并发布到另一仓库
前言 接上文初探CI,Github调戏Action手记--自动构建并发布 在学习了Action的基本操作之后 接着我们来探索Action其他可能的功能 众所周知 只有用得到的技术学习的才会最快 我也是 ...
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django
近期开始学习基于Linux平台的Django开发,想配置一台可以发布的服务器,经过近一个月的努力,终于掌握了基于Apache和mod-wsgi插件的部署模式,自己也写了一个教程,一是让自己有个记录,二 ...
- Django框架使用一 基本介绍,安装和建项篇
Django概述 Django 是在快节奏的编辑环境中开发的,设计使得常见 Web 开发任务快速且容易;它可以编写一个数据驱动的Web应用程序,简单的说就是不需要开发者操作数据库. 设计数据模型 尽管 ...
- IIS上发布WCF发布服务,访问不到
1 环境是IIS7,发布WCF发布服务,访问不到. 一种原因站点自动生成“程序应用池”和站点的Framwork版本不一致. 解决的办法:新建一个“程序应用池”,然后站点指向这个新建的“程序应用池”
随机推荐
- 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,如果需要往一 ...
- CSS 过渡动画
一.过渡 过渡(transition)是CSS3中具有颠覆性的特征之一,可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 在CSS3 ...
- Django模型层(models.py)之模型创建
Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结. 1.ORM简介 简单的来说,ORM就是对象-关系-映射.它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖 ...
- Java深入学习(6):Disruptor
Disruptor框架简介: 并发框架,基于事件驱动,使用观察者模式 底层采用环形数组,取模算法 简单使用: /** * 声明一个Event:表示生产者和消费者之间传递的数据类型 */ public ...
- H3C 802.1x认证接入过程
- expect免交互用法
一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...
- 目标检测论文解读4——Faster R-CNN
背景 Fast R-CNN中的region proposal阶段所采用的SS算法成为了检测网络的速度瓶颈,本文是在Fast R-CNN基础上采用RPN(Region Proposal Networks ...
- Linux core dump总结
文章链接:https://www.cnblogs.com/Anker/p/6079580.html 1.前言 一直在从事linux下后台开发,经常与core文件打交道.还记得刚开始从事linux下开发 ...
- Detectron2源码阅读笔记-(二)Registry&build_*方法
Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...
- Flash完美跨域访问的方法
先,你要确定以下几点,否则可能无法实现: 1.你要跨到哪个域,你必须能管理那域上文件,因为这里要放一个通行文件. 2.你的Flash如果只有SWF,那不一定能实现,因为有时,Flash的AS中,要加入 ...