diff --git a/docs/source/guides/admin-guides/references/man1/xcattest.1.rst b/docs/source/guides/admin-guides/references/man1/xcattest.1.rst index 5b07c71cc..53a022bdf 100644 --- a/docs/source/guides/admin-guides/references/man1/xcattest.1.rst +++ b/docs/source/guides/admin-guides/references/man1/xcattest.1.rst @@ -229,9 +229,10 @@ For example, to run rscan command against the hardware control point of compute .. code-block:: perl rscan __GETNODEATTR($$CN, hcp)__ -z - 3. B To get the value of column where keyname == key in specified table. +3. \ **GETTABLEVALUE(keyname, key, colname, table)**\ To get the value of column where keyname == key in specified table. + ***** FILES diff --git a/xCAT-test/autotest/testcase/restapi/node/cases0 b/xCAT-test/autotest/testcase/restapi/node/cases0 index a1308afe4..da8f29146 100644 --- a/xCAT-test/autotest/testcase/restapi/node/cases0 +++ b/xCAT-test/autotest/testcase/restapi/node/cases0 @@ -1,99 +1,82 @@ -start:node_post -description: node_post -cmd:restapitest -m POST -r /nodes/node1 -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' +start:create_node_rest +description: create a node with REST API +cmd:restapitest -m POST -r /nodes/restnode -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' check:rc==201 end -start:node_post2 -description: node_post2 -cmd:restapitest -m POST -r /nodes/node1 -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' -check:rc==403 -cmdcheck:restapitest -o '{"errorcode":"1"}' -O == +start:create_node_rest2 +description: create a node with REST API failure +cmd:restapitest -m POST -r /nodes/restnode -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' +check:rc==147 +check:output=~'errorcode' => '1' end - -start:node_put -description: node_put -cmd:restapitest -m PUT -r /nodes/node1 -d '{"mgt":"hmc","netboot":"xnba"}' -check:rc==200 -end - - - -start:nodes_get -description: nodes_get +start:get_nodes_rest +description: get all nodes with REST API cmd:restapitest -m GET -r /nodes check:rc==200 -cmdcheck:restapitest -o '["node1"]' -O == +check:output=~'restnode' end -start:node_get -description: node_get -cmd:restapitest -m GET -r /nodes/node1 +start:get_node_rest +description: get single node with REST API +cmd:restapitest -m GET -r /nodes/restnode check:rc==200 -cmdcheck:restapitest -o '{"node1":{"netboot":"xnba"}}' -O == +check:output=~'restnode' end -start:node_delete -description: node_delete -cmd:restapitest -m DELETE -r /nodes/node1 +start:node_delete_rest +description: delete node with REST API +cmd:restapitest -m DELETE -r /nodes/restnode check:rc==200 end -start:nodes_get2 -description: nodes_get2 +start:get_nodes_rest2 +description: get all nodes with REST API cmd:restapitest -m GET -r /nodes check:rc==200 -cmdcheck:restapitest -o '["node1"]' -O != +check:output!~'restnode' end -start:node_get2 -description: node_get2 -cmd:restapitest -m GET -r /nodes/node1 -check:rc==403 -cmdcheck:restapitest -o '{"errorcode":"1"}' -O == +start:get_node_rest2 +description: get single node with REST API +cmd:restapitest -m GET -r /nodes/restnode +check:rc==147 +check:output=~'errorcode' => '1' end -start:node_post3_for_get_test -description: node_post3_for_get_test -cmd:restapitest -m POST -r /nodes/node1 -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' +start:create_node_token_rest +description: create a node with REST API using authentication token +cmd:restapitest -m POST -r /nodes/restnode -d '{"groups":"all","mgt":"dfm","netboot":"yaboot"}' -t check:rc==201 end -start:node_attr_get -description: node_get2 -cmd:restapitest -m GET -r /nodes/node1/attrs/mgt,groups,netboot -check:rc==200 -cmdcheck:restapitest -o '{"node1":{"netboot":"yaboot"}}' -O == -end - -start:node_makehosts -description: node_makehosts -cmd:restapitest -m POST -r /nodes/node1/host +start:node_makehosts_rest +description: makehosts for node with REST API +cmd:restapitest -m POST -r /nodes/restnode/host check:rc==201 end -start:node_makedns -description: node_makehosts -cmd:restapitest -m POST -r /nodes/node1/dns +start:node_makedns_rest +description: makehosts for node with REST API +cmd:restapitest -m POST -r /nodes/restnode/dns check:rc==201 end - -start:node_delete_dns -description: node_delete_dns -cmd:restapitest -m DELETE -r /nodes/node1/dns +start:node_delete_dns_rest +description: delete dns for node with REST API +cmd:restapitest -m DELETE -r /nodes/restnode/dns check:rc==200 end -start:node_put -description: node_put -cmd:restapitest -m PUT -r /nodes/node1 -d '{"mac":"00:1a:64:54:14:80"}' +start:node_change_attr_rest +description: change node attribute with REST API +cmd:restapitest -m PUT -r /nodes/restnode -d '{"mac":"00:1a:64:54:14:80"}' check:rc==200 end -start:node_makedhcp -description: node_makedhcp +start:node_makedhcp_rest +description: makedhcp for node with REST API cmd:restapitest -m POST -r /nodes/node1/dhcp check:rc==201 end @@ -104,139 +87,18 @@ cmd:restapitest -m DELETE -r /nodes/node1/dhcp check:rc==200 end -start:node_state -description: node_state -cmd:restapitest -m GET -r /nodes/node1/nodestat +start:node_state_rest +description: get node state with REST API +cmd:restapitest -m GET -r /nodes/restnode/nodestat check:rc==200 -cmdcheck:restapitest -o '{"node1":{"nodestat":"ANY"}}' -O == +check:output=~'restnode' +check:output=~'nodestat' end - -#start:node_post4_for_scan_test -#description: node_post4_for_scan_test -#cmd:restapitest -m POST -r /nodes/e108m6hmc02 -d '{"groups":"all,hmc","mgt":"hmc","hwtype":"hmc","mtm":"7042CR4","serial":"1050FBB","nodetype":"ppc"}' -#check:rc==201 -#end - -start:node_scan -description: node_scan -cmd:restapitest -m GET -r /nodes/__GETNODEATTR($$CN,hcp)__ +start:node_state_token_rest +description: get node state with REST API using authentication token +cmd:restapitest -m GET -r /nodes/restnode/nodestat -t check:rc==200 -cmdcheck:restapitest -o '{"__GETNODEATTR($$CN,hcp)__":"ANY"}' -O == +check:output=~'restnode' +check:output=~'nodestat' end - - -start:node_power_get -description: node_power_get -cmd:restapitest -m GET -r /nodes/$$CN/power -check:rc==200 -cmdcheck:restapitest -o '{"$$CN":{"power":"ANY"}}' -O == -end - -start:node_power_put -description: node_power_reset -cmd:restapitest -m PUT -r /nodes/$$CN/power -d '{"action":"reset"}' -check:rc==200 -end - -#start:node_energy_put -#description: node_energy_put -#cmd:restapitest -m PUT -r /nodes/Vc68m5sn01/energy -d '{"cappingstatus":"on"}' -#check:rc==200 -#end - -#start:node_energy_get -#description: node_energy_get -#cmd:restapitest -m GET -r /nodes/Vc68m5sn01/energy -#check:rc==200 -#cmdcheck:restapitest -o '{"Vc68m5sn01":{"cappingmin":"on"}}' -O == -#end - -#start:node_energy_get_attr -#description: node_energy_get_attr -#cmd:restapitest -m GET -r /nodes/Vc68m5sn01/energy/cappingmaxmin,cappingstatus -#check:rc==200 -#cmdcheck:restapitest -o '{"Vc68m5sn01":{"cappingmin":"ANY"}}' -O == -#end - -#start:node_get_attr -#description: node_get_attr -#cmd:restapitest -m GET -r /nodes/Vc68m5sn01/sp/community -#check:rc==200 -#cmdcheck:restapitest -o '{"Vc68m5sn01":{"SP SNMP Community":"public"}}' -O == -#end - -#start:node_put_attr -#description: node_put_attr -#cmd:restapitest -m PUT -r /nodes/Vc68m5sn01/sp/community -d '{"value":"mycommunity"}'' -#check:rc==200 -#end - -#start:node_put_nextboot -#description: node_put_nextboot -#cmd:restapitest -m PUT -r /nodes/$$CN/nextboot -d '{"order":"net"}' -#check:rc==201 -#end - -#start:node_get_nextboot -#description: node_get_nextboot -#cmd:restapitest -m GET -r /nodes/Vc68m5sn01/nextboot -#check:rc==200 -#cmdcheck:restapitest -o '{"Vc68m5sn01":{"nextboot":"net"}}' -O == -#end - -start:node_put_bootstate -description: node_put_bootstate -cmd:restapitest -m PUT -r /nodes/Vc68m5sn01/bootstate -d '{"osimage":"rhels6.4-x86_64-install-compute"}' -check:rc==201 -end - -start:node_get_bootstate -description: node_get_bootstate -cmd:restapitest -m GET -r /nodes/$$CN/bootstate -check:rc==200 -cmdcheck:restapitest -o '{"$$CN":{"bootstat":"ANY"}}' -O == -end - -start:node_get_vitals -description: node_get_vitals -cmd:restapitest -m GET -r /nodes/Vc68m5sn01/vitals -check:rc==200 -cmdcheck:restapitest -o '{"Vc68m5sn01":{"SysBrd Fault":"0"}}' -O == -end - -start:node_get_vitals_attr -description: node_get_vitals_attr -cmd:restapitest -m GET -r /nodes/$$CN/vitals/all -check:rc==200 -cmdcheck:restapitest -o '{"$$CN":{"System Temperature":"ANY"}}' -O == -end - -start:node_get_inventory -description: node_get_inventory -cmd:restapitest -m GET -r /nodes/Vc68m5sn01/inventory -check:rc==200 -cmdcheck:restapitest -o '{"Vc68m5sn01":{"Power Supply 2 Board FRU Number":"94Y8105"}}' -O == -end - -start:node_get_inventory_attr -description: node_get_inventory_attr -cmd:restapitest -m GET -r /nodes/Vc68m5sn01/inventory/model -check:rc==200 -cmdcheck:restapitest -o '{"Vc68m5sn01":{"System Description":"System x3650 M4"}}' -O == -end - -#start:node_get_eventlog -#description: node_get_eventlog -#cmd:restapitest -m GET -r /nodes/Vc68m5sn01/eventlog -#check:rc==200 -#cmdcheck:restapitest -o '{"Vc68m5sn01":{"eventlog":"ANY"}}' -O == -#end - -start:node_post_nodecopy -description: node_post_nodecopy -cmd:restapitest -m POST -r /nodes/$$CN/nodecopy -d '{"src":["/etc/hosts","/etc/resolv.conf"],"target":"/tmp"}' -check:rc==201 -end - - diff --git a/xCAT-test/pods/man1/xcattest.1.pod b/xCAT-test/pods/man1/xcattest.1.pod index 5dba9d902..f21804684 100644 --- a/xCAT-test/pods/man1/xcattest.1.pod +++ b/xCAT-test/pods/man1/xcattest.1.pod @@ -151,6 +151,7 @@ The xCAT-test testing framework provides some inline functions. The inline funct For example, to run rscan command against the hardware control point of compute node specified in the configuration file: rscan __GETNODEATTR($$CN, hcp)__ -z + 3. B To get the value of column where keyname == key in specified table. =head1 FILES diff --git a/xCAT-test/restapitest b/xCAT-test/restapitest index 83ba63c38..f5db2e79c 100755 --- a/xCAT-test/restapitest +++ b/xCAT-test/restapitest @@ -4,14 +4,14 @@ # Flags are used for test input: # -m method. Should be GET, POST, PUT, DELETE # -r resource -# -t token +# -t # -h host # -u user # -p passwd # -P port (BC) # -d data # -c cert -# -n hostname +# --debug # Flags are used for check output: # -o expected output # -O logical operator @@ -36,6 +36,7 @@ use strict; my $help; my $method; my $token; +my $usetoken; my $resource; my $host; my $user; @@ -43,7 +44,6 @@ my $passwd; my $port; my $data; my $cert; -my $hostname; my $output; my $loperator; my $debug; @@ -54,7 +54,7 @@ my $outputfile = "/tmp/testrestapiresult"; if ( !GetOptions("h|?" => \$help, "m=s" => \$method, - "t=s" => \$token, + "t" => \$usetoken, # use generated token instead of the user/pw "r=s" => \$resource, "h=s" => \$host, "u=s" => \$user, @@ -62,7 +62,6 @@ if ( "P=s" => \$port, "d=s" => \$data, "c=s" => \$cert, - "n=s" => \$hostname, "o=s" => \$output, "O=s" => \$loperator, "debug" => \$debug, @@ -131,52 +130,46 @@ while () { } } -# get token -my $defaultserver = $confhash{DefaultServer}; -my $defaultuser = $confhash{DefaultUser1}; -my $DefaultPasswd = $confhash{DefaultPasswd1}; -my $gettoken = `curl -X POST -k 'https://$defaultserver/xcatws/tokens?userName=$defaultuser&password=$DefaultPasswd' -H Content-Type:application/json --data '{"userName":"$defaultuser","password":"$DefaultPasswd"}' 2>/dev/null`; -my $reshash = parse_json($gettoken); -my $token1 = $$reshash{token}{id}; - -# get hostname -unless ($hostname) { - $hostname = `hostname`; - chomp($hostname); -} -unless ($defaultserver) { +# get hostname or default to local host if not specified +unless ($host) { $host = "127.0.0.1"; -} else { - $host = $defaultserver; } -# keey default test result for save -my $res = run_restapi($method, $resource, $data, "", $port, "$host", "$defaultuser", "$DefaultPasswd"); +unless ($user) { + $user = $confhash{DefaultUser1}; +} +unless ($passwd) { + $passwd = $confhash{DefaultPasswd1}; +} +my $DefaultPasswd = $confhash{DefaultPasswd1}; + +if ($usetoken) { +# get token + my $gettoken = `curl -X POST -k 'https://$host/xcatws/tokens' -H Content-Type:application/json --data '{"userName":"$user","userPW":"$passwd"}' 2>/dev/null`; + my $reshash = parse_json($gettoken); + $token = $$reshash{token}{id}; +} + +# debug and log info +log_debug(3, "User $user. \n"); +log_debug(3, "Password $passwd. \n"); +log_debug(3, "Host $host. \n"); +log_debug(3, "Got token $token. \n"); +log_debug(3, "get path of ca $confhash{Cert} \n"); + +my $res = run_restapi($method, $resource, $data, "", $port, "$host", "$user", "$passwd", "$token"); $defaulthash = parse_json($res); $defaulthttpresult = check_errcode(); -# debug and log info -log_debug(3, "get token $token1. \n"); -log_debug(3, "get first default user $confhash{DefaultUser1} \n"); -log_debug(3, "get first default user's passwd is $confhash{DefaultPasswd1} \n"); -log_debug(3, "get second default user $confhash{DefaultUser2} \n"); -log_debug(3, "get second default user's passwd is $confhash{DefaultPasswd2} \n"); -log_debug(3, "get path of ca $confhash{Cert} \n"); -log_debug(3, "get server $defaultserver from configuration file and it is $host\n"); -log_debug(3, "get hostname $hostname.\n"); -log_debug(3, "default result is $res. \n"); -log_debug(3, "default resulthash is: \n"); -log_debug(3, $defaulthash); -log_debug(3, "default errcode is $defaulthttpresult \n"); -log_debug(3, "**************begin to run more restapi test, stop when post***************"); - +print Dumper $defaulthash; +exit $defaulthttpresult; #################################################### # Begin to run test cases #################################################### my @users = ($confhash{DefaultUser1}, $confhash{DefaultUser2}, $user); my @passwds = ($confhash{DefaultPasswd1}, $confhash{DefaultPasswd2}, $passwd); -my @tokens = ("", $token1, $token); +my @tokens = ("", $token, $token); my @certs = ("", $confhash{Cert}, $cert); my $i = 0; unless ($method eq "POST") { # Should not post sevral times @@ -235,7 +228,7 @@ sub usage print " testrestapi [-?|-h]\n"; print " testrestapi [-m method] [-r resource] [-t tocken]\n"; print " [-h host] [-P port][-u user] [-p passwd]\n"; - print " [-d data] [-c cert] [-n hostname]\n"; + print " [-d data] [-c cert] \n"; print " [-o expect_output] [-O logical_operator] \n"; print " [--debug]\n"; print "\n"; @@ -287,18 +280,14 @@ sub run_restapi if ($t) { $cmd .= " -H X-Auth-Token:$t "; } - if ($t or $c) { - $cmd .= " 'https://$hostname"; - } else { - $cmd .= " 'https://$h"; - } + $cmd .= " 'https://$h"; if ($p) { $cmd .= ":$p"; } $cmd .= "/xcatws"; $cmd .= "$r?"; unless ($t) { - $cmd .= "userName=$u&password=$a'"; + $cmd .= "userName=$u&userPW=$a'"; } else { $cmd .= "'"; } @@ -331,7 +320,7 @@ sub parse_json # {"networks":[{"mgtifname":"eth1","mask":"255.255.255.0"},{"mgtifname":"eth1","mask":"255.255.255.0"}]} if ($input =~ /^\[(.*)\]$/s) { my $content = $1; - log_debug(2, "[:] content is $content \n"); + # log_debug(2, "[:] content is $content \n"); parse_json($content); } @@ -344,7 +333,7 @@ sub parse_json # record result foreach my $t (@contents) { - log_debug(2, ":{}, content is $t \n"); + #log_debug(2, ":{}, content is $t \n"); my $re = parse_json($t); push @reval, $re; } @@ -366,7 +355,7 @@ sub parse_json # record result foreach my $t (@contents) { - log_debug(2, "{},{}, content is $t \n"); + #log_debug(2, "{},{}, content is $t \n"); my $re = parse_json($t); push @reval, $re; } @@ -386,7 +375,7 @@ sub parse_json # {"clustersite":{"domain":"cluster.com","master":"192.168.1.15"}} elsif ($input =~ /^\s*{(.*)}\s*$/s) { my $content = $1; - log_debug(2, "{} content is $content \n"); + #log_debug(2, "{} content is $content \n"); parse_json($content); } elsif ($input =~ /],\"\S+\":/) { @@ -396,7 +385,7 @@ sub parse_json # record result foreach my $t (@contents) { - log_debug(2, "],:, content is $t \n"); + #log_debug(2, "],:, content is $t \n"); my $re = parse_json($t); push @reval, $re; } @@ -420,7 +409,7 @@ sub parse_json # record result foreach my $t (@contents) { - log_debug(2, ", content is $t \n"); + #log_debug(2, ", content is $t \n"); my $re = parse_json($t); push @reval, $re; } @@ -446,7 +435,7 @@ sub parse_json if ($value =~ /{/) { # "clustersite":{"domain":"cluster.com","master":"192.168.1.15"} - log_debug(2, "{ content is $value \n"); + #log_debug(2, "{ content is $value \n"); $hash{$key} = parse_json($value, $key); return \%hash; } else { @@ -464,7 +453,7 @@ sub parse_json else { if ($input =~ /^\[(.*)\]/s) { my $content = $1; - log_debug(2, "[] content is $content \n"); + #log_debug(2, "[] content is $content \n"); my @all = split /,/, $content; foreach my $n (@all) { $n =~ /\"(.*)\"/;