From c418e9aeb96e29c227b6c50594023c5e8b0719e0 Mon Sep 17 00:00:00 2001 From: daniceexi Date: Fri, 28 Mar 2014 03:04:55 -0400 Subject: [PATCH] More uri definition changes --- xCAT-server/xCAT-wsapi/genrestapidoc.pm | 9 +- xCAT-server/xCAT-wsapi/restapi.pl | 263 ++++++++++++------------ 2 files changed, 134 insertions(+), 138 deletions(-) diff --git a/xCAT-server/xCAT-wsapi/genrestapidoc.pm b/xCAT-server/xCAT-wsapi/genrestapidoc.pm index e5765a8e8..e0bad186b 100755 --- a/xCAT-server/xCAT-wsapi/genrestapidoc.pm +++ b/xCAT-server/xCAT-wsapi/genrestapidoc.pm @@ -4,12 +4,13 @@ package genrestapidoc; my @apigroups = ( { - groupname => 'node', + groupname => 'nodes', header => "Node Resources", desc => "The URI list which can be used to create, query, change and manage nodes.", resources => ['allnode', 'nodeallattr', 'nodeattr', 'power', 'energy', 'energyattr', 'serviceprocessor', 'nextboot', 'vitals', 'vitalsattr', 'inventory', 'inventoryattr', 'eventlog', 'beacon', 'bootstat', - 'updating','filesyncing','software_maintenance','postscript', 'nodeshell', 'nodecopy',] + 'updating','filesyncing','software_maintenance','postscript', 'nodeshell', 'nodecopy', + ] }, { groupname => 'policy', @@ -91,7 +92,7 @@ sub outtext { push @errmsg, "Error format in:[".$def->{desc}."]\n"; } - if ($parts[2] && $parts[3] && $parts[4]) { + if ($parts[2] && $parts[3] && ($parts[4] || $opt ne "GET")) { my ($uri, $data); if ($parts[3] =~ /\s+/) { ($uri, $data) = split(/ /, $parts[3]); @@ -168,7 +169,7 @@ sub outwiki { push @errmsg, "Error format for:[".$def->{desc}."]\n"; } - if ($parts[2] && $parts[3] && $parts[4]) { + if ($parts[2] && $parts[3] && ($parts[4] || $opt ne "GET")) { my ($uri, $data); if ($parts[3] =~ /\s+/) { ($uri, $data) = split(/ /, $parts[3]); diff --git a/xCAT-server/xCAT-wsapi/restapi.pl b/xCAT-server/xCAT-wsapi/restapi.pl index 8b08069b3..745de84cd 100755 --- a/xCAT-server/xCAT-wsapi/restapi.pl +++ b/xCAT-server/xCAT-wsapi/restapi.pl @@ -49,28 +49,28 @@ my %usagemsg = ( my %URIdef = ( #### definition for node resources - node => { + nodes => { allnode => { - desc => "[URI:/node] - The node list resource.", + desc => "[URI:/nodes] - The node list resource.", desc1 => "This resource can be used to display all the nodes which have been defined in the xCAT database.", - matcher => '^/node$', + matcher => '^/nodes$', GET => { desc => "Get all the nodes in xCAT.", desc1 => "The attributes details for the node will not be displayed.", - usage => "||An array of node names.|", - example => "|Get all the node names from xCAT database.|GET|/node|[\n \"node1\",\n \"node2\",\n \"node3\",\n]|", + usage => "||Json format: An array of node names.|", + example => "|Get all the node names from xCAT database.|GET|/nodes|[\n \"node1\",\n \"node2\",\n \"node3\",\n]|", cmd => "lsdef", fhandler => \&defhdl, outhdler => \&defout_remove_appended_type, } }, nodeallattr => { - desc => "[URI:/node/{nodename}] - The node resource", - matcher => '^/node/[^/]*$', + desc => "[URI:/nodes/{nodename}] - The node resource", + matcher => '^/nodes/[^/]*$', GET => { desc => "Get all the attibutes for the node {nodename}.", usage => "||$usagemsg{objreturn}|", - example => "|Get all the attibutes for node \'node1\'.|GET|/node/node1|{\n \"node1\":{\n \"profile\":\"compute\",\n \"netboot\":\"xnba\",\n \"arch\":\"x86_64\",\n \"mgt\":\"ipmi\",\n \"groups\":\"all\",\n ...\n }\n}|", + example => "|Get all the attibutes for node \'node1\'.|GET|/nodes/node1|{\n \"node1\":{\n \"profile\":\"compute\",\n \"netboot\":\"xnba\",\n \"arch\":\"x86_64\",\n \"mgt\":\"ipmi\",\n \"groups\":\"all\",\n ...\n }\n}|", cmd => "lsdef", fhandler => \&defhdl, outhdler => \&defout, @@ -78,7 +78,7 @@ my %URIdef = ( PUT => { desc => "Change the attibutes for the node {nodename}.", usage => "|$usagemsg{objchparam} DataBody: {attr1:v1,att2:v2,...}.|$usagemsg{non_getreturn}|", - example => "|Change the attributes mgt=dfm and netboot=yaboot.|PUT|/node/node1 {\"mgt\":\"dfm\",\"netboot\":\"yaboot\"}||", + example => "|Change the attributes mgt=dfm and netboot=yaboot.|PUT|/nodes/node1 {\"mgt\":\"dfm\",\"netboot\":\"yaboot\"}||", cmd => "chdef", fhandler => \&defhdl, outhdler => \&noout, @@ -86,7 +86,7 @@ my %URIdef = ( POST => { desc => "Create the node {nodename}.", usage => "|$usagemsg{objchparam} DataBody: {attr1:v1,att2:v2,...}.|$usagemsg{non_getreturn}|", - example => "|Create a node with attributes groups=all, mgt=dfm and netboot=yaboot|POST|/node/node1 {\"groups\":\"all\",\"mgt\":\"dfm\",\"netboot\":\"yaboot\"}||", + example => "|Create a node with attributes groups=all, mgt=dfm and netboot=yaboot|POST|/nodes/node1 {\"groups\":\"all\",\"mgt\":\"dfm\",\"netboot\":\"yaboot\"}||", cmd => "mkdef", fhandler => \&defhdl, outhdler => \&noout, @@ -94,19 +94,19 @@ my %URIdef = ( DELETE => { desc => "Remove the node {nodename}.", usage => "||$usagemsg{non_getreturn}|", - example => "|Delete the node node1|DELETE|/node/node1||", + example => "|Delete the node node1|DELETE|/nodes/node1||", cmd => "rmdef", fhandler => \&defhdl, outhdler => \&noout, }, }, nodeattr => { - desc => "[URI:/node/{nodename}/attr/{attr1,attr2,attr3 ...}] - The attributes resource for the node {nodename}", - matcher => '^/node/[^/]*/attr/\S+$', + desc => "[URI:/nodes/{nodename}/attr/{attr1,attr2,attr3 ...}] - The attributes resource for the node {nodename}", + matcher => '^/nodes/[^/]*/attr/\S+$', GET => { desc => "Get the specific attributes for the node {nodename}.", usage => "||$usagemsg{objreturn}|", - example => "|Get the attributes {groups,mgt,netboot} for node node1|GET|/node/node1/attr/groups,mgt,netboot|{\n \"node1\":{\n \"netboot\":\"xnba\",\n \"mgt\":\"ipmi\",\n \"groups\":\"all\"\n }\n}|", + example => "|Get the attributes {groups,mgt,netboot} for node node1|GET|/nodes/node1/attr/groups,mgt,netboot|{\n \"node1\":{\n \"netboot\":\"xnba\",\n \"mgt\":\"ipmi\",\n \"groups\":\"all\"\n }\n}|", cmd => "lsdef", fhandler => \&defhdl, outhdler => \&defout, @@ -114,19 +114,19 @@ my %URIdef = ( PUT_backup => { desc => "Change attributes for the node {nodename}. DataBody: {attr1:v1,att2:v2,att3:v3 ...}.", usage => "||An array of node objects.|", - example => "|Get the attributes {groups,mgt,netboot} for node node1|GET|/node/node1/attr/groups;mgt;netboot||", + example => "|Get the attributes {groups,mgt,netboot} for node node1|GET|/nodes/node1/attr/groups;mgt;netboot||", cmd => "chdef", fhandler => \&defhdl, outhdler => \&noout, } }, power => { - desc => "[URI:/node/{nodename}/power] - The power resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/power$', + desc => "[URI:/nodes/{nodename}/power] - The power resource for the node {nodename}", + matcher => '^/nodes/[^/]*/power$', GET => { desc => "Get the power status for the node {nodename}.", usage => "||$usagemsg{objreturn}|", - example => "|Get the power status.|GET|/node/node1/power|[\n {\n \"power\":\"on\",\n \"name\":\"node1\"\n }\n]|", + example => "|Get the power status.|GET|/nodes/node1/power|{\n \"node1\":{\n \"power\":\"on\"\n }\n}|", cmd => "rpower", fhandler => \&actionhdl, outhdler => \&actionout, @@ -134,78 +134,78 @@ my %URIdef = ( PUT => { desc => "Change power status for the node {nodename}.", usage => "|Json Formatted DataBody: {action:on/off/reset ...}.|$usagemsg{non_getreturn}|", - example => "|Change the power status to on|PUT|/node/node1/power {\"action\":\"on\"}|[\n {\n \"power\":\"on\",\n \"name\":\"node1\"\n }\n]|", + example => "|Change the power status to on|PUT|/nodes/node1/power {\"action\":\"on\"}||", cmd => "rpower", fhandler => \&actionhdl, outhdler => \&noout, } }, energy => { - desc => "[URI:/node/{nodename}/energy] - The energy resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/energy$', + desc => "[URI:/nodes/{nodename}/energy] - The energy resource for the node {nodename}", + matcher => '^/nodes/[^/]*/energy$', GET => { desc => "Get all the energy status for the node {nodename}.", - usage => "||An array of node object, each node object includes the energy status of the node.|", - example => "|Get all the energy attributes.|GET|/node/node1/energy|[\n {\n \"cappingmin\":\"272.3 W\",\n \"cappingmax\":\"354.0 W\",\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get all the energy attributes.|GET|/nodes/node1/energy|{\n \"node1\":{\n \"cappingmin\":\"272.3 W\",\n \"cappingmax\":\"354.0 W\"\n ...\n }\n}|", cmd => "renergy", fhandler => \&actionhdl, outhdler => \&actionout, }, PUT => { - desc => "Change energy attributes for the node {nodename}. DataBody: {cappingstatus:on ...}.", - usage => "|Put data: Json formatted attribute:value pair.|An array of node object, each node object includes the energy status of the node.|", - example => "|Turn on the cappingstatus to [on]|PUT|/node/node1/energy {\"cappingstatus\":\"on\"}|[\n {\n \"cappingstatus\":\"off\",\n \"name\":\"node1\"\n }\n]|", + desc => "Change energy attributes for the node {nodename}.", + usage => "|$usagemsg{objchparam} DataBody: {powerattr:value}.|$usagemsg{non_getreturn}|", + example => "|Turn on the cappingstatus to [on]|PUT|/nodes/node1/energy {\"cappingstatus\":\"on\"}||", cmd => "renergy", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, } }, energyattr => { disable => 1, - desc => "[URI:/node/{nodename}/energy/{cappingmaxmin;cappingstatus;cappingvalue ...}] - The specific energy attributes resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/energy/\S+$', + desc => "[URI:/nodes/{nodename}/energy/{cappingmaxmin,cappingstatus,cappingvalue ...}] - The specific energy attributes resource for the node {nodename}", + matcher => '^/nodes/[^/]*/energy/\S+$', GET => { desc => "Get the specific energy attributes cappingmaxmin,cappingstatus,cappingvalue ... for the node {nodename}.", - usage => "||An array of node object, each node object includes the energy status of the node.|", - example => "|Get the energy attributes which are specified in the URI.|GET|/node/node1/energy/cappingmaxmin;cappingstatus|[\n {\n \"cappingmin\":\"272.3 W\",\n \"cappingmax\":\"354.0 W\",\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the energy attributes which are specified in the URI.|GET|/nodes/node1/energy/cappingmaxmin,cappingstatus|{\n \"node1\":{\n \"cappingmin\":\"272.3 W\",\n \"cappingmax\":\"354.0 W\"\n }\n}|", cmd => "renergy", fhandler => \&actionhdl, outhdler => \&actionout, }, PUT => { - desc => "Change energy attributes for the node {nodename}. DataBody: {cappingstatus:on}.", - usage => "|Put data: Json formatted attribute:value pair.|An array of node object, each node object includes the energy status of the node.|", - example => "|Turn on the cappingstatus to [on]|PUT|/node/node1/energy {\"cappingstatus\":\"on\"}|[\n {\n \"cappingstatus\":\"off\",\n \"name\":\"node1\"\n }\n]|", + desc => "Change energy attributes for the node {nodename}. ", + usage => "|$usagemsg{objchparam} DataBody: {powerattr:value}.|$usagemsg{non_getreturn}|", + example => "|Turn on the cappingstatus to [on]|PUT|/nodes/node1/energy {\"cappingstatus\":\"on\"}||", cmd => "renergy", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, } }, serviceprocessor => { disable => 1, - desc => "[URI:/node/{nodename}/sp/{community|ip|netmask|...}] - The attribute resource of service processor for the node {nodename}", - matcher => '^\/node\/[^\/]*/sp/\S+$', + desc => "[URI:/nodes/{nodename}/sp/{community|ip|netmask|...}] - The attribute resource of service processor for the node {nodename}", + matcher => '^/nodes/[^/]*/sp/\S+$', GET => { desc => "Get the specific attributes for service processor resource.", - usage => "||An array of node object, each node object includes the service processor attributes for the node.|", - example => "|Get the snmp community for the service processor of node1.|GET|/node/node1/sp/community|[\n {\n \"name\":\"node1\",\n \"SP SNMP Community\":\"public\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the snmp community for the service processor of node1.|GET|/nodes/node1/sp/community|{\n \"node1\":{\n \"SP SNMP Community\":\"public\"\n }\n}|", cmd => "rspconfig", fhandler => \&actionhdl, outhdler => \&actionout, }, PUT => { - desc => "Change the specific attributes for the service processor resource. DataBody: {community:public}.", - usage => "|Put data: Json formatted value for the resource.|An array of node object, each node object includes the service processor attributes for the node.|", - example => "|Set the snmp community to [mycommunity].|PUT|/node/node1/sp/community {\"value\":\"mycommunity\"}|[\n {\n \"name\":\"node1\",\n \"SP SNMP Community\":\"public\"\n }\n]|", + desc => "Change the specific attributes for the service processor resource. ", + usage => "|$usagemsg{objchparam} DataBody: {community:public}.|$usagemsg{non_getreturn}|", + example => "|Set the snmp community to [mycommunity].|PUT|/nodes/node1/sp/community {\"value\":\"mycommunity\"}||", cmd => "rspconfig", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, } }, macaddress => { disable => 1, - desc => "[URI:/node/{nodename}/mac] - The mac address resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/mac$', + desc => "[URI:/nodes/{nodename}/mac] - The mac address resource for the node {nodename}", + matcher => '^/nodes/[^/]*/mac$', GET => { desc => "Get the mac address for the node {nodename}. Generally, it also updates the mac attribute of the node.", cmd => "getmacs", @@ -213,32 +213,32 @@ my %URIdef = ( }, }, nextboot => { - desc => "[URI:/node/{nodename}/nextboot] - The temporary bootorder resource in next boot for the node {nodename}", - matcher => '^\/node\/[^\/]*/nextboot$', + desc => "[URI:/nodes/{nodename}/nextboot] - The temporary bootorder resource in next boot for the node {nodename}", + matcher => '^/nodes/[^/]*/nextboot$', GET => { desc => "Get the next bootorder.", - usage => "||An array of node object, each node object includes the value of nextboot attribute for the node.|", - example => "|Get the bootorder for the next boot. (It's only valid after setting.)|GET|/node/node1/nextboot|[\n {\n \"name\":\"node1\",\n \"nextboot\":\"Network\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the bootorder for the next boot. (It's only valid after setting.)|GET|/nodes/node1/nextboot|{\n \"node1\":{\n \"nextboot\":\"Network\"\n }\n}|", cmd => "rsetboot", fhandler => \&actionhdl, outhdler => \&actionout, }, PUT => { - desc => "Change the next boot order. DataBody: {order:net}.", - usage => "|Put data: Json formatted order:value pair.|An array of node object, each node object includes the value of nextboot attribute for the node.|", - example => "|Set the bootorder for the next boot.|PUT|/node/node1/nextboot {\"order\":\"net\"}|[\n {\n \"name\":\"node1\",\n \"nextboot\":\"Network\"\n }\n]|", + desc => "Change the next boot order. ", + usage => "|$usagemsg{objchparam} DataBody: {order:net/hd}.|$usagemsg{non_getreturn}|", + example => "|Set the bootorder for the next boot.|PUT|/nodes/node1/nextboot {\"order\":\"net\"}||", cmd => "rsetboot", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, } }, bootorder => { - desc => "[URI:/node/{nodename}/bootorder] - The permanent bootorder resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/bootorder$', + desc => "[URI:/nodes/{nodename}/bootorder] - The permanent bootorder resource for the node {nodename}", + matcher => '^/nodes/[^/]*/bootorder$', GET => { desc => "Get the permanent boot order.", usage => "|?|?|", - example => "|Get the permanent bootorder for the node1.|GET|/node/node1/bootorder|?|", + example => "|Get the permanent bootorder for the node1.|GET|/nodes/node1/bootorder|?|", cmd => "rbootseq", fhandler => \&actionhdl, outhdler => \&actionout, @@ -246,19 +246,19 @@ my %URIdef = ( PUT => { desc => "Change the boot order. DataBody: {\"order\":\"net,hd\"}.", usage => "|Put data: Json formatted order:value pair.|?|", - example => "|Set the permanent bootorder for the node1.|PUT|/node/node1/bootorder|?|", + example => "|Set the permanent bootorder for the node1.|PUT|/nodes/node1/bootorder|?|", cmd => "rbootseq", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, } }, vitals => { - desc => "[URI:/node/{nodename}/vitals] - The vitals resources for the node {nodename}", - matcher => '^\/node\/[^\/]*/vitals$', + desc => "[URI:/nodes/{nodename}/vitals] - The vitals resources for the node {nodename}", + matcher => '^/nodes/[^/]*/vitals$', GET => { desc => "Get all the vitals attibutes.", - usage => "||An array of node object, each node object includes the value of vitals attribute for the node.|", - example => "|Get all the vitails attributes for the node1.|GET|/node/node1/vitals|[\n {\n \"SysBrd Fault\":\"0\",\n \"CPUs\":\"0\",\n \"Fan 4A Tach\":\"3293 RPM\",\n ...\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get all the vitails attributes for the node1.|GET|/nodes/node1/vitals|{\n \"node1\":{\n \"SysBrd Fault\":\"0\",\n \"CPUs\":\"0\",\n \"Fan 4A Tach\":\"3330 RPM\",\n \"Drive 15\":\"0\",\n \"SysBrd Vol Fault\":\"0\",\n \"nvDIMM Flash\":\"0\",\n \"Progress\":\"0\"\n ...\n }\n}|", cmd => "rvitals", fhandler => \&actionhdl, outhdler => \&actionout, @@ -266,81 +266,81 @@ my %URIdef = ( }, vitalsattr => { disable => 1, - desc => "[URI:/node/{nodename}/vitals/{temp|voltage|wattage|fanspeed|power|leds...}] - The specific vital attributes for the node {nodename}", - matcher => '^\/node\/[^\/]*/vitals/\S+$', + desc => "[URI:/nodes/{nodename}/vitals/{temp|voltage|wattage|fanspeed|power|leds...}] - The specific vital attributes for the node {nodename}", + matcher => '^/nodes/[^/]*/vitals/\S+$', GET => { desc => "Get the specific vitals attibutes.", - usage => "||An array of node object, each node object includes the value of vitals attribute for the node.|", - example => "|Get the \'fanspeed\' vitals attribute.|GET|/node/node1/vitals/fanspeed|[\n {\n \"Fan 1A Tach\":\"3219 RPM\",\n \"Fan 4B Tach\":\"2688 RPM\",\n \"Fan 3B Tach\":\"2592 RPM\",\n \"Fan 4A Tach\":\"3330 RPM\",\n \"name\":\"node1\",\n \"Fan 2A Tach\":\"3256 RPM\",\n \"Fan 1B Tach\":\"2560 RPM\",\n \"Fan 3A Tach\":\"3145 RPM\",\n \"Fan 2B Tach\":\"2592 RPM\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the \'fanspeed\' vitals attribute.|GET|/nodes/node1/vitals/fanspeed|{\n \"node1\":{\n \"Fan 1A Tach\":\"3219 RPM\",\n \"Fan 4B Tach\":\"2688 RPM\",\n \"Fan 3B Tach\":\"2560 RPM\",\n \"Fan 4A Tach\":\"3330 RPM\",\n \"Fan 2A Tach\":\"3293 RPM\",\n \"Fan 1B Tach\":\"2592 RPM\",\n \"Fan 3A Tach\":\"3182 RPM\",\n \"Fan 2B Tach\":\"2592 RPM\"\n }\n}|", cmd => "rvitals", fhandler => \&actionhdl, outhdler => \&actionout, }, }, inventory => { - desc => "[URI:/node/{nodename}/inventory] - The inventory attributes for the node {nodename}", - matcher => '^\/node\/[^\/]*/inventory$', + desc => "[URI:/nodes/{nodename}/inventory] - The inventory attributes for the node {nodename}", + matcher => '^/nodes/[^/]*/inventory$', GET => { desc => "Get all the inventory attibutes.", - usage => "||An array of node object, each node object includes the value of inventory attribute for the node.|", - example => "|Get all the inventory attributes for node1.|GET|/node/node1/inventory|[\n {\n \"DIMM 21 \":\"8GB PC3-12800 (1600 MT/s) ECC RDIMM\",\n \"DIMM 1 Manufacturer\":\"Hyundai Electronics\",\n \"Power Supply 2 Board FRU Number\":\"94Y8105\",\n \"DIMM 9 Model\":\"HMT31GR7EFR4C-PB\",\n \"DIMM 8 Manufacture Location\":\"01\",\n \"DIMM 13 Manufacturer\":\"Hyundai Electronics\",\n \"DASD Backplane 4\":\"Not Present\",\n \"DIMM 24 Model\":\"HMT31GR7EFR4C-PB\",\n \"DIMM 2 Manufacture Location\":\"01\",\n \"DIMM 17 Manufacture Location\":\"01\",\n \"Backup UEFI Version\":\"1.41 (VVE128GUS )\",\n \"DIMM 1 Model\":\"HMT31GR7EFR4A-H9\",\n \"DIMM 13 Manufacture Date\":\"Week 22 of 2013\",\n \"name\":\"node1\",\n \"DIMM 4 \":\"8GB PC3-12800 (1600 MT/s) ECC RDIMM\",\n ...\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get all the inventory attributes for node1.|GET|/nodes/node1/inventory|{\n \"node1\":{\n \"DIMM 21 \":\"8GB PC3-12800 (1600 MT/s) ECC RDIMM\",\n \"DIMM 1 Manufacturer\":\"Hyundai Electronics\",\n \"Power Supply 2 Board FRU Number\":\"94Y8105\",\n \"DIMM 9 Model\":\"HMT31GR7EFR4C-PB\",\n \"DIMM 8 Manufacture Location\":\"01\",\n \"DIMM 13 Manufacturer\":\"Hyundai Electronics\",\n \"DASD Backplane 4\":\"Not Present\",\n ...\n }\n}|", cmd => "rinv", fhandler => \&actionhdl, outhdler => \&actionout, }, }, inventoryattr => { - desc => "[URI:/node/{nodename}/inventory/{pci;model...}] - The specific inventory attributes for the node {nodename}", - matcher => '^\/node\/[^\/]*/inventory/\S+$', + desc => "[URI:/nodes/{nodename}/inventory/{pci;model...}] - The specific inventory attributes for the node {nodename}", + matcher => '^/nodes/[^/]*/inventory/\S+$', GET => { desc => "Get the specific inventory attibutes.", - usage => "||An array of node object, each node object includes the value of inventory attribute for the node.|", - example => "|Get the \'model\' inventory attribute for node1.|GET|/node/node1/inventory/model|[\n {\n \"System Description\":\"System x3650 M4\",\n \"System Model/MTM\":\"7915C2A\",\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the \'model\' inventory attribute for node1.|GET|/nodes/node1/inventory/model|{\n \"node1\":{\n \"System Description\":\"System x3650 M4\",\n \"System Model/MTM\":\"7915C2A\"\n }\n}|", cmd => "rinv", fhandler => \&actionhdl, outhdler => \&actionout, }, }, eventlog => { - desc => "[URI:/node/{nodename}/eventlog] - The eventlog resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/eventlog$', + desc => "[URI:/nodes/{nodename}/eventlog] - The eventlog resource for the node {nodename}", + matcher => '^/nodes/[^/]*/eventlog$', GET => { desc => "Get all the eventlog for the node {nodename}.", - usage => "||An array of node object, each node object includes the enentlog array for all the eventlog entries.|", - example => "|Get all the eventlog for node1.|GET|/node/node1/eventlog|[\n {\n \"eventlog\":[\n \"09/07/2013 10:05:02 Event Logging Disabled, Log Area Reset/Cleared (SEL Fullness)\",\n ...\n ],\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get all the eventlog for node1.|GET|/nodes/node1/eventlog|{\n \"node1\":{\n \"eventlog\":[\n \"03/19/2014 15:17:58 Event Logging Disabled, Log Area Reset/Cleared (SEL Fullness)\"\n ]\n }\n}|", cmd => "reventlog", fhandler => \&actionhdl, outhdler => \&actionout, }, DELETE => { desc => "Clean up the event log for the node {nodename}.", - usage => "||An array of node object, each node object includes the delete result.|", - example => "|Delete all the event log for node1.|DELETE|/node/node1/eventlog|[\n {\n \"eventlog\":[\n \"SEL cleared\"\n ],\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{non_getreturn}|", + example => "|Delete all the event log for node1.|DELETE|/nodes/node1/eventlog|[\n {\n \"eventlog\":[\n \"SEL cleared\"\n ],\n \"name\":\"node1\"\n }\n]|", cmd => "reventlog", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, }, }, beacon => { - desc => "[URI:/node/{nodename}/beacon] - The beacon resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/beacon$', + desc => "[URI:/nodes/{nodename}/beacon] - The beacon resource for the node {nodename}", + matcher => '^/nodes/[^/]*/beacon$', GET_backup => { desc => "Get the beacon status for the node {nodename}.", cmd => "rbeacon", fhandler => \&common, }, PUT => { - desc => "Change the beacon status for the node {nodename}. DataBody: {on|off|blink}.", - usage => "|Put data: Json formatted action:on/off/blink pair.|An array of node object, each node object includes the beacon status.|", - example => "|Turn on the beacon.|PUT|/node/node1/beacon {\"action\":\"on\"}|[\n {\n \"name\":\"node1\",\n \"beacon\":\"on\"\n }\n]|", + desc => "Change the beacon status for the node {nodename}.", + usage => "|$usagemsg{objchparam} DataBody: {action:on/off/blink}.|$usagemsg{non_getreturn}|", + example => "|Turn on the beacon.|PUT|/nodes/node1/beacon {\"action\":\"on\"}|[\n {\n \"name\":\"node1\",\n \"beacon\":\"on\"\n }\n]|", cmd => "rbeacon", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, }, }, virtualization => { - desc => "[URI:/node/{nodename}/virtualization] - The virtualization resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/virtualization$', + desc => "[URI:/nodes/{nodename}/virtualization] - The virtualization resource for the node {nodename}", + matcher => '^/nodes/[^/]*/virtualization$', GET => { desc => "Get the vm status for the node {nodename}.", cmd => "lsvm", @@ -358,80 +358,80 @@ my %URIdef = ( }, }, updating => { - desc => "[URI:/node/{nodename}/updating] - The updating resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/updating$', + desc => "[URI:/nodes/{nodename}/updating] - The updating resource for the node {nodename}", + matcher => '^/nodes/[^/]*/updating$', PUT => { desc => "Update the node with file syncing, software maintenance and rerun postscripts.", usage => "||An array of messages for performing the node updating.|", - example => "|Initiate an updatenode process.|PUT|/node/node2/updating|[\n \"There were no syncfiles defined to process. File synchronization has completed.\",\n \"Performing software maintenance operations. This could take a while, if there are packages to install.\n\",\n \"node2: Wed Mar 20 15:01:43 CST 2013 Running postscript: ospkgs\",\n \"node2: Running of postscripts has completed.\"\n]|", + example => "|Initiate an updatenode process.|PUT|/nodes/node2/updating|[\n \"There were no syncfiles defined to process. File synchronization has completed.\",\n \"Performing software maintenance operations. This could take a while, if there are packages to install.\n\",\n \"node2: Wed Mar 20 15:01:43 CST 2013 Running postscript: ospkgs\",\n \"node2: Running of postscripts has completed.\"\n]|", cmd => "updatenode", fhandler => \&actionhdl, outhdler => \&infoout, }, }, filesyncing => { - desc => "[URI:/node/{nodename}/filesyncing] - The filesyncing resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/filesyncing$', + desc => "[URI:/nodes/{nodename}/filesyncing] - The filesyncing resource for the node {nodename}", + matcher => '^/nodes/[^/]*/filesyncing$', PUT => { desc => "Sync files for the node {nodename}. DataBody: {location of syncfile}", usage => "||An array of messages for performing the file syncing for the node.|", - example => "|Initiate an file syncing process.|PUT|/node/node2/filesyncing|[\n \"There were no syncfiles defined to process. File synchronization has completed.\"\n]|", + example => "|Initiate an file syncing process.|PUT|/nodes/node2/filesyncing|[\n \"There were no syncfiles defined to process. File synchronization has completed.\"\n]|", cmd => "updatenode", fhandler => \&actionhdl, outhdler => \&infoout, }, }, software_maintenance => { - desc => "[URI:/node/{nodename}/sw] - The software maintenance for the node {nodename}", - matcher => '^\/node\/[^\/]*/sw$', + desc => "[URI:/nodes/{nodename}/sw] - The software maintenance for the node {nodename}", + matcher => '^/nodes/[^/]*/sw$', PUT => { desc => "Perform the software maintenance process for the node {nodename}.", usage => "||An array of messages for performing the software maintenance for the node.|", - example => "|Initiate an software maintenance process.|PUT|/node/node2/sw|[\n \"Performing software maintenance operations. This could take a while, if there are packages to install.\n\",\n \"node2: Wed Mar 20 15:40:27 CST 2013 Running postscript: ospkgs\",\n \"node2: Unable to read consumer identity\",\n \"node2: Postscript: ospkgs exited with code 0\",\n \"node2: Wed Mar 20 15:40:29 CST 2013 Running postscript: otherpkgs\",\n \"node2: ./otherpkgs: no extra rpms to install\",\n \"node2: Postscript: otherpkgs exited with code 0\",\n \"node2: Running of Software Maintenance has completed.\"\n]|", + example => "|Initiate an software maintenance process.|PUT|/nodes/node2/sw|[\n \"Performing software maintenance operations. This could take a while, if there are packages to install.\n\",\n \"node2: Wed Mar 20 15:40:27 CST 2013 Running postscript: ospkgs\",\n \"node2: Unable to read consumer identity\",\n \"node2: Postscript: ospkgs exited with code 0\",\n \"node2: Wed Mar 20 15:40:29 CST 2013 Running postscript: otherpkgs\",\n \"node2: ./otherpkgs: no extra rpms to install\",\n \"node2: Postscript: otherpkgs exited with code 0\",\n \"node2: Running of Software Maintenance has completed.\"\n]|", cmd => "updatenode", fhandler => \&actionhdl, outhdler => \&infoout, }, }, postscript => { - desc => "[URI:/node/{nodename}/postscript] - The postscript resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/postscript$', + desc => "[URI:/nodes/{nodename}/postscript] - The postscript resource for the node {nodename}", + matcher => '^/nodes/[^/]*/postscript$', PUT => { desc => "Run the postscripts for the node {nodename}. DataBody: {scripts:[p1,p2,p3,...]}", usage => "|Put data: Json formatted scripts:[scriptname list].|An array of messages for the running postscripts for the node.|", - example => "|Initiate an updatenode process.|PUT|/node/node2/postscript {\"scripts\":[\"syslog\",\"remoteshell\"]}|[\n \"node2: Wed Mar 20 15:39:23 CST 2013 Running postscript: syslog\",\n \"node2: Shutting down system logger: [ OK ]\n\",\n \"node2: Starting system logger: [ OK ]\n\",\n \"node2: Postscript: syslog exited with code 0\",\n \"node2: Wed Mar 20 15:39:23 CST 2013 Running postscript: remoteshell\",\n \"node2: \",\n \"node2: Stopping sshd: [ OK ]\n\",\n \"node2: Starting sshd: [ OK ]\n\",\n \"node2: Postscript: remoteshell exited with code 0\",\n \"node2: Running of postscripts has completed.\"\n]|", + example => "|Initiate an updatenode process.|PUT|/nodes/node2/postscript {\"scripts\":[\"syslog\",\"remoteshell\"]}|[\n \"node2: Wed Mar 20 15:39:23 CST 2013 Running postscript: syslog\",\n \"node2: Shutting down system logger: [ OK ]\n\",\n \"node2: Starting system logger: [ OK ]\n\",\n \"node2: Postscript: syslog exited with code 0\",\n \"node2: Wed Mar 20 15:39:23 CST 2013 Running postscript: remoteshell\",\n \"node2: \",\n \"node2: Stopping sshd: [ OK ]\n\",\n \"node2: Starting sshd: [ OK ]\n\",\n \"node2: Postscript: remoteshell exited with code 0\",\n \"node2: Running of postscripts has completed.\"\n]|", cmd => "updatenode", fhandler => \&actionhdl, outhdler => \&infoout, }, }, nodeshell => { - desc => "[URI:/node/{nodename}/nodeshell] - The nodeshell resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/nodeshell$', + desc => "[URI:/nodes/{nodename}/nodeshell] - The nodeshell resource for the node {nodename}", + matcher => '^/nodes/[^/]*/nodeshell$', PUT => { desc => "Run the command in the shell of the node {nodename}. DataBody: {command:[cmd1,cmd2]}", usage => "|Put data: Json formatted command:[cmd1,cmd2].|An arry of messages for running commands on the node.|", - example => "|Run the \'data\' command on the node2.|PUT|/node/node2/nodeshell {\"command\":[\"date\",\"ls\"]}|[\n \"node2: Wed Mar 20 16:18:08 CST 2013\",\n \"node2: anaconda-ks.cfg\nnode2: install.log\nnode2: install.log.syslog\nnode2: post.log\",\n null\n]|", + example => "|Run the \'data\' command on the node2.|PUT|/nodes/node2/nodeshell {\"command\":[\"date\",\"ls\"]}|[\n \"node2: Wed Mar 20 16:18:08 CST 2013\",\n \"node2: anaconda-ks.cfg\nnode2: install.log\nnode2: install.log.syslog\nnode2: post.log\",\n null\n]|", cmd => "xdsh", fhandler => \&actionhdl, outhdler => \&infoout, }, }, nodecopy => { - desc => "[URI:/node/{nodename}/nodecopy] - The nodecopy resource for the node {nodename}", - matcher => '^\/node\/[^\/]*/nodecopy$', + desc => "[URI:/nodes/{nodename}/nodecopy] - The nodecopy resource for the node {nodename}", + matcher => '^/nodes/[^/]*/nodecopy$', PUT => { desc => "Copy files to the node {nodename}. DataBody: {src:[file1,file2],target:dir}", usage => "|Put data: Json formatted src file and target file or directory.|Error messages.|", - example => "|Copy files to the node2.|PUT|/node/node2/nodecopy {\"src\":[\"/tmp/f1\",\"/tmp/f2\"],\"target\":\"/tmp\"}|no output for succeeded copy.|", + example => "|Copy files to the node2.|PUT|/nodes/node2/nodecopy {\"src\":[\"/tmp/f1\",\"/tmp/f2\"],\"target\":\"/tmp\"}|no output for succeeded copy.|", cmd => "xdcp", fhandler => \&actionhdl, outhdler => \&infoout, }, }, subnode => { - desc => "[URI:/node/{nodename}/subnode] - The sub nodes for the node {nodename}", - matcher => '^\/node\/[^\/]*/subnode$', + desc => "[URI:/nodes/{nodename}/subnode] - The sub nodes for the node {nodename}", + matcher => '^/nodes/[^/]*/subnode$', GET => { desc => "Return the Children node for the node {nodename}.", cmd => "rscan", @@ -446,7 +446,7 @@ my %URIdef = ( # for slpnode, we need use the query attribute to specify the network parameter for lsslp command slpnode => { desc => "[URI:/slpnode?network=xx] - The slp nodes in the xCAT cluster", - matcher => '^\/slpnode\?.*$', + matcher => '^/slpnode\?.*$', GET => { desc => "Get all the nodes which support slp protocol in the network.", cmd => "lsslp", @@ -460,7 +460,7 @@ my %URIdef = ( }, specific_slpnode => { desc => "[URI:/slpnode/{IMM;CMM;CEC;FSP...}?network=xx] - The slp nodes with specific service type in the xCAT cluster", - matcher => '^\/slpnode/[^\/]*/\?.*$', + matcher => '^/slpnode/[^/]*/\?.*$', GET => { desc => "Get all the nodes with specific slp service type in the network.", cmd => "lsslp", @@ -473,23 +473,23 @@ my %URIdef = ( }, }, bootstat => { - desc => "[URI:/node/{nodename}/bootstat] - The boot state resource for node {nodename}.", - matcher => '^\/node\/[^\/]*/bootstat$', + desc => "[URI:/nodes/{nodename}/bootstat] - The boot state resource for node {nodename}.", + matcher => '^/nodes/[^/]*/bootstat$', GET => { desc => "Get boot state.", - usage => "||An array of node object, each node object includes the boot status.|", - example => "|Get the next boot state for the node1.|GET|/node/node1/bootstat|[\n {\n \"bootstat\":\"boot\",\n \"name\":\"node1\"\n }\n]|", + usage => "||$usagemsg{objreturn}|", + example => "|Get the next boot state for the node1.|GET|/nodes/node1/bootstat|{\n \"node1\":{\n \"bootstat\":\"boot\"\n }\n}|", cmd => "nodeset", fhandler => \&actionhdl, outhdler => \&actionout, }, PUT => { - desc => "Set the boot state. DataBody: {osimage:xxx}", - usage => "|Put data: Json formatted osimage:imagename pair.|An array of node object, each node object includes the boot status.|", - example => "|Set the next boot state for the node1.|PUT|/node/node1/bootstat {\"osimage\":\"rhels6.4-x86_64-install-compute\"}|[\n {\n \"bootstat\":\"install rhels6.4-x86_64-compute\",\n \"name\":\"node1\"\n }\n]|", + desc => "Set the boot state.", + usage => "|$usagemsg{objchparam} DataBody: {osimage:xxx}.|$usagemsg{non_getreturn}|", + example => "|Set the next boot state for the node1.|PUT|/nodes/node1/bootstat {\"osimage\":\"rhels6.4-x86_64-install-compute\"}||", cmd => "nodeset", fhandler => \&actionhdl, - outhdler => \&actionout, + outhdler => \&noout, }, }, @@ -773,12 +773,12 @@ my %URIdef = ( #### definition for database/table resources table => { table_nodes => { - desc => "[URI:/table/{tablelist}/node/{noderange}/{attrlist}] - The node table resource", - matcher => '^/table/[^/]+/node(/[^/]+){0,2}$', + desc => "[URI:/table/{tablelist}/nodes/{noderange}/{attrlist}] - The node table resource", + matcher => '^/table/[^/]+/nodes(/[^/]+){0,2}$', GET => { desc => "Get table attibutes for a noderange. {noderange} and {attrlist} are optional.", usage => "||An object for the specific attributes.|", - example => "|Get |GET|/table/mac/node/node1/mac|{\n \"mac\":[\n {\n \"name\":\"node1\",\n \"mac\":\"mac=6c:ae:8b:41:3f:53\"\n }\n ]\n}|", + example => "|Get |GET|/table/mac/nodes/node1/mac|{\n \"mac\":[\n {\n \"name\":\"node1\",\n \"mac\":\"mac=6c:ae:8b:41:3f:53\"\n }\n ]\n}|", cmd => "getTablesNodesAttribs", # not used fhandler => \&tablenodehdl, outhdler => \&tableout, @@ -1212,12 +1212,9 @@ sub actionout { my $data = shift; my $param =shift; - my $json; my $jsonnode; foreach my $d (@$data) { - if (defined ($d->{node}->[0]->{name})) { - $jsonnode->{$d->{node}->[0]->{name}->[0]}->{'name'} = $d->{node}->[0]->{name}->[0]; - } else { + unless (defined ($d->{node}->[0]->{name})) { next; } if (defined ($d->{node}->[0]->{data}) && (ref($d->{node}->[0]->{data}->[0]) ne "HASH" || ! defined($d->{node}->[0]->{data}->[0]->{contents}))) { @@ -1235,11 +1232,7 @@ sub actionout { } } - foreach (keys %{$jsonnode}) { - push @$json, $jsonnode->{$_}; - } - - addPageContent($JSON->encode($json)) if ($json); + addPageContent($JSON->encode($jsonnode)) if ($jsonnode); } sub defout_1 { @@ -1286,7 +1279,9 @@ sub defhdl { $request->{command} = $params->{'cmd'}; # push the -t args - push @args, ('-t', $params->{'resourcegroup'}); + my $resrctype = $params->{'resourcegroup'}; + $resrctype =~ s/s$//; # remove the last 's' as the type of object + push @args, ('-t', $resrctype); # push the object name - node/noderange if (defined ($urilayers[1])) { @@ -1343,7 +1338,7 @@ sub actionhdl { if ($params->{'resourcename'} eq "energy") { push @args, 'all'; } elsif ($params->{'resourcename'} eq "energyattr") { - my @attrs = split(';', $urilayers[3]); + my @attrs = split(',', $urilayers[3]); push @args, @attrs; } } elsif ($paramhash) { @@ -1741,7 +1736,7 @@ sub filterData { if (exists($_->{serverdone})) { - if (defined ($outputerror->{errorcode})) { + if (defined ($outputerror->{error})) { addPageContent($JSON->encode($outputerror)); #return the default http error code to be 403 forbidden sendResponseMsg($STATUS_FORBIDDEN);