2015-03-08 1 views
1

J'ai les 2 ressources suivantes définies dans un livre de recettes qui effectue des requêtes HTTP. J'ai essentiellement besoin d'exécuter action 2 basé sur la vérification d'une condition à partir du résultat de action 1. Si la condition de action 1 ne correspond pas, le livre de recettes doit être mis en veille pendant un certain temps, puis recommencer action 1.Exécution conditionnelle de ressources

Quelle est la meilleure approche/façon de faire cela?

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

J'utilise les éléments suivants ruby_block pour traiter le résultat de action 1 donc je pense qu'il devrait être possible d'exécuter ensuite action 2 sur la base correspondant à la condition.

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 

Répondre

2

Ce que je fais (attention: ce code est non testé):

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 

Une autre façon serait de faire l'appel « Action 1 » à l'intérieur du bloc de rubis pour analyser sa sortie directement.

Quelque chose le long de la ligne pourrait faire (encore code non testé).

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

Merci beaucoup - je vais essayer \ – user1513388

+0

j'ajouterais, si vous voulez sauter # 2 si # 1 expire, puis placez 'not_if {node.runstate ['my_hook'] ['retries'] <0}' (vous devrez peut-être envelopper dans un bloc 'paresseux 'aussi –

+0

@TejayCardon Je peux me tromper (comme je ne l'ai pas testé) mais ma dernière ligne dans le bloc retournerait vrai ou faux, et IIRC (mais vraiment incertain) si le ruby_block renvoie faux la notification ne devrait pas être déclenchée (je dois tester cela pour confirmer ce comportement) – Tensibai