From ad2dd72b1350478f4f08fa2f4047571079fda08e Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Fri, 5 Oct 2018 13:38:47 -0700 Subject: [PATCH 1/3] Json: fixes flatten_list() when passed an empty set --- LANforge/JsonUtils.pm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/LANforge/JsonUtils.pm b/LANforge/JsonUtils.pm index 9317cbf8..28225036 100644 --- a/LANforge/JsonUtils.pm +++ b/LANforge/JsonUtils.pm @@ -106,6 +106,22 @@ sub flatten_list { my $rh_list = shift; my $list_name = shift; my $rh_irefs = {}; + return if (!defined $rh_list); + + if (!defined $rh_list->{$list_name}) { + warn "flatten_list: $list_name not found"; + return; + } + if (ref $rh_list->{$list_name} eq "HASH") { + return if ( (keys %{$rh_list->{$list_name}} < 1)); + } + if (ref $rh_list->{$list_name} ne "ARRAY") { + print "flatten_list: $list_name not Array Ref:\n"; + print "-------------------------------------------------\n"; + print Dumper($rh_list); + print "-------------------------------------------------\n"; + return; + } for (my $i=0; $i < @{$rh_list->{$list_name}}; $i++) { my @k = keys(%{$rh_list->{$list_name}[$i]}); #print Dumper(\@k); From b7677c580a0c555163b13200cc6a47106d5d34c4 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Fri, 5 Oct 2018 15:03:10 -0700 Subject: [PATCH 2/3] port_test now points at resource 6, variable introduced --- json/port_test.pl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/json/port_test.pl b/json/port_test.pl index 2f204ea0..1f9ae148 100755 --- a/json/port_test.pl +++ b/json/port_test.pl @@ -34,6 +34,8 @@ my $usage = qq("$0 --host {ip or hostname} # connect to this ); +my $num_sta = 30; +my $des_resource = 6; ## ## M A I N ## @@ -72,13 +74,13 @@ my @radios = (); my @destroy_me = (); for my $rh_alias_link (@$ra_alias_links) { for my $rh_link (@$rh_alias_link) { - if ( ($rh_link->{'uri'} =~m{^/port/1/[3]/}) + if ( ($rh_link->{'uri'} =~m{^/port/1/$des_resource/}) && ($rh_link->{'device'} =~m{^sta})) { push(@destroy_me, $rh_link); } push(@radios, $rh_link) - if (($rh_link->{'uri'} =~m{^/port/1/[3]/}) + if (($rh_link->{'uri'} =~m{^/port/1/$des_resource/}) && ($rh_link->{'device'} =~m{^wiphy})); } } @@ -100,13 +102,13 @@ for my $rh_target (@destroy_me) { usleep (15000); } my $rh_update = { - 'shelf'=>1, 'resource'=>3, 'port'=>'all', 'probe_flags'=>'0x1' + 'shelf'=>1, 'resource'=>$des_resource, 'port'=>'all', 'probe_flags'=>'0x1' }; logg("\nRefreshing: "); my $rh_response = json_post("/cli-json/nc_show_ports", $rh_update); my $remaining = 1; while ($remaining > 0) { - $rh = json_request("/port/1/3/list"); + $rh = json_request("/port/1/$des_resource/list"); flatten_list($rh, 'interfaces'); $remaining = 0; for my $name (keys %{$rh->{'flat_list'}}) { @@ -129,7 +131,6 @@ my $rh_radio; my $radio_name; my $resource; my $range; -my $num_sta = 160; my $radio_num; my $radio_counter = 0; $rh_response = json_post("/cli-json/nc_show_ports", $rh_update); From c183ad399d823cbc5ca9980e17ac7d1da397b842 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Fri, 5 Oct 2018 15:03:30 -0700 Subject: [PATCH 3/3] Layer4 json test --- json/l4_test.pl | 303 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100755 json/l4_test.pl diff --git a/json/l4_test.pl b/json/l4_test.pl new file mode 100755 index 00000000..6514b494 --- /dev/null +++ b/json/l4_test.pl @@ -0,0 +1,303 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use diagnostics; +use Carp; +$SIG{ __DIE__ } = sub { Carp::confess( @_ ) }; +$SIG{ __WARN__ } = sub { Carp::confess( @_ ) }; + +# Un-buffer output +$| = 1; +use Getopt::Long; +use JSON::XS; +use HTTP::Request; +use LWP; +use LWP::UserAgent; +use Data::Dumper; +use Time::HiRes qw(usleep); +use JSON; +use lib '/home/lanforge/scripts'; +use LANforge::JsonUtils qw(logg err json_request get_links_from get_thru json_post get_port_names flatten_list); + +package main; +# Default values for ye ole cmd-line args. +our $Resource = 1; +our $quiet = "yes"; +our $Host = "localhost"; +our $Port = 8080; +our $HostUri = "http://$Host:$Port"; +our $Web = LWP::UserAgent->new; +our $Decoder = JSON->new->utf8; +our $ssid; +our $security; +our $passphrase; + +my $usage = qq("$0 --host {ip or hostname} # connect to this + --port {port number} # defaults to 8080 +); + +my $des_resource = 6; + +## +## M A I N +## + +GetOptions +( + 'host=s' => \$::Host, + 'port=i' => \$::Port +) || (print($usage) && exit(1)); + +$::HostUri = "http://$Host:$Port"; + +my $uri = "/shelf/1"; +my $rh = json_request($uri); +my $ra_links = get_links_from($rh, 'resources'); +my @ports_up= (); + +# TODO: make this a JsonUtils::list_ports() +$uri = "/port/1/6/list?fields=alias,device,down,phantom,port"; +#logg("requesting $uri"); +$rh = json_request($uri); +flatten_list($rh, 'interfaces'); +for my $rh_p (keys %{$rh->{'flat_list'}}) { + if (!$rh->{'flat_list'}->{$rh_p}->{'down'}) { + push(@ports_up, $rh_p); + } +} +# find first station +my $rh_sta; +for my $rh_up (@ports_up) { + my $eid = $rh->{'flat_list'}->{$rh_up}->{'port'}; + my @hunks = split(/[.]/, $eid); + if ($hunks[1]) { + $rh_sta = $rh_up; + } +} +if (!defined $rh_sta) { + die("Unable to find a virtual station. Is one up?"); +} + +# delete old CXes and old endpoints +# TODO: collect_l4cx_names + +my $rh_endplist = json_request("/layer4/list"); +print "\nRemoving L4: "; +my @endp_names = (); +print Dumper($rh_endplist); + +if (defined $rh_endplist->{"endpoint"} + && (ref $rh_endplist->{"endpoint"} eq "HASH")) { + # indicates we only have one + push(@endp_names, $rh_endplist->{"endpoint"}->{"name"}); +} +elsif (defined $rh_endplist->{"endpoint"}) { + flatten_list($rh_endplist, 'endpoint'); + print "FLAT LIST:\n"; + print Dumper($rh_endplist->{'flat_list'}); + for my $ep_name (keys %{$rh_endplist->{'flat_list'}}) { + next if (!defined $ep_name); + next if ($ep_name eq ""); + next if ((ref $ep_name) eq "ARRAY"); + next if (!defined $rh_endplist->{'flat_list'}->{$ep_name}->{"name"}); + next if ($rh_endplist->{'flat_list'}->{$ep_name}->{"name"} eq ""); + print "epn:".Dumper($rh_endplist->{'flat_list'}->{$ep_name}->{"name"}); + push(@endp_names, $ep_name); + } +} +if ((@endp_names < 1) && (defined $rh_endplist->{"endpoint"})) { + # check for mutated L4endp entries that only exist in EID form + #die "Unknown L4 endpoint state" + # if (!(defined $rh_endplist->{"endpoint"})); + die "No endpoint entries" + if (scalar @{$rh_endplist->{"endpoint"}} < 1); + for $rh (@{$rh_endplist->{"endpoint"}}) { + print Dumper($rh); + my @k = keys(%$rh); + print "$k[0] "; + push(@endp_names, $k[0]); + } +} +#print Dumper(\@endp_names); + +my @cx_names = (); +if (@endp_names > 0) { + for my $endp_name (@endp_names) { + print " endp_name[$endp_name]"; + push(@cx_names, "CX_".$endp_name); + } +} +my $rh_req = { "test_mgr" => "all" }; +for my $cx_name (@cx_names) { + $rh_req->{"cx_name"} = $cx_name; + json_post("/cli-json/rm_cx", $rh_req); +} +my $rh_show_cxe = { "test_mgr"=>"all", "cross_connect"=>"all"}; +json_post("/cli-json/show_cxe", $rh_show_cxe); +sleep 1; + +$uri = "/cli-json/rm_endp"; +for my $ep_name (@endp_names) { + if (!defined $ep_name || $ep_name =~/^\s*$/ || (ref $ep_name) eq "ARRAY") { + print " [$ep_name]"; #skipping + print Dumper(\$ep_name); + next; + } + print "-$ep_name "; + $rh = { "endp_name" => $ep_name }; + json_post($uri, $rh); +} + +print "\nRefreshing..."; +my $h = {"endpoint"=>"all"}; +json_request("/cli-json/nc_show_endpoints", $h); +sleep 1; +$h = {"test_mgr"=>"all", "cross_connect"=>"all"}; +json_request("/cli-json/show_cxe", $h); + +# assume resource 1, eth1 is present, and create an endpoint to it +# -A and -B are expected convention for endpoint names + +# create 10 endpoints +my $rh_ports = json_request("/port/1/${des_resource}/list"); +flatten_list($rh_ports, 'interfaces'); + +my $rh_endp_A = { + 'alias' => 'udp_json', + 'shelf' => 1, + 'resource' => 1, + 'port' => 'b1000', # or eth1 + 'type' => 'lf_udp', + 'ip_port' => -1, + 'is_rate_bursty' => 'NO', + 'min_rate' => 1000000, + 'min_pkt' => -1, + 'max_pkt' => -1, + 'payload_pattern' => 'increasing', + 'multi_conn' => 0 + }; + +my $rh_endp_B = { + 'alias' => "untitled", + 'shelf' => 1, + 'resource' => $des_resource, + #'port' => 'unset', + 'type' => 'l4_generic', + 'timeout' => '2000', + 'url_rate' => '600', + 'url' => 'DL http://10.41.0.3/', + 'max_speed' => '1000000' + }; + +$h = {"endpoint"=>"all"}; +json_request("/cli-json/nc_show_endpoints", $h); +$h = {"test_mgr"=>"all", "cross_connect"=>"all"}; +json_request("/cli-json/show_cxe", $h); +sleep 1; +print "\nConstructing new Endpoints: "; +my $num_ports = scalar keys(%{$rh_ports->{'flat_list'}}); +my $num_cx = 0; +my $disp_num = $des_resource * 1000; +for my $rh_p (values %{$rh_ports->{'flat_list'}}) { + + last if ($num_cx >= ($num_ports-1)); + next if ($rh_p->{'alias'} !~ /^v*sta/); + + #my $end_a_alias = "udp_json_${disp_num}-A"; + my $end_b_alias = "l4json_${disp_num}"; + my $port_b = $rh_p->{'alias'}; + print " ${port_b}:$end_b_alias"; + $rh_endp_B->{'port'} = $port_b; + $rh_endp_B->{'alias'} = $end_b_alias; + $num_cx++; + $disp_num++; + + #json_post("/cli-json/add_endp", $rh_endp_A); + print Dumper($rh_endp_B); + sleep 5; + + json_post("/cli-json/add_l4_endp", $rh_endp_B); +} +print "\nRefreshing..."; +$h = {"endpoint"=>"all"}; +json_request("/cli-json/nc_show_endpoints", $h); +sleep 1; +print "\nConstructing new CX: "; +$num_cx = 0; +my $rh_endpoints = json_request("/layer4/list"); +flatten_list($rh_endpoints, 'endpoint'); +for my $rh_e (values %{$rh_endpoints->{'flat_list'}}) { + last if ($num_cx >= ($num_ports-1)); + #next if ($rh_e->{'alias'} !~ /^v*sta/); + print Dumper($rh_e); + # my $end_a_alias = "udp_json_${num_cx}-A"; + # my $end_b_alias = "udp_json_${num_cx}-B"; + # my $port_b = $rh_p->{'alias'}; + # my $cx_alias = "udp_json_".$num_cx; + # $rh_cx->{'alias'} = $cx_alias; + # $rh_cx->{'tx_endp'} = $end_a_alias; + # $rh_cx->{'rx_endp'} = $end_b_alias; + # json_post("/cli-json/add_cx", $rh_cx); + # print " $cx_alias"; + # $num_cx++; +} +# print "\nRefreshing..."; +$h = {"endpoint"=>"all"}; +json_request("/cli-json/nc_show_endpoints", $h); + +#my $rh_cxlist = json_request("/cx/list"); +#@cx_names = (); +#for my $cx_name (sort keys %$rh_cxlist) { +# next if (ref $rh_cxlist->{$cx_name} ne "HASH"); +# next if (!defined $rh_cxlist->{$cx_name}->{"name"}); +# push(@cx_names, $rh_cxlist->{$cx_name}->{"name"}); +#} +#for my $cx_alias (sort @cx_names) { +# my $rh_cx_t = { +# 'test_mgr' => 'default_tm', +# 'cx_name' => $cx_alias, +# 'milliseconds'=> 1000, +# }; +# json_post("/cli-json/set_cx_report_timer", $rh_cx_t); +#} +print "\nRefreshing..."; +$h = {"endpoint"=>"all"}; +json_request("/cli-json/nc_show_endpoints", $h); +sleep 1; +$h = {"test_mgr"=>"all", "cross_connect"=>"all"}; +json_request("/cli-json/show_cxe", $h); + +#my $set_state = { +# 'test_mgr' => 'default_tm', +# 'cx_name' => 'udp_ex', +# 'cx_state' => 'RUNNING' +#}; +#my @cx_names = (); +#$rh_cxlist = json_request("/cx/list"); +#for my $cx_name (sort keys %$rh_cxlist) { +# next if (ref $rh_cxlist->{$cx_name} ne "HASH"); +# next if (!defined $rh_cxlist->{$cx_name}->{"name"}); +# push(@cx_names, $rh_cxlist->{$cx_name}->{"name"}); +#} +#print "\nStarting: "; +#for my $cxname (@cx_names) { +# print " $cxname"; +# $set_state->{'cx_name'} = $cxname; +# json_post("/cli-json/set_cx_state", $set_state); +#} +#sleep 10; + +#my $set_state = { +# 'test_mgr' => 'default_tm', +# 'cx_name' => 'udp_ex', +# 'cx_state' => 'STOPPED' +#}; +#print "\nStopping: "; +#for my $cxname (@cx_names) { +# $set_state->{'cx_name'} = $cxname; +# print " $cxname"; +# json_post("/cli-json/set_cx_state", $set_state); +#} +#print "...done\n"; +# +#