2015-03-08 82 views
1

我在烹饪书中定义了以下两个资源,它们发出HTTP请求。我基本上需要根据action 1的结果检查条件执行action 2。如果来自action 1的条件不匹配,我需要食谱睡眠一段时间,然后再次尝试action 1有条件地执行资源

什么是最好的方法/方法来做到这一点?

webhooks_request "Action 1" do 
    uri "example.net/data1" 
    post_data ({ 'value1' => '1', 'value2' => '2'}) 
    expected_response_codes [ 200, 201 ] 
    action :post 
end 

我使用以下ruby_block处理来自action 1所以我想它应该是可能的,然后基于匹配的条件执行action 2结果。

ruby_block "Parse Response" do 
    #Parse the result from action 1 
end 

webhooks_request "Action 2" do 
    uri "example.net/data2" 
    post_data ({ 'value1' => '1', 'value2' => '2'}) 
    expected_response_codes [ 200, 201 ] 
    action :post 
end 

回答

2

我会做什么(警告:这是未经测试的代码):

node.runstate['my_hook']['retries']=10 

webhooks_request "Action 1" do 
    uri "example.net/data1" 
    post_data ({ 'value1' => '1', 'value2' => '2'}) 
    expected_response_codes [ 200, 201 ] 
    action :post 
    notifies :run, "ruby_block[Parse Response]", :immediately 
end 

ruby_block "Parse Response" do 
    action :nothing 
    block do 
    #Parse the result from action 1 
    if "result ok from action 1" 
     self.notifies :post,"webhooks_request[Action 2]",:immediately 
    else 
     node.runstate['my_hook']['retries'] -= 1 # decrease to avoid infinite loop 
     sleep(10) 
     self.notifies :post,"webhooks_request['Action 1']",:immediately 
    end 
    end 
end 

webhooks_request "Action 2" do 
    uri "example.net/data2" 
    post_data ({ 'value1' => '1', 'value2' => '2'}) 
    expected_response_codes [ 200, 201 ] 
    action :nothing 
end 

另一种方式是做红宝石块内的“动作1”的号召,以分析它直接输出。

东西沿线可以做(仍未经测试的代码):

ruby_block "try webhook" do 
    block do 
    r = Chef::Resource::WebhooksRequest.new('Action 1',run_context) 
    r.uri "example.net/data2" 
    r.post_data ({ 'value1' => '1', 'value2' => '2'}) 
    r.expected_response_codes [ 200, 201 ] 
    hookretries=10 
    while hookretries do 
     r.run_action :post 
     # parse data from Action 1 
     if "action 1 returned NOK" 
     hookretries -= 1 
     else 
     break 
     end 
    end 
    hook_retries > 0 # to trigger notify if we're not in timeout 
    end 
    notifies :post, "webhooks_request[Action 2]", :immediately 
end 
webhooks_request "Action 2" do 
    uri "example.net/data2" 
    post_data ({ 'value1' => '1', 'value2' => '2'}) 
    expected_response_codes [ 200, 201 ] 
    action :nothing 
end 
+0

非常感谢 - 我要试试这个\ – user1513388 2015-03-09 22:05:12

+0

我想补充,如果你想跳过#2如果第1超时,然后把'not_if {node.runstate ['my_hook'] ['retries'] <0}'(你可能必须把它包装在一个懒惰的块中。 – 2015-03-10 05:27:02

+0

@TejayCardon我可能是错的没有测试过),但是我的最后一行代码块会返回true或false,而且如果ruby_block返回false,那么IIRC(但确实不确定)通知不应该被激怒(我必须测试这个来确认这种行为) – Tensibai 2015-03-10 09:29:18