lib/zergrush_cf/init.rb in zergrush_cf-0.0.5 vs lib/zergrush_cf/init.rb in zergrush_cf-0.0.6

- old
+ new

@@ -25,10 +25,12 @@ require 'fog' require 'excon' require 'rbconfig' require 'awesome_print' require 'securerandom' +require 'bunny' +require 'time' require_relative 'renderer' class CloudFormation < ZergGemPlugin::Plugin "/driver" def rush hive_location, task_name, task_hash, debug aws_key_id = task_hash["vm"]["driver"]["driveroptions"][0]["access_key_id"] @@ -44,10 +46,12 @@ end abort("AWS key id is not specified in task") unless aws_key_id != nil abort("AWS secret is not specified in task") unless aws_secret != nil + rabbit_objects = initRabbitConnection(task_hash["vm"]["driver"]["driveroptions"][0]["rabbit"]) + renderer = ZergrushCF::Renderer.new( hive_location, task_name, task_hash) template_body = renderer.render @@ -111,25 +115,29 @@ end event_counter = 0 while outputs_info.body["Stacks"][0]["StackStatus"] == "CREATE_IN_PROGRESS" do logEvents(events.first(events.length - event_counter)) + logRabbitEvents(events.first(events.length - event_counter), rabbit_objects, eval_params(task_hash["vm"]["driver"]["driveroptions"][0]["rabbit"])) event_counter = events.length events = cf.describe_stack_events(stack_name).body['StackEvents'] outputs_info = cf.describe_stacks({ 'StackName' => stack_name }) if outputs_info.body["Stacks"][0]["StackStatus"] == "CREATE_COMPLETE" logEvents(events.first(events.length - event_counter)) puts("Stack outputs:") ap outputs_info.body["Stacks"][0]["Outputs"] + rabbit_objects[:connection].close unless rabbit_objects == nil return 0 end end + rabbit_objects[:connection].close unless rabbit_objects == nil abort("ERROR: Failed with stack status: #{outputs_info.body["Stacks"][0]["StackStatus"]}") rescue Fog::Errors::Error => fog_cf_error + rabbit_objects[:connection].close unless rabbit_objects == nil abort ("ERROR: AWS error: #{fog_cf_error.message}") end def clean hive_location, task_name, task_hash, debug @@ -146,10 +154,12 @@ end abort("AWS key id is not specified in task") unless aws_key_id != nil abort("AWS secret is not specified in task") unless aws_secret != nil + rabbit_objects = initRabbitConnection(task_hash["vm"]["driver"]["driveroptions"][0]["rabbit"]) + puts("Cleaning task #{task_name} ...") # run fog cleanup on the stack. stack_name = "#{task_name}" @@ -166,50 +176,91 @@ while outputs_info == nil do sleep 1 begin outputs_info = cf.describe_stacks({ 'StackName' => stack_name }) rescue Fog::AWS::CloudFormation::NotFound + rabbit_objects[:connection].close unless rabbit_objects == nil return 0 end end events = cf.describe_stack_events(stack_name).body['StackEvents'] while events == nil do sleep 1 begin events = cf.describe_stack_events(stack_name).body['StackEvents'] rescue Fog::AWS::CloudFormation::NotFound + rabbit_objects[:connection].close unless rabbit_objects == nil return 0 end end event_counter = 0 while outputs_info.body["Stacks"][0]["StackStatus"] == "DELETE_IN_PROGRESS" do logEvents(events.first(events.length - event_counter)) + logRabbitEvents(events.first(events.length - event_counter), rabbit_objects, eval_params(task_hash["vm"]["driver"]["driveroptions"][0]["rabbit"])) + event_counter = events.length begin events = cf.describe_stack_events(stack_name).body['StackEvents'] outputs_info = cf.describe_stacks({ 'StackName' => stack_name }) rescue Fog::AWS::CloudFormation::NotFound logEvents(events.first(events.length - event_counter)) + rabbit_objects[:connection].close unless rabbit_objects == nil return 0 end end + rabbit_objects[:connection].close unless rabbit_objects == nil abort("ERROR: Failed with stack status: #{outputs_info.body["Stacks"][0]["StackStatus"]}") rescue Fog::Errors::Error => fog_cf_error + rabbit_objects[:connection].close unless rabbit_objects == nil abort ("ERROR: AWS error: #{fog_cf_error.ai}") end def logEvents events events.each do |event| - puts "Timestamp: #{event['Timestamp']}" + puts "Timestamp: #{Time.parse(event['Timestamp'].to_s).iso8601}" puts "LogicalResourceId: #{event['LogicalResourceId']}" puts "ResourceType: #{event['ResourceType']}" puts "ResourceStatus: #{event['ResourceStatus']}" puts "ResourceStatusReason: #{event['ResourceStatusReason']}" if event['ResourceStatusReason'] puts "--" + end + end + + def initRabbitConnection rabbitInfo + return nil unless rabbitInfo != nil + params = eval_params(rabbitInfo) + conn = Bunny.new(Hash[params["bunny_params"].map{ |k, v| [k.to_sym, v] }]) + conn.start + + channel = conn.create_channel + exch = (params["exchange"] == nil) ? channel.default_echange : channel.direct(params["exchange"]["name"], Hash[params["exchange"]["params"].map{ |k, v| [k.to_sym, v] }]) + channel.queue(params["queue"]["name"], Hash[params["queue"]["params"].map{ |k, v| [k.to_sym, v] }]).bind(exch) + + return { :connection => conn, :channel => channel, :exchange => exch } + end + + def logRabbitEvents events, rabbit_objects, rabbit_properties + timestamp = (rabbit_properties["event_timestamp_name"] == nil) ? "timestamp" : rabbit_properties["event_timestamp_name"] + res_id_name = (rabbit_properties["event_resource_id_name"] == nil) ? "resource_id" : rabbit_properties["event_resource_id_name"] + res_type_name = (rabbit_properties["event_resource_type_name"] == nil) ? "resource_type" : rabbit_properties["event_resource_type_name"] + res_status = (rabbit_properties["event_resource_status_name"] == nil) ? "resource_status" : rabbit_properties["event_resource_status_name"] + reason = (rabbit_properties["event_resource_reason_name"] == nil) ? "reason" : rabbit_properties["event_resource_reason_name"] + + + events.each do |event| + event_info = { + timestamp.to_sym => "#{Time.parse(event['Timestamp'].to_s).iso8601}", + res_id_name.to_sym => "#{event['LogicalResourceId']}", + res_type_name.to_sym => "#{event['ResourceType']}", + res_status.to_sym => "#{event['ResourceStatus']}", + reason.to_sym => "#{event['ResourceStatusReason']}" + } + + rabbit_objects[:exchange].publish(event_info.to_json, :routing_key => rabbit_properties["queue"]["name"]) end end def halt hive_location, task_name, task_hash, debug puts("Halt is not implemented for CloudFormation.")