astute multicast verification part

orchestration for multicast verification task

related patch Ia4470d10ddc280b836fafd0490958d9ed7c1fce5

Related to blueprint multicast-group-verification

Change-Id: Ieebbeea00e593923f9e331025f921d4edac9e8d4
This commit is contained in:
Dima Shulyak 2014-03-07 14:38:52 +02:00
parent 26f0173c96
commit 8e301abed3
7 changed files with 122 additions and 7 deletions

View File

@ -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|
{

View File

@ -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)

View File

@ -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)

View File

@ -28,4 +28,16 @@ end
action "dhcp_discover", :description => "Find dhcp server for provided interfaces" do
display :always
end
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

View File

@ -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

View File

@ -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
}

View File

@ -131,4 +131,54 @@ describe Astute::Network do
res.should eql(expected)
end
end
end
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