changes:
1. Change file and plugin name: remove "PCM/pcm". 2. Implenment lock query sub 3. Use sinfo indicating processing progress git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13953 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| # IBM(c) 2012 EPL license http://www.eclipse.org/legal/epl-v10.html | ||||
| package xCAT::PCMNodeMgmtUtils; | ||||
| package xCAT::ProfiledNodeUtils; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| @@ -15,11 +15,11 @@ require xCAT::NetworkUtils; | ||||
| 
 | ||||
| #-------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head1    xCAT::PCMNodeMgmtkUtils | ||||
| =head1    xCAT::ProfiledNodeUtils | ||||
| 
 | ||||
| =head2    Package Description | ||||
| 
 | ||||
| This program module file, is a set of PCM node management utilities. | ||||
| This program module file, is a set of node management utilities for Profile based nodes. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| @@ -80,8 +80,8 @@ sub genhosts_with_numric_tmpl | ||||
| { | ||||
|     my ($class, $format, $rank) = @_; | ||||
| 
 | ||||
|     my ($prefix, $appendix, $len) = xCAT::PCMNodeMgmtUtils->split_hostname($format, 'N'); | ||||
|     return xCAT::PCMNodeMgmtUtils->gen_numric_hostnames($prefix, $appendix, $len, $rank); | ||||
|     my ($prefix, $appendix, $len) = xCAT::ProfiledNodeUtils->split_hostname($format, 'N'); | ||||
|     return xCAT::ProfiledNodeUtils->gen_numric_hostnames($prefix, $appendix, $len, $rank); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| @@ -200,9 +200,11 @@ sub get_hostname_format_type{ | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| sub rackformat_to_numricformat{ | ||||
|     my ($class, $format, $racknum) = @_; | ||||
|     my ($prefix, $appendix, $len) = xCAT::PCMNodeMgmtUtils->split_hostname($format, 'R'); | ||||
|     my ($class, $format, $rackname) = @_; | ||||
|     my ($prefix, $appendix, $len) = xCAT::ProfiledNodeUtils->split_hostname($format, 'R'); | ||||
| 
 | ||||
|     my $objhash = xCAT::DBojbutils->getobjdefs({$rackname, "rack"}); | ||||
|     my $racknum = $objhash->{$rackname}->{"num"}; | ||||
|     my $maxnum = 10 ** $len; | ||||
|     my $fullnum = $maxnum + $racknum; | ||||
|     return $prefix.(substr $fullnum, 1).$appendix; | ||||
| @@ -280,7 +282,7 @@ sub get_netprofile_nic_attrs{ | ||||
| sub get_netprofile_bmcnet{ | ||||
|     my ($class, $netprofilename) = @_; | ||||
| 
 | ||||
|     my $netprofile_nicshash_ref = xCAT::PCMNodeMgmtUtils->get_netprofile_nic_attrs($netprofilename); | ||||
|     my $netprofile_nicshash_ref = xCAT::ProfiledNodeUtils->get_netprofile_nic_attrs($netprofilename); | ||||
|     my %netprofile_nicshash = %$netprofile_nicshash_ref; | ||||
|     if (exists $netprofile_nicshash{'bmc'}{"network"}){ | ||||
|         return $netprofile_nicshash{'bmc'}{"network"} | ||||
| @@ -301,7 +303,7 @@ sub get_netprofile_bmcnet{ | ||||
| sub get_netprofile_provisionnet{ | ||||
|     my ($class, $netprofilename) = @_; | ||||
| 
 | ||||
|     my $netprofile_nicshash_ref = xCAT::PCMNodeMgmtUtils->get_netprofile_nic_attrs($netprofilename); | ||||
|     my $netprofile_nicshash_ref = xCAT::ProfiledNodeUtils->get_netprofile_nic_attrs($netprofilename); | ||||
|     my %netprofile_nicshash = %$netprofile_nicshash_ref; | ||||
|     my $restab = xCAT::Table->new('noderes'); | ||||
|     my $installnicattr = $restab->getNodeAttribs($netprofilename, ['installnic']); | ||||
| @@ -318,7 +320,7 @@ sub get_netprofile_provisionnet{ | ||||
| #------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head3 get_output_filename | ||||
|       Description : Generate a temp file name for placing output details for PCM node management operations. | ||||
|       Description : Generate a temp file name for placing output details for profiled node management operations. | ||||
|                     We make this file generated under /install/ so that clients can access it through http. | ||||
|       Arguments   : N/A | ||||
|       Returns     : A temp filename placed under /install/pcm/work/ | ||||
| @@ -344,8 +346,8 @@ sub get_output_filename | ||||
|                              if set, return a hash ref. | ||||
|       Returns     : ref for node list. | ||||
|       Example     :  | ||||
|                     my $arrayref = xCAT::PCMNodeMgmtUtils->get_all_chassis(); | ||||
|                     my $hashref = xCAT::PCMNodeMgmtUtils->get_all_chassis(1); | ||||
|                     my $arrayref = xCAT::ProfiledNodeUtils->get_all_chassis(); | ||||
|                     my $hashref = xCAT::ProfiledNodeUtils->get_all_chassis(1); | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| @@ -397,12 +399,12 @@ sub get_allnode_singleattrib_hash | ||||
| #------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head3 acquire_lock | ||||
|       Description : Create lock file for PCM plugins so that there is  | ||||
|       Description : Create lock file for plugins so that there is  | ||||
|                     no multi instance of plugins running at same time. | ||||
|                     The lock file content will be the pid of the plugin running process. | ||||
|                     Using perl's flock to achive this. | ||||
|                     Note: we can not judge whether PCM discovering is running or only  | ||||
|                           through acquire_lock("nodemgmt") | ||||
|                     Note: we can not judge whether profiled nodes discovering is running  | ||||
|                           or not only through acquire_lock("nodemgmt") | ||||
|                           We must also call is_discover_started()  | ||||
|       Arguments   : action name: for example: nodemgmt, imageprofile...etc We'll generate | ||||
|                     a lock file named as /var/lock/pcm/$action. | ||||
| @@ -434,7 +436,7 @@ sub acquire_lock | ||||
| #------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head3 is_discover_started | ||||
|       Description : Judge whether PCM discovering is running or not. | ||||
|       Description : Judge whether profiled nodes discovering is running or not. | ||||
|       Arguments   : NA | ||||
|       Returns     : 1 - Discover is running | ||||
|                     0 - Discover is not started. | ||||
| @@ -468,6 +470,32 @@ sub release_lock | ||||
|     return flock($lockfh, LOCK_UN|LOCK_NB); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head3 is_locked | ||||
|       Description : Try to see whether current command catagory is locked or not. | ||||
|       Arguments   : action - command catagory | ||||
|       Returns     :  | ||||
|                     1 - current command catagory already locked. | ||||
|                     0 - not locked yet. | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| sub is_locked | ||||
| { | ||||
|     my $class = shift; | ||||
|     my $action = shift; | ||||
| 
 | ||||
|     my $lock = xCAT::ProfiledNodeUtils->acquire_lock($action); | ||||
|     if ($lock == -1){ | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     xCAT::ProfiledNodeUtils->release_lock($lock); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #------------------------------------------------------------------------------- | ||||
| 
 | ||||
| =head3 get_node_profiles | ||||
| @@ -1,32 +1,32 @@ | ||||
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html | ||||
| 
 | ||||
| package xCAT_plugin::00pcmkitbase; | ||||
| package xCAT_plugin::00kitnodebase; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| require xCAT::Utils; | ||||
| require xCAT::Table; | ||||
| require xCAT::PCMNodeMgmtUtils; | ||||
| require xCAT::ProfiledNodeUtils; | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head1 | ||||
| 
 | ||||
|     xCAT plugin, which is also the default PCM kit plugin. | ||||
|     These commands are called by PCM node management commands,  | ||||
|     xCAT plugin, which is also the default kit plugin. | ||||
|     These commands are called by node management commands,  | ||||
|     should not be called directly by external. | ||||
| 
 | ||||
|     The kit plugin framework is creating a common framework for kits' extension. The major feature of this framework is to update kits' related configuration files/services automatically while add/remove/update nodes. | ||||
|      | ||||
|     According to design, if a kit wants have such a auto configure feature, it should create a xCAT plugin which implement commands "kitcmd_nodemgmt_add", "kitcmd_nodemgmt_remove"..., just like plugin "00pcmkitbase". | ||||
|     According to design, if a kit wants have such a auto configure feature, it should create a xCAT plugin which implement commands "kitcmd_nodemgmt_add", "kitcmd_nodemgmt_remove"..., just like plugin "00kitnodebase". | ||||
| 
 | ||||
|     For example, we create a kit for LSF, and want to update LSF's configuration file automatically updated while add/remove/update xCAT nodes, then we should create a xCAT plugin. This plugin will update LSF's configuration file and may also reconfigure/restart LSF service while these change happens. | ||||
| 
 | ||||
|     If we have multi kits, and all these kits have such a plugin, then all these plugins will be called while we add/remove/update xCAT nodes. To configure these kits in one go by auto. | ||||
| 
 | ||||
|     This plugin is a PCM kit plugin, just for configure nodes' related configurations automatically. So that we do not need to run these make* commands manually after creating them.     | ||||
|     This plugin is a kit plugin, just for configure nodes' related configurations automatically. So that we do not need to run these make* commands manually after creating them.     | ||||
| 
 | ||||
|     About PCM kit plugin naming:  naming this plugin starts with "00" is a way for specifying plugin calling orders, we want to call the default kit plugin in front of other kit plugins. | ||||
|     About kit plugin naming:  naming this plugin starts with "00" is a way for specifying plugin calling orders, we want to call the default kit plugin in front of other kit plugins. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| @@ -43,11 +43,11 @@ require xCAT::PCMNodeMgmtUtils; | ||||
| #------------------------------------------------------- | ||||
| sub handled_commands { | ||||
|     return { | ||||
|         kitcmd_nodemgmt_add => '00pcmkitbase', | ||||
|         kitcmd_nodemgmt_remove => '00pcmkitbase', | ||||
|         kitcmd_nodemgmt_update => '00pcmkitbase', | ||||
|         kitcmd_nodemgmt_refresh => '00pcmkitbase', | ||||
|         kitcmd_nodemgmt_finished => '00pcmkitbase', | ||||
|         kitnodeadd => '00kitnodebase', | ||||
|         kitnoderemove => '00kitnodebase', | ||||
|         kitnodeupdate => '00kitnodebase', | ||||
|         kitnoderefresh => '00kitnodebase', | ||||
|         kitnodefinished => '00kitnodebase', | ||||
|     }; | ||||
| 
 | ||||
| } | ||||
| @@ -72,93 +72,81 @@ sub process_request { | ||||
|     my $retref; | ||||
|     my $rsp; | ||||
| 
 | ||||
|     if($command eq 'kitcmd_nodemgmt_add') | ||||
|     if($command eq 'kitnodeadd') | ||||
|     { | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating hosts entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         setrsp_progress("Updating hosts entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating DNS entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Updating DNS entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         # Work around for makedns bug, it will set umask to 0007. | ||||
|         #umask(0022); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update DHCP entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makekdhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update known hosts"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Update DHCP entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
| 
 | ||||
|         setrsp_progress("Update known hosts"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makeknownhosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
| 
 | ||||
|         my $firstnode = (@$nodelist)[0]; | ||||
|         my $profileref = xCAT::PCMNodeMgmtUtils->get_nodes_profiles([$firstnode]); | ||||
|         my $profileref = xCAT::ProfiledNodeUtils->get_nodes_profiles([$firstnode]); | ||||
|         my %profilehash = %$profileref; | ||||
|         if (exists $profilehash{$firstnode}{"ImageProfile"}){ | ||||
|             $rsp->{info}->[0] = "[PCM nodes mgmt]Update nodes' boot settings"; | ||||
|             $::CALLBACK->($rsp); | ||||
|             setrsp_progress("Update nodes' boot settings"); | ||||
|             $retref = xCAT::Utils->runxcmd({command=>["nodeset"], node=>$nodelist, arg=>['osimage='.$profilehash{$firstnode}{"ImageProfile"}]}, $request_command, 0, 1); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|     elsif ($command eq 'kitcmd_nodemgmt_remove'){ | ||||
|     elsif ($command eq 'kitnoderemove'){ | ||||
|         setrsp_progress("Update nodes' boot settings"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["nodeset"], node=>$nodelist, arg=>['offline']}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update known hosts"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Update known hosts"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makeknownhosts"], node=>$nodelist, arg=>['-r']}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update DHCP entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makekdhcp"], node=>$nodelist, arg=>['-d']}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating DNS entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Update DHCP entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedhcp"], node=>$nodelist, arg=>['-d']}, $request_command, 0, 1); | ||||
| 
 | ||||
|         setrsp_progress("Updating DNS entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodelist, arg=>['-d']}, $request_command, 0, 1); | ||||
|         # Work around for makedns bug, it will set umask to 0007. | ||||
|         #umask(0022); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating hosts entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Updating hosts entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>$nodelist, arg=>['-d']}, $request_command, 0, 1); | ||||
|     } | ||||
|     elsif ($command eq 'kitcmd_nodemgmt_update'){ | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating hosts entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|     elsif ($command eq 'kitnodeupdate'){ | ||||
|         setrsp_progress("Updating hosts entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating DNS entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Updating DNS entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         # Work around for makedns bug, it will set umask to 0007. | ||||
|         #umask(0022); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update DHCP entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makekdhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update known hosts"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Update DHCP entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
| 
 | ||||
|         setrsp_progress("Update known hosts"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makeknownhosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         my $firstnode = (@$nodelist)[0]; | ||||
|         my $profileref = xCAT::PCMNodeMgmtUtils->get_nodes_profiles([$firstnode]); | ||||
|         my $profileref = xCAT::ProfiledNodeUtils->get_nodes_profiles([$firstnode]); | ||||
|         my %profilehash = %$profileref; | ||||
|         if (exists $profilehash{$firstnode}{"ImageProfile"}){ | ||||
|             $rsp->{info}->[0] = "[PCM nodes mgmt]Update nodes' boot settings"; | ||||
|             $::CALLBACK->($rsp); | ||||
|             setrsp_progress("Update nodes' boot settings"); | ||||
|             $retref = xCAT::Utils->runxcmd({command=>["nodeset"], node=>$nodelist, arg=>['osimage='.$profilehash{$firstnode}{"ImageProfile"}]}, $request_command, 0, 1); | ||||
|         } | ||||
|     } | ||||
|     elsif ($command eq 'kitcmd_nodemgmt_refresh'){ | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating hosts entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|     elsif ($command eq 'kitnoderefresh'){ | ||||
|         setrsp_progress("Updating hosts entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating DNS entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Updating DNS entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         # Work around for makedns bug, it will set umask to 0007. | ||||
|         #umask(0022); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update DHCP entries"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makekdhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Update known hosts"; | ||||
|         $::CALLBACK->($rsp); | ||||
| 
 | ||||
|         setrsp_progress("Update DHCP entries"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makedhcp"], node=>$nodelist}, $request_command, 0, 1); | ||||
| 
 | ||||
|         setrsp_progress("Update known hosts"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makeknownhosts"], node=>$nodelist}, $request_command, 0, 1); | ||||
|     } | ||||
|     elsif ($command eq 'kitcmd_nodemgmt_finished') | ||||
|     elsif ($command eq 'kitnodefinished') | ||||
|     { | ||||
|         $rsp->{info}->[0] = "[PCM nodes mgmt]Updating conserver configuration files"; | ||||
|         $::CALLBACK->($rsp); | ||||
|         setrsp_progress("Updating conserver configuration files"); | ||||
|         $retref = xCAT::Utils->runxcmd({command=>["makeconservercf"]}, $request_command, 0, 1); | ||||
|     } | ||||
|     else | ||||
| @@ -166,4 +154,22 @@ sub process_request { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  setrsp_progress | ||||
| 
 | ||||
|        Description:  generate progresss info and return to client. | ||||
|        Args: $msg - The progress message. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub setrsp_progress | ||||
| { | ||||
|     my $msg = shift; | ||||
|     my $rsp; | ||||
|     $rsp->{sinfo} = $msg; | ||||
|     $::CALLBACK->($rsp); | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
| @@ -3,13 +3,12 @@ | ||||
| 
 | ||||
| =head1 | ||||
| 
 | ||||
|     xCAT plugin to support PCM node management | ||||
|     These commands are designed to be called by PCM GUI. | ||||
|     xCAT plugin to support Profiled nodes management | ||||
|      | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| package xCAT_plugin::pcmnodes; | ||||
| package xCAT_plugin::profilednodes; | ||||
| 
 | ||||
| use strict; | ||||
| use warnings; | ||||
| @@ -19,7 +18,7 @@ require xCAT::Utils; | ||||
| require xCAT::TableUtils; | ||||
| require xCAT::NetworkUtils; | ||||
| require xCAT::MsgUtils; | ||||
| require xCAT::PCMNodeMgmtUtils; | ||||
| require xCAT::ProfiledNodeUtils; | ||||
| 
 | ||||
| # Globals. | ||||
| # These 2 global variables are for storing the parse result of hostinfo file. | ||||
| @@ -57,14 +56,14 @@ my %args_dict; | ||||
| #------------------------------------------------------- | ||||
| sub handled_commands { | ||||
|     return { | ||||
|         addhost_hostfile   => 'pcmnodes', | ||||
|         addhost_discover     => 'pcmnodes', | ||||
|         removehost     => 'pcmnodes', | ||||
|         updatehost     => 'pcmnodes', | ||||
|         pcmdiscover_start => 'pcmnodes', | ||||
|         pcmdiscover_stop => 'pcmnodes', | ||||
|         pcmdiscover_nodels => 'pcmnodes', | ||||
|         findme => 'pcmnodes', | ||||
|         nodeimport => 'profilednodes', | ||||
|         nodepurge => 'profilednodes', | ||||
|         nodechprofile => 'profilednodes', | ||||
|         noderefresh =>  'profilednodes', | ||||
|         nodediscoverstart => 'profilednodes', | ||||
|         nodediscoverstop => 'profilednodes', | ||||
|         nodediscoverls => 'profilednodes', | ||||
|         findme => 'profilednodes', | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| @@ -88,39 +87,41 @@ sub process_request { | ||||
|     $args = $request->{arg}; | ||||
| 
 | ||||
| 
 | ||||
|     my $lockfh = xCAT::PCMNodeMgmtUtils->acquire_lock("nodemgmt"); | ||||
|     my $lockfh = xCAT::ProfiledNodeUtils->acquire_lock("nodemgmt"); | ||||
|     if ($lockfh == -1){ | ||||
|         setrsp_errormsg("Can not acquire lock, some process is operating node related actions."); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     # These commands should make sure no discover is running. | ||||
|     if (grep{ $_ eq $command} ("addhost_hostfile", "removehost", "updatehost")){ | ||||
|         my $discover_running = xCAT::PCMNodeMgmtUtils->is_discover_started(); | ||||
|     if (grep{ $_ eq $command} ("nodeimport", "nodepurge", "nodechprofile")){ | ||||
|         my $discover_running = xCAT::ProfiledNodeUtils->is_discover_started(); | ||||
|         if ($discover_running){ | ||||
|             setrsp_errormsg("Can not run command $command as PCM discover is running."); | ||||
|             xCAT::PCMNodeMgmtUtils->release_lock($lockfh); | ||||
|             setrsp_errormsg("Can not run command $command as profiled nodes discover is running."); | ||||
|             xCAT::ProfiledNodeUtils->release_lock($lockfh); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| 	 | ||||
|     if ($command eq "addhost_hostfile"){ | ||||
|         addhost_hostfile() | ||||
|     } elsif ($command eq "removehost"){ | ||||
|     	removehost(); | ||||
|     } elsif ($command eq "updatehost"){ | ||||
|     	updatehost(); | ||||
|     } elsif ($command eq "pcmdiscover_start"){ | ||||
|         pcmdiscover_start(); | ||||
|     } elsif ($command eq "pcmdiscover_nodels"){ | ||||
|         pcmdiscover_nodels(); | ||||
|     if ($command eq "nodeimport"){ | ||||
|         nodeimport() | ||||
|     } elsif ($command eq "nodepurge"){ | ||||
|     	nodepurge(); | ||||
|     } elsif ($command eq "nodechprofile"){ | ||||
|     	nodechprofile(); | ||||
|     } elsif ($command eq "noderefresh"){ | ||||
|     	noderefresh(); | ||||
|     } elsif ($command eq "nodediscoverstart"){ | ||||
|         nodediscoverstart(); | ||||
|     } elsif ($command eq "nodediscoverstop"){ | ||||
|         nodediscoverstop(); | ||||
|     } elsif ($command eq "findme"){ | ||||
|         findme(); | ||||
|     } elsif ($command eq "pcmdiscover_stop"){ | ||||
|         pcmdiscover_stop(); | ||||
|     } elsif ($command eq "nodediscoverls"){ | ||||
|         nodediscoverls(); | ||||
|     } | ||||
| 
 | ||||
|     xCAT::PCMNodeMgmtUtils->release_lock($lockfh); | ||||
|     xCAT::ProfiledNodeUtils->release_lock($lockfh); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| @@ -159,13 +160,13 @@ sub parse_args{ | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  addhost_hostfile | ||||
| =head3 nodeimport  | ||||
| 
 | ||||
|     Description :  | ||||
|     Create PCM nodes by importing hostinfo file. | ||||
|     This sub maps to request "addhost_hostfile", we need to call this command from CLI like following steps: | ||||
|     # ln -s /opt/xcat/bin/xcatclientnnr /opt/xcat/bin/addhost_hostfile | ||||
|     # addhost_hostfile file=/root/hostinfo.file networkprofile=network_cn imageprofile=rhel63_cn hardwareprofile=ipmi groups=group1,group2  | ||||
|     Create profiled nodes by importing hostinfo file. | ||||
|     This sub maps to request "nodeimport", we need to call this command from CLI like following steps: | ||||
|     # ln -s /opt/xcat/bin/xcatclientnnr /opt/xcat/bin/nodeimport | ||||
|     # nodeimport file=/root/hostinfo.file networkprofile=network_cn imageprofile=rhel63_cn hardwareprofile=ipmi groups=group1,group2  | ||||
|      | ||||
|     The hostinfo file should be written like: (MAC address is mandatory attribute) | ||||
|     # Auto generate hostname for this node entry. | ||||
| @@ -180,10 +181,10 @@ sub parse_args{ | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub addhost_hostfile { | ||||
| sub nodeimport{ | ||||
| 
 | ||||
|     # Parse arges. | ||||
|     setrsp_infostr("[PCM nodes mgmt]Import PCM nodes through hostinfo file."); | ||||
|     setrsp_infostr("Import profiled nodes through hostinfo file."); | ||||
|     my $retstr = parse_args(); | ||||
|     if ($retstr){ | ||||
|         setrsp_errormsg($retstr); | ||||
| @@ -211,12 +212,12 @@ sub addhost_hostfile { | ||||
|     } | ||||
| 
 | ||||
|     # Get database records: all hostnames, all ips, all racks... | ||||
|     setrsp_infostr("[PCM nodes mgmt]Getting database records."); | ||||
|     my $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('nodelist', 'node'); | ||||
|     setrsp_infostr("Getting database records."); | ||||
|     my $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('nodelist', 'node'); | ||||
|     %allhostnames = %$recordsref; | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('ipmi', 'bmc'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('ipmi', 'bmc'); | ||||
|     %allbmcips = %$recordsref; | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('mac', 'mac'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('mac', 'mac'); | ||||
|     %allmacs = %$recordsref; | ||||
|     # MAC records looks like: "01:02:03:04:05:0E!node5│01:02:03:05:0F!node6-eth1". We want to get the real mac addres. | ||||
|     foreach (keys %allmacs){ | ||||
| @@ -226,7 +227,7 @@ sub addhost_hostfile { | ||||
|             $allmacs{$macstr} = 0; | ||||
|         } | ||||
|     } | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('hosts', 'ip'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('hosts', 'ip'); | ||||
|     %allinstallips = %$recordsref; | ||||
|     $recordsref = xCAT::NetworkUtils->get_all_nicips(1); | ||||
|     %allips = %$recordsref; | ||||
| @@ -235,13 +236,13 @@ sub addhost_hostfile { | ||||
|     %allips = (%allips, %allbmcips, %allinstallips); | ||||
| 
 | ||||
|     #TODO: can not use getallnode to get rack infos. | ||||
|     #$recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('rack', 'rackname'); | ||||
|     #$recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('rack', 'rackname'); | ||||
|     %allracks = (); | ||||
|     $recordsref =  xCAT::PCMNodeMgmtUtils->get_all_chassis(1); | ||||
|     $recordsref =  xCAT::ProfiledNodeUtils->get_all_chassis(1); | ||||
|     %allchassis = %$recordsref; | ||||
| 
 | ||||
|     # Generate temporary hostnames for hosts entries in hostfile.  | ||||
|     setrsp_infostr("[PCM nodes mgmt]Generate temporary hostnames."); | ||||
|     setrsp_infostr("Generate temporary hostnames."); | ||||
|     my ($retcode_read, $retstr_read) = read_and_generate_hostnames($args_dict{'file'}); | ||||
|     if ($retcode_read != 0){ | ||||
|         setrsp_errormsg($retstr_read); | ||||
| @@ -249,7 +250,7 @@ sub addhost_hostfile { | ||||
|     } | ||||
| 
 | ||||
|     # Parse and validate the hostinfo string. The real hostnames will be generated here. | ||||
|     setrsp_infostr("[PCM nodes mgmt]Parsing hostinfo string and validate it."); | ||||
|     setrsp_infostr("Parsing hostinfo string and validate it."); | ||||
|     my ($hostinfo_dict_ref, $invalid_records_ref) = parse_hosts_string($retstr_read); | ||||
|     my %hostinfo_dict = %$hostinfo_dict_ref; | ||||
|     my @invalid_records = @$invalid_records_ref; | ||||
| @@ -263,60 +264,78 @@ sub addhost_hostfile { | ||||
|     } | ||||
| 
 | ||||
|     # Create the real hostinfo string in stanza file format. | ||||
|     setrsp_infostr("[PCM nodes mgmt]Generating new hostinfo string."); | ||||
|     setrsp_infostr("Generating new hostinfo string."); | ||||
|     my ($retcode_gen, $retstr_gen) = gen_new_hostinfo_string(\%hostinfo_dict); | ||||
|     unless ($retcode_gen){ | ||||
|         setrsp_errormsg($retstr_gen); | ||||
|         return; | ||||
|     } | ||||
|     # call mkdef to create hosts and then call nodemgmt for node management plugins. | ||||
|     setrsp_infostr("[PCM nodes mgmt]call mkdef to create pcm nodes."); | ||||
|     setrsp_progress("call mkdef to create nodes."); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["mkdef"], stdin=>[$retstr_gen], arg=>['-z']}, $request_command, 0, 1); | ||||
| 
 | ||||
|     my @nodelist = keys %hostinfo_dict; | ||||
|     setrsp_infostr("[PCM nodes mgmt]call nodemgmt plugins."); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_add"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_finished"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     setrsp_progress("call nodemgmt plugins."); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodeadd"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodefinished"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     setrsp_success(\@nodelist); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  removehost | ||||
| =head3  nodepurge | ||||
| 
 | ||||
|     Description : Remove PCM nodes. After nodes removed, their info in /etc/hosts, dhcp, dns... will be removed automatically. | ||||
|     Description : Remove nodes. After nodes removed, their info in /etc/hosts, dhcp, dns... will be removed automatically. | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub removehost{ | ||||
| sub nodepurge{ | ||||
|     my $nodes   = $request->{node}; | ||||
|     setrsp_infostr("[PCM nodes mgmt]Remove PCM nodes."); | ||||
|     setrsp_infostr("Purging nodes."); | ||||
|     # For remove nodes, we should call 'nodemgmt' in front of 'noderm' | ||||
|     setrsp_infostr("[PCM nodes mgmt]call nodemgmt plugins."); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_remove"], node=>$nodes}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_finished"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_infostr("[PCM nodes mgmt]call noderm to remove nodes."); | ||||
|     setrsp_infostr("Call kit node plugins."); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["kitnoderemove"], node=>$nodes}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodefinished"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_infostr("Call noderm to remove nodes."); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["noderm"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_success($nodes); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  updatehost | ||||
| =head3  noderefresh | ||||
| 
 | ||||
|     Description : Update PCM node profiles: imageprofile, networkprofile and hardwareprofile. | ||||
|     Description : Re-Call kit plugins for node management | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------ | ||||
| sub noderefresh | ||||
| { | ||||
|     my $nodes   = $request->{node}; | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["kitnoderefresh"], node=>$nodes}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodefinished"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_success($nodes); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  nodechprofile | ||||
| 
 | ||||
|     Description : Update node profiles: imageprofile, networkprofile and hardwareprofile. | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub updatehost{ | ||||
| sub nodechprofile{ | ||||
|     my $nodes   = $request->{node}; | ||||
|     my %updated_groups; | ||||
| 
 | ||||
|     setrsp_infostr("[PCM nodes mgmt]Update PCM nodes settings."); | ||||
|     setrsp_infostr("Update nodes' profile settings."); | ||||
|     # Parse arges. | ||||
|     my $retstr = parse_args(); | ||||
|     if ($retstr){ | ||||
| @@ -333,7 +352,7 @@ sub updatehost{ | ||||
|     } | ||||
| 
 | ||||
|     # Get current templates for all nodes. | ||||
|     setrsp_infostr("[PCM nodes mgmt]Read database to get groups for all nodes."); | ||||
|     setrsp_infostr("Read database to get groups for all nodes."); | ||||
|     my %groupdict; | ||||
|     my $nodelstab = xCAT::Table->new('nodelist'); | ||||
|     my $nodeshashref = $nodelstab->getNodesAttribs($nodes, ['groups']); | ||||
| @@ -362,23 +381,23 @@ sub updatehost{ | ||||
|     } | ||||
|      | ||||
|     #update DataBase. | ||||
|     setrsp_infostr("[PCM nodes mgmt]Update database records."); | ||||
|     setrsp_infostr("Update database records."); | ||||
|     my $nodetab = xCAT::Table->new('nodelist',-create=>1); | ||||
|     $nodetab->setNodesAttribs(\%updatenodeshash); | ||||
|     $nodetab->close(); | ||||
|      | ||||
|     # call plugins | ||||
|     setrsp_infostr("[PCM nodes mgmt]call nodemgmt plugins."); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_update"], node=>$nodes}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_finished"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_infostr("Call nodemgmt plugins."); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["kitnodeupdate"], node=>$nodes}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodefinished"], node=>$nodes}, $request_command, 0, 1); | ||||
|     setrsp_success($nodes); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  pcmdiscover_start | ||||
| =head3 nodediscoverstart  | ||||
| 
 | ||||
|     Description : Start PCM discovery. If already started, return a failure. | ||||
|     Description : Start profiled nodes discovery. If already started, return a failure. | ||||
|                   User should specify networkprofile, hardwareprofile,  | ||||
|                   imageprofile, hostnameformat, rack, chassis, height and u so | ||||
|                   that node's IP address will be generated automatcially  | ||||
| @@ -392,9 +411,9 @@ sub updatehost{ | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub pcmdiscover_start{ | ||||
| sub nodediscoverstart{ | ||||
|     # Parse arges. | ||||
|     setrsp_infostr("[PCM nodes mgmt]PCM discovery started."); | ||||
|     setrsp_infostr("Profiled nodes discovery started."); | ||||
|     my $retstr = parse_args(); | ||||
|     if ($retstr){ | ||||
|         setrsp_errormsg($retstr); | ||||
| @@ -419,7 +438,7 @@ sub pcmdiscover_start{ | ||||
|     # Read DB to confirm the discover is not started yet.  | ||||
|     my @sitevalues = xCAT::TableUtils->get_site_attribute("__PCMDiscover"); | ||||
|     if ($sitevalues[0]){ | ||||
|         setrsp_errormsg("PCM node discovery already started."); | ||||
|         setrsp_errormsg("Profiled nodes discovery already started."); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @@ -439,20 +458,20 @@ sub pcmdiscover_start{ | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  pcmdiscover_stop | ||||
| =head3  nodediscoverstop | ||||
| 
 | ||||
|     Description : Stop PCM auto discover. This action will remove the  | ||||
|     Description : Stop profiled nodes auto discover. This action will remove the  | ||||
|                   dababase flags. | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------ | ||||
| sub pcmdiscover_stop{ | ||||
| sub nodediscoverstop{ | ||||
|     # Read DB to confirm the discover is started.  | ||||
|     my @sitevalues = xCAT::TableUtils->get_site_attribute("__PCMDiscover"); | ||||
|     if (! $sitevalues[0]){ | ||||
|         setrsp_errormsg("PCM node discovery not started yet."); | ||||
|         setrsp_errormsg("Profiled nodes discovery not started yet."); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @@ -474,20 +493,20 @@ sub pcmdiscover_stop{ | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  pcmdiscover_nodels | ||||
| =head3  nodediscoverls | ||||
| 
 | ||||
|     Description : List all discovered PCM nodes. | ||||
|     Description : List all discovered profiled nodes. | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub pcmdiscover_nodels{ | ||||
| sub nodediscoverls{ | ||||
|     # Read DB to confirm the discover is started.  | ||||
|     my @sitevalues = (); | ||||
|     @sitevalues = xCAT::TableUtils->get_site_attribute("__PCMDiscover"); | ||||
|     if (! $sitevalues[0]){ | ||||
|         setrsp_errormsg("PCM node discovery not started yet."); | ||||
|         setrsp_errormsg("Profiled nodes discovery not started yet."); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @@ -497,22 +516,23 @@ sub pcmdiscover_nodels{ | ||||
|     my $nodelisttab = xCAT::Table->new("nodelist"); | ||||
|     my $statusref = $nodelisttab->getNodesAttribs(\@nodes, ['status']); | ||||
| 
 | ||||
|     my %rsp = (); | ||||
|     my %rspentry = (); | ||||
|     my $rspentry; | ||||
|     my $i = 0; | ||||
|     foreach (@nodes){ | ||||
|         if (! $_){ | ||||
|             next; | ||||
|         } | ||||
|         $rspentry{"node"} = $_; | ||||
|         $rspentry->{info}->[$i]->{"node"} = $_; | ||||
|         #TODO: get provisioning mac. | ||||
|         $rspentry{"mac"} = $macsref->{$_}->[0]->{"mac"}; | ||||
|         $rspentry->{info}->[$i]->{"mac"} = $macsref->{$_}->[0]->{"mac"}; | ||||
| 
 | ||||
|         if ($statusref->{$_}->[0]){ | ||||
|             $rspentry{"status"} = $statusref->{$_}->[0]; | ||||
|             $rspentry->{info}->[$i]->{"status"} = $statusref->{$_}->[0]; | ||||
|         } else{ | ||||
|             $rspentry{"status"} = "defined"; | ||||
|             $rspentry->{info}->[$i]->{"status"} = "defined"; | ||||
|         } | ||||
|         $callback->(\%rspentry); | ||||
|         $callback->($rspentry); | ||||
|         $i++; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @@ -522,19 +542,19 @@ sub pcmdiscover_nodels{ | ||||
| 
 | ||||
|     Description : The default interface for node discovery.  | ||||
|                   We must implement this method so that  | ||||
|                   PCM nodes's findme request can be answered  | ||||
|                   while PCM discovery is running. | ||||
|                   profiled nodes's findme request can be answered  | ||||
|                   while profiled nodes discovery is running. | ||||
|     Arguments   : N/A | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub findme{ | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]PCM discover: Start.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Profield nodes discover: Start.\n"); | ||||
|     # Read DB to confirm the discover is started.  | ||||
|     my @sitevalues = xCAT::TableUtils->get_site_attribute("__PCMDiscover"); | ||||
|     if (! @sitevalues){ | ||||
|         setrsp_errormsg("PCM node discovery not started yet."); | ||||
|         setrsp_errormsg("Profiled nodes discovery not started yet."); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @@ -551,12 +571,12 @@ sub findme{ | ||||
| 
 | ||||
|     # Get database records: all hostnames, all ips, all racks... | ||||
|     # To improve performance, we should initalize a daemon later?? | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]PCM discover: Getting database records.\n"); | ||||
|     my $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('nodelist', 'node'); | ||||
|     xCAT::MsgUtils->message('S', "Getting database records.\n"); | ||||
|     my $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('nodelist', 'node'); | ||||
|     %allhostnames = %$recordsref; | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('ipmi', 'bmc'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('ipmi', 'bmc'); | ||||
|     %allbmcips = %$recordsref; | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('mac', 'mac'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('mac', 'mac'); | ||||
|     %allmacs = %$recordsref; | ||||
|     foreach (keys %allmacs){ | ||||
|         my @hostentries = split(/\|/, $_); | ||||
| @@ -565,17 +585,17 @@ sub findme{ | ||||
|             $allmacs{$macstr} = 0; | ||||
|         } | ||||
|     } | ||||
|     $recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('hosts', 'ip'); | ||||
|     $recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('hosts', 'ip'); | ||||
|     %allinstallips = %$recordsref; | ||||
|     $recordsref = xCAT::NetworkUtils->get_all_nicips(1); | ||||
|     %allips = %$recordsref; | ||||
|     # Merge all BMC IPs and install IPs into allips. | ||||
|     %allips = (%allips, %allbmcips, %allinstallips); | ||||
| 
 | ||||
|     #$recordsref = xCAT::PCMNodeMgmtUtils->get_allnode_singleattrib_hash('rack', 'rackname'); | ||||
|     #$recordsref = xCAT::ProfiledNodeUtils->get_allnode_singleattrib_hash('rack', 'rackname'); | ||||
|     #%allracks = %$recordsref; | ||||
|     %allracks = (); | ||||
|     $recordsref =  xCAT::PCMNodeMgmtUtils->get_all_chassis(1); | ||||
|     $recordsref =  xCAT::ProfiledNodeUtils->get_all_chassis(1); | ||||
|     %allchassis = %$recordsref; | ||||
| 
 | ||||
|     my @enabledparams = ('networkprofile', 'hardwareprofile', 'imageprofile', 'hostnameformat', 'rack', 'chassis', 'u', 'height', 'rank'); | ||||
| @@ -599,16 +619,8 @@ sub findme{ | ||||
|             setrsp_errormsg("Specified rack $args_dict{'rack'} not defined"); | ||||
|             return; | ||||
|         } | ||||
|     }else{ | ||||
|         # set default rack. | ||||
|         #TODO : how to set default rack. | ||||
|     } | ||||
|     if (!exists $args_dict{'u'}){ | ||||
|         $args_dict{'u'} = 1; | ||||
|     } | ||||
|     if (!exists $args_dict{'height'}){ | ||||
|         $args_dict{'height'} = 1; | ||||
|     } | ||||
| 
 | ||||
|     # chassis jdugement. | ||||
|     if (exists $args_dict{'chassis'}){ | ||||
|         if (! exists $allchassis{$args_dict{'chassis'}}){ | ||||
| @@ -619,7 +631,7 @@ sub findme{ | ||||
| 
 | ||||
|     # Get discovered client IP and MAC | ||||
|     my $ip = $request->{'_xcat_clientip'}; | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]PCM discover: _xcat_clientip is $ip.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Profield nodes discover: _xcat_clientip is $ip.\n"); | ||||
|     my $mac = ''; | ||||
|     my $arptable = `/sbin/arp -n`; | ||||
|     my @arpents = split /\n/,$arptable; | ||||
| @@ -630,10 +642,10 @@ sub findme{ | ||||
|         } | ||||
|     } | ||||
|     if (! $mac){ | ||||
|         setrsp_errormsg("[PCM nodes mgmt]PCM discover: Can not get mac address of this node."); | ||||
|         setrsp_errormsg("Profiled nodes discover: Can not get mac address of this node."); | ||||
|         return; | ||||
|     } | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]PCM discover: mac is $mac.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Profiled nodes discover: mac is $mac.\n"); | ||||
|     if ( exists $allmacs{$mac}){ | ||||
|         setrsp_errormsg("Discovered MAC $mac already exists in database."); | ||||
|         return; | ||||
| @@ -648,10 +660,16 @@ sub findme{ | ||||
|             $raw_hostinfo_str .= "  $key=$args_dict{$key}\n"; | ||||
|         } | ||||
|     } | ||||
|     if (exists $args_dict{'u'} and exists $args_dict{'height'}){ | ||||
|         # increase start unit automatically. | ||||
|         $args_dict{'u'} = $args_dict{'u'} + $args_dict{'height'}; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     my ($hostinfo_dict_ref, $invalid_records_ref) = parse_hosts_string($raw_hostinfo_str); | ||||
|     my %hostinfo_dict = %$hostinfo_dict_ref; | ||||
|     # Create the real hostinfo string in stanza file format. | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]PCM discover: Generating new hostinfo string.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Profiled nodes discover: Generating new hostinfo string.\n"); | ||||
|     my ($retcode_gen, $retstr_gen) = gen_new_hostinfo_string($hostinfo_dict_ref); | ||||
|     unless ($retcode_gen){ | ||||
|         setrsp_errormsg($retstr_gen); | ||||
| @@ -659,18 +677,18 @@ sub findme{ | ||||
|     } | ||||
| 
 | ||||
|     # call mkdef to create hosts and then call nodemgmt for node management plugins. | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]call mkdef to create pcm nodes.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Call mkdef to create nodes.\n"); | ||||
|     my $retref = xCAT::Utils->runxcmd({command=>["mkdef"], stdin=>[$retstr_gen], arg=>['-z']}, $request_command, 0, 1); | ||||
|     # increase unit automatically. | ||||
|     $args_dict{'u'} = $args_dict{'u'} + $args_dict{'height'}; | ||||
| 
 | ||||
|     my @nodelist = keys %hostinfo_dict; | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]call nodemgmt plugins.\n"); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_add"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitcmd_nodemgmt_finished"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     xCAT::MsgUtils->message('S', "Call nodemgmt plugins.\n"); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodeadd"], node=>\@nodelist}, $request_command, 0, 1); | ||||
|     $retref = xCAT::Utils->runxcmd({command=>["kitnodefinished"], node=>\@nodelist}, $request_command, 0, 1); | ||||
| 
 | ||||
|     # call discover to notify client. | ||||
|     xCAT::MsgUtils->message('S', "[PCM nodes mgmt]call discovered request.\n"); | ||||
|     xCAT::MsgUtils->message('S', "Call discovered request.\n"); | ||||
|     $request->{"command"} = ["discovered"]; | ||||
|     $request->{"node"} = \@nodelist; | ||||
|     $retref = xCAT::Utils->runxcmd($request, $request_command, 0, 1); | ||||
| @@ -729,13 +747,13 @@ sub gen_new_hostinfo_string{ | ||||
| 
 | ||||
|     # Get free ips list for all networks in network profile. | ||||
|     my @allknownips = keys %allips; | ||||
|     my $netprofileattrsref = xCAT::PCMNodeMgmtUtils->get_netprofile_nic_attrs($args_dict{'networkprofile'}); | ||||
|     my $netprofileattrsref = xCAT::ProfiledNodeUtils->get_netprofile_nic_attrs($args_dict{'networkprofile'}); | ||||
|     my %netprofileattr = %$netprofileattrsref; | ||||
|     my %freeipshash; | ||||
|     foreach (keys %netprofileattr){ | ||||
|         my $netname = $netprofileattr{$_}{'network'}; | ||||
|         if($netname and (! exists $freeipshash{$netname})) { | ||||
|             $freeipshash{$netname} = xCAT::PCMNodeMgmtUtils->get_allocable_staticips_innet($netname, \@allknownips); | ||||
|             $freeipshash{$netname} = xCAT::ProfiledNodeUtils->get_allocable_staticips_innet($netname, \@allknownips); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -747,7 +765,7 @@ sub gen_new_hostinfo_string{ | ||||
|     my $installnic = $nodereshash{'installnic'}; | ||||
| 
 | ||||
|     # Get node's provisioning method | ||||
|     my $provmethod = xCAT::PCMNodeMgmtUtils->get_imageprofile_prov_method($args_dict{'imageprofile'}); | ||||
|     my $provmethod = xCAT::ProfiledNodeUtils->get_imageprofile_prov_method($args_dict{'imageprofile'}); | ||||
| 
 | ||||
|     # compose the stanza string for hostinfo file. | ||||
|     my $hostsinfostr = ""; | ||||
| @@ -831,7 +849,7 @@ sub read_and_generate_hostnames{ | ||||
|     my $hostfile = shift; | ||||
| 
 | ||||
|     # Get 10000 temprary hostnames. | ||||
|     my $freehostnamesref = xCAT::PCMNodeMgmtUtils->gen_numric_hostnames("TMPHOSTS","", 4); | ||||
|     my $freehostnamesref = xCAT::ProfiledNodeUtils->gen_numric_hostnames("TMPHOSTS","", 4); | ||||
|     # Auto generate hostnames for "__hostname__" entries. | ||||
|     open(HOSTFILE, $hostfile); | ||||
|     my $filecontent = join("", <HOSTFILE>);  | ||||
| @@ -874,7 +892,7 @@ sub parse_hosts_string{ | ||||
| 
 | ||||
|     my $nameformat = $args_dict{'hostnameformat'}; | ||||
| 
 | ||||
|     my $nameformattype = xCAT::PCMNodeMgmtUtils->get_hostname_format_type($nameformat); | ||||
|     my $nameformattype = xCAT::ProfiledNodeUtils->get_hostname_format_type($nameformat); | ||||
|     my %freehostnames; | ||||
| 
 | ||||
|     # Parse hostinfo file string. | ||||
| @@ -914,7 +932,7 @@ sub parse_hosts_string{ | ||||
|                     push @invalid_records, ["__hostname__", "No rack info specified. Do specify it because the nameformat contains rack info."]; | ||||
|                     next; | ||||
|                 } | ||||
|                 $numricformat = xCAT::PCMNodeMgmtUtils->rackformat_to_numricformat($nameformat, $::FILEATTRS{$_}{"rack"}); | ||||
|                 $numricformat = xCAT::ProfiledNodeUtils->rackformat_to_numricformat($nameformat, $::FILEATTRS{$_}{"rack"}); | ||||
|             } else{ | ||||
|                 # pure numric hostname format | ||||
|                 $numricformat = $nameformat; | ||||
| @@ -926,7 +944,7 @@ sub parse_hosts_string{ | ||||
|                 if (exists($args_dict{'rank'})){ | ||||
|                     $rank = $args_dict{'rank'}; | ||||
|                 } | ||||
|                 $freehostnames{$numricformat} = xCAT::PCMNodeMgmtUtils->genhosts_with_numric_tmpl($numricformat, $rank); | ||||
|                 $freehostnames{$numricformat} = xCAT::ProfiledNodeUtils->genhosts_with_numric_tmpl($numricformat, $rank); | ||||
|             } | ||||
|             my $hostnamelistref = $freehostnames{$numricformat}; | ||||
|             my $nexthostname = shift @$hostnamelistref; | ||||
| @@ -1053,10 +1071,11 @@ sub setrsp_invalidrecords | ||||
|      | ||||
|     # The total number of invalid records. | ||||
|     $rsp->{error} = "Some error records detected"; | ||||
|     $rsp->{invalid_records_num} = scalar @$recordsref; | ||||
|     $rsp->{errorcode} = 1; | ||||
|     $rsp->{data}->{invalid_records_num} = scalar @$recordsref; | ||||
| 
 | ||||
|     # We write details of invalid records into a file. | ||||
|     my ($fh, $filename) = xCAT::PCMNodeMgmtUtils->get_output_filename(); | ||||
|     my ($fh, $filename) = xCAT::ProfiledNodeUtils->get_output_filename(); | ||||
|     foreach (@$recordsref){ | ||||
|     	my @erroritem = @$_; | ||||
|         print $fh "nodename $erroritem[0], error: $erroritem[1]\n"; | ||||
| @@ -1064,7 +1083,7 @@ sub setrsp_invalidrecords | ||||
|     close $fh; | ||||
|     # Tells the URL of the details file. | ||||
|     xCAT::MsgUtils->message('S', "Detailed response info placed in file: http://$master/$filename\n"); | ||||
|     $rsp->{details} = "http://$master/$filename"; | ||||
|     $rsp->{data}->{details} = "http://$master/$filename"; | ||||
|     $callback->($rsp); | ||||
| } | ||||
| 
 | ||||
| @@ -1083,7 +1102,8 @@ sub setrsp_errormsg | ||||
|     my $errormsg = shift; | ||||
|     my $rsp; | ||||
|     xCAT::MsgUtils->message('S', "$errormsg\n"); | ||||
|     $rsp->{error}->[0] = $errormsg; | ||||
|     $rsp->{error} = $errormsg; | ||||
|     $rsp->{errorcode} = 1; | ||||
|     $callback->($rsp); | ||||
| } | ||||
| 
 | ||||
| @@ -1102,10 +1122,30 @@ sub setrsp_infostr | ||||
|     my $infostr = shift; | ||||
|     my $rsp; | ||||
|     xCAT::MsgUtils->message('S', "$infostr\n"); | ||||
|     $rsp->{info}->[0] = $infostr; | ||||
|     $rsp->{data} = $infostr; | ||||
|     $callback->($rsp); | ||||
| } | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| =head3  setrsp_progress | ||||
|      | ||||
|     Description : Set response for running progress | ||||
|     Arguments   : progress: the progress string. | ||||
| 
 | ||||
| =cut | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| sub setrsp_progress | ||||
| { | ||||
|     my $progress = shift; | ||||
|     my $rsp; | ||||
|     xCAT::MsgUtils->message('S', "$progress"); | ||||
|     $rsp->{sinfo} = $progress; | ||||
|     $callback->($rsp); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #------------------------------------------------------- | ||||
| 
 | ||||
| @@ -1124,15 +1164,15 @@ sub setrsp_success | ||||
|     my $master=xCAT::TableUtils->get_site_Master(); | ||||
|      | ||||
|     # The total number of success nodes. | ||||
|     $rsp->{success_nodes_num} = scalar @$recordsref; | ||||
|     my ($fh, $filename) = xCAT::PCMNodeMgmtUtils->get_output_filename(); | ||||
|     $rsp->{data}->{success_nodes_num} = scalar @$recordsref; | ||||
|     my ($fh, $filename) = xCAT::ProfiledNodeUtils->get_output_filename(); | ||||
|     foreach (@$recordsref){ | ||||
|         print $fh "success: $_\n"; | ||||
|     } | ||||
|     close $fh; | ||||
|     # Tells the URL of the details file. | ||||
|     xCAT::MsgUtils->message('S', "Detailed response info placed in file: http://$master/$filename\n"); | ||||
|     $rsp->{details} = "http://$master/$filename"; | ||||
|     $rsp->{data}->{details} = "http://$master/$filename"; | ||||
|     $callback->($rsp); | ||||
| } | ||||
| 1; | ||||
		Reference in New Issue
	
	Block a user