From 8e301abed327d11f7811f0296fab362769b497ec Mon Sep 17 00:00:00 2001 From: Dima Shulyak Date: Fri, 7 Mar 2014 14:38:52 +0200 Subject: [PATCH] astute multicast verification part orchestration for multicast verification task related patch Ia4470d10ddc280b836fafd0490958d9ed7c1fce5 Related to blueprint multicast-group-verification Change-Id: Ieebbeea00e593923f9e331025f921d4edac9e8d4 --- lib/astute/network.rb | 30 +++++++++++++++++-- lib/astute/orchestrator.rb | 4 +++ lib/astute/server/dispatcher.rb | 6 ++++ mcagents/net_probe.ddl | 14 ++++++++- mcagents/net_probe.rb | 17 +++++++++++ run_tests.sh | 6 ++-- spec/unit/network_spec.rb | 52 ++++++++++++++++++++++++++++++++- 7 files changed, 122 insertions(+), 7 deletions(-) diff --git a/lib/astute/network.rb b/lib/astute/network.rb index 405b8f9f..e35c20fc 100644 --- a/lib/astute/network.rb +++ b/lib/astute/network.rb @@ -50,7 +50,7 @@ module Astute {'nodes' => result} end - def self.check_dhcp(ctx, nodes) + def self.check_dhcp(ctx, nodes) uids = nodes.map { |node| node['uid'].to_s } net_probe = MClient.new(ctx, "net_probe", uids) @@ -66,6 +66,33 @@ module Astute {'nodes' => result, 'status'=> 'ready'} end + def self.multicast_verification(ctx, nodes) + uids = nodes.map { |node| node['uid'].to_s } + net_probe = MClient.new(ctx, "net_probe", uids) + data_to_send = {} + nodes.each do |node| + data_to_send[node['uid']] = node + end + + listen_resp = net_probe.multicast_listen(:nodes => data_to_send.to_json) + Astute.logger.debug("Mutlicast verification listen: #{listen_resp.inspect}") + ctx.reporter.report({'progress' => 30}) + + send_resp = net_probe.multicast_send() + Astute.logger.debug("Mutlicast verification send: #{send_resp.inspect}") + ctx.reporter.report({'progress' => 60}) + + results = net_probe.multicast_info() + Astute.logger.debug("Mutlicast verification info: #{results.inspect}") + response = {} + results.each do |node| + if node.results[:data][:out].present? + response[node.results[:sender].to_i] = JSON.parse(node.results[:data][:out]) + end + end + {'nodes' => response} + end + private def self.start_frame_listeners(ctx, net_probe, nodes) nodes.each do |node| @@ -130,7 +157,6 @@ module Astute end end - def self.check_vlans_by_traffic(uids, data) data.map do |iface, vlans| { diff --git a/lib/astute/orchestrator.rb b/lib/astute/orchestrator.rb index 227a1ee7..ef2fc817 100644 --- a/lib/astute/orchestrator.rb +++ b/lib/astute/orchestrator.rb @@ -181,6 +181,10 @@ module Astute Network.check_dhcp(Context.new(task_id, reporter), nodes) end + def multicast_verification(reporter, task_id, nodes) + Network.multicast_verification(Context.new(task_id, reporter), nodes) + end + private def report_result(result, reporter) diff --git a/lib/astute/server/dispatcher.rb b/lib/astute/server/dispatcher.rb index b4cbaca7..aa1d1327 100644 --- a/lib/astute/server/dispatcher.rb +++ b/lib/astute/server/dispatcher.rb @@ -85,6 +85,12 @@ module Astute report_result(result, reporter) end + def multicast_verification(data) + reporter = Astute::Server::Reporter.new(@producer, data['respond_to'], data['args']['task_uuid']) + result = @orchestrator.multicast_verification(reporter, data['args']['task_uuid'], data['args']['nodes']) + report_result(result, reporter) + end + def dump_environment(data) task_id = data['args']['task_uuid'] reporter = Astute::Server::Reporter.new(@producer, data['respond_to'], task_id) diff --git a/mcagents/net_probe.ddl b/mcagents/net_probe.ddl index 37114e2f..32b97596 100644 --- a/mcagents/net_probe.ddl +++ b/mcagents/net_probe.ddl @@ -28,4 +28,16 @@ end action "dhcp_discover", :description => "Find dhcp server for provided interfaces" do display :always -end \ No newline at end of file +end + +action "multicast_listen", :description => "Start multicast listeners" do + display :always +end + +action "multicast_send", :description => "Send multicast frames" do + display :always +end + +action "multicast_info", :description => "Request received data from multicast frames" do + display :always +end diff --git a/mcagents/net_probe.rb b/mcagents/net_probe.rb index ed6d86a7..7c364520 100644 --- a/mcagents/net_probe.rb +++ b/mcagents/net_probe.rb @@ -24,6 +24,23 @@ module MCollective @pattern = "/var/tmp/net-probe-dump*" end + action "multicast_listen" do + config = JSON.parse(request[:nodes])[get_uid] + cmd = "fuel-netcheck multicast serve listen --config='#{config.to_json}'" + reply[:status] = run(cmd, :stdout => :out, :stderr => :err) + end + + action "multicast_send" do + cmd = "fuel-netcheck multicast send" + reply[:status] = run(cmd, :stdout => :out, :stderr => :err) + end + + action "multicast_info" do + reply[:status] = run("fuel-netcheck multicast info", + :stdout => :out, :stderr => :err) + run("fuel-netcheck multicast clean") + end + action "start_frame_listeners" do cleanup_netprobe start_frame_listeners diff --git a/run_tests.sh b/run_tests.sh index 102fa595..7f969cf4 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -18,7 +18,7 @@ function cd_workspace() { function license_check() { # License information must be in every source file cd_workspace - + tmpfile=`tempfile` find * -not -path "docs/*" -regex ".*\.\(rb\)" -type f -print0 | xargs -0 grep -Li License files_with_no_license=`wc -l $tmpfile | awk '{print $1}'` @@ -33,10 +33,10 @@ function license_check() { function ruby_checks() { cd_workspace - + # Install all ruby dependencies (expect ruby version manager: RVM, rbenv or similar) bundle install - + # Run unit rspec tests bundle exec rake spec:unit } diff --git a/spec/unit/network_spec.rb b/spec/unit/network_spec.rb index 0637526c..824af71e 100644 --- a/spec/unit/network_spec.rb +++ b/spec/unit/network_spec.rb @@ -131,4 +131,54 @@ describe Astute::Network do res.should eql(expected) end end -end \ No newline at end of file + + describe '.multicast_verifcation' do + + def make_nodes(*uids) + uids.map do |uid| + { + 'uid' => uid.to_s, + 'iface' => 'eth1', + 'group' => '250.0.0.3', + 'port' => 10000 + } + end + end + + def format_nodes(nodes) + formatted_nodes = {} + nodes.each do |node| + formatted_nodes[node['uid']] = node + end + formatted_nodes + end + + it "must run all three stages: listen send info with expected argumenets" do + nodes = make_nodes(1, 2) + formatted_nodes = format_nodes(nodes) + command_output = JSON.dump(["1", "2"]) + res1 = {:sender => "1", + :data => {:out => command_output}} + res2 = {:sender => "2", + :data => {:out => command_output}} + mc_valid_res = mock_mc_result + expected_response = {1 => ["1", "2"], + 2 => ["1", "2"]} + + rpcclient = mock_rpcclient() + + rpcclient.expects(:discover).with(:nodes=>formatted_nodes.keys) + + rpcclient.expects(:multicast_listen).with(:nodes=>formatted_nodes.to_json).once.returns([mock_mc_result]*2) + + rpcclient.expects(:multicast_send).with().once.returns([mock_mc_result]*2) + + rpcclient.expects(:multicast_info).with().once.returns([mock_mc_result(res1), mock_mc_result(res2)]) + + res = Astute::Network.multicast_verification(Astute::Context.new('task_uuid', reporter), nodes) + res['nodes'].should eql(expected_response) + end + + end + +end