为barbican数据库添加cron任务垃圾回收器¶
蓝图
https://blueprints.launchpad.net/barbican/+spec/clean-db-soft-deletes
问题描述¶
对于barbican数据库中所有使用软删除的表,表中的条目不会被删除,而是被标记为删除。我们希望创建一个可配置的命令,该命令将由cron任务调用,以遍历数据库并删除已删除标志等于1的条目,或者如果条目不再需要(例如僵尸项目)。
提议的变更¶
创建一个名为‘barbican-manage db cleanup’的barbican命令,该命令将由cron任务运行,以清理barbican数据库中的软删除。该命令将利用python sqlalchemy库调用来遍历数据库并删除已删除等于1的条目。只有在‘barbican/model/models.py’中具有相应类的表,并且该类以‘SoftDeleteMixIn’作为父类,才会被检查。由于假定未使用软删除,因此不会检查任何其他表。该脚本将动态加载models.py中定义的表类到一个列表中。创建列表后,脚本将检查barbican.conf中的配置以添加或删除特定的模型。
将提供一个示例cron任务文件,以便管理员可以修改内容,以按照他们的喜好在间隔内调用python脚本。预期barbican部署者将在cron任务中调用barbican-mange db cleanup命令。
该命令可配置以下选项:自软删除以来保留的最短天数(默认值为90天)删除僵尸项目(无关联资源,默认值为true)强制检查的模型(不继承SoftDeleteMixIn,默认值为None)忽略的模型(继承SoftDeleteMixIn,默认值为None)日志级别(默认值为INFO)。清理日志的位置(默认值为None)。
注意
关于僵尸项目的说明:每当用户尝试发出请求时,Barbican都会创建一个项目条目。如果项目没有关联的资源,则可以删除该项目数据库条目。
注意
关于审计日志的说明:通过API进行的DELETE操作已经由CADF中间件记录。因此,无需添加功能来记录谁执行了删除操作。
注意
对于本次迭代,由于barbican提供的不同可用SLA,订单将不会被触及,应进一步讨论。证书订单不应被删除,因为证书续订需要旧订单。
配置 - 可以使用barbican manage命令传递选项参数来定制清理。例如:‘barbican db cleanup –min_num_days_to_keep_softdeletes 30’
该命令还可以传递一个配置文件来执行命令。‘barbican db cleanup -f “/etc/barbican/barbican.conf”
如果同时提供了配置文件和其他选项参数,则选项参数将具有更高的优先级。因此,barbican管理员可以仅提供选项参数,仅提供配置文件,或两者都提供。配置文件的默认值为‘None’。
以下是配置文件的配置示例
[db_cleanup] #在数据库中保留软删除条目的时间长度 minimum_num_days_to_keep_soft_deletions = 90
#删除没有关联资源的孤立项目 cleanup_unassociated_projects = True
#要强制检查的表类,例如CertificateAuthority,SecretACL,.. table_classes_to_force_check = None
#如果密钥已过期,则应进行软删除 soft_delete_expired_secrets = True
#要忽略的表类,其父类是SoftDeleteMixIn #例如,Project,Secret… table_classes_to_ignore = None
#显示更详细的日志输出(设置INFO日志级别输出) verbose = True
#在日志中显示调试输出(设置DEBUG日志级别输出) #debug = True
#存储删除信息的日志文件 db_cleanup_log_file = “/var/log/barbican/barbican-cleanup.log”
备选方案¶
为删除操作添加一个REST API参数,用户可以在其中指定硬删除。
让数据库管理员手动清理他们的数据库。
让数据库管理员创建数据库触发器进行清理。
创建一个守护进程而不是cron任务,类似于glance scrubber。
数据模型影响¶
数据模型不应更改。
检查的表是具有SoftDeleteMixIn作为父类的表。除非配置,否则将忽略其他表。‘deleted == 1’的条目将被删除。
REST API 影响¶
无
安全影响¶
barbican manage命令和cron任务文件应具有有效的barbican管理员用户权限。没有全局用户能够修改/运行该脚本。
通知与审计影响¶
应保留一个日志,其中包含每个表删除的总条目数。日志位置将可配置。
如果日志级别为debug,则将记录表名、条目ID、软删除日期和硬删除日期。
由于用户删除已经由CADF中间件记录,因此无需记录谁进行了软删除。
Python 和命令行客户端影响¶
无
其他最终用户影响¶
无
性能影响¶
由于这是数据库上执行的定期查找和删除操作,因此可能会占用大量的计算周期。Barbican的管理员/操作员将决定最佳运行时间、运行作业的间隔以及配置要删除的内容。管理员必须根据自己的喜好定制cron作业条目。
其他部署者影响¶
部署者必须配置cron任务文件。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
edtubill
- 其他贡献者
无
工作项¶
下面列出的每个阶段都旨在成为一个CR。(第2阶段将分为不同的CR)
阶段1:创建简单的barbican-manage命令,遍历数据库并删除所有‘deleted == 1’的内容。为第一阶段创建单元和功能测试。阶段2:添加逻辑以读取配置文件并根据配置遍历数据库。创建额外的单元和功能测试。阶段4:创建示例cron任务配置文件。阶段5:在Barbican Wiki上记录cron任务垃圾回收器。
依赖项¶
无
测试¶
必须为内部组件测试编写单元测试。必须根据不同的可能配置创建功能测试。功能测试将直接检查数据库条目。
文档影响¶
将为‘barbican-manage db cleanup’命令的使用方法、如何配置以及如何设置cron作业的示例创建Wiki文档。
如果用户执行barbican-manage db cleanup –help,则应显示用法文档。
参考资料¶
https://blueprints.launchpad.net/barbican/+spec/clean-db-soft-deletes