在构建一些配方时,我们发现如果系统已经处于良好状态但是更新仍在运行,那么触发apt_update作为流程的一部分可能会大大减慢速度。
为了解决这个问题,我们使用action做了一个apt_update调用:没有,然后设置任何实际需要更新通知的内容:before或:immediate(比如在安装包之前或添加apt存储库之后,尽管存储库情况在添加时可以通过标志进行控制。
我们想测试apt_update调用是否仅在必要时触发,并且不作为会话的一部分运行,否则将无法安装包。
DROP SCHEMA IF EXISTS local_schema_name CASCADE;
CREATE SCHEMA local_schema_name ;
IMPORT FOREIGN SCHEMA foreign_schema_name
FROM SERVER foreign_server_name INTO local_schema_name ;
答案 0 :(得分:0)
我花了很长时间才找到实际测试apt_update的代码,甚至更长时间才能理解它,然后当我想测试它总是在我需要它的早期触发的正确时间运行apt_update时更长在编译阶段而不是收敛阶段。
it 'triggered apt update' do
ppa_call = chef_run.apt_repository('git-core')
expect(ppa_call).to notify('apt_update[update]').to(:update).immediately
end
it 'default apt update' do
expect(chef_run).to update_apt_update('update')
end
it 'install git' do
expect(chef_run).to install_apt_package('git')
end
我不记得我在哪里找到了有条件触发的语法,但在再次查看常规的apt_update测试后,我终于在chefspec示例中找到了它。 https://github.com/chefspec/chefspec/blob/master/examples/apt_update/spec/update_spec.rb
答案 1 :(得分:0)
运行kitchen converge以检查每次运行时是否执行apt_repository,或者如果存储库已存在则跳过。我不确定该资源是否是幂等的。如果它不是幂等的,它肯定会在每次运行时通知更新。我建议为apt_repository添加一个保护子句,以便在存储库已经存在时跳过它。
单元测试无法确认只有在添加新存储库时才会调用更新。