2015-03-08 4 views
1

У меня есть следующие 2 ресурса, определенные в кулинарной книге, которая обрабатывает HTTP-запросы. Мне необходимо выполнить action 2 на основании проверки состояния из результата action 1. Если условие от 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

+0

Я хотел бы добавить, если вы хотите, чтобы пропустить # 2, если # 1 раза в год, затем поставьте 'not_if {node.runstate ['my_hook'] ['retries'] <0}' (возможно, вам придется обернуть это в блок «ленивый». –

+0

@TejayCardon Возможно, я ошибаюсь (поскольку я 've не проверял его, но моя последняя строка в блоке вернет true или false, а IIRC (но действительно неуверенный), если ruby_block возвращает false, уведомление не должно быть тригером (я должен проверить это, чтобы подтвердить это поведение) – Tensibai