Stx3.0补丁服务分析(一)

 

服务架构

服务架构

Stx 3.0的补丁相关服务主要包含以下几个:

  • sw-patch-controller-daemon:控制服务,主要包含三个线程:api-thread是提供RestAPI供外部访问;auth-api-thread主要提供用户权限校验;main-thread处理patch和host的业务逻辑,负责与patch-agent通信。各线程都访问全局变量pa:PatchController。控制服务运行在控制节点。
  • patch-agent:agent服务,主要负责与控制节点的main-thread通信,负责查询本机rpm状态、安装rpm包等操作。agent服务在所有节点都存在。
  • patch-alarm-manager:负责补丁相关的告警的产生和消除,通过各服务的RestAPI周期查询补丁状态和告警列表,通过比较来set和clear告警。

操作流程

操作流程

如上图所示,使用sw-patch命令或者portal页面可以对补丁做以上6种操作,每一步操作完成之后,补丁的状态和主机的状态可以参考图中内容。具体sw-patch命令如下:

upload补丁:

sw-patch upload TC_19.12_PATCH_TEST.patch

apply补丁:

sw-patch apply TC_19.12_PATCH_TEST

查看补丁列表和状态:

sw-patch query

查看主机列表和状态:

sw-patch query-hosts

指定节点安装补丁:

sw-patch host-install compute-0

remove补丁:

sw-patch remove TC_19.12_PATCH_TEST

delete补丁:

sw-patch delete TC_19.12_PATCH_TEST

commit补丁:

sw-patch commit TC_19.12_PATCH_TEST

commit操作可以删除相关补丁中版本低的rpm包,节省磁盘空间,但commit操作是不可逆的,一般使用得较少

补丁结构

补丁结构

可以使用命令解压补丁

tar -xzvf TC_19.12_PATCH_0003.patch
  • metadata.xml中记录了补丁的基本信息,包括补丁ID、状态、说明、内容等信息
  • software.tar包含补丁的rpm包
  • semantics.tar存放在apply前或者remove前需要执行的脚本,目前没有用到
  • signature是补丁签名,是最原始的签名方式
  • signature.v2是第二代补丁签名,R5和stx中有,R4中没有

上传补丁

上传补丁

上传补丁的流程:

  1. 执行sw-patch upload TC_19.12_PATCH_TEST.patch命令上传补丁,是调用patch_client代码的patch_upload_req()方法,发送一个RestAPI请求给patch-controller。
  2. 响应上传补丁接口的是PatchAPIController控制器的upload()方法。
  3. upload()将补丁文件完整的保存在/scratch/目录下。
  4. 调用全局变量pa:PatchController的patch_import_api()解析补丁内容,如果补丁ID已存在就只更新补丁的metadata,如果补丁ID不存在就全部解析。
  5. patch_import_api()调用PatchFile的extract_patch()方法提取补丁。
  6. extract_patch()先调用read_patch()方法把补丁解压到/tmp/patch_xxxxxx目录下
  7. read_patch()方法使用文件md5值校验第一版签名,然后调用patch_verify的verify_files()方法校验第二版签名;
  8. extract_patch()解析补丁信息,比对补丁内rpm包与基础库rpm包版本号,如果版本号小于或等于基础库版本号,抛异常;比对补丁内rpm包与升级库rpm包,如果该rpm包在以前的任何补丁中存在,抛异常;
  9. extract_patch()归档补丁文件,将metadata.xml文件归档到/opt/patching/metadata/available目录,将rpm包归档到/opt/patching/packages/{SW_VERSION}目录。
  10. extract_patch()返回当前补丁信息
  11. 更新PatchController的patch_data,更新/新增upload的补丁信息。
  12. patch_import_api()返回提示信息
  13. upload()调用pa:PatchController的patch_sync()方法同步

参考资料

社区源代码仓库:https://opendev.org/starlingx/update

smart代码仓库:https://github.com/smartpm/smart