From 7227c7f98dd347a4e3cea9efed659dea9e43dfc0 Mon Sep 17 00:00:00 2001 From: Bin Xu Date: Wed, 18 Apr 2018 15:58:54 +0800 Subject: [PATCH 01/93] show server name by default for Error and Warn message --- perl-xCAT/xCAT/Client.pm | 47 ++++++++++++++++-------- xCAT-test/autotest/testcase/rmdef/cases0 | 2 +- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/perl-xCAT/xCAT/Client.pm b/perl-xCAT/xCAT/Client.pm index 455c3524e..99dcbd3ff 100644 --- a/perl-xCAT/xCAT/Client.pm +++ b/perl-xCAT/xCAT/Client.pm @@ -1130,14 +1130,18 @@ sub handle_response { } my $msgsource = ""; + $msgsource = $rsp->{xcatdsource}->[0] if ($rsp->{xcatdsource}); + + # To determine if the INFO msg need to be added with source server name. For ERROR/WARN, it always is shown. + my $showsource = 0; + if ($rsp->{host}) { + $showsource = 1; + } if ($ENV{'XCATSHOWSVR'}) { unless ($rsp->{NoSvrPrefix}) { # some plugins could disable the prefix forcely by seting the flag in response. - $msgsource = $rsp->{xcatdsource}->[0] if ($rsp->{xcatdsource}); + $showsource = 1; } } - if ($rsp->{host}) { - $msgsource = $rsp->{xcatdsource}->[0] if ($rsp->{xcatdsource}); - } #print "in handle_response\n"; # Handle errors @@ -1158,14 +1162,14 @@ sub handle_response { if (ref($rsp->{error}) eq 'ARRAY') { foreach my $text (@{ $rsp->{error} }) { my $desc = "$text"; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($desc && $msgsource); $desc = "Error: $desc" unless ($rsp->{NoErrorPrefix}); print STDERR "$desc\n"; } } else { my $desc = $rsp->{error}; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($desc && $msgsource); $desc = "Error: $desc" unless ($rsp->{NoErrorPrefix}); print STDERR "$desc\n"; } @@ -1176,14 +1180,14 @@ sub handle_response { if (ref($rsp->{warning}) eq 'ARRAY') { foreach my $text (@{ $rsp->{warning} }) { my $desc = "$text"; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($desc && $msgsource); $desc = "Warning: $desc" unless ($rsp->{NoWarnPrefix}); print STDERR "$desc\n"; } } else { my $desc = $rsp->{warning}; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($desc && $msgsource); $desc = "Warning: $desc" unless ($rsp->{NoWarnPrefix}); print STDERR "$desc\n"; } @@ -1193,13 +1197,13 @@ sub handle_response { if (ref($rsp->{info}) eq 'ARRAY') { foreach my $text (@{ $rsp->{info} }) { my $desc = "$text"; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($showsource && $desc && $msgsource); print "$desc\n"; } } else { my $desc = $rsp->{info}; - $desc = "[$msgsource]: $desc" if ($msgsource && $desc); + $desc = "[$msgsource]: $desc" if ($showsource && $desc && $msgsource); print "$desc\n"; } } @@ -1234,11 +1238,7 @@ sub handle_response { } else { $desc = $node->{name}; } - if ($desc) { - $desc = "$desc: [$msgsource]" if ($msgsource); - } else { - $desc = "[$msgsource]" if ($msgsource); - } + if ($node->{errorcode}) { if (ref($node->{errorcode}) eq 'ARRAY') { foreach my $ecode (@{ $node->{errorcode} }) { @@ -1250,14 +1250,29 @@ sub handle_response { } # assume it is a non-reference scalar } if ($node->{error}) { + if ($desc) { + $desc = "$desc: [$msgsource]" if ($msgsource); + } else { + $desc = "[$msgsource]" if ($msgsource); + } $desc .= ": Error: " . $node->{error}->[0]; $errflg = 1; } if ($node->{warning}) { + if ($desc) { + $desc = "$desc: [$msgsource]" if ($msgsource); + } else { + $desc = "[$msgsource]" if ($msgsource); + } $desc .= ": Warning: " . $node->{warning}->[0]; $errflg = 1; } if ($node->{data}) { + if ($desc) { + $desc = "$desc: [$msgsource]" if ($showsource && $msgsource); + } else { + $desc = "[$msgsource]" if ($showsource && $msgsource); + } if (ref(\($node->{data})) eq 'SCALAR') { $desc = $desc . ": " . $node->{data}; } elsif (ref($node->{data}) eq 'HASH') { @@ -1322,7 +1337,7 @@ sub handle_response { } } if ($desc) { - $desc = "[$msgsource]: $desc" if ($msgsource); + $desc = "[$msgsource]: $desc" if ($showsource && $msgsource); print "$desc\n"; } } diff --git a/xCAT-test/autotest/testcase/rmdef/cases0 b/xCAT-test/autotest/testcase/rmdef/cases0 index 5133ae8aa..f6e2848ce 100644 --- a/xCAT-test/autotest/testcase/rmdef/cases0 +++ b/xCAT-test/autotest/testcase/rmdef/cases0 @@ -135,6 +135,6 @@ description:try to delete a template, then error messages appear cmd:result=`lsdef | grep switch-template`; if [[ $result =~ "switch-template" ]]; then echo $result; noderm switch-template; fi cmd:rmdef switch-template check:rc==1 -check:output=~Error\: Could not find an object named \'switch-template\' of type \'node\' +check:output=~Error\: (\[.*?\]: )?Could not find an object named \'switch-template\' of type \'node\' check:output=~No objects have been removed from the xCAT database. end From d49664ea31da4c2d59f851397d2f51d857c54f00 Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Wed, 30 May 2018 13:41:25 -0400 Subject: [PATCH 02/93] Add WARNING message if non-root user runs chtab command --- xCAT-server/sbin/chtab | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xCAT-server/sbin/chtab b/xCAT-server/sbin/chtab index e6a6d0a99..715734cde 100755 --- a/xCAT-server/sbin/chtab +++ b/xCAT-server/sbin/chtab @@ -63,6 +63,12 @@ unless ($target) { exit(1); } +my $current_userid = getpwuid($>); +if ($current_userid ne "root") +{ + print "WARNING: chtab worked without passing xcatd, using tabch command instead if user is controled by policy mechanism\n"; +} + my %keyhash = (); my @keypairs = split(/,/, $target); if ($keypairs[0] !~ /([^\.\=]+)\.([^\.\=]+)\=(.+)/) { From bcf0b4a7b818506a842b111c5c5e7b852f443ad8 Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Wed, 30 May 2018 21:27:00 -0400 Subject: [PATCH 03/93] Modified message --- xCAT-server/sbin/chtab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/sbin/chtab b/xCAT-server/sbin/chtab index 715734cde..7859ce463 100755 --- a/xCAT-server/sbin/chtab +++ b/xCAT-server/sbin/chtab @@ -66,7 +66,7 @@ unless ($target) { my $current_userid = getpwuid($>); if ($current_userid ne "root") { - print "WARNING: chtab worked without passing xcatd, using tabch command instead if user is controled by policy mechanism\n"; + print "WARNING: chtab bypasses xcatd and does not enforce xCAT policy tables. Using tabch instead.\n"; } my %keyhash = (); From 671231833df0dd66afe6cc12578b02b47b5d48fa Mon Sep 17 00:00:00 2001 From: robin2008 Date: Thu, 31 May 2018 17:13:04 +0800 Subject: [PATCH 04/93] modify nodestat usage and manpage for `-f|--useping` --- .../source/guides/admin-guides/references/man1/nodestat.1.rst | 4 ++-- xCAT-client/pods/man1/nodestat.1.pod | 4 ++-- xCAT-server/lib/xcat/plugins/nodestat.pm | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/guides/admin-guides/references/man1/nodestat.1.rst b/docs/source/guides/admin-guides/references/man1/nodestat.1.rst index 8d3afd684..9264a0232 100644 --- a/docs/source/guides/admin-guides/references/man1/nodestat.1.rst +++ b/docs/source/guides/admin-guides/references/man1/nodestat.1.rst @@ -19,7 +19,7 @@ Name **************** -\ **nodestat**\ [\ *noderange*\ ] [\ **-m | -**\ **-usemon**\ ] [\ **-p | -**\ **-powerstat**\ ] [\ **-f**\ ] [\ **-u | -**\ **-updatedb**\ ] +\ **nodestat**\ [\ *noderange*\ ] [\ **-m | -**\ **-usemon**\ ] [\ **-p | -**\ **-powerstat**\ ] [\ **-f | -**\ **-usefping**\ ] [\ **-u | -**\ **-updatedb**\ ] \ **nodestat**\ [\ **-h | -**\ **-help | -v | -**\ **-version**\ ] @@ -86,7 +86,7 @@ For the command specified by 'dcmd', no input is needed, the output can be a str -\ **-f**\ +\ **-f | -**\ **-usefping**\ Uses fping instead of nmap even if nmap is available. If you seem to be having a problem with false negatives, fping can be more forgiving, but slower. diff --git a/xCAT-client/pods/man1/nodestat.1.pod b/xCAT-client/pods/man1/nodestat.1.pod index fd964a3c9..e7a82a232 100644 --- a/xCAT-client/pods/man1/nodestat.1.pod +++ b/xCAT-client/pods/man1/nodestat.1.pod @@ -4,7 +4,7 @@ B - display the running status of each node in a noderange =head1 B -B [I] [B<-m>|B<--usemon>] [B<-p>|B<--powerstat>] [B<-f>] [B<-u>|B<--updatedb>] +B [I] [B<-m>|B<--usemon>] [B<-p>|B<--powerstat>] [B<-f>|B<--usefping>] [B<-u>|B<--updatedb>] B [B<-h>|B<--help>|B<-v>|B<--version>] @@ -57,7 +57,7 @@ For the command specified by 'dcmd', no input is needed, the output can be a str =over 10 -=item B<-f> +=item B<-f>|B<--usefping> Uses fping instead of nmap even if nmap is available. If you seem to be having a problem with false negatives, fping can be more forgiving, but slower. diff --git a/xCAT-server/lib/xcat/plugins/nodestat.pm b/xCAT-server/lib/xcat/plugins/nodestat.pm index 3dfb73b67..428268a1a 100644 --- a/xCAT-server/lib/xcat/plugins/nodestat.pm +++ b/xCAT-server/lib/xcat/plugins/nodestat.pm @@ -912,7 +912,7 @@ sub process_request { if (ref $request->{arg}) { @ARGV = @{ $request->{arg} }; GetOptions( - 'f' => \$usefping + 'f|useping' => \$usefping ); } @@ -1217,7 +1217,7 @@ sub usage my $retcode=shift; my $rsp = {}; $rsp->{data}->[0] = "Usage:"; - $rsp->{data}->[1] = " nodestat [noderange] [-m|--usemon] [-p|powerstat] [-u|--updatedb]"; + $rsp->{data}->[1] = " nodestat [noderange] [-m|--usemon] [-p|powerstat] [-f|--usefping] [-u|--updatedb]"; $rsp->{data}->[2] = " nodestat [-h|--help|-v|--version]"; if($retcode){ $rsp->{errorcode}->[0]=$retcode; From 780546760a1e3dfe4d7e5e059ab964dc02bf8d8e Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Thu, 31 May 2018 15:46:38 -0400 Subject: [PATCH 05/93] Remove pip instructions, causes more headaches than good using pip --- .../scalability/python/install/index.rst | 1 - .../scalability/python/install/pip.rst | 22 ------------------- 2 files changed, 23 deletions(-) delete mode 100644 docs/source/references/coral/cluster_mgmt/scalability/python/install/pip.rst diff --git a/docs/source/references/coral/cluster_mgmt/scalability/python/install/index.rst b/docs/source/references/coral/cluster_mgmt/scalability/python/install/index.rst index ec1f19ce7..70c74418e 100644 --- a/docs/source/references/coral/cluster_mgmt/scalability/python/install/index.rst +++ b/docs/source/references/coral/cluster_mgmt/scalability/python/install/index.rst @@ -8,5 +8,4 @@ A new RPM is created that contains the Python code: ``xCAT-openbmc-py``. The Py :maxdepth: 2 rpm.rst - pip.rst disable.rst diff --git a/docs/source/references/coral/cluster_mgmt/scalability/python/install/pip.rst b/docs/source/references/coral/cluster_mgmt/scalability/python/install/pip.rst deleted file mode 100644 index 344b7e7c4..000000000 --- a/docs/source/references/coral/cluster_mgmt/scalability/python/install/pip.rst +++ /dev/null @@ -1,22 +0,0 @@ -Using pip -========= - -A alternative method for installing the Python dependencies is using ``pip``. - -#. Download ``pip`` using one of the following methods: - - #. ``pip`` is provided in the EPEL repo as: ``python2-pip`` - - #. Follow the instructions to install from here: https://pip.pypa.io/en/stable/installing/ - -#. Use ``pip`` to install the following Python libraries: :: - - pip install gevent docopt requests paramiko scp - - -#. Install ``xCAT-openbmc-py`` using ``rpm`` with ``--nodeps``: :: - - cd xcat-core - rpm -ihv xCAT-openbmc-py*.rpm --nodeps - - From 1d55bd6ed2ca3d7c6e7af1cb26ca90710893b08b Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Fri, 1 Jun 2018 10:38:19 +0800 Subject: [PATCH 06/93] Update Version --- Version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Version b/Version index b70ae75a8..7243b12cf 100644 --- a/Version +++ b/Version @@ -1 +1 @@ -2.14.1 +2.14.2 From 84ba10fad6f9424a0fb3732d8321b87283e108a5 Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Fri, 1 Jun 2018 10:39:41 +0800 Subject: [PATCH 07/93] Update README.rst --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index f813c12c5..12c854a1f 100644 --- a/README.rst +++ b/README.rst @@ -8,6 +8,8 @@ Documentation Latest xCAT documentation is available at: http://xcat-docs.readthedocs.io/en/latest/ +`document for xCAT 2.14.1 `_ + `document for xCAT 2.14 `_ `document for xCAT 2.13.11 `_ From 12bfd5699dc69fdaf79ab1af59d2d69336ae9248 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Fri, 1 Jun 2018 14:30:53 +0800 Subject: [PATCH 08/93] if not get valid pid when waitpid, sleep (#5274) --- xCAT-server/lib/xcat/plugins/openbmc.pm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index 7841afcde..1a20bf10f 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -1088,8 +1088,10 @@ rmdir \"/tmp/\$userid\" \n"; } if (%child_node_map) { + my $pid_flag = 0; while ((my $cpid = waitpid(-1, WNOHANG)) > 0) { if ($child_node_map{$cpid}) { + $pid_flag = 1; my $node = $child_node_map{$cpid}; my $rc = $? >> 8; if ($rc != 0) { @@ -1107,6 +1109,9 @@ rmdir \"/tmp/\$userid\" \n"; delete $child_node_map{$cpid}; } } + unless ($pid_flag) { + select(undef, undef, undef, 0.01); + } } my @del; while (my ($k, $v) = each %node_wait) { From adb1cafa43df68d70912e63f47fe1cc1f6bad9fe Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Fri, 1 Jun 2018 11:28:25 -0400 Subject: [PATCH 09/93] modify message --- xCAT-server/sbin/chtab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/sbin/chtab b/xCAT-server/sbin/chtab index 7859ce463..9a2bff905 100755 --- a/xCAT-server/sbin/chtab +++ b/xCAT-server/sbin/chtab @@ -66,7 +66,7 @@ unless ($target) { my $current_userid = getpwuid($>); if ($current_userid ne "root") { - print "WARNING: chtab bypasses xcatd and does not enforce xCAT policy tables. Using tabch instead.\n"; + print "WARNING: chtab bypasses xcatd and does not enforce xCAT policy tables. Consider using tabch instead.\n"; } my %keyhash = (); From cd689a9a65040cb62eb6e9a208a6281a1a29c702 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Tue, 5 Jun 2018 13:07:29 +0800 Subject: [PATCH 10/93] Framework of redfish support perl part (#5269) --- xCAT-server/lib/perl/xCAT/AGENT.pm | 198 +++++++++++++++++++++++ xCAT-server/lib/perl/xCAT/OPENBMC.pm | 175 -------------------- xCAT-server/lib/xcat/plugins/openbmc2.pm | 9 +- 3 files changed, 203 insertions(+), 179 deletions(-) create mode 100644 xCAT-server/lib/perl/xCAT/AGENT.pm diff --git a/xCAT-server/lib/perl/xCAT/AGENT.pm b/xCAT-server/lib/perl/xCAT/AGENT.pm new file mode 100644 index 000000000..f62125615 --- /dev/null +++ b/xCAT-server/lib/perl/xCAT/AGENT.pm @@ -0,0 +1,198 @@ +#!/usr/bin/perl +## IBM(c) 2018 EPL license http://www.eclipse.org/legal/epl-v10.html + +package xCAT::AGENT; + +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; +use strict; +use warnings "all"; + +use JSON; +use Time::HiRes qw(sleep time); +use File::Path; +use Fcntl ":flock"; +use IO::Socket::UNIX qw( SOCK_STREAM ); +use xCAT_monitoring::monitorctrl; +use xCAT::TableUtils; + +my $LOCK_DIR = "/var/lock/xcat/"; +my $LOCK_PATH = "/var/lock/xcat/agent.lock"; +my $AGENT_SOCK_PATH = "/var/run/xcat/agent.sock"; +my $PYTHON_LOG_PATH = "/var/log/xcat/agent.log"; +my $PYTHON_AGENT_FILE = "/opt/xcat/lib/python/agent/agent.py"; +my $MSG_TYPE = "message"; +my $DB_TYPE = "db"; +my $lock_fd; + +my %module_type = ( + "openbmc" => "OpenBMC", + "redfish" => "Redfish", +); + +sub acquire_lock { + my $ppid = shift; + $ppid = shift if (($ppid) && ($ppid =~ /AGENT/)); + + mkpath($LOCK_DIR); + # always create a new lock file + if ($ppid) { + $LOCK_PATH = "$LOCK_PATH.$ppid"; + $AGENT_SOCK_PATH = "$AGENT_SOCK_PATH.$ppid"; + } + unlink($LOCK_PATH); + open($lock_fd, ">>", $LOCK_PATH) or return undef; + flock($lock_fd, LOCK_EX) or return undef; + return $lock_fd; +} + +sub exists_python_agent { + if ( -e $PYTHON_AGENT_FILE) { + return 1; + } + return 0; +} + +sub python_agent_reaper { + unlink($LOCK_PATH); + unlink($AGENT_SOCK_PATH); +} + +sub start_python_agent { + my $ppid = shift; + $ppid = shift if (($ppid) && ($ppid =~ /AGENT/)); + + if (!defined(acquire_lock($ppid))) { + xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to acquire lock"); + return undef; + } + + my $fd; + my $pid = fork; + if (!defined $pid) { + xCAT::MsgUtils->message("S", "start_python_agent() Error: Unable to fork process"); + return undef; + } elsif ($pid){ + open($fd, '>', $AGENT_SOCK_PATH) && close($fd); + $SIG{INT} = $SIG{TERM} = \&python_agent_reaper; + return $pid; + } + + $SIG{CHLD} = 'DEFAULT'; + if (!$pid) { + # child + open($fd, ">>", $PYTHON_LOG_PATH) && close($fd); + open(STDOUT, '>>', $PYTHON_LOG_PATH) or die("open: $!"); + open(STDERR, '>>&', \*STDOUT) or die("open: $!"); + my @args = ( "$PYTHON_AGENT_FILE --sock $AGENT_SOCK_PATH --lockfile $LOCK_PATH" ); + my $ret = exec @args; + if (!defined($ret)) { + xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to start the xCAT Python agent."); + exit(1); + } + } +} + +sub handle_message { + my ($data, $callback) = @_; + if($data->{type} eq $MSG_TYPE) { + my $msg = $data->{msg}; + if ($msg->{type} eq 'info') { + xCAT::MsgUtils->message("I", { data => [$msg->{data}] }, $callback); + } elsif ($msg->{type} eq 'warning') { + xCAT::MsgUtils->message("W", { data => [$msg->{data}] }, $callback); + } elsif ($msg->{type} eq 'error'){ + xCAT::SvrUtils::sendmsg([ 1, $msg->{data} ], $callback, $msg->{node}); + } elsif ($msg->{type} eq 'syslog'){ + xCAT::MsgUtils->message("S", $msg->{data}); + } + } elsif ($data->{type} eq $DB_TYPE) { + my $attribute = $data->{attribute}; + if ($attribute->{name} eq 'status' and $attribute->{method} eq 'set' and $attribute->{type} eq 'node') { + my %new_status = ($attribute->{value} => [$attribute->{node}]); + xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%new_status, 1) + } + } +} + +sub submit_agent_request { + my ($pid, $req, $module, $nodeinfo, $callback) = @_; + my $sock; + my $retry = 0; + while($retry < 30) { + $sock = IO::Socket::UNIX->new(Peer => $AGENT_SOCK_PATH, Type => SOCK_STREAM, Timeout => 10, Blocking => 1); + if (!defined($sock)) { + sleep(0.1); + } else { + last; + } + $retry++; + } + if (!defined($sock)) { + xCAT::MsgUtils->message("E", { data => ["$module_type{$module} management is using a Python framework. An error has occurred when trying to create socket $AGENT_SOCK_PATH."] }, $callback); + kill('TERM', $pid); + return; + } + my $xcatdebugmode = 0; + if ($::XCATSITEVALS{xcatdebugmode}) { $xcatdebugmode = $::XCATSITEVALS{xcatdebugmode} } + my %env_hash = (); + $env_hash{debugmode} = $xcatdebugmode; + my ($data, $sz, $ret, $buf); + $data->{module} = $module; + $data->{command} = $req->{command}->[0]; + $data->{args} = $req->{arg}; + $data->{cwd} = $req->{cwd}; + $data->{nodes} = $req->{node}; + $data->{nodeinfo} = $nodeinfo; + $data->{envs} = \%env_hash; + $buf = encode_json($data); + $sz = pack('i', length($buf)); + # send length of data first + $ret = $sock->send($sz); + if (!$ret) { + xCAT::MsgUtils->message("E", { data => ["Failed to send message to the agent"] }, $callback); + $sock->close(); + kill('TERM', $pid); + return; + } + # send data + $ret = $sock->send($buf); + if (!$ret) { + xCAT::MsgUtils->message("E", { data => ["Failed to send message to the agent"] }, $callback); + $sock->close(); + kill('TERM', $pid); + return; + } + while(1) { + $ret = $sock->recv($buf, 4); + if (!$ret) { + last; + } + # receive the length of data + $sz = unpack('i', $buf); + # read data with length is $sz + $ret = $sock->recv($buf, $sz); + if (!$ret) { + xCAT::MsgUtils->message("E", { data => ["receive data from python agent unexpectedly"] }, $callback); + last; + } + $data = decode_json($buf); + handle_message($data, $callback); + } + # no message received, the socket on the agent side should be closed. + $sock->close(); +} + +sub wait_agent { + my ($pid, $callback) = @_; + waitpid($pid, 0); + if ($? >> 8 != 0) { + xCAT::MsgUtils->message("E", { data => ["Agent exited unexpectedly. See $PYTHON_LOG_PATH for details."] }, $callback); + } + python_agent_reaper(); +} + +1; diff --git a/xCAT-server/lib/perl/xCAT/OPENBMC.pm b/xCAT-server/lib/perl/xCAT/OPENBMC.pm index 2061a191a..83ceafed2 100644 --- a/xCAT-server/lib/perl/xCAT/OPENBMC.pm +++ b/xCAT-server/lib/perl/xCAT/OPENBMC.pm @@ -19,19 +19,10 @@ use Data::Dumper; use Time::HiRes qw(sleep time); use JSON; use File::Path; -use Fcntl ":flock"; -use IO::Socket::UNIX qw( SOCK_STREAM ); use xCAT_monitoring::monitorctrl; use xCAT::TableUtils; -my $LOCK_DIR = "/var/lock/xcat/"; -my $LOCK_PATH = "/var/lock/xcat/agent.lock"; -my $AGENT_SOCK_PATH = "/var/run/xcat/agent.sock"; -my $PYTHON_LOG_PATH = "/var/log/xcat/agent.log"; my $PYTHON_AGENT_FILE = "/opt/xcat/lib/python/agent/agent.py"; -my $MSG_TYPE = "message"; -my $DB_TYPE = "db"; -my $lock_fd; my $header = HTTP::Headers->new('Content-Type' => 'application/json'); @@ -59,172 +50,6 @@ sub send_request { return $id; } -# if lock is released unexpectedly, python side would aware of the error after -# getting this lock -sub acquire_lock { - my $ppid = shift; - $ppid = shift if (($ppid) && ($ppid =~ /OPENBMC/)); - - mkpath($LOCK_DIR); - # always create a new lock file - if ($ppid) { - $LOCK_PATH = "$LOCK_PATH.$ppid"; - $AGENT_SOCK_PATH = "$AGENT_SOCK_PATH.$ppid"; - } - unlink($LOCK_PATH); - open($lock_fd, ">>", $LOCK_PATH) or return undef; - flock($lock_fd, LOCK_EX) or return undef; - return $lock_fd; -} - -sub exists_python_agent { - if ( -e $PYTHON_AGENT_FILE) { - return 1; - } - return 0; -} -sub python_agent_reaper { - unlink($LOCK_PATH); - unlink($AGENT_SOCK_PATH); -} -sub start_python_agent { - - my $ppid = shift; - $ppid = shift if (($ppid) && ($ppid =~ /OPENBMC/)); - - if (!defined(acquire_lock($ppid))) { - xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to acquire lock"); - return undef; - } - - my $fd; - my $pid = fork; - if (!defined $pid) { - xCAT::MsgUtils->message("S", "start_python_agent() Error: Unable to fork process"); - return undef; - } elsif ($pid){ - - open($fd, '>', $AGENT_SOCK_PATH) && close($fd); - $SIG{INT} = $SIG{TERM} = \&python_agent_reaper; - return $pid; - } - - $SIG{CHLD} = 'DEFAULT'; - if (!$pid) { - # child - open($fd, ">>", $PYTHON_LOG_PATH) && close($fd); - open(STDOUT, '>>', $PYTHON_LOG_PATH) or die("open: $!"); - open(STDERR, '>>&', \*STDOUT) or die("open: $!"); - my @args = ( "$PYTHON_AGENT_FILE --sock $AGENT_SOCK_PATH --lockfile $LOCK_PATH" ); - my $ret = exec @args; - if (!defined($ret)) { - xCAT::MsgUtils->message("S", "start_python_agent() Error: Failed to start the xCAT Python agent."); - exit(1); - } - } - -} - -sub handle_message { - my ($data, $callback) = @_; - if($data->{type} eq $MSG_TYPE) { - my $msg = $data->{msg}; - if ($msg->{type} eq 'info') { - xCAT::MsgUtils->message("I", { data => [$msg->{data}] }, $callback); - } elsif ($msg->{type} eq 'warning') { - xCAT::MsgUtils->message("W", { data => [$msg->{data}] }, $callback); - } elsif ($msg->{type} eq 'error'){ - xCAT::SvrUtils::sendmsg([ 1, $msg->{data} ], $callback, $msg->{node}); - } elsif ($msg->{type} eq 'syslog'){ - xCAT::MsgUtils->message("S", $msg->{data}); - } - } elsif ($data->{type} eq $DB_TYPE) { - my $attribute = $data->{attribute}; - if ($attribute->{name} eq 'status' and $attribute->{method} eq 'set' and $attribute->{type} eq 'node') { - my %new_status = ($attribute->{value} => [$attribute->{node}]); - xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%new_status, 1) - } - } -} - -sub submit_agent_request { - my ($pid, $req, $nodeinfo, $callback) = @_; - my $sock; - my $retry = 0; - while($retry < 30) { - $sock = IO::Socket::UNIX->new(Peer => $AGENT_SOCK_PATH, Type => SOCK_STREAM, Timeout => 10, Blocking => 1); - if (!defined($sock)) { - sleep(0.1); - } else { - last; - } - $retry++; - } - if (!defined($sock)) { - xCAT::MsgUtils->message("E", { data => ["OpenBMC management is using a Python framework. An error has occurred when trying to create socket $AGENT_SOCK_PATH."] }, $callback); - kill('TERM', $pid); - return; - } - my $xcatdebugmode = 0; - if ($::XCATSITEVALS{xcatdebugmode}) { $xcatdebugmode = $::XCATSITEVALS{xcatdebugmode} } - my %env_hash = (); - $env_hash{debugmode} = $xcatdebugmode; - my ($data, $sz, $ret, $buf); - $data->{module} = 'openbmc'; - $data->{command} = $req->{command}->[0]; - $data->{args} = $req->{arg}; - $data->{cwd} = $req->{cwd}; - $data->{nodes} = $req->{node}; - $data->{nodeinfo} = $nodeinfo; - $data->{envs} = \%env_hash; - $buf = encode_json($data); - $sz = pack('i', length($buf)); - # send length of data first - $ret = $sock->send($sz); - if (!$ret) { - xCAT::MsgUtils->message("E", { data => ["Failed to send message to the agent"] }, $callback); - $sock->close(); - kill('TERM', $pid); - return; - } - # send data - $ret = $sock->send($buf); - if (!$ret) { - xCAT::MsgUtils->message("E", { data => ["Failed to send message to the agent"] }, $callback); - $sock->close(); - kill('TERM', $pid); - return; - } - while(1) { - $ret = $sock->recv($buf, 4); - if (!$ret) { - last; - } - # receive the length of data - $sz = unpack('i', $buf); - # read data with length is $sz - $ret = $sock->recv($buf, $sz); - if (!$ret) { - xCAT::MsgUtils->message("E", { data => ["receive data from python agent unexpectedly"] }, $callback); - last; - } - $data = decode_json($buf); - handle_message($data, $callback); - } - # no message received, the socket on the agent side should be closed. - $sock->close(); -} - -sub wait_agent { - my ($pid, $callback) = @_; - waitpid($pid, 0); - if ($? >> 8 != 0) { - xCAT::MsgUtils->message("E", { data => ["Agent exited unexpectedly. See $PYTHON_LOG_PATH for details."] }, $callback); - xCAT::MsgUtils->message("I", { data => ["To revert to Perl framework: chdef -t site clustersite openbmcperl=ALL"] }, $callback); - } - python_agent_reaper(); -} - #-------------------------------------------------------------------------------- =head3 run_cmd_in_perl diff --git a/xCAT-server/lib/xcat/plugins/openbmc2.pm b/xCAT-server/lib/xcat/plugins/openbmc2.pm index 3f1e22886..66d955d6b 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc2.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc2.pm @@ -16,6 +16,7 @@ use Getopt::Long; use xCAT::Usage; use xCAT::SvrUtils; use xCAT::OPENBMC; +use xCAT::AGENT; #------------------------------------------------------- @@ -134,7 +135,7 @@ sub process_request { my $request = shift; $callback = shift; - if (!xCAT::OPENBMC::exists_python_agent()) { + if (!xCAT::AGENT::exists_python_agent()) { xCAT::MsgUtils->message("E", { data => ["The xCAT Python agent does not exist. Check if xCAT-openbmc-py package is installed on management node and service nodes."] }, $callback); return; } @@ -149,14 +150,14 @@ sub process_request { return unless(%node_info); # If we can't start the python agent, exit immediately - my $pid = xCAT::OPENBMC::start_python_agent($$); + my $pid = xCAT::AGENT::start_python_agent($$); if (!defined($pid)) { xCAT::MsgUtils->message("E", { data => ["Failed to start the xCAT Python agent. Check /var/log/xcat/cluster.log for more information."] }, $callback); return; } - xCAT::OPENBMC::submit_agent_request($pid, $request, \%node_info, $callback); - xCAT::OPENBMC::wait_agent($pid, $callback); + xCAT::AGENT::submit_agent_request($pid, $request, "openbmc", \%node_info, $callback); + xCAT::AGENT::wait_agent($pid, $callback); } my @rsp_common_options = qw/autoreboot bootmode powersupplyredundancy powerrestorepolicy timesyncmethod From 1c1eace7737aee2ba253c4d550eac525a7bb1461 Mon Sep 17 00:00:00 2001 From: Bin Xu Date: Tue, 5 Jun 2018 17:57:55 +0800 Subject: [PATCH 11/93] Recording the Severity of log message into xCAT logs (#5267) - modify rsyslog conf and add "%syslogseverity-text:::uppercase%" to input the text Severity - remove duplicate Severity in log message - modify MsgUtils::trace for better performance and code structure --- perl-xCAT/xCAT/MsgUtils.pm | 48 +++++++++------------------- xCAT-server/sbin/xcatd | 16 +++++----- xCAT/etc/rsyslog.d/xcat-cluster.conf | 2 +- xCAT/etc/rsyslog.d/xcat-compute.conf | 2 +- 4 files changed, 25 insertions(+), 43 deletions(-) diff --git a/perl-xCAT/xCAT/MsgUtils.pm b/perl-xCAT/xCAT/MsgUtils.pm index 4e3bf292c..d4876281e 100644 --- a/perl-xCAT/xCAT/MsgUtils.pm +++ b/perl-xCAT/xCAT/MsgUtils.pm @@ -897,42 +897,24 @@ sub trace() { if (($level eq "I") || ($level eq "i")) { $prefix = "INFO"; } if (($level eq "D") || ($level eq "d")) { $prefix = "DEBUG"; } - if (($level eq "E") - || ($level eq "e") - || ($level eq "I") - || ($level eq "i") - || ($level eq "W") - || ($level eq "w")) { - my $msg = $prefix . " " . $logcontent; - eval { - openlog("xcat", "nofatal,pid", "local4"); - syslog("$prefix", $msg); - closelog(); - }; - if ($@) { - print "Error: Unable to log to syslog: $@\n"; - print "$msg\n"; - } - return; + return unless ($prefix); #unknown level, do nothing. + + if (($verbose == 0) && ($prefix eq "DEBUG")) { + my @tmp = xCAT::TableUtils->get_site_attribute("xcatdebugmode"); + my $xcatdebugmode = $tmp[0]; + return unless (($xcatdebugmode == 1) || ($xcatdebugmode == 2)); } - my @tmp = xCAT::TableUtils->get_site_attribute("xcatdebugmode"); - my $xcatdebugmode = $tmp[0]; - if (($level eq "D") - || ($level eq "d")) { - if (($verbose == 1) || ($xcatdebugmode eq "1") || ($xcatdebugmode eq "2")) { - my $msg = $prefix . " " . $logcontent; - eval { - openlog("xcat", "nofatal,pid", "local4"); - syslog("$prefix", $msg); - closelog(); - }; - if ($@) { - print "Error: Unable to log to syslog: $@\n"; - print "$msg\n"; - } - } + eval { + openlog("xcat", "nofatal,pid", "local4"); + syslog("$prefix", $logcontent); + closelog(); + }; + if ($@) { + print "Error: Unable to log to syslog: $@\n"; + print "$prefix . $logcontent\n"; } + } #------------------------------------------------------------------ diff --git a/xCAT-server/sbin/xcatd b/xCAT-server/sbin/xcatd index 53c1ab745..f8e83a6a3 100755 --- a/xCAT-server/sbin/xcatd +++ b/xCAT-server/sbin/xcatd @@ -844,14 +844,14 @@ sub do_udp_service { # This function opens up a UDP port #notify the client that its request is been processing my $ret=xCAT::NetworkUtils->send_tcp_msg($clientip,3001,"processing"); if($ret){ - xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $clientip that its 'findme' request is been processing"); + xCAT::MsgUtils->message("S", "xcatd: fail to notify $clientip that its 'findme' request is been processing"); } } elsif ($data =~ /^ $data, sockaddr => $clientip, sport => $sport }, $discoctl); #notify the client that its request is been processing my $ret=xCAT::NetworkUtils->send_tcp_msg($clientip,3001,"processing"); if($ret){ - xCAT::MsgUtils->message("S", "INFO xcatd: fail to notify $clientip that its 'findme' request is been processing"); + xCAT::MsgUtils->message("S", "xcatd: fail to notify $clientip that its 'findme' request is been processing"); } } else { # for *now*, we'll do a tiny YAML subset @@ -1212,7 +1212,7 @@ unless ($cmdlog_svrpid) { if ($clientsock) { close($clientsock); } if (-e $cmdlogservicefile) { unlink("$cmdlogservicefile"); } if ($cmdlogsvrlistener) { close($cmdlogsvrlistener); } - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ is terminated by USR2 signal"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ is terminated by USR2 signal"); exit(0); }; @@ -1222,7 +1222,7 @@ unless ($cmdlog_svrpid) { if ($clientsock) { close($clientsock); } if (-e $cmdlogservicefile) { unlink("$cmdlogservicefile"); } if ($cmdlogsvrlistener) { close($cmdlogsvrlistener); } - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ is terminated by TERM or INT signal"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ is terminated by TERM or INT signal"); exit(0); }; @@ -1246,10 +1246,10 @@ unless ($cmdlog_svrpid) { $cmdlogfileswitch = 1; } if (!$trytime) { - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ get HUP signal, reopen commands.log file failed, send TERM signal to kill itself"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ get HUP signal, reopen commands.log file failed, send TERM signal to kill itself"); kill 'INT', $$; } else { - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ get HUP signal, reopen commands.log file"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ get HUP signal, reopen commands.log file"); } }; @@ -1260,7 +1260,7 @@ unless ($cmdlog_svrpid) { Listen => 8192); if (not $cmdlogsvrlistener and open($cmdlogpidfile, "<", "$cmdlogservicefile")) { - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ is trying to get port $cmdlog_port"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ is trying to get port $cmdlog_port"); my $pid = <$cmdlogpidfile>; if ($pid) { kill 'USR2', $pid; @@ -1319,7 +1319,7 @@ unless ($cmdlog_svrpid) { if ($cmdlogfile) { close($cmdlogfile); } if ($cmdlogsvrlistener) { close($cmdlogsvrlistener); } - xCAT::MsgUtils->message("S", "INFO xcatd: 'Command log writer' process $$ stop"); + xCAT::MsgUtils->message("S", "xcatd: 'Command log writer' process $$ stop"); } # ----used for command log end--------- diff --git a/xCAT/etc/rsyslog.d/xcat-cluster.conf b/xCAT/etc/rsyslog.d/xcat-cluster.conf index 7e37c15a2..924d8f70a 100644 --- a/xCAT/etc/rsyslog.d/xcat-cluster.conf +++ b/xCAT/etc/rsyslog.d/xcat-cluster.conf @@ -1,3 +1,3 @@ -$template xCATTraditionalFormat0,"%timegenerated% %HOSTNAME% %syslogtag% %msg:::drop-last-lf%\n" +$template xCATTraditionalFormat0,"%timegenerated% %HOSTNAME% %syslogtag% %syslogseverity-text:::uppercase% %msg:::drop-last-lf%\n" :programname, isequal, "xcat" /var/log/xcat/cluster.log;xCATTraditionalFormat0 :programname, startswith, "xcat." /var/log/xcat/cluster.log;xCATTraditionalFormat0 diff --git a/xCAT/etc/rsyslog.d/xcat-compute.conf b/xCAT/etc/rsyslog.d/xcat-compute.conf index fa5eaa0f6..6b71f0696 100644 --- a/xCAT/etc/rsyslog.d/xcat-compute.conf +++ b/xCAT/etc/rsyslog.d/xcat-compute.conf @@ -1,3 +1,3 @@ -$template xCATTraditionalFormat9,"%timegenerated% %HOSTNAME% %syslogtag% %msg:::drop-last-lf%\n" +$template xCATTraditionalFormat9,"%timegenerated% %HOSTNAME% %syslogtag% %syslogseverity-text:::uppercase% %msg:::drop-last-lf%\n" :fromhost-ip, !isequal, "127.0.0.1" /var/log/xcat/computes.log;xCATTraditionalFormat9 & ~ From 7576e04e2419dcaeeaf4edc5a516ade16dd03a78 Mon Sep 17 00:00:00 2001 From: Yuan Bai Date: Wed, 6 Jun 2018 15:25:11 +0800 Subject: [PATCH 12/93] let mysqlsetup work when using alias IP as MN IP (#5279) * let mysqlsetup work when using alias IP as MN IP --- xCAT-client/bin/mysqlsetup | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xCAT-client/bin/mysqlsetup b/xCAT-client/bin/mysqlsetup index b8936aa30..36a39b86c 100755 --- a/xCAT-client/bin/mysqlsetup +++ b/xCAT-client/bin/mysqlsetup @@ -338,6 +338,7 @@ if ((($odbconly == 0) && ($::xcatrunningmysql == 0)) || $::UPDATE || $::SETUPLL) } # initial setup request, if not already running mysql +my $hostfile_configured=0; if (($::INIT) && ($::xcatrunningmysql == 0)) { # MySQL not running, then initialize the database @@ -443,6 +444,12 @@ if (($::INIT) && ($::xcatrunningmysql == 0)) # &createcfgloc; + if ($::HOSTFILE) + { + &addhosts; + $hostfile_configured=1 + } + # # Restore backed up database into MySQL # @@ -481,7 +488,7 @@ if ($::SETUPLL) # if input a list of hosts to add to the database, to give access to MySQL -if ($::HOSTFILE) +if (($::HOSTFILE) && ($hostfile_configured == 0)) { &addhosts; From cc158f775533bdb906d4fb836c9b491ea5f335dc Mon Sep 17 00:00:00 2001 From: cxhong Date: Wed, 6 Jun 2018 22:04:54 -0400 Subject: [PATCH 13/93] Create switchprobe link during xCAT-probe installation (#5272) * Create switchprobe link during xCAT-probe installation * remove debug message * Modify upgrade path * make symbolic link --- makerpm | 1 - xCAT-probe/subcmds/switch_macmap | 7 ------- xCAT-probe/xCAT-probe.spec | 13 +++++++++++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/makerpm b/makerpm index 1e874662f..8ed19bf24 100755 --- a/makerpm +++ b/makerpm @@ -13,7 +13,6 @@ function xcat_probe_copy { # xCAT-probe uses some functions shipped with xCAT, copying for the following reasons: # 1. make xCAT-probe code be self-contained # 2. do not maintain two files for each script - # 3. symbolic link can't work during packaging RPMNAME=${1} if [ $RPMNAME = "xCAT-probe" ]; then mkdir -p ${RPMNAME}/lib/perl/xCAT/ diff --git a/xCAT-probe/subcmds/switch_macmap b/xCAT-probe/subcmds/switch_macmap index 2b4757177..ef4db81bc 100755 --- a/xCAT-probe/subcmds/switch_macmap +++ b/xCAT-probe/subcmds/switch_macmap @@ -53,13 +53,6 @@ if ($help) { exit 0; } -if (!-d "$currdir/bin") { - mkpath("$currdir/bin/"); -} -if (!-e "$currdir/bin/switchprobe") { - link("$::XCATROOT/bin/xcatclient", "$currdir/bin/switchprobe"); -} - if ($test) { `$currdir/bin/switchprobe -h`; if ($?) { diff --git a/xCAT-probe/xCAT-probe.spec b/xCAT-probe/xCAT-probe.spec index c46700694..d2cd0243f 100644 --- a/xCAT-probe/xCAT-probe.spec +++ b/xCAT-probe/xCAT-probe.spec @@ -61,5 +61,18 @@ rm -rf $RPM_BUILD_ROOT - "Create xCAT probe package" %post +if [ -e %{prefix}/probe/subcmds/bin/switchprobe ]; then + rm -rf %{prefix}/probe/subcmds/bin/switchprobe +else + mkdir -p %{prefix}/probe/subcmds/bin/ +fi +cd %{prefix}/probe/subcmds/bin/ +if [ -e %{prefix}/bin/xcatclient ]; then + ln -s %{prefix}/bin/xcatclient switchprobe +fi %preun +#remove the bin directory if not on upgrade +if [ "$1" != "1" ]; then + rm -rf %{prefix}/probe/subcmds/bin/ +fi From a1596fa3e3bee0e9306f503496fe671d776b6852 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Thu, 7 Jun 2018 16:58:49 +0800 Subject: [PATCH 14/93] check ip whether static for networkmanager config (#5261) * check ip whether static by networkmanager --- xCAT-probe/lib/perl/probe_utils.pm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/xCAT-probe/lib/perl/probe_utils.pm b/xCAT-probe/lib/perl/probe_utils.pm index d9e93a84c..f8c1b2209 100644 --- a/xCAT-probe/lib/perl/probe_utils.pm +++ b/xCAT-probe/lib/perl/probe_utils.pm @@ -179,6 +179,24 @@ sub is_static_ip { my $os = get_os(); my $rst = 0; + `which nmcli > /dev/null 2>&1`; + unless ($?) { + my $device_connection = `nmcli device show $nic 2>&1 | grep GENERAL.CONNECTION`; + my $net_name; + if ($device_connection =~ /GENERAL.CONNECTION:\s*(.+)/) { + $net_name = $1; + } + if ($net_name) { + my $ipv4_method = `nmcli con show "$net_name" 2>&1 | grep -E 'ipv4.method'`; + unless ($?) { + if ($ipv4_method =~ /manual/) { + $rst = 1; + } + return $rst; + } + } + } + if ($os =~ /redhat/) { my $output1 = `cat /etc/sysconfig/network-scripts/ifcfg-$nic 2>&1 |grep -i IPADDR`; my $output2 = `cat /etc/sysconfig/network-scripts/ifcfg-$nic 2>&1 |grep -i BOOTPROTO`; From 952dea810b4a03202b4be2405013c1fca80da843 Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Thu, 7 Jun 2018 13:18:30 -0400 Subject: [PATCH 15/93] Using physical entity description OID to get Vendor information --- xCAT-server/lib/xcat/plugins/switchdiscover.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index 07b88b26a..0c347862e 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -982,7 +982,7 @@ sub get_snmpvendorinfo { foreach $comms(@comm_list) { #get sysDescr.0"; - my $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.1.1"; + my $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.47.1.1.1.1.2.1"; if (exists($globalopt{verbose})) { send_msg($request, 0, "Process command: $ccmd\n"); } From 61cbe03b939a44555566894fc0b2e11528da466b Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Wed, 13 Jun 2018 17:32:05 +0800 Subject: [PATCH 16/93] Enhance xcattest to support label search (#5280) * enhance xcattest to support label search --- xCAT-test/xcattest | 482 +++++++++++++++++++++++++++++++++------------ 1 file changed, 361 insertions(+), 121 deletions(-) diff --git a/xCAT-test/xcattest b/xCAT-test/xcattest index dbb218414..cbbe21220 100755 --- a/xCAT-test/xcattest +++ b/xCAT-test/xcattest @@ -16,8 +16,9 @@ BEGIN use lib "$::XCATROOT/lib/perl"; #--------------global attributes---------------- -my $prpgram_path = dirname(File::Spec->rel2abs(__FILE__)); -my $program_name = basename($0); +my $prpgram_path = dirname(File::Spec->rel2abs(__FILE__)); +my $program_name = basename($0); + my $rootdir = "$prpgram_path/../share/xcat/tools/autotest"; my $casedir = "$rootdir/testcase/"; my $bundledir = "$rootdir/bundle/"; @@ -52,19 +53,29 @@ my $RUN = 1; #----------global logs attributes--------------- my $running_log_fd = undef -my $running_log_name = undef; +my $running_log_name = undef; my $failed_log_name = undef; my $performance_log_name = undef; #--------------command line attrbutes-------------- -my $needhelp = 0; -my $configfile = undef; -my $bundlelist = undef; -my $caselist = undef; -my $cmdlist = undef; -my $list = undef; -my $restore = 0; -my $quiet = 0; +my $needhelp = 0; +my $configfile = undef; +my $bundlelist = undef; +my $caselist = undef; +my $cmdlist = undef; +my $list = undef; +my $restore = 0; +my $quiet = 0; +my $search_expression = undef; + +my %label_map; +my %case_label_map; +my @label_order = (["xcat_install"], + ["mn_only"], + [ "sn_diskful", "sn_diskless" ], + [ "flat_cn_diskful", "flat_cn_diskless", "hierarchy_cn_diskful", "hierarchy_cn_diskless" ], + [ "cn_bmc_ready", "cn_os_ready" ], + ["others"]); #-------------usage-------------------- $::USAGE = "Usage: @@ -75,6 +86,8 @@ To list the information about all cases shipped by xcat test package $program_name -l {caselist|caseinfo|casenum} To list the information about all bunldes shipped by xcat test package $program_name -l bundleinfo +To list the information about label + $program_name -l labelinfo To list the information about cases in specific bundles $program_name -l {caselist|caseinfo|casenum} -b To list the information about cases related to specific commands @@ -82,22 +95,33 @@ To list the information about cases related to specific commands To list the information about specific cases $program_name -l {caselist|caseinfo|casenum} -t +To list cases information that satisfy specific filter expression + $program_name -l {caselist|caseinfo|casenum} -s \"filter_expression\" +To list information about cases in specific bundles and satisfy specific filter expression at same time + $program_name -l {caselist|caseinfo|casenum} -b -s \"filter_expression\" + To run test cases in specific bundles $program_name [-f {configure_file|configure_file:System}] -b [-r] [-q] To run specific test cases $program_name [-f {configure_file|configure_file:System}] -t [-r] [-q] To run all cases related to specific commands $program_name [-f {configure_file|configure_file:System}] -c [-r] [-q] +To run test cases that satisfy specific filter expression + $program_name -s \"filter_expression\" Options: -h : Get $program_name usage information. - -l : list specific information. The valid options are caselist,caseinfo,casenum,bundleinfo + -l : list specific information. The valid options are caselist,caseinfo,casenum,bundleinfo. -f : specify the configuration file. If 'System' tag is used, only [System] section in the configuration file will be used. If 'System' is not used all other sections of the configuration file will be used, like [Table], [Object], etc. -c : Comma separated list of command names to test. -t : Comma separated list of test case names to test. -b : Comma separated list of bundle names to test. If a bundle name is specified without an absolute path, such like / \$cmdlist, "l=s" => \$list, "q" => \$quiet, + "s=s" => \$search_expression, "r" => \$restore) ) { @@ -124,6 +149,8 @@ if ( to_exit(1); } +#$list="caselist" unless($list); + if ($needhelp) { log_this($running_log_fd, "$::USAGE"); to_exit(0); @@ -136,6 +163,14 @@ if ($rst) { to_exit(1); } +if($search_expression){ + $rst = scan_existed_labels(\%case_label_map, \%label_map, \$error); + if($rst) { + log_this($running_log_fd, "$error"); + to_exit(1); + } +} + $rst = calculate_cases_to_be_run(\@cases_to_be_run, \$error); if ($rst) { log_this($running_log_fd, "$error"); @@ -149,7 +184,7 @@ if ($list) { if ($list eq "caselist") { if (@cases_to_be_run) { - #list the cases indicated by option -b,-c,-t + #list the cases indicated by option -b,-c,-t, -s foreach (@cases_to_be_run) { log_this($running_log_fd, "$_"); } @@ -182,6 +217,7 @@ if ($list) { $rst = load_case(\@cases_to_be_run, \@cases, \%case_name_index_map, \$error, $NORUN); if ($rst) { log_this($running_log_fd, "$error"); + to_exit(1); } my $casenum = @cases; log_this($running_log_fd, "$casenum"); @@ -194,12 +230,46 @@ if ($list) { log_this($running_log_fd, "$error"); to_exit(1); } + } elsif ($list eq "labelinfo"){ + $rst = scan_existed_labels(\%case_label_map, \%label_map, \$error); + my %label_conut; + my %case_label_str_map; + foreach my $case (keys %case_label_map){ + if($case_label_map{$case}{label_str}){ + $case_label_str_map{$case} = $case_label_map{$case}{label_str}; + my @labels = split(",", $case_label_map{$case}{label_str}); + foreach my $label (@labels){ + if(!exists $label_conut{$label}){ + $label_conut{$label}=1; + }else{ + $label_conut{$label}+=1; + } + } + } + } + + log_this($running_log_fd, "-------------------------------"); + log_this($running_log_fd, "The labels of cases:"); + log_this($running_log_fd, "-------------------------------"); + print_table(\%case_label_str_map); + my $label_total_num=keys %label_conut; + log_this($running_log_fd, "\n-------------------------------"); + log_this($running_log_fd, "There are $label_total_num different labels"); + log_this($running_log_fd, "The number of cases of each label:"); + log_this($running_log_fd, "-------------------------------"); + print_table(\%label_conut); + log_this($running_log_fd, "-------------------------------"); + my $total_case = keys %case_label_map; + my $case_with_label_num = keys %case_label_str_map; + log_this($running_log_fd, "There are $total_case cases totaly, there are $case_with_label_num cases with label."); + } + to_exit(0); } unless (@cases_to_be_run) { - log_this($running_log_fd, "Please indicate the cases to run by option -b,-c,-t"); + log_this($running_log_fd, "There is no case to run, Please indicate case by option -b,-c,-t,-s"); to_exit(1); } @@ -220,11 +290,12 @@ if (defined($configfile)) { } } else { $setup_env_by_config_file = 0; + # Leverage environment variable to used in test case foreach (keys %ENV) { if (/^XCATTEST_/) { - my @envname=split("_",$_,2); - $config{var}{$envname[-1]} = $ENV{$_}; + my @envname = split("_", $_, 2); + $config{var}{ $envname[-1] } = $ENV{$_}; } } } @@ -264,7 +335,7 @@ log_this($running_log_fd, "******************************"); log_this($running_log_fd, "loading test cases"); log_this($running_log_fd, "******************************"); $rst = load_case(\@cases_to_be_run, \@cases, \%case_name_index_map, \$error, $RUN); -if ($rst && $rst < 2 ) { +if ($rst && $rst < 2) { log_this($running_log_fd, "$error"); to_exit(1); } @@ -276,7 +347,7 @@ if ($rst && $rst < 2 ) { #print "=====Dumper cases to be run=====\n"; #print Dumper \@cases_to_be_run; -unless(@cases_to_be_run){ +unless (@cases_to_be_run) { to_exit(1); } @@ -468,6 +539,17 @@ sub calculate_cases_to_be_run { close($fd); } } + + + if($search_expression){ + my @rest_cases_to_be_run=(); + $rst = filter_case_by_label($cases_to_be_run_ref,\%case_label_map,\@rest_cases_to_be_run, $error_ref); + if ($rst) { + return 1; + } + + @$cases_to_be_run_ref=@rest_cases_to_be_run; + } return 0; } @@ -535,7 +617,7 @@ sub check_option_validity { if ($bundlelist || $caselist || $cmdlist) { @vaild_list_method = ("caselist", "caseinfo", "casenum"); } else { - @vaild_list_method = ("caselist", "caseinfo", "casenum", "bundleinfo"); + @vaild_list_method = ("caselist", "caseinfo", "casenum", "bundleinfo", "labelinfo"); } if (!(grep { /^$list$/ } @vaild_list_method)) { $$error_ref = "Unsupport list method for option l"; @@ -827,6 +909,8 @@ sub load_case { my $case_num = @{$cases_to_be_run_ref}; $load_all_case_flag = 1 if ($case_num == 0); + @$case_ref = (); + %$case_name_index_map_ref=(); my @files = (); get_files_recursive("$casedir", \@files); @@ -847,11 +931,11 @@ sub load_case { return 1; } while ($line = <$fd>) { - if($newcmdstart){ - $line =~ s/\s+$//g ; - }else{ - $line =~ s/^\s+|#[^!].+|\s+$//g ; - } + if ($newcmdstart) { + $line =~ s/\s+$//g; + } else { + $line =~ s/^\s+|#[^!].+|\s+$//g; + } #skip blank and comment lines next if (length($line) == 0 || ($line =~ /^\s*#/)); @@ -860,16 +944,18 @@ sub load_case { my $name = $1; if ($load_all_case_flag) { if (is_valid_case_name($name)) { - $skip = 0; - $j = -1; - $case_ref->[$i] = {}; - $case_ref->[$i]->{name} = $name; - $case_ref->[$i]->{filename} = $file; - if(exists($$case_name_index_map_ref{"$name"})){ - $case_name_index_map_bak{"$name"}=$$case_name_index_map_ref{"$name"}; + $skip = 0; + $j = -1; + $case_ref->[$i] = {}; + $case_ref->[$i]->{name} = $name; + $case_ref->[$i]->{filename} = $file; + $case_ref->[$i]->{label} = 0; + $case_ref->[$i]->{label_str} = ""; + if (exists($$case_name_index_map_ref{"$name"})) { + $case_name_index_map_bak{"$name"} = $$case_name_index_map_ref{"$name"}; } $$case_name_index_map_ref{"$name"} = $i; - $newcmdstart = 0; + $newcmdstart = 0; } else { $skip = 1; push @{ $invalidcases{"invalidcasename"} }, $name; @@ -880,17 +966,19 @@ sub load_case { next; } else { if (is_valid_case_name($name)) { - $skip = 0; - $j = -1; - $case_ref->[$i] = {}; - $case_ref->[$i]->{name} = $name; - $case_ref->[$i]->{filename} = $file; - if(exists($$case_name_index_map_ref{"$name"})){ - $case_name_index_map_bak{"$name"}=$$case_name_index_map_ref{"$name"}; + $skip = 0; + $j = -1; + $case_ref->[$i] = {}; + $case_ref->[$i]->{name} = $name; + $case_ref->[$i]->{filename} = $file; + $case_ref->[$i]->{label} = 0; + $case_ref->[$i]->{label_str} = ""; + if (exists($$case_name_index_map_ref{"$name"})) { + $case_name_index_map_bak{"$name"} = $$case_name_index_map_ref{"$name"}; } $$case_name_index_map_ref{"$name"} = $i; - $newcmdstart = 0; - if(grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + $newcmdstart = 0; + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); } } else { @@ -899,7 +987,7 @@ sub load_case { } } } - } elsif ($line =~ /^os\s*:\s*(\w[\w\,]+)/) { + } elsif ($line =~ /^os\s*:\s*(\w[\w\, ]+)/) { next if $skip; $case_ref->[$i]->{os} = $1; @@ -921,92 +1009,95 @@ sub load_case { foreach my $os (@newvalidoslist) { if ($currentos =~ /$os/i) { $valid = 1; - if(grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); } last; } } unless ($valid) { + #$skip = 1; - if(exists($case_name_index_map_bak{$case_ref->[$i]->{name}})){ - $$case_name_index_map_ref{$case_ref->[$i]->{name}}=$case_name_index_map_bak{$case_ref->[$i]->{name}}; - }else{ - delete $$case_name_index_map_ref{$case_ref->[$i]->{name}}; - if(! grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (exists($case_name_index_map_bak{ $case_ref->[$i]->{name} })) { + $$case_name_index_map_ref{ $case_ref->[$i]->{name} } = $case_name_index_map_bak{ $case_ref->[$i]->{name} }; + } else { + delete $$case_name_index_map_ref{ $case_ref->[$i]->{name} }; + if (!grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { push @{ $invalidcases{"noruncases"} }, $case_ref->[$i]->{name}; } } } } $newcmdstart = 0; - } elsif ($line =~ /^arch\s*:\s*(\w[\w\,]+)/) { + } elsif ($line =~ /^arch\s*:\s*(\w[\w\, ]+)/) { next if $skip; $case_ref->[$i]->{arch} = $1; if ($run_case_flag) { + #To judge whether need to skip the current case my $case_arch = $case_ref->[$i]->{arch}; - if($case_arch =~ /ppc/i && $case_arch !~ /le|el/i){ - $case_arch="ppc"; - }elsif($case_arch =~ /ppc/i && $case_arch =~ /le|el/i){ - $case_arch="ppc64le"; - }elsif($case_arch =~ /x86/i){ - $case_arch="x86"; + if ($case_arch =~ /ppc/i && $case_arch !~ /le|el/i) { + $case_arch = "ppc"; + } elsif ($case_arch =~ /ppc/i && $case_arch =~ /le|el/i) { + $case_arch = "ppc64le"; + } elsif ($case_arch =~ /x86/i) { + $case_arch = "x86"; } my $env_arch = ""; - if(exists($config{var}{ARCH})){ + if (exists($config{var}{ARCH})) { $env_arch = $config{var}{ARCH}; - }else{ - $env_arch =`uname -m`; + } else { + $env_arch = `uname -m`; chomp($env_arch); } - if($env_arch =~ /ppc/i && $env_arch !~ /le|el/i){ - $env_arch="ppc"; - }elsif($env_arch =~ /ppc/i && $env_arch =~ /le|el/i){ - $env_arch="ppc64le"; - }elsif($env_arch =~ /x86/i){ - $env_arch="x86"; + if ($env_arch =~ /ppc/i && $env_arch !~ /le|el/i) { + $env_arch = "ppc"; + } elsif ($env_arch =~ /ppc/i && $env_arch =~ /le|el/i) { + $env_arch = "ppc64le"; + } elsif ($env_arch =~ /x86/i) { + $env_arch = "x86"; } - - my $valid = 0; + + my $valid = 0; if ($case_arch eq $env_arch) { $valid = 1; - if(grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); } } unless ($valid) { - if(exists($case_name_index_map_bak{$case_ref->[$i]->{name}})){ - $$case_name_index_map_ref{$case_ref->[$i]->{name}}=$case_name_index_map_bak{$case_ref->[$i]->{name}}; - }else{ - delete $$case_name_index_map_ref{$case_ref->[$i]->{name}}; - if(! grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (exists($case_name_index_map_bak{ $case_ref->[$i]->{name} })) { + $$case_name_index_map_ref{ $case_ref->[$i]->{name} } = $case_name_index_map_bak{ $case_ref->[$i]->{name} }; + } else { + delete $$case_name_index_map_ref{ $case_ref->[$i]->{name} }; + if (!grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { push @{ $invalidcases{"noruncases"} }, $case_ref->[$i]->{name}; } } } } $newcmdstart = 0; - } elsif ($line =~ /^hcp\s*:\s*(\w[\w\,]+)/) { + } elsif ($line =~ /^hcp\s*:\s*(\w[\w\, ]+)/) { next if $skip; $case_ref->[$i]->{hcp} = $1; if ($run_case_flag) { + #To judge whether need to skip the current case - my $valid = 0; - if (exists ($config{var}{HCP}) && ($case_ref->[$i]->{hcp} =~ /$config{var}{HCP}/i)) { + my $valid = 0; + if (exists($config{var}{HCP}) && ($case_ref->[$i]->{hcp} =~ /$config{var}{HCP}/i)) { $valid = 1; - if(grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); } } unless ($valid) { - if(exists($case_name_index_map_bak{$case_ref->[$i]->{name}})){ - $$case_name_index_map_ref{$case_ref->[$i]->{name}}=$case_name_index_map_bak{$case_ref->[$i]->{name}}; - }else{ - delete $$case_name_index_map_ref{$case_ref->[$i]->{name}}; - if(! grep (/$case_ref->[$i]->{name}/,@{ $invalidcases{"noruncases"} })){ + if (exists($case_name_index_map_bak{ $case_ref->[$i]->{name} })) { + $$case_name_index_map_ref{ $case_ref->[$i]->{name} } = $case_name_index_map_bak{ $case_ref->[$i]->{name} }; + } else { + delete $$case_name_index_map_ref{ $case_ref->[$i]->{name} }; + if (!grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { push @{ $invalidcases{"noruncases"} }, $case_ref->[$i]->{name}; } } @@ -1038,7 +1129,7 @@ sub load_case { if ($run_case_flag) { $case_ref->[$i]->{cmd}->[$j][$m] = getvar($1, \%config); if ($case_ref->[$i]->{cmd}->[$j][$m] =~ /miss attribute (.+)/) { - update_miss_attr($case_ref->[$i]->{cmd}->[$j][$m], $case_ref->[$i]->{name}, \@{$invalidcases{"missattr"}}); + update_miss_attr($case_ref->[$i]->{cmd}->[$j][$m], $case_ref->[$i]->{name}, \@{ $invalidcases{"missattr"} }); } } else { $case_ref->[$i]->{cmd}->[$j][$m] = $1; @@ -1049,7 +1140,7 @@ sub load_case { if ($run_case_flag) { $case_ref->[$i]->{check}->[$j][$z] = getvar($1, \%config); if ($case_ref->[$i]->{check}->[$j][$z] =~ /miss attribute/) { - update_miss_attr($case_ref->[$i]->{check}->[$j][$z], $case_ref->[$i]->{name}, \@{$invalidcases{"missattr"}}); + update_miss_attr($case_ref->[$i]->{check}->[$j][$z], $case_ref->[$i]->{name}, \@{ $invalidcases{"missattr"} }); } } else { $case_ref->[$i]->{check}->[$j][$z] = $1; @@ -1061,7 +1152,7 @@ sub load_case { if ($run_case_flag) { $case_ref->[$i]->{cmdcheck}->[$j][$z] = getvar($1, \%config); if ($case_ref->[$i]->{cmdcheck}->[$j][$z] =~ /miss attribute/) { - update_miss_attr($case_ref->[$i]->{cmdcheck}->[$j][$z],$case_ref->[$i]->{name}, \@{$invalidcases{"missattr"}}); + update_miss_attr($case_ref->[$i]->{cmdcheck}->[$j][$z], $case_ref->[$i]->{name}, \@{ $invalidcases{"missattr"} }); } } else { $case_ref->[$i]->{cmdcheck}->[$j][$z] = $1; @@ -1092,7 +1183,8 @@ sub load_case { if ($run_case_flag) { if ($invalidcases{"missattr"}) { - log_this($running_log_fd, "Miss attribute:", @{$invalidcases{"missattr"}}); + log_this($running_log_fd, "Miss attribute:", @{ $invalidcases{"missattr"} }); + #$$error_ref = "Miss attribute: " . join(",", @{ $invalidcases{"missattr"} }); foreach my $line (@{ $invalidcases{"missattr"} }) { my @name = split(" ", $line); @@ -1103,7 +1195,7 @@ sub load_case { $caseerror = 2; } - if ($invalidcases{"noruncases"} && @{$invalidcases{"noruncases"}}) { + if ($invalidcases{"noruncases"} && @{ $invalidcases{"noruncases"} }) { log_this($running_log_fd, "Unsuitable current environment:", @{ $invalidcases{"noruncases"} }); push @wrong_cases, @{ $invalidcases{"noruncases"} }; $caseerror = 2; @@ -1111,18 +1203,18 @@ sub load_case { # To filter unexisted cases my @unexisted_cases; - foreach my $case (@{$cases_to_be_run_ref}){ - if(!(grep { /^$case$/ } @wrong_cases) && !defined ($$case_name_index_map_ref{$case})){ + foreach my $case (@{$cases_to_be_run_ref}) { + if (!(grep { /^$case$/ } @wrong_cases) && !defined($$case_name_index_map_ref{$case})) { push @unexisted_cases, $case; } } - if(@unexisted_cases){ + if (@unexisted_cases) { log_this($running_log_fd, "Not existed:", @unexisted_cases); - push @wrong_cases, @unexisted_cases; + push @wrong_cases, @unexisted_cases; $caseerror = 2; } - if($caseerror) { + if ($caseerror) { my @new_cases_to_be_run = (); foreach my $c (@{$cases_to_be_run_ref}) { if (!(grep { /^$c$/ } @wrong_cases)) { @@ -1131,10 +1223,10 @@ sub load_case { } @{$cases_to_be_run_ref} = @new_cases_to_be_run; } - - if (@{$cases_to_be_run_ref}){ + + if (@{$cases_to_be_run_ref}) { log_this($running_log_fd, "To run:", @{$cases_to_be_run_ref}); - }else{ + } else { log_this($running_log_fd, "To run:", "There is no valid case to run"); } } @@ -1234,9 +1326,9 @@ sub run_case { #to run single line command log_this($running_log_fd, "RUN:$cmd->[0] [$runstartstr]"); - $cmd->[0] = getfunc($cmd->[0]); - @output = &runcmd($cmd->[0]); - $rc = $::RUNCMD_RC; + $cmd->[0] = getfunc($cmd->[0]); + @output = &runcmd($cmd->[0]); + $rc = $::RUNCMD_RC; push(@caselog, "RUN:$cmd->[0] [$runstartstr]"); } else { @@ -1333,7 +1425,7 @@ sub run_case { if ($cmdcheck) { &runcmd($cmdcheck); $rc = $::RUNCMD_RC; - if ($rc != 0 ) { + if ($rc != 0) { $failflag = 1; log_this($running_log_fd, "CHECK:output $cmdcheck\t[Failed]"); push(@caselog, "CHECK:output $cmdcheck\t[Failed]"); @@ -1439,8 +1531,8 @@ sub setup_env_by_configure_file { } #-------------------------------------------------------- -# Fuction name: detect_current_env -# Description: detect some important attribute in current environment, such as os, arch, hcp... +# Fuction name: detect_current_env +# Description: detect some important attribute in current environment, such as os, arch, hcp... # Atrributes: # $config_ref (input attribute) # The reference of global hash %config. @@ -1449,7 +1541,7 @@ sub setup_env_by_configure_file { # The reference of scalar to save the error message generated during running current function # Retrun code: 0 Success 1 Failed #-------------------------------------------------------- -sub detect_current_env{ +sub detect_current_env { my $config_ref = shift; my $error_ref = shift; @@ -1807,36 +1899,184 @@ sub print_table { } sub update_miss_attr { - my $org_str = shift; - my $case_name = shift; - my $miss_attr_arr_ref = shift; + my $org_str = shift; + my $case_name = shift; + my $miss_attr_arr_ref = shift; my $insert_flag = 0; - my $index = 0; - foreach my $str (@{$miss_attr_arr_ref}){ - my @words = split(" ", $str); + my $index = 0; + foreach my $str (@{$miss_attr_arr_ref}) { + my @words = split(" ", $str); my @org_words = split(" ", $org_str); - if($case_name eq "$words[0]"){ - if(!(grep { /^$org_words[2]$/} @words)){ - $miss_attr_arr_ref->[$index] .= " $org_words[2]"; - } - $insert_flag = 1; - last; + if ($case_name eq "$words[0]") { + if (!(grep { /^$org_words[2]$/ } @words)) { + $miss_attr_arr_ref->[$index] .= " $org_words[2]"; + } + $insert_flag = 1; + last; } ++$index; } - unless($insert_flag){ + unless ($insert_flag) { push @{$miss_attr_arr_ref}, "$case_name $org_str"; } } -sub delete_item_from_array{ - my $item = shift; - my $array_ref = shift; - - my @tmp_arr=(); - foreach (@$array_ref){ - push @tmp_arr, $_ unless($_ eq $item); + +sub delete_item_from_array { + my $item = shift; + my $array_ref = shift; + + my @tmp_arr = (); + foreach (@$array_ref) { + push @tmp_arr, $_ unless ($_ eq $item); } @$array_ref = @tmp_arr; } + +sub filter_case_by_label { + my $cases_to_be_run_ref = shift; + my $case_label_map_ref = shift; + my $rest_cases_to_be_run_ref = shift; + my $error_ref = shift; + + my @filters = (); + my $rst = parse_filters(\@filters, $error_ref); + if($rst){ + return 1; + } + #print Dumper \@filters; + + my @targetcases = (); + foreach my $case (keys %{$case_label_map_ref}) { + if(@$cases_to_be_run_ref){ + next unless(grep { /^$case$/ } @$cases_to_be_run_ref); + } + foreach my $f (@filters) { + my $hit = 1; + foreach my $c (@$f) { + if (($c > 0) and (($case_label_map_ref->{$case}->{label} & $c) == 0)) { + $hit = 0; + last; + } elsif (($c < 0) and (($case_label_map_ref->{$case}->{label} & ($c * -1)) != 0)) { + $hit = 0; + last; + } + } + push @targetcases, $case if ($hit and !(grep { /^$case$/ } @targetcases)); + } + } + + #print Dumper \@targetcases; + + for (my $i = 0 ; $i <= $#label_order ; $i++) { + foreach my $l (@{ $label_order[$i] }) { + foreach my $c (@targetcases) { + push @{$rest_cases_to_be_run_ref}, $c unless (($case_label_map_ref->{$c}->{label} & $label_map{$l}) == 0); + } + } + } + return 0; +} + +sub parse_filters{ + my $filters_ref=shift; + my $error_ref=shift; + + my $index = 0; + my @undefined_labels; + my @exps = split('\|', $search_expression); + foreach my $e (@exps) { + $e =~ s/\+/ /g; + $e =~ s/\-/ -/g; + my @tags = split(' ', $e); + foreach my $t (@tags) { + if ($t =~ /^-(.+)/) { + my $tmpt = $1; + unless (grep { /^$tmpt$/ } keys(%label_map)) { + push @undefined_labels, $tmpt; + next; + } + push @{ $filters_ref->[$index] }, ($label_map{$tmpt} * -1); + } else { + unless (grep { /^$t$/ } keys(%label_map)) { + push @undefined_labels, $t; + next; + } + push @{ $filters_ref->[$index] }, $label_map{$t}; + } + } + $index += 1; + } + +# if (@undefined_labels) { +# $$error_ref = "Label \"" . join(",", @undefined_labels) . "\" are not exist. Existed labels are: " . join(" ", keys(%label_map)); +# return 1; +# } + return 0; +} + +sub scan_existed_labels { + my $case_label_map_ref = shift; + my $label_map_ref = shift; + my $error_ref = shift; + + my $label_value = 1; + my @files = (); + my @cmdfiles = (); + get_files_recursive("$casedir", \@files); + + foreach my $file (@files) { + my @output = runcmd("grep -E \"^start:|^hcp:|^os:|^arch:|^label:\" $file"); + my $current_case_name = ""; + foreach my $line (@output) { + $line =~ s/^\s+|#[^!].+|\s+$//g; + + #skip blank and comment lines + next if (length($line) == 0 || ($line =~ /^\s*#/)); + + my @labels = (); + if ($line =~ /^start\s*:\s*(.*)/) { + $current_case_name = $1; + $case_label_map_ref->{$current_case_name}->{label} = 0; + $case_label_map_ref->{$current_case_name}->{label_str} = ""; + } elsif ($line =~ /^os\s*:\s*(\w[\w\, ]+)/) { + my @oss = split(",", $1); + foreach my $os (@oss) { + $os =~ s/^\s+|\s+$//g; + push @labels, "os=$os"; + } + } elsif ($line =~ /^arch\s*:\s*(\w[\w\, ]+)/) { + my @archs = split(",", $1); + foreach my $arch (@archs) { + $arch =~ s/^\s+|\s+$//g; + push @labels, "arch=$arch"; + } + } elsif ($line =~ /^hcp\s*:\s*(\w[\w\, ]+)/) { + my @hcps = split(",", $1); + foreach my $hcp (@hcps) { + $hcp =~ s/^\s+|\s+$//g; + push @labels, "hcp=$hcp"; + } + } elsif ($line =~ /^label\s*:\s*(.+)/) { + my @tmp = split(",", $1); + foreach my $l (@tmp){ + $l =~ s/^\s+|\s+$//g; + push @labels, $l; + } + } + + if($current_case_name){ + foreach my $t (@labels) { + unless (exists $label_map_ref->{$t}) { + $label_map_ref->{$t} = $label_value; + $label_value *= 2; + } + $case_label_map_ref->{$current_case_name}->{label} |= $label_map_ref->{$t}; + $case_label_map_ref->{$current_case_name}->{label_str} .= "$t,"; + } + } + } + } + return 0; +} From 2cc35b60905d32886165b3a4a90e19e8fe3a6f7f Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Wed, 13 Jun 2018 13:43:44 -0400 Subject: [PATCH 17/93] Failed to discover PDU --- xCAT-server/lib/xcat/plugins/switchdiscover.pm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index 0c347862e..d2c211f56 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -981,8 +981,14 @@ sub get_snmpvendorinfo { push @comm_list, 'public'; foreach $comms(@comm_list) { - #get sysDescr.0"; - my $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.47.1.1.1.1.2.1"; + #for pdu: get vendor info from sysDescr.0 + #for switches: get vendor info from product OID + my $ccmd; + if (exists($globalopt{pdu})) { + $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.1.1"; + } else { + $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.47.1.1.1.1.2.1"; + } if (exists($globalopt{verbose})) { send_msg($request, 0, "Process command: $ccmd\n"); } From 643fa238feb2657350d0b0320164eb046633af43 Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Thu, 14 Jun 2018 11:41:50 -0400 Subject: [PATCH 18/93] put name of OID --- xCAT-server/lib/xcat/plugins/switchdiscover.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index d2c211f56..35c792a52 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -981,8 +981,8 @@ sub get_snmpvendorinfo { push @comm_list, 'public'; foreach $comms(@comm_list) { - #for pdu: get vendor info from sysDescr.0 - #for switches: get vendor info from product OID + #for pdu: get vendor info from sysDescr + #for switches: get vendor info from entPhysicalDescr my $ccmd; if (exists($globalopt{pdu})) { $ccmd = "snmpwalk -Os -v1 -c $comms $ip 1.3.6.1.2.1.1.1"; From 18c5afc0f47544ed84f02c7a4dba9c8ad5acc2b1 Mon Sep 17 00:00:00 2001 From: Bin Xu Date: Fri, 15 Jun 2018 10:28:51 +0800 Subject: [PATCH 19/93] support secure root method (#5286) - support xcat_secure_pw: API in credential plugin - for diskless, if enabled secure root, packimage will not write root password into image - for stateful, if enabled secure root, nodeset will not write root password into config file - and 'remoteshell' will update shadow file accordingly --- perl-xCAT/xCAT/Schema.pm | 2 + xCAT-server/lib/perl/xCAT/Template.pm | 1 + xCAT-server/lib/xcat/plugins/credentials.pm | 11 ++++ xCAT-server/lib/xcat/plugins/packimage.pm | 6 +- xCAT/postscripts/remoteshell | 67 +++++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) diff --git a/perl-xCAT/xCAT/Schema.pm b/perl-xCAT/xCAT/Schema.pm index 3c1fe110f..a77358ce0 100755 --- a/perl-xCAT/xCAT/Schema.pm +++ b/perl-xCAT/xCAT/Schema.pm @@ -1178,6 +1178,8 @@ passed as argument rather than by table value', " all of the nodes passed into the cmd and create the mypostscript file\n" . " for each node, and put them in a directory of tftpdir(such as: /tftpboot)\n" . " If no, it will not generate the mypostscript file in the tftpdir.\n\n" . +" secureroot: If set to 1, xCAT will use secure mode to transfer root password hash\n" . +" during the installation. Default is 0.\n\n" . " setinstallnic: Set the network configuration for installnic to be static.\n\n" . " sharedtftp: Set to 0 or no, xCAT should not assume the directory\n" . " in tftpdir is mounted on all on Service Nodes. Default is 1/yes.\n" . diff --git a/xCAT-server/lib/perl/xCAT/Template.pm b/xCAT-server/lib/perl/xCAT/Template.pm index 0fd80d9ef..1440272b3 100644 --- a/xCAT-server/lib/perl/xCAT/Template.pm +++ b/xCAT-server/lib/perl/xCAT/Template.pm @@ -1598,6 +1598,7 @@ sub crydb }; $kp = $get_query_map->($key); return undef if (!defined($kp)); + return '*' if ($::XCATSITEVALS{secureroot} eq "1"); return xCAT::PasswordUtils::crypt_system_password($table, $kp, \@fields); } diff --git a/xCAT-server/lib/xcat/plugins/credentials.pm b/xCAT-server/lib/xcat/plugins/credentials.pm index f613f0152..f046deaeb 100644 --- a/xCAT-server/lib/xcat/plugins/credentials.pm +++ b/xCAT-server/lib/xcat/plugins/credentials.pm @@ -33,6 +33,7 @@ use IO::Socket::INET; use Time::HiRes qw(sleep); use xCAT::Utils; +use xCAT::PasswordUtils; use xCAT::MsgUtils; use Getopt::Long; @@ -316,6 +317,16 @@ sub process_request } $tfilename = "/etc/xcatdockerca/cert/dockerhost-cert.pem"; + } elsif ($parm =~ /xcat_secure_pw:/) { + xCAT::MsgUtils->trace(0, 'I', "credentials: sending $parm to $client"); + my @users=split(/:/,$parm); + if (defined($users[1]) and $users[1] eq 'root') { + my $pass = xCAT::PasswordUtils::crypt_system_password(); + if ($pass) { + push @{$rsp->{'data'}}, { content => [ $pass ], desc => [ $parm ] }; + } + } + next; } else { xCAT::MsgUtils->trace(0, 'W', "credentials: Not supported type: $parm"); next; diff --git a/xCAT-server/lib/xcat/plugins/packimage.pm b/xCAT-server/lib/xcat/plugins/packimage.pm index 709a04b31..18a219b3d 100755 --- a/xCAT-server/lib/xcat/plugins/packimage.pm +++ b/xCAT-server/lib/xcat/plugins/packimage.pm @@ -394,11 +394,15 @@ sub process_request { system("umount $rootimg_dir/proc"); copybootscript($installroot, $rootimg_dir, $osver, $arch, $profile, $callback); + my $pass = xCAT::PasswordUtils::crypt_system_password(); if (!defined($pass)) { $pass = 'cluster'; } - + my @secure_root = xCAT::TableUtils->get_site_attribute("secureroot"); + if ($secure_root[0] == 1) { + $pass = '*'; + } my $oldmask = umask(0077); my $shadow; open($shadow, "<", "$rootimg_dir/etc/shadow"); diff --git a/xCAT/postscripts/remoteshell b/xCAT/postscripts/remoteshell index 5d35add8e..4b424888d 100755 --- a/xCAT/postscripts/remoteshell +++ b/xCAT/postscripts/remoteshell @@ -462,6 +462,73 @@ then fi fi +# if secureroot is enabled then we get root password hash, not for updatenode +if [ "x$SECUREROOT" = "x1" ] && [ "x$UPDATENODE" != "x1" ]; then + logger -t xcat -p local4.info "remoteshell: secure root is enabled" + if [ $useflowcontrol = "1" ]; then + logger -t xcat -p local4.info "remoteshell: sending xcatflowrequest $master 3001" + /$xcatpost/xcatflowrequest $master 3001 + rc=$? + if [ $rc -ne 0 ]; then + logger -t xcat -p local4.info "remoteshell: error from xcatflowrequest (rc=$rc), will not use flow control" + useflowcontrol=0 + fi + fi + getcredentials.awk xcat_secure_pw:root | grep -E -v '|'|sed -e 's/<//' -e 's/&/&/' -e 's/"/"/' -e "s/'/'/" > /tmp/secure_root_hash + + logger -t xcat -p local4.info "remoteshell: gathering password hash for root" + #check whether the message is an error or not + grep -E '' /tmp/secure_root_hash > /dev/null + if [ $? -ne 0 ]; then + #The message contains the data we request + rootpwhash=`cat /tmp/secure_root_hash | grep -E '' | sed -n 's%.*\(.*\).*%\1%p'` + + MAX_RETRIES=10 + RETRY=0 + while [ -z "$rootpwhash" ]; do + if [ $useflowcontrol = "0" ]; then + let SLI=$RANDOM%10 + let SLI=SLI+10 + sleep $SLI + fi + RETRY=$(($RETRY+1)) + if [ $RETRY -eq $MAX_RETRIES ]; then + ERR_MSG="Too many retries" + break + fi + if [ $useflowcontrol = "1" ]; then + #first contact daemon xcatflowrequest 3001 + logger -t xcat -p local4.info "remoteshell: sending xcatflowrequest $master 3001" + /$xcatpost/xcatflowrequest $master 3001 + rc=$? + if [ $rc -ne 0 ]; then + logger -t xcat -p local4.info "remoteshell: error from xcatflowrequest (rc=$rc), will not use flow control" + useflowcontrol=0 + fi + fi + getcredentials.awk xcat_secure_pw:root | grep -E -v '|'|sed -e 's/<//' -e 's/&/&/' -e 's/"/"/' -e "s/'/'/" > /tmp/secure_root_hash + grep -E '' /tmp/secure_root_hash > /dev/null + if [ $? -ne 0 ]; then + rootpwhash=`cat /tmp/secure_root_hash | grep -E '' | sed -n 's%.*\(.*\).*%\1%p'` + else + ERR_MSG=`sed -n 's%.*\(.*\).*%\1%p' /tmp/secure_root_hash` + break + fi + done + if [ -n "$rootpwhash" ]; then + #updat shadow + usermod -p "$rootpwhash" root + fi + else + #This is an error message + ERR_MSG=`sed -n 's%.*\(.*\).*%\1%p' /tmp/secure_root_hash` + fi + rm /tmp/secure_root_hash + if [ "x" != "x$ERR_MSG" ]; then + logger -t xcat -p local4.err "Failed to acquire secure root password: $ERR_MSG" + fi +fi + # start up the sshd for syncfiles postscript to do the sync work logger -t xcat -p local4.info "start up sshd" if [[ $OSVER == ubuntu* || $OSVER == debian* ]] From c49e41da99104a0597743b1a11f129d7854b79b2 Mon Sep 17 00:00:00 2001 From: yangsong Date: Fri, 15 Jun 2018 14:51:41 +0800 Subject: [PATCH 20/93] support environment variables in osimage customized files (#5281) * * osimage table schema change: add a "environvar" col in osimage table to hold environment variables used in osimage customized files * osimage object schema change: add a environvar attribute, which refers to osimage.environvar * the environment variables specified in "environvar" attribute will be exported during invocation of postinstall scripts in genimage * support variables in synclists * support environment variables in genimage,mkinstall,getpostscript * support environment variables for xdcp -i -F in packimage --- perl-xCAT/xCAT/DSHCLI.pm | 74 +++++++++++++++++++ perl-xCAT/xCAT/Schema.pm | 7 +- perl-xCAT/xCAT/Utils.pm | 30 +++++++- xCAT-client/bin/xdsh | 7 +- xCAT-server/lib/perl/xCAT/Postage.pm | 26 ++++++- xCAT-server/lib/perl/xCAT/Template.pm | 1 + xCAT-server/lib/xcat/plugins/anaconda.pm | 13 +++- xCAT-server/lib/xcat/plugins/genimage.pm | 6 +- xCAT-server/lib/xcat/plugins/packimage.pm | 10 ++- .../share/xcat/netboot/imgutils/imgutils.pm | 22 +++++- xCAT-server/share/xcat/netboot/rh/genimage | 10 ++- 11 files changed, 190 insertions(+), 16 deletions(-) diff --git a/perl-xCAT/xCAT/DSHCLI.pm b/perl-xCAT/xCAT/DSHCLI.pm index 85693ec22..631b412c2 100644 --- a/perl-xCAT/xCAT/DSHCLI.pm +++ b/perl-xCAT/xCAT/DSHCLI.pm @@ -804,6 +804,46 @@ sub fork_fanout_dcp my @dcp_command; my $rsyncfile; + + my %envardict; + foreach my $varstr (split(',',$$target_properties{'envar'})){ + if($varstr =~ m/(.*)=(.*)/){ + my ($myvar,$myvalue)=($1,$2); + $envardict{$myvar}=$myvalue; + } + } + + if(%envardict){ + my $dest_srcdict=$$options{'destDir_srcFile'}{$user_target}; + for my $dest (keys %{$dest_srcdict}){ + my $newdest=$dest; + $newdest=xCAT::Utils->varsubinline($newdest,\%envardict); + for my $label(keys %{$$dest_srcdict{$dest}}){ + my $myref; + if('ARRAY' eq ref($$dest_srcdict{$dest}{$label})){ + for my $path(@{$$dest_srcdict{$dest}{$label}}){ + $path=xCAT::Utils->varsubinline($path,\%envardict); + } + }elsif('HASH' eq ref($$dest_srcdict{$dest}{$label})){ + for my $path(keys(%{$$dest_srcdict{$dest}{$label}})){ + my $newpath=$path; + $newpath=xCAT::Utils->varsubinline($newpath,\%envardict); + if($newpath ne $path){ + $$dest_srcdict{$dest}{$label}{$newpath}=$$dest_srcdict{$dest}{$label}{$path}; + delete $$dest_srcdict{$dest}{$label}{$path}; + } + } + } + } + if($newdest ne $dest){ + $$dest_srcdict{$newdest}=$$dest_srcdict{$dest}; + delete $$dest_srcdict{$dest}; + } + + } + } + + if (!$$target_properties{'localhost'}) # this is to a remote host { my $target_type = $$target_properties{'type'}; @@ -3293,6 +3333,13 @@ sub bld_resolve_nodes_hash $rsp->{info}->[0] = "Command: $cmd failed. Continuing..."; xCAT::MsgUtils->message("I", $rsp, $::CALLBACK); } + + + my $ostab = xCAT::Table->new('nodetype'); + my %oents = %{ $ostab->getNodesAttribs(\@target_list, [qw(provmethod)]) }; + + + foreach my $target (@target_list) { @@ -3306,12 +3353,27 @@ sub bld_resolve_nodes_hash if (($mname eq $target) || ($localhostname eq $target)) { $localhost = $target; } + + my $envar=undef; + my $ent = $oents{$target}->[0]; + if ($ent and $ent->{provmethod} and \ + ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot') and ($ent->{provmethod} ne 'statelite')) { + + my $imagename = $ent->{provmethod}; + my $osimagetab = xCAT::Table->new('osimage', -create => 1); + (my $ref) = $osimagetab->getAttribs({ imagename => $imagename }, 'environvar'); + if($ref){ + $envar=$ref->{'environvar'}; + } + } + my %properties = ( 'hostname' => $hostname, 'ip-address' => $ip_address, 'localhost' => $localhost, 'user' => $user, 'context' => $context, + 'envar' => $envar, 'unresolved' => $target ); @@ -4405,6 +4467,7 @@ sub parse_and_run_dcp $::XCATROOT = "/opt/xcat"; } + # parse the arguments Getopt::Long::Configure("posix_default"); Getopt::Long::Configure("no_gnu_compat"); @@ -4914,6 +4977,15 @@ sub rsync_to_image my ($input_file, $image) = @_; my $rc = 0; + + my %osimgenv; + if($ENV{'XCAT_OSIMAGE_ENV'}){ + foreach my $myenv(split(',',$ENV{'XCAT_OSIMAGE_ENV'})){ + if($myenv =~ /\s*(\S+)\s*=\s*(\S+)\s*/) { + $osimgenv{$1}=$2; + } + } + } open(INPUTFILE, "< $input_file") || die "File $input_file does not exist\n"; while (my $line = ) { @@ -4923,6 +4995,8 @@ sub rsync_to_image next; } + $line=xCAT::Utils->varsubinline($line,\%osimgenv); + # process no more lines, do not exec # do not execute postscripts when syncing images if (($line =~ /EXECUTE:/) || ($line =~ /EXECUTEALWAYS:/) diff --git a/perl-xCAT/xCAT/Schema.pm b/perl-xCAT/xCAT/Schema.pm index a77358ce0..3a78f33a8 100755 --- a/perl-xCAT/xCAT/Schema.pm +++ b/perl-xCAT/xCAT/Schema.pm @@ -768,7 +768,7 @@ passed as argument rather than by table value', }, }, osimage => { - cols => [qw(imagename groups profile imagetype description provmethod rootfstype osdistroname osupdatename cfmdir osname osvers osarch synclists postscripts postbootscripts serverrole isdeletable kitcomponents comments disable)], + cols => [qw(imagename groups profile imagetype description provmethod rootfstype osdistroname osupdatename cfmdir osname osvers osarch synclists postscripts postbootscripts serverrole isdeletable kitcomponents environvar comments disable)], keys => [qw(imagename)], tablespace => 'XCATTBS32K', table_desc => 'Basic information about an operating system image that can be used to deploy cluster nodes.', @@ -795,6 +795,7 @@ passed as argument rather than by table value', serverrole => 'The role of the server created by this osimage. Default roles: mgtnode, servicenode, compute, login, storage, utility.', isdeletable => 'A flag to indicate whether this image profile can be deleted. This attribute is only used by PCM.', kitcomponents => 'List of Kit Component IDs assigned to this OS Image definition.', + environvar => 'Comma delimited environment variables for the osimage', comments => 'Any user-written notes.', disable => "Set to 'yes' or '1' to comment out this row.", }, @@ -3478,6 +3479,10 @@ push(@{ $defspec{node}->{'attrs'} }, @nodeattrs); tabentry => 'nimimage.comments', access_tabentry => 'nimimage.imagename=attr:imagename', }, + { attr_name => 'environvar', + tabentry => 'osimage.environvar', + access_tabentry => 'osimage.imagename=attr:imagename', + }, ); ######################### diff --git a/perl-xCAT/xCAT/Utils.pm b/perl-xCAT/xCAT/Utils.pm index 4130b3397..7b76bcb9c 100644 --- a/perl-xCAT/xCAT/Utils.pm +++ b/perl-xCAT/xCAT/Utils.pm @@ -5004,4 +5004,32 @@ sub console_sleep { sleep($time); } -1; + +# replace the variables in $line with the values in dict ref $refvardict +# return the substitued $line +sub varsubinline{ + my $class=shift; + my $line=shift; + my $refvardict=shift; + + my @varsinline= $line =~ /\$\{?(\w+)\}?/g; + my @unresolvedvars; + foreach my $var(@varsinline){ + if(exists $refvardict->{$var}){ + $line=~ s/\$\{$var\}/$refvardict->{$var}/g; + $line=~ s/\$$var/$refvardict->{$var}/g; + }else{ + push @unresolvedvars,$var; + } + } + + return $line; +} + +#remove the left and right white spaces from string +sub strim{ + my $class=shift; + my $str=shift; + $str =~ s/^\s+|\s+$//g; + return $str; +} diff --git a/xCAT-client/bin/xdsh b/xCAT-client/bin/xdsh index 89e4ff0a6..666f51d97 100644 --- a/xCAT-client/bin/xdsh +++ b/xCAT-client/bin/xdsh @@ -13,7 +13,7 @@ use File::Basename; use Cwd; use Socket; -#use Data::Dumper; +use Data::Dumper; use Getopt::Long; require xCAT::MsgUtils; require xCAT::DSHCLI; @@ -195,6 +195,11 @@ if ($ENV{'DSH_VERIFY'}) push(@{ $cmdref->{env} }, "DSH_VERIFY=$ENV{'DSH_VERIFY'}"); } +if ($ENV{'XCAT_OSIMAGE_ENV'}) +{ + push(@{ $cmdref->{env} }, "XCAT_OSIMAGE_ENV=$ENV{'XCAT_OSIMAGE_ENV'}"); +} + xCAT::Client::submit_request($cmdref, \&xCAT::Client::handle_response); exit $xCAT::Client::EXITCODE; diff --git a/xCAT-server/lib/perl/xCAT/Postage.pm b/xCAT-server/lib/perl/xCAT/Postage.pm index 7fe50d925..553892415 100644 --- a/xCAT-server/lib/perl/xCAT/Postage.pm +++ b/xCAT-server/lib/perl/xCAT/Postage.pm @@ -18,6 +18,7 @@ use xCAT::Template; use xCAT::SvrUtils; use xCAT::Zone; +use Data::Dumper; use File::Basename; use Socket; use strict; @@ -319,7 +320,7 @@ sub makescript { #%image_hash is used to store the attributes in linuximage and nimimage tabs my %image_hash; - getImage(\%image_hash); + getImage(\%image_hash); # get postscript and postscript from postscripts and osimage tabs my $script_hash = xCAT::Postage::getScripts($nodes, \%image_hash); @@ -512,6 +513,16 @@ sub makescript { $osimgname = $provmethod; } + + if($image_hash{$osimgname}{'environvar'}){ + my $myenvstr=$image_hash{$osimgname}{'environvar'}; + foreach my $myenv(split(',',$myenvstr)){ + if($myenv =~ /\s*(\S+)\s*=\s*(\S+)\s*/) { + $ENV{$1}=$2; + } + } + } + my $osimage_vars; $osimage_vars = getImageitems_for_node($node, \%image_hash, $nodesetstate); @@ -1114,7 +1125,7 @@ sub getImage if ($^O =~ /^linux/i) { my $linuximagetab = xCAT::Table->new('linuximage', -create => 1); - my @et2 = $linuximagetab->getAllAttribs('imagename', 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir'); + my @et2 = $linuximagetab->getAllAttribs('imagename', 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir','environvar'); if (@et2) { foreach my $tmp_et2 (@et2) { my $imagename = $tmp_et2->{imagename}; @@ -1122,6 +1133,7 @@ sub getImage $image_hash->{$imagename}->{pkgdir} = $tmp_et2->{pkgdir}; $image_hash->{$imagename}->{otherpkglist} = $tmp_et2->{otherpkglist}; $image_hash->{$imagename}->{otherpkgdir} = $tmp_et2->{otherpkgdir}; + $image_hash->{$imagename}->{environvar} = $tmp_et2->{environvar}; } } } @@ -1190,6 +1202,11 @@ sub getImageitems_for_node $result .= "export OTHERPKGDIR\n"; } } + if ($ref1->{'environvar'}){ + foreach my $myenvar(split(',',$ref1->{'environvar'})){ + $result .='export '.$myenvar."\n"; + } + } } } else @@ -1813,6 +1830,8 @@ sub includefile my $file = shift; my $idir = shift; my @text = (); + + $file=xCAT::Utils->varsubinline($file,\%ENV); unless ($file =~ /^\//) { $file = $idir . "/" . $file; @@ -1948,7 +1967,7 @@ sub getScripts $script_hash{default_postboot} = $et->{'postbootscripts'}; - my @et2 = $ostab->getAllAttribs('imagename', 'postscripts', 'postbootscripts', 'osvers', 'osarch', 'profile', 'provmethod', 'synclists', 'kitcomponents'); + my @et2 = $ostab->getAllAttribs('imagename', 'postscripts', 'postbootscripts', 'osvers', 'osarch', 'profile', 'provmethod', 'synclists', 'kitcomponents','environvar'); if (@et2) { foreach my $tmp_et2 (@et2) { my $imagename = $tmp_et2->{imagename}; @@ -1959,6 +1978,7 @@ sub getScripts $image_hash->{$imagename}->{profile} = $tmp_et2->{profile}; $image_hash->{$imagename}->{provmethod} = $tmp_et2->{provmethod}; $image_hash->{$imagename}->{synclists} = $tmp_et2->{synclists}; + $image_hash->{$imagename}->{environvar} = $tmp_et2->{environvar}; $image_hash->{$imagename}->{kitcomponents} = $tmp_et2->{kitcomponents} if ($tmp_et2->{kitcomponents}); } } diff --git a/xCAT-server/lib/perl/xCAT/Template.pm b/xCAT-server/lib/perl/xCAT/Template.pm index 1440272b3..64caa91ce 100644 --- a/xCAT-server/lib/perl/xCAT/Template.pm +++ b/xCAT-server/lib/perl/xCAT/Template.pm @@ -1489,6 +1489,7 @@ sub includefile #2 means pattern list, pattern list starts with @, #3 means remove package list, packages to be removed start with -. my $text = ""; + $file=xCAT::Utils->varsubinline($file,\%ENV); unless ($file =~ /^\//) { $file = $idir . "/" . $file; } diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 1a1d4088c..5b780080e 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -18,7 +18,6 @@ use xCAT::MsgUtils; use xCAT::SvrUtils; use xCAT::Yum; -#use Data::Dumper; use Getopt::Long; Getopt::Long::Configure("bundling"); Getopt::Long::Configure("pass_through"); @@ -952,12 +951,13 @@ sub mkinstall if (!$osimagetab) { $osimagetab = xCAT::Table->new('osimage', -create => 1); } - (my $ref) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod', 'osupdatename'); + (my $ref) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod', 'osupdatename','environvar'); if ($ref) { $img_hash{$imagename}->{osver} = $ref->{'osvers'}; $img_hash{$imagename}->{osarch} = $ref->{'osarch'}; $img_hash{$imagename}->{profile} = $ref->{'profile'}; $img_hash{$imagename}->{provmethod} = $ref->{'provmethod'}; + $img_hash{$imagename}->{environvar} = $ref->{'environvar'}; if (!$linuximagetab) { $linuximagetab = xCAT::Table->new('linuximage', -create => 1); } @@ -1163,6 +1163,15 @@ sub mkinstall } else { $tmperr = "Unable to find template in /install/custom/install/$platform or $::XCATROOT/share/xcat/install/$platform (for $profile/$os/$arch combination)"; } + + if($img_hash{$imagename}->{environvar}){ + foreach my $myenv(split(',',$img_hash{$imagename}->{'environvar'})){ + if($myenv =~ /\s*(\S+)\s*=\s*(\S+)\s*/) { + $ENV{$1}=$2; + } + } + } + if (-r "$tmplfile") { $tmperr = diff --git a/xCAT-server/lib/xcat/plugins/genimage.pm b/xCAT-server/lib/xcat/plugins/genimage.pm index c98a05720..69d0c4c6d 100644 --- a/xCAT-server/lib/xcat/plugins/genimage.pm +++ b/xCAT-server/lib/xcat/plugins/genimage.pm @@ -73,6 +73,7 @@ sub process_request { my $dryrun; my $ignorekernelchk; my $noupdate; + my $envar; GetOptions( 'a=s' => \$arch, @@ -138,7 +139,7 @@ sub process_request { return 1; } - (my $ref_osimage_tab) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod'); + (my $ref_osimage_tab) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod','environvar'); unless ($ref_osimage_tab) { $callback->({ error => ["Cannot find image \'$imagename\' from the osimage table."], errorcode => [1] }); return 1; @@ -153,6 +154,7 @@ sub process_request { $osver = $ref_osimage_tab->{'osvers'}; $arch = $ref_osimage_tab->{'osarch'}; $profile = $ref_osimage_tab->{'profile'}; + $envar = $ref_osimage_tab->{'environvar'}; my $provmethod = $ref_osimage_tab->{'provmethod'}; # TODO: not necessary, and need to update both statelite and stateless modes unless ($osver and $arch and $profile and $provmethod) { @@ -318,7 +320,7 @@ sub process_request { if ($kerneldir) { $cmd .= " --kerneldir $kerneldir"; } if ($interactive) { $cmd .= " --interactive" } if ($onlyinitrd) { $cmd .= " --onlyinitrd" } - + if ($envar) { $cmd .= " --env $envar"; } if ($srcdir) { $cmd .= " --srcdir \"$srcdir\""; } if ($pkglist) { $cmd .= " --pkglist $pkglist"; } if ($srcdir_otherpkgs) { $cmd .= " --otherpkgdir \"$srcdir_otherpkgs\""; } diff --git a/xCAT-server/lib/xcat/plugins/packimage.pm b/xCAT-server/lib/xcat/plugins/packimage.pm index 18a219b3d..fe08e6c2b 100755 --- a/xCAT-server/lib/xcat/plugins/packimage.pm +++ b/xCAT-server/lib/xcat/plugins/packimage.pm @@ -99,6 +99,7 @@ sub process_request { my $imagename; my $dotorrent; my $provmethod; + my $envars; my $help; my $version; my $lock; @@ -153,7 +154,7 @@ sub process_request { $callback->({ error => ["The linuximage table cannot be opened."], errorcode => [1] }); return 1; } - (my $ref) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod', 'synclists'); + (my $ref) = $osimagetab->getAttribs({ imagename => $imagename }, 'osvers', 'osarch', 'profile', 'provmethod', 'synclists','environvar'); unless ($ref) { $callback->({ error => ["Cannot find image \'$imagename\' from the osimage table."], errorcode => [1] }); return 1; @@ -169,6 +170,7 @@ sub process_request { $profile = $ref->{'profile'}; $syncfile = $ref->{'synclists'}; $provmethod = $ref->{'provmethod'}; + $envars = $ref->{'environvar'}; unless ($osver and $arch and $profile and $provmethod) { $callback->({ error => ["osimage.osvers, osimage.osarch, osimage.profile and osimage.provmethod must be specified for the image $imagename in the database."], errorcode => [1] }); @@ -422,8 +424,12 @@ sub process_request { # sync fils configured in the synclist to the rootimage $syncfile = xCAT::SvrUtils->getsynclistfile(undef, $osver, $arch, $profile, "netboot", $imagename); if ( defined($syncfile) && -f $syncfile && -d $rootimg_dir) { + my $myenv=''; + if($envars){ + $myenv.=" XCAT_OSIMAGE_ENV=$envars"; + } print "Syncing files from $syncfile to root image dir: $rootimg_dir\n"; - system("$::XCATROOT/bin/xdcp -i $rootimg_dir -F $syncfile"); + system("$myenv $::XCATROOT/bin/xdcp -i $rootimg_dir -F $syncfile"); } } else { print "Bypass of syncfiles requested, will not sync files to root image directory.\n"; diff --git a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm index 71aae5185..e8cc25445 100644 --- a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm +++ b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm @@ -10,6 +10,24 @@ use File::Basename; use File::Path; use Cwd qw(realpath); +sub varsubinline{ + my $line=shift; + my $refvardict=shift; + + my @varsinline= $line =~ /\$\{?(\w+)\}?/g; + my @unresolvedvars; + foreach my $var(@varsinline){ + if(exists $refvardict->{$var}){ + $line=~ s/\$\{$var\}/$refvardict->{$var}/g; + $line=~ s/\$$var/$refvardict->{$var}/g; + }else{ + push @unresolvedvars,$var; + } + } + + return $line; +} + sub get_profile_def_filename { my $osver = shift; my $profile = shift; @@ -54,6 +72,8 @@ sub include_file my $file = shift; my $idir = shift; my @text = (); + + $file=varsubinline($file,\%ENV); unless ($file =~ /^\//) { $file = $idir . "/" . $file; } @@ -117,7 +137,6 @@ sub get_package_names { $pkgtext =~ s/#INCLUDE:([^#^\n]+)#/include_file($1,$idir)/eg; } } - #print "\n\npkgtext=$pkgtext\n\n"; my @tmp = split(',', $pkgtext); my $pass = 1; @@ -169,7 +188,6 @@ sub get_package_names { } } } - return %pkgnames; } diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 2fd822aa0..b119c7ca8 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -69,7 +69,7 @@ my $prompt; my $ignorekernelchk; my $noupdate; my $lock; - +my $envar; sub xdie { @@ -186,6 +186,7 @@ GetOptions( 'onlyinitrd' => \$onlyinitrd, 'ignorekernelchk' => \$ignorekernelchk, 'noupdate' => \$noupdate, + 'env=s' => \$envar, ); if (@ARGV > 0) { @@ -376,6 +377,11 @@ unless ($onlyinitrd) { exit 1; } + my @envarlist=split(',',$envar); + foreach my $entry (@envarlist){ + my ($key,$value)=split('=',$entry); + $ENV{xCAT::Utils->strim($key)}=xCAT::Utils->strim($value); + } mount_chroot($rootimg_dir); my %pkg_hash = imgutils::get_package_names($pkglist); @@ -784,6 +790,7 @@ if ($postinstall_filename) { $ENV{IMG_OTHERPKGLIST}=$otherpkglist if("" ne $otherpkglist); $ENV{IMG_OTHERPKGDIR}=$srcdir_otherpkgs if("" ne $srcdir_otherpkgs); $ENV{IMG_ROOTIMGDIR}=$rootimg_dir if("" ne $rootimg_dir); + foreach my $postinstall (split /,/, $postinstall_filename) { if (!-x $postinstall) { @@ -1944,7 +1951,6 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile "tmpfs /dev/shm tmpfs defaults 0 0\n"; print $cfgfile "proc /proc proc defaults 0 0\n"; print $cfgfile "sysfs /sys sysfs defaults 0 0\n"; - if (!&using_systemd($osver)) { if ($tmplimit) { print $cfgfile "tmpfs /tmp tmpfs defaults,size=$tmplimit 0 2\n"; From fde918f7511df847ef96b607a03b51c7eed34623 Mon Sep 17 00:00:00 2001 From: tingtli Date: Fri, 15 Jun 2018 17:48:27 +0800 Subject: [PATCH 21/93] add case for task 164,exporting the files referred in #INCLUDE:# in pkglist, otherpkglist, etc.. for xcat-inventory (#5282) * add case for task 164,exporting the files referred in #INCLUDE:# in pkglist, otherpkglist, etc.. for xcat-inventory * update according to comments * correct the export and import result directories,and remove unwantd files * update label for this case --- .../testcase/xcat-inventory/cases.include | 42 +++++++++++++++++++ .../templates/imagedata/test_osimage/exlist | 2 + .../templates/imagedata/test_osimage/file1.1 | 2 + .../templates/imagedata/test_osimage/file2.1 | 2 + .../templates/imagedata/test_osimage/file2.2 | 2 + .../templates/imagedata/test_osimage/file2.3 | 2 + .../templates/imagedata/test_osimage/file3.1 | 2 + .../templates/imagedata/test_osimage/file3.2 | 2 + .../templates/imagedata/test_osimage/file3.3 | 2 + .../templates/imagedata/test_osimage/file4.1 | 2 + .../templates/imagedata/test_osimage/file4.2 | 2 + .../templates/imagedata/test_osimage/file4.3 | 2 + .../templates/imagedata/test_osimage/file5 | 2 + .../templates/imagedata/test_osimage/file6 | 2 + .../templates/imagedata/test_osimage/file7 | 2 + .../imagedata/test_osimage/otherpkglist | 4 ++ .../imagedata/test_osimage/partitionfile | 2 + .../templates/imagedata/test_osimage/pkglist | 2 + .../imagedata/test_osimage/postinstall | 2 + .../imagedata/test_osimage/synclists | 2 + .../imagedata/test_osimage/template.tmpl | 2 + .../test_osimage/test_osimage.stanza | 13 ++++++ 22 files changed, 97 insertions(+) create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/cases.include create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/exlist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file1.1 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.1 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.3 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.1 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.3 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.1 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.3 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file5 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file6 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file7 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/otherpkglist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/partitionfile create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/pkglist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/postinstall create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/synclists create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/template.tmpl create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/test_osimage.stanza diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.include b/xCAT-test/autotest/testcase/xcat-inventory/cases.include new file mode 100644 index 000000000..2f168d599 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.include @@ -0,0 +1,42 @@ +start:export_import_osimage_with_INCLUDE_in_file +description:This case is used to test xcat-inventory export and import one linux osimage definition which has INCLUDE in the attribute's specified files. The attributes are pkglist, otherpkglist,exlist,synclists,template,postinstall and partitionfile. +label:xcat-inventory +cmd:dir="/tmp/imagedata/";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir +check:rc==0 +cmd:dir="/tmp/imagedata/export";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir +check:rc==0 +cmd:cp -rf /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage /tmp/imagedata +check:rc==0 +cmd:lsdef -t osimage -o test_osimage >/dev/null 2>&1;if [[ $? -eq 0 ]]; then lsdef -t osimage -o test_osimage -z >/tmp/imagedata/test_osimage.org.stanza ;rmdef -t osimage -o test_osimage;fi +check:rc==0 +cmd:cat /tmp/imagedata/test_osimage/test_osimage.stanza |mkdef -z +check:rc==0 +cmd:rm -rf /tmp/imagedata/test_osimage/test_osimage.stanza +cmd:lsdef -t osimage -o test_osimage +check:rc==0 +cmd:xcat-inventory export -t osimage -o test_osimage -d /tmp/imagedata/export +check:output=~The osimage objects has been exported to directory /tmp/imagedata/export +cmd:ls -lFR /tmp/imagedata/export +cmd:diff -r /tmp/imagedata/test_osimage /tmp/imagedata/export/test_osimage/tmp/imagedata/test_osimage/ +check:output=~Only in /tmp/imagedata/test_osimage: file7 +cmd:diff -y /etc/hosts /tmp/imagedata/export/test_osimage/etc/hosts +check:rc==0 +cmd:ls -l /tmp/imagedata/export/test_osimage/tmp/imagedata/test_osimage/file7 +check:rc!=0 +cmd: rmdef -t osimage -o test_osimage +check:rc==0 +cmd:rm -rf /tmp/imagedata/test_osimage +cmd:xcat-inventory import -t osimage -d /tmp/imagedata/export +check:rc==0 +check:output=~Importing object: test_osimage +check:output=~Inventory import successfully! +check:output=~The object test_osimage has been imported +cmd:lsdef -t osimage -o test_osimage +check:rc==0 +cmd:diff -r /tmp/imagedata/export/test_osimage/tmp/imagedata/test_osimage/ /tmp/imagedata/test_osimage +check:rc==0 +cmd: rmdef -t osimage -o test_osimage +check:rc==0 +cmd:dir="/tmp/imagedata"; rm -rf $dir; if [ -d ${dir}".bak" ];then mv ${dir}".bak" $dir; fi +cmd: if [ -e /tmp/imagedata/test_osimage.org.stanza ]; then cat /tmp/imagedata/test_osimage.org.stanza |mkdef -z;fi +end diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/exlist b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/exlist new file mode 100644 index 000000000..0aca75548 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/exlist @@ -0,0 +1,2 @@ +#Test file for exlist +#INCLUDE: /tmp/imagedata/test_osimage/file1.1# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file1.1 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file1.1 new file mode 100644 index 000000000..198b31359 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file1.1 @@ -0,0 +1,2 @@ +###Test file without INCLUDE +AAA diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.1 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.1 new file mode 100644 index 000000000..ed12e0334 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.1 @@ -0,0 +1,2 @@ +###Test file with one INCLUDE in the file +AAA diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.2 new file mode 100644 index 000000000..2949f7bbc --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.2 @@ -0,0 +1,2 @@ +###Test file with one INCLUDE in the file +BBB diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.3 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.3 new file mode 100644 index 000000000..a76a6b1d3 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file2.3 @@ -0,0 +1,2 @@ +###Test file with one INCLUDE in the file +CCC diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.1 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.1 new file mode 100644 index 000000000..182513e3c --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.1 @@ -0,0 +1,2 @@ +###Test file with serverl INCLUDE in the file +#INCLUDE:/tmp/imagedata/test_osimage/file3.2# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.2 new file mode 100644 index 000000000..1bfa29cff --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.2 @@ -0,0 +1,2 @@ +###Test file with serverl INCLUDE in the file +#INCLUDE:/tmp/imagedata/test_osimage/file3.3# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.3 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.3 new file mode 100644 index 000000000..19896eaa9 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file3.3 @@ -0,0 +1,2 @@ +###Test file with serverl INCLUDE in the file +AAA diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.1 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.1 new file mode 100644 index 000000000..d3d2ee784 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.1 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +#INCLUDE:/tmp/imagedata/test_osimage/file4.2# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.2 new file mode 100644 index 000000000..71b777ed2 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.2 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +#INCLUDE:/tmp/imagedata/test_osimage/file4.3# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.3 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.3 new file mode 100644 index 000000000..6685ac51a --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file4.3 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +#INCLUDE:/tmp/imagedata/test_osimage/file4.1# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file5 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file5 new file mode 100644 index 000000000..e1d35691b --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file5 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +#INCLUDE:/etc/hosts# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file6 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file6 new file mode 100644 index 000000000..c08a94e4f --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file6 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +AAA diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file7 b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file7 new file mode 100644 index 000000000..c08a94e4f --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file7 @@ -0,0 +1,2 @@ +#Test file for INCLUDE nesting file +AAA diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/otherpkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/otherpkglist new file mode 100644 index 000000000..918a6c0e8 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/otherpkglist @@ -0,0 +1,4 @@ +#Test file for otherpkglist +#INCLUDE: /tmp/imagedata/test_osimage/file2.1# +#INCLUDE: /tmp/imagedata/test_osimage/file2.2# +#INCLUDE: /tmp/imagedata/test_osimage/file2.3# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/partitionfile b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/partitionfile new file mode 100644 index 000000000..03f9f6229 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/partitionfile @@ -0,0 +1,2 @@ +#Test file for otherpkglist +#INCLUDE: /tmp/imagedata/test_osimage/file3.1# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/pkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/pkglist new file mode 100644 index 000000000..f94989176 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/pkglist @@ -0,0 +1,2 @@ +#Test file for otherpkglist +#INCLUDE: /tmp/imagedata/test_osimage/file4.1# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/postinstall b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/postinstall new file mode 100644 index 000000000..e3c718393 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/postinstall @@ -0,0 +1,2 @@ +#Test file for otherpkglist +#INCLUDE: /tmp/imagedata/test_osimage/file5# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/synclists b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/synclists new file mode 100644 index 000000000..10e4cb8f8 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/synclists @@ -0,0 +1,2 @@ +#Test file for synclists +#INCLUDE: ./file6# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/template.tmpl b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/template.tmpl new file mode 100644 index 000000000..75bca79e0 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/template.tmpl @@ -0,0 +1,2 @@ +#Test file for template +#INCLUDE: /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/file7# diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/test_osimage.stanza b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/test_osimage.stanza new file mode 100644 index 000000000..04ea48c78 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/imagedata/test_osimage/test_osimage.stanza @@ -0,0 +1,13 @@ +# + +test_osimage: + objtype=osimage + exlist=/tmp/imagedata/test_osimage/exlist + imagetype=linux + otherpkglist=/tmp/imagedata/test_osimage/otherpkglist + partitionfile=/tmp/imagedata/test_osimage/partitionfile + pkglist=/tmp/imagedata/test_osimage/pkglist + postinstall=/tmp/imagedata/test_osimage/postinstall + provmethod=install + synclists=/tmp/imagedata/test_osimage/synclists + template=/tmp/imagedata/test_osimage/template.tmpl From cce391e208e8f5580632793409c6e04269301144 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Mon, 18 Jun 2018 09:52:06 -0400 Subject: [PATCH 22/93] Add security notification for 2018-06-12 OpenSSL reported issue --- .../source/security/2018/20180612_openssl.rst | 21 +++++++++++++++++++ docs/source/security/2018/index.rst | 7 +++++++ docs/source/security/index.rst | 1 + 3 files changed, 29 insertions(+) create mode 100644 docs/source/security/2018/20180612_openssl.rst create mode 100644 docs/source/security/2018/index.rst diff --git a/docs/source/security/2018/20180612_openssl.rst b/docs/source/security/2018/20180612_openssl.rst new file mode 100644 index 000000000..e11dc06b0 --- /dev/null +++ b/docs/source/security/2018/20180612_openssl.rst @@ -0,0 +1,21 @@ +2018-06-12 - OpenSSL Vulnerabilities +==================================== + +*Jun 12, 2018*, OpenSSL announced the following security advisories: https://www.openssl.org/news/secadv/20180612.txt + + +Advisory CVEs +------------- + +* CVE-2018-0732 - **Client DoS due to large DH parameter** (Severity: Low) + +Please see the security bulletin above for patch, upgrade, or suggested work around information. + +Action +------ + +xCAT uses OpenSSL for client-server communication but **does not** ship it. + +It is highly recommended to keep your OpenSSL levels up-to-date with the indicated versions in the security bulletins to prevent any potential security threats. Obtain the updated software packages from your Operating system distribution channels. + + diff --git a/docs/source/security/2018/index.rst b/docs/source/security/2018/index.rst new file mode 100644 index 000000000..eb736ccb8 --- /dev/null +++ b/docs/source/security/2018/index.rst @@ -0,0 +1,7 @@ +2018 Notices +============ + +.. toctree:: + :maxdepth: 1 + + 20180612_openssl.rst diff --git a/docs/source/security/index.rst b/docs/source/security/index.rst index 911c9ec62..c97f5e61c 100644 --- a/docs/source/security/index.rst +++ b/docs/source/security/index.rst @@ -4,6 +4,7 @@ Security Notices .. toctree:: :maxdepth: 2 + 2018/index.rst 2017/index.rst 2016/index.rst 2015/index.rst From c6745a3dd54cf4414cc5a391bb6059d68b9ed0be Mon Sep 17 00:00:00 2001 From: robin2008 Date: Wed, 20 Jun 2018 09:13:29 +0800 Subject: [PATCH 23/93] enhance xcattest for better debug new case and acquire attribute not only for node: - to support customize the testcase dir with environment variable XCATTEST_CASEDIR - to allow to print more debug info with environment variable XCATTEST_DEBUG - to add a new func to get general object attribute (__GETOBJECTATTR(...)__) --- xCAT-test/xcattest | 52 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/xCAT-test/xcattest b/xCAT-test/xcattest index cbbe21220..6ef98f6cd 100755 --- a/xCAT-test/xcattest +++ b/xCAT-test/xcattest @@ -21,6 +21,7 @@ my $program_name = basename($0); my $rootdir = "$prpgram_path/../share/xcat/tools/autotest"; my $casedir = "$rootdir/testcase/"; +$casedir = $ENV{'XCATTEST_CASEDIR'} if exists $ENV{'XCATTEST_CASEDIR'}; my $bundledir = "$rootdir/bundle/"; my $resultdir = "$rootdir/result/"; my $rst = 0; @@ -56,6 +57,8 @@ my $running_log_fd = undef my $running_log_name = undef; my $failed_log_name = undef; my $performance_log_name = undef; +my $xcatdebug = 0; +$xcatdebug = 1 if exists $ENV{'XCATTEST_DEBUG'}; #--------------command line attrbutes-------------- my $needhelp = 0; @@ -177,8 +180,11 @@ if ($rst) { to_exit(1); } -#print "----case to be run-----------------\n"; -#print Dumper \@cases_to_be_run; + +if ($xcatdebug) { + print "----case to be run-----------------\n"; + print Dumper \@cases_to_be_run; +} if ($list) { if ($list eq "caselist") { @@ -340,12 +346,14 @@ if ($rst && $rst < 2) { to_exit(1); } -#print "=====Dumper loaded cases=======\n"; -#print Dumper \@cases; -#print "=====Dumper case_name_index_map=======================\n"; -#print Dumper \%case_name_index_map; -#print "=====Dumper cases to be run=====\n"; -#print Dumper \@cases_to_be_run; +if ($xcatdebug) { + print "=====Dumper loaded cases=======\n"; + print Dumper \@cases; + print "=====Dumper case_name_index_map=======================\n"; + print Dumper \%case_name_index_map; + print "=====Dumper cases to be run=====\n"; + print Dumper \@cases_to_be_run; +} unless (@cases_to_be_run) { to_exit(1); @@ -1647,7 +1655,7 @@ sub runscript { #-------------------------------------------------------- # Fuction name: getnodeattr -# Description: get the value of node attribute form current environment +# Description: get the value of node attribute from current environment # Atrributes: # Retrun code: #-------------------------------------------------------- @@ -1655,11 +1663,26 @@ sub getnodeattr { my $node = shift; my $attr = shift; my $maxtry = 40; + return getobjectattr('node', $node, $attr, $maxtry); +} + +#-------------------------------------------------------- +# Fuction name: getobjectattr +# Description: get the value of object attribute from current DB +# Atrributes: +# Retrun code: +#-------------------------------------------------------- +sub getobjectattr { + my $objtype = shift; + my $objname = shift; + my $attr = shift; + my $maxtry = shift; + $maxtry = 1 unless defined($maxtry) and $maxtry > 0; foreach my $try (0 .. $maxtry) { - my @output = runcmd("lsdef -t node -o $node -i $attr"); + my @output = runcmd("lsdef -t $objtype -o $objname -i $attr"); if ($::RUNCMD_RC == 0) { foreach my $line (@output) { - if ($line =~ /$attr=(\w.+)/) { + if ($line =~ /$attr=(\S.+)/) { return $1; } } @@ -1813,7 +1836,7 @@ sub getfunc { my $str = shift; - while ($str =~ /__(\w+)\(([\s\,\w\$]*)\)__/) { + while ($str =~ /__(\w+)\(([\s\,\w\$\-\.]*)\)__/) { my $func = $1; my $parameter = $2; my $value = undef; @@ -1827,6 +1850,11 @@ sub getfunc if ($value eq "Unknown") { $value = ''; } + } elsif ($func eq "GETOBJECTATTR") { + $value = getobjectattr(@para); + if ($value eq "Unknown") { + $value = ''; + } } elsif ($func eq "INC") { $value = $para[0] + 1; } elsif ($func eq "GETTABLEVALUE") { From 35b23b4d0e0683ebbffaf3151a0328375fe341b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Wed, 20 Jun 2018 15:53:39 +0800 Subject: [PATCH 24/93] Support Ubuntu 18.04. Add code name bionic to the build script (#5304) --- build-ubunturepo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-ubunturepo b/build-ubunturepo index 97ce0a1c1..ba4cd8dcb 100755 --- a/build-ubunturepo +++ b/build-ubunturepo @@ -69,7 +69,7 @@ for i in $*; do done # Supported distributions -dists="saucy trusty utopic xenial" +dists="saucy trusty utopic xenial bionic" c_flag= # xcat-core (trunk-delvel) path d_flag= # xcat-dep (trunk) path From f718db6b00e69a731d70563d6b8ea24bc2491927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Thu, 21 Jun 2018 10:24:37 +0800 Subject: [PATCH 25/93] Add pkglist files for Ubuntu 18.04 (#5307) --- .../compute.ubuntu18.04.ppc64el.pkglist | 15 +++++++++++++++ .../compute.ubuntu18.04.ppc64le.pkglist | 1 + .../compute.ubuntu18.04.ppc64el.pkglist | 19 +++++++++++++++++++ .../compute.ubuntu18.04.ppc64le.pkglist | 1 + .../ubuntu/compute.ubuntu18.04.x86_64.pkglist | 19 +++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist create mode 120000 xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64le.pkglist create mode 100644 xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist create mode 120000 xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64le.pkglist create mode 100644 xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist diff --git a/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist new file mode 100644 index 000000000..a2a01bc6e --- /dev/null +++ b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist @@ -0,0 +1,15 @@ +bash +nfs-common +openssl +isc-dhcp-client +libc-bin +openssh-server +openssh-client +wget +vim +ntp +ntpdate +rsync +busybox-static +gawk +dnsutils diff --git a/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64le.pkglist b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64le.pkglist new file mode 120000 index 000000000..450fee27f --- /dev/null +++ b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64le.pkglist @@ -0,0 +1 @@ +compute.ubuntu18.04.ppc64el.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist new file mode 100644 index 000000000..df556b887 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist @@ -0,0 +1,19 @@ +bash +nfs-common +openssl +isc-dhcp-client +libc-bin +linux-image-generic +openssh-server +openssh-client +wget +vim +ntp +ntpdate +rsync +busybox-static +gawk +dnsutils +tar +gzip +xz-utils diff --git a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64le.pkglist b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64le.pkglist new file mode 120000 index 000000000..450fee27f --- /dev/null +++ b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64le.pkglist @@ -0,0 +1 @@ +compute.ubuntu18.04.ppc64el.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist new file mode 100644 index 000000000..df556b887 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist @@ -0,0 +1,19 @@ +bash +nfs-common +openssl +isc-dhcp-client +libc-bin +linux-image-generic +openssh-server +openssh-client +wget +vim +ntp +ntpdate +rsync +busybox-static +gawk +dnsutils +tar +gzip +xz-utils From 56b8762801e47ae81f9610542b22eda785e7176c Mon Sep 17 00:00:00 2001 From: xuweibj Date: Thu, 21 Jun 2018 01:01:51 -0400 Subject: [PATCH 26/93] fix error of xcatmn --- xCAT-probe/subcmds/xcatmn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xCAT-probe/subcmds/xcatmn b/xCAT-probe/subcmds/xcatmn index 2cabc7013..2c1f2cd25 100755 --- a/xCAT-probe/subcmds/xcatmn +++ b/xCAT-probe/subcmds/xcatmn @@ -1146,7 +1146,9 @@ sub check_daemon_attributes { my $node_num = `nodels 2>&1 | wc -l`; chomp($node_num); my $xcatmaxconnections = 64; + my $xcatmaxconnections_site = 64; my $xcatmaxbatchconnections = 50; + my $xcatmaxbatchconnections_site = 50; my @site_max_info = `lsdef -t site -i xcatmaxconnections,xcatmaxbatchconnections -c 2>&1`; foreach my $site_max (@site_max_info) { From c922ad2cf74626b4b30705f83f496282c0371f8a Mon Sep 17 00:00:00 2001 From: cxhong Date: Thu, 21 Jun 2018 01:38:31 -0400 Subject: [PATCH 27/93] Find correct template and postinstall file to build osimage for copycds -n command (#5300) * Parse copycd -n options to get correct tmpl and postinstall file * Add support for Ubuntu --- xCAT-server/lib/perl/xCAT/SvrUtils.pm | 113 +++++++++++++++++++------- 1 file changed, 85 insertions(+), 28 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/SvrUtils.pm b/xCAT-server/lib/perl/xCAT/SvrUtils.pm index 37dab6083..a82c7d422 100755 --- a/xCAT-server/lib/perl/xCAT/SvrUtils.pm +++ b/xCAT-server/lib/perl/xCAT/SvrUtils.pm @@ -452,37 +452,59 @@ sub get_file_name { #usally there're only 4 arguments passed for this function #the $genos is only used for the Redhat family - my $dotpos = rindex($os, "."); - my $osbase = substr($os, 0, $dotpos); #handle the following ostypes: sles10.2, sles11.1, rhels5.3, rhels5.4, etc if (-r "$searchpath/$profile.$os.$arch.$extension") { return "$searchpath/$profile.$os.$arch.$extension"; } - elsif (-r "$searchpath/$profile.$os.$extension") { + if (-r "$searchpath/$profile.$os.$extension") { return "$searchpath/$profile.$os.$extension"; } - elsif (($genos) && (-r "$searchpath/$profile.$genos.$arch.$extension")) { + if (($genos) && (-r "$searchpath/$profile.$genos.$arch.$extension")) { return "$searchpath/$profile.$genos.$arch.$extension"; } - elsif (($genos) && (-r "$searchpath/$profile.$genos.$extension")) { + if (($genos) && (-r "$searchpath/$profile.$genos.$extension")) { return "$searchpath/$profile.$genos.$extension"; } + + my $dotpos = rindex($os, "."); + my $osbase = substr($os, 0, $dotpos); # If the osimge name was specified with -n, the name might contain multiple "." # Chop them off one at a time until filename match is found - else { - while ($dotpos > 0) { + while ($dotpos > 0) { + if (-r "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-r "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; + } + # Chop off "." from the end and try again + $dotpos = rindex($osbase, "."); + $osbase = substr($osbase, 0, $dotpos); + } - if (-r "$searchpath/$profile.$osbase.$arch.$extension") { - return "$searchpath/$profile.$osbase.$arch.$extension"; - } - elsif (-r "$searchpath/$profile.$osbase.$extension") { - return "$searchpath/$profile.$osbase.$extension"; - } - # Chop off "." from the end and try again - $dotpos = rindex($osbase, "."); - $osbase = substr($osbase, 0, $dotpos); + #if there are no '.', pick the two numbers follow by leading string, like sles11 + #then pick one number follow by leading string, like centos7, rhels7 + if ($os =~ m/([a-zA-Z]+\d\d)/) + { + $osbase=$1; + if (-r "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-r "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; + } + } + + if ($os =~ m/([a-zA-Z]+\d)/) + { + $osbase = $1; + if (-r "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-r "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; } } @@ -490,12 +512,11 @@ sub get_file_name { if (-r "$searchpath/$profile.$arch.$extension") { return "$searchpath/$profile.$arch.$extension"; } - elsif (-r "$searchpath/$profile.$extension") { + if (-r "$searchpath/$profile.$extension") { return "$searchpath/$profile.$extension"; } - else { - return undef; - } + + return undef; } sub get_tmpl_file_name { @@ -541,24 +562,60 @@ sub get_postinstall_file_name { if (-x "$searchpath/$profile.$os.$arch.$extension") { return "$searchpath/$profile.$os.$arch.$extension"; } - elsif (-x "$searchpath/$profile.$osbase.$arch.$extension") { + if (-x "$searchpath/$profile.$osbase.$arch.$extension") { return "$searchpath/$profile.$osbase.$arch.$extension"; } - elsif (-x "$searchpath/$profile.$os.$extension") { + if (-x "$searchpath/$profile.$os.$extension") { return "$searchpath/$profile.$os.$extension"; } - elsif (-x "$searchpath/$profile.$osbase.$extension") { + if (-x "$searchpath/$profile.$osbase.$extension") { return "$searchpath/$profile.$osbase.$extension"; } - elsif (-x "$searchpath/$profile.$arch.$extension") { + # If the osimge name was specified with -n, the name might contain multiple "." + # Chop them off one at a time until filename match is found + while ($dotpos > 0) { + if (-x "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-x "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; + } + # Chop off "." from the end and try again + $dotpos = rindex($osbase, "."); + $osbase = substr($osbase, 0, $dotpos); + } + + #if there are no '.', pick the two numbers follow by leading string, like sles11 + #then pick one number follow by leading string, like centos7, rhels7 + if ($os =~ m/([a-zA-Z]+\d\d)/) + { + $osbase=$1; + if (-x "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-x "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; + } + } + + if ($os =~ m/([a-zA-Z]+\d)/) + { + $osbase = $1; + if (-x "$searchpath/$profile.$osbase.$arch.$extension") { + return "$searchpath/$profile.$osbase.$arch.$extension"; + } + if (-x "$searchpath/$profile.$osbase.$extension") { + return "$searchpath/$profile.$osbase.$extension"; + } + } + + if (-x "$searchpath/$profile.$arch.$extension") { return "$searchpath/$profile.$arch.$extension"; } - elsif (-x "$searchpath/$profile.$extension") { + if (-x "$searchpath/$profile.$extension") { return "$searchpath/$profile.$extension"; } - else { - return undef; - } + return undef; } From 2bf8108af61b7330f2b99daa4285c8bce90c4893 Mon Sep 17 00:00:00 2001 From: cxhong Date: Thu, 21 Jun 2018 01:40:41 -0400 Subject: [PATCH 28/93] build xnba config files from boottarget table (#5296) --- xCAT-server/lib/xcat/plugins/xnba.pm | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/xnba.pm b/xCAT-server/lib/xcat/plugins/xnba.pm index 7fdaec0d7..01eb1747c 100644 --- a/xCAT-server/lib/xcat/plugins/xnba.pm +++ b/xCAT-server/lib/xcat/plugins/xnba.pm @@ -105,11 +105,20 @@ sub setstate { my %machash = %{ shift() }; my %iscsihash = %{ shift() }; my $tftpdir = shift; - my %linuximghash = (); my $linuximghashref = shift; - if (ref $linuximghashref) { %linuximghash = %{$linuximghashref}; } - my $imgaddkcmdline = ($linuximghash{'boottarget'}) ? undef : $linuximghash{'addkcmdline'}; + my $kern = $bphash{$node}->[0]; + my $imgaddkcmdline = $linuximghashref->{'addkcmdline'}; + my $imgboottarget = $linuximghashref->{'boottarget'}; + + # get kernel and initrd from boottarget table + my $bttab; + my $btentry; + if ($imgboottarget) { + $bttab = xCAT::Table->new('boottarget'); + $btentry = $bttab->getAttribs({ 'bprofile' => $imgboottarget }, 'kernel', 'initrd', 'kcmdline'); + } + unless ($::XNBA_addkcmdlinehandled->{$node}) { #Tag to let us know the plugin had a special syntax implemented for addkcmdline if ($kern->{addkcmdline} or ($imgaddkcmdline)) { @@ -171,6 +180,18 @@ sub setstate { } } + + #fill in kernel, intrd and kcmdline from boottarget table if not available + unless ($kern->{kernel}) { + $kern->{kernel} = $btentry->{kernel}; + } + unless ($kern->{initrd}) { + $kern->{initrd} = $btentry->{initrd}; + } + unless ($kern->{kcmdline}) { + $kern->{kcmdline} = $btentry->{kcmdline}; + } + my $elilokcmdline = $kern->{kcmdline}; #track it separate, since vars differ my $pxelinuxkcmdline = $kern->{kcmdline}; #track it separate, since vars differ if ($kern->{kcmdline} =~ /!myipfn!/) { From 8d0d4d27a74c95b8fc2cee42f84844037b8e9dec Mon Sep 17 00:00:00 2001 From: xuweibj Date: Thu, 21 Jun 2018 02:41:12 -0400 Subject: [PATCH 29/93] modify confluent doc based on verification --- .../confluent/client/confluent_client.rst | 10 ++- .../confluent/server/confluent_server.rst | 80 ++++++------------- 2 files changed, 31 insertions(+), 59 deletions(-) diff --git a/docs/source/advanced/confluent/client/confluent_client.rst b/docs/source/advanced/confluent/client/confluent_client.rst index 1c1bfe5b2..8fdce725f 100644 --- a/docs/source/advanced/confluent/client/confluent_client.rst +++ b/docs/source/advanced/confluent/client/confluent_client.rst @@ -40,13 +40,19 @@ If you want to use the xCAT Keys, you can simple copy them into ``/etc/confluent cp /etc/xcat/cert/server-key.pem /etc/confluent/privkey.pem cp /etc/xcat/cert/server-cert.pem /etc/confluent/srvcert.pem +The user and password may alternatively be provided via environment variables: :: + + CONFLUENT_USER=vhu + CONFLUENT_PASSPHRASE="mynewpassword" + export CONFLUENT_USER CONFLUENT_PASSPHRASE Start confetty, specify the server IP address: :: confetty -s 127.0.0.1 +If you want to run a confluent command against another host, could set the CONFLUENT_HOST variable: :: - -TODO: Add text for exporting user/pass into environment + CONFLUENT_HOST=127.0.0.1 + export CONFLUENT_HOST diff --git a/docs/source/advanced/confluent/server/confluent_server.rst b/docs/source/advanced/confluent/server/confluent_server.rst index 8591055ee..c0634506b 100644 --- a/docs/source/advanced/confluent/server/confluent_server.rst +++ b/docs/source/advanced/confluent/server/confluent_server.rst @@ -2,33 +2,11 @@ Getting Started =============== -For xCAT 2.9.1 and later, confluent is intended to be used in conjunction with xCAT. +Confluent is intended to be used in conjunction with xCAT. The following documentation assumes that xCAT is already installed and configured on the management node. -Download -======== - -confluent ---------- - -rpms -~~~~ - -The latest confluent rpms are built and provided for your convenience: `confluent rpms `_. However, the rpms are not built on a regular release schedule. To use the latest code base, consider building the rpms from :ref:`label_confluent_source`. - -The following example downloads the confluent tar package and creates a local repository on your management node:: - - mkdir ~/confluent - cd ~/confluent - wget https://path-to-confluent/confluent-X.X-repo.tbz2 - tar jxvf confluent-X.X-repo.tbz2 - cd confluent-X.X - ./mklocalrepo.sh - -.. _label_confluent_source: - -source -~~~~~~ +Download confluent +================== To build from source, ensure your machine has the correct development packages to build rpms, then execute the following: @@ -42,33 +20,26 @@ To build from source, ensure your machine has the correct development packages t cd confluent/confluent_client ; ./buildrpm ; cd - -confluent-dep -------------- - -The latest confluent dependency packages are provided for your convenience: `confluent-deps `_ - -The following example describes the steps for **rhels7.1** on **ppc64le**:: - - mkdkir ~/confluent - cd ~/confluent - wget https://path/to/confluent-dep/rh7/ppc64le/confluent-dep-rh7-ppc64le.tar.bz2 - tar -jxvf confluent-dep-rh7-ppc64le.tar.bz2 - cd confluent-dep-rh7-ppc64le/ - ./mklocalrepo.sh - -.. note:: If the OS/architecture you are looking for is not provided under confluent-dep, send an email to the xcat-user mailing list: xcat-user@lists.sourceforge.net - - Install ======= -*confluent and confluent-deps must be downloaded to the management node before installing* +dependency +---------- -xCAT 2.9.1 began shipping a new rpm ``xCAT-confluent``. +The following example describes the steps for **rhels7.5** on **ppc64le**:: -Installing ``xCAT-confluent`` via yum will pull in the confluent dependencies:: + yum install libffi-devel.ppc64le + yum install openssl-devel + pip install crypto pyasn1 pycrypto eventlet pyparsing netifaces scrapy pysnmp paramiko pyghmi pyte - yum install xCAT-confluent + +confluent +--------- + +Installing ``xCAT-confluent`` via rpm:: + + rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_server-*.noarch.rpm + rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_client-*.noarch.rpm You may find it helpful to add the confluent paths into your system path:: @@ -76,6 +47,7 @@ You may find it helpful to add the confluent paths into your system path:: export PATH=$CONFLUENTROOT/bin:$PATH export MANPATH=$CONFLUENTROOT/share/man:$MANPATH + Configuration ============= @@ -92,7 +64,8 @@ To stop confluent:: If you want confluent daemon to start automatically at bootup, add confluent service to ``chkconfig``:: - chkconfig --add confluent + chkconfig confluent on + Replacing conserver with confluent ---------------------------------- @@ -111,11 +84,6 @@ Use ``rcons`` as before to start the console session.:: rcons - # If using confluent, a timestamp will be shown on the - # console title next to the node name - [15:05] - - Web Browser access ================== @@ -136,19 +104,17 @@ It is **highly** recommended that you create a non-root user to access the sessi Rest Explorer ============= -TODO: some intro text - Configure the httpd configuration for confluent-api by creating a ``confluent.conf`` file under ``/etc/httpd/conf.d/`` directory:: The example uses server ip: 10.2.5.3 and port 4005 - cat /etc/httpd/conf.d/confluent.conf + # cat /etc/httpd/conf.d/confluent.conf LoadModule proxy_http_module modules/mod_proxy_http.so ProxyPass http://10.2.5.3:4005 - - #restart httpd + + # restart httpd service httpd restart Now point your browser to: ``http://:`` and log in with the non-root user and password created above. From ab0c535f1a1dd50997323cab8c97d103a702c071 Mon Sep 17 00:00:00 2001 From: tingtli Date: Thu, 21 Jun 2018 15:40:13 +0800 Subject: [PATCH 30/93] update cases for task168, support environment variables in osimage in ventory data and files (#5295) * update cases for task168, support environment variables in osimage inventory data and files * update label for this case * update label for this case * update according to comments * update according to comments --- .../testcase/xcat-inventory/cases.environment | 80 ++++++++++++++++++ .../gitrepo/otherpkglist/test1.otherpkglist | 1 + .../gitrepo/otherpkglist/test2.otherpkglist | 1 + .../environment/gitrepo/pkglist/test1.pkglist | 1 + .../environment/gitrepo/pkglist/test2.pkglist | 1 + .../gitrepo/postinstall/test1.postinstall | 52 ++++++++++++ .../gitrepo/postinstall/test2.postinstall | 5 ++ .../environment/gitrepo/syncfiles/synclist | 1 + .../conserver-xcat-8.2.1-1.ppc64le.rpm | Bin 0 -> 188532 bytes .../perl-Net-Telnet-3.03-19.el7.noarch.rpm | Bin 0 -> 56828 bytes ...5a5171ab309a2aef1d4f6efe3-filelists.xml.gz | Bin 0 -> 664 bytes ...a9ea473f9f5f6da76997276c1-other.sqlite.bz2 | Bin 0 -> 1359 bytes ...6945143e6be4f69489eb59a4aa8-primary.xml.gz | Bin 0 -> 1667 bytes ...0078ecc06d5710c0520dc56-primary.sqlite.bz2 | Bin 0 -> 3376 bytes ...394ce110227f7d48f999a86d90ede-other.xml.gz | Bin 0 -> 729 bytes ...5dd773b0550c7f191e3f8-filelists.sqlite.bz2 | Bin 0 -> 1628 bytes .../swdir/otherpkgdir/repodata/repomd.xml | 55 ++++++++++++ .../pkgdir/dhcp-4.2.5-68.el7.ppc64le.rpm | Bin 0 -> 512044 bytes ...a2347d46b43de8cf48931-filelists.sqlite.bz2 | Bin 0 -> 1482 bytes ...823e5ba319d0ddbed4b2a2397-filelists.xml.gz | Bin 0 -> 527 bytes ...03bb1f59a73e373b5cebcf03d65-primary.xml.gz | Bin 0 -> 1269 bytes ...ad5227802c0c02bb73dd72ce1-other.sqlite.bz2 | Bin 0 -> 1388 bytes ...f7423ec46cf25221fb1193e35611b-other.xml.gz | Bin 0 -> 749 bytes ...d788e791d259673af365373-primary.sqlite.bz2 | Bin 0 -> 2967 bytes .../swdir/pkgdir/repodata/repomd.xml | 55 ++++++++++++ .../swdir/pkgdir/tftp-5.2-22.el7.ppc64le.rpm | Bin 0 -> 40068 bytes .../test.environments.osimage.yaml | 23 +++++ 27 files changed, 275 insertions(+) create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/cases.environment create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test1.otherpkglist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test2.otherpkglist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test1.pkglist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test2.pkglist create mode 100755 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test1.postinstall create mode 100755 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test2.postinstall create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/syncfiles/synclist create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/conserver-xcat-8.2.1-1.ppc64le.rpm create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/perl-Net-Telnet-3.03-19.el7.noarch.rpm create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/2f8132e926de0ada34da23f1a63713a9e6761fa5a5171ab309a2aef1d4f6efe3-filelists.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/771b092d010ec878233b66dc1dba2ab81b614c5a9ea473f9f5f6da76997276c1-other.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/8a1f4155ca9e8784d0a41e5a9b5b715af7f096945143e6be4f69489eb59a4aa8-primary.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/98590d4faf7b8f997493a85d6fcbb6aa2ede7a9b30078ecc06d5710c0520dc56-primary.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/bd36e0c2e540280fd45799e9f755a72f63b394ce110227f7d48f999a86d90ede-other.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/e3cf2fc42c62b0328effe9e44a4ab1296905ae92f845dd773b0550c7f191e3f8-filelists.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/repomd.xml create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/dhcp-4.2.5-68.el7.ppc64le.rpm create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/2a9abe54b23615850e70c41456bd49ff3994eae972ea2347d46b43de8cf48931-filelists.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/4160c0db6523d465541345245e8463eacd03e5f823e5ba319d0ddbed4b2a2397-filelists.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/75c2df3e4d5ca66a0c105562f4d0cea1c0c1203bb1f59a73e373b5cebcf03d65-primary.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/811daeb0fde54384fec22af72ecdcdd2d4d8060ad5227802c0c02bb73dd72ce1-other.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/9fcfad63d06bdaba2be3507fbb1cd080db5f7423ec46cf25221fb1193e35611b-other.xml.gz create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/e4f965fd5f4b914c4e89d54b8784394b7760e051dd788e791d259673af365373-primary.sqlite.bz2 create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/repomd.xml create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/tftp-5.2-22.el7.ppc64le.rpm create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.yaml diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.environment b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment new file mode 100644 index 000000000..b0cdf61bc --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment @@ -0,0 +1,80 @@ +start:import_osimage_with_environments_in_yaml +description:this case is to verify if osimage import could support environment variables. +os:Linux +label:xcat_install,xcat_inventory,provision +cmd:chdef -t node -o $$CN servicenode= monserver=$$MN nfsserver=$$MN tftpserver=$$MN xcatmaster=$$MN +check:rc==0 + +cmd:makedns -n +check:rc==0 +cmd:sleep 20 +cmd:if [[ "__GETNODEATTR($$CN,arch)__" = "ppc64" ]] && [[ "__GETNODEATTR($$CN,mgt)__" != "ipmi" ]]; then getmacs -D $$CN; fi +check:rc==0 +cmd:makedhcp -n +check:rc==0 +cmd:makedhcp -a +check:rc==0 +cmd:a=0;while true; do [ $a -eq 100 ] && exit 1;output=$(makedhcp -q $$CN);[ $? -ne 0 ] && exit 1;echo $output|grep $$CN 2>/dev/null && exit 0;a=$[$a+1];sleep 1;done +check:rc==0 +cmd:copycds $$ISO +check:rc==0 + +cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir ]; then mv $rootimgdir $rootimgdir.regbak -f;fi +check:rc==0 +cmd:export GITREPO="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo";export SWDIR="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir";xcat-inventory import -f /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.yaml +check:output=~Importing object: test.environments.osimage +check:output=~Inventory import successfully! +check:rc==0 +cmd:lsdef -t osimage -o test.environments.osimage +check:rc==0 +cmd:genimage test.environments.osimage +check:rc==0 +cmd:packimage test.environments.osimage +check:rc==0 + +cmd:rinstall $$CN osimage=test.environments.osimage +check:rc==0 +check:output=~Provision node\(s\)\: $$CN + +cmd:if [[ -f /var/lib/dhcp/db/dhcpd.leases ]]; then cat /var/lib/dhcp/db/dhcpd.leases; elif [[ -f /var/lib/dhcpd/dhcpd.leases ]];then cat /var/lib/dhcpd/dhcpd.leases;elif [[ -f /var/lib/dhcp/dhcpd.leases ]];then cat /var/lib/dhcp/dhcpd.leases; fi +cmd:cat /tmp/mountoutput/file.org +cmd:sleep 300 +cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ $a -gt 60 ];then break;fi done + +cmd:ping $$CN -c 3 +check:rc==0 +check:output=~64 bytes from $$CN +cmd:lsdef -l $$CN | grep status +check:rc==0 +check:output=~booted +cmd:xdsh $$CN date +check:rc==0 +check:output=~\d\d:\d\d:\d\d +cmd:xdsh $$CN mount +check:rc==0 +check:output=~on / type tmpfs +cmd:sleep 120 +cmd:ping $$CN -c 3 +check:rc==0 +check:output=~64 bytes from $$CN + +cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir.regbak ]; then rm -rf $rootimgdir; mv $rootimgdir.regbak $rootimgdir; fi +check:rc==0 +cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" +cmd:xdsh $$CN "cat /tmp/synclist" +check:rc==0 +cmd:xdsh $$CN "cat /tmp/test1.postinstall" +check:rc==0 +check:output=~test postisntall +cmd:xdsh $$CN "cat /tmp/test2.postinstall" +check:rc==0 +check:output=~test postisntall +cmd:xdsh $$CN "rpm -qa |grep -i conserver-xcat" +check:rc==0 +cmd:xdsh $$CN "rpm -qa |grep -i perl-Net-Telnet" +check:rc==0 +cmd:xdsh $$CN "rpm -qa |grep -i tftp" +check:rc==0 +cmd:xdsh $$CN "rpm -qa |grep -w dhcp" +check:rc==0 +end diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test1.otherpkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test1.otherpkglist new file mode 100644 index 000000000..2209b1f9f --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test1.otherpkglist @@ -0,0 +1 @@ +conserver-xcat diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test2.otherpkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test2.otherpkglist new file mode 100644 index 000000000..7abe5bf95 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test2.otherpkglist @@ -0,0 +1 @@ +perl-Net-Telnet diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test1.pkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test1.pkglist new file mode 100644 index 000000000..72ab18f1e --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test1.pkglist @@ -0,0 +1 @@ +dhcp diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test2.pkglist b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test2.pkglist new file mode 100644 index 000000000..63cfc228d --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test2.pkglist @@ -0,0 +1 @@ +tftp diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test1.postinstall b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test1.postinstall new file mode 100755 index 000000000..979d03cf4 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test1.postinstall @@ -0,0 +1,52 @@ +#!/bin/sh +#-- Do not remove following line if you want to make use of CVS version tracking +#-- $Id: compute.postinstall,v 1.21 2008/09/04 12:05:45 sikorsky Exp $ +#-- jurij.sikorsky@t-systems.cz +#-- +#-- this script is run after all packages from $profile.pkglist are installed +#-- +#-- it gets these arguments: +#-- +#-- $1 = install root (chroot directory for profile) +#-- $2 = OS version +#-- $3 = architecture +#-- $4 = profile name +#-- $5 = work dir (where genimage is located) +#-- +#-- +installroot=$1 +osver=$2 +arch=$3 +profile=$4 +workdir=$5 + +#-- Example how /etc/fstab can be automatically generated during image generation: +cat <$installroot/etc/fstab +proc /proc proc rw 0 0 +sysfs /sys sysfs rw 0 0 +devpts /dev/pts devpts rw,gid=5,mode=620 0 0 +END + + +#-- Uncomment the line contains "cons" in /etc/inittab +#cons:12345:respawn:/sbin/smart_agetty -L 38400 console +echo "co:2345:respawn:/sbin/agetty -L 38400 console" >> $installroot/etc/inittab + +#-- Disable SELinux in the rootimg +#-- Redhat 7.3 will install selinux-policy and selinux is enabled by default +#-- Need to disable selinux, otherwise, the booting will hang on "Loading selinux policy" +if [ -f "$installroot/etc/selinux/config" ] +then + sed -i 's/SELINUX=enforcing\|permissive/SELINUX=disabled/' $installroot/etc/selinux/config +fi + +#-- Example of booted image versioning +#-- We want to know, with what configuration (version of the image) each node was booted. +#-- Hence, we keep image definition files and postscripts in CVS. During image generation we create file /etc/IMGVERSION and fill it with CVS "$Id$" of files with image definition (.pkglist, .exlist, .repolist, .postinstall). Then, during boot, each "CVS enabled" postscript (see /install/postscripts/cvs_template.sh and /install/postscripts/cvs_template.pl) adds one line to /etc/IMGVERSION. Then you can determine in any time what image you are running and what postscipts in which versions were run. +#cat /dev/null > $installroot/etc/IMGVERSION +#for ext in pkglist exlist postinstall repolist; do +# [ -r $workdir/$profile.$ext ] && cat $workdir/$profile.$ext | grep -E '^[[:space:]]*#.*[[:space:]]\$Id' >> $installroot/etc/IMGVERSION +#done +echo "test postisntall" >> $installroot/tmp/test1.postinstall +${GITREPO}/postinstall/test2.postinstall + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test2.postinstall b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test2.postinstall new file mode 100755 index 000000000..45f8697f7 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test2.postinstall @@ -0,0 +1,5 @@ +#Test for postinstall script +installroot=$1 +echo "test postisntall" >> $installroot/tmp/test2.postinstall + + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/syncfiles/synclist b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/syncfiles/synclist new file mode 100644 index 000000000..8200a7bbe --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/gitrepo/syncfiles/synclist @@ -0,0 +1 @@ +${GITREPO}/syncfiles/synclist -> /tmp/synclist diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/conserver-xcat-8.2.1-1.ppc64le.rpm b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/conserver-xcat-8.2.1-1.ppc64le.rpm new file mode 100644 index 0000000000000000000000000000000000000000..226980702b04128c046e9f91b2dd0cd2e1739287 GIT binary patch literal 188532 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

fiX2@`o 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%0D5!=oGQ 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 R(Tld}-y8w}0000ASz0sGH9G(R literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/perl-Net-Telnet-3.03-19.el7.noarch.rpm b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/perl-Net-Telnet-3.03-19.el7.noarch.rpm new file mode 100644 index 0000000000000000000000000000000000000000..09084bc0e275c57e7ebce4f9224cbb3df883a587 GIT binary patch literal 56828 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ఽiJ>@ImR5#O}_N6sMbv_zn&&n9qAYOT%29? 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 L0ssI2018=JsscDU literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/2f8132e926de0ada34da23f1a63713a9e6761fa5a5171ab309a2aef1d4f6efe3-filelists.xml.gz b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/2f8132e926de0ada34da23f1a63713a9e6761fa5a5171ab309a2aef1d4f6efe3-filelists.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..dec901f2fe8254a846a1f4b606f28301c0a864b6 GIT binary patch literal 664 zcmV;J0%!dniwFP!000021FcruZks?5eeYKw-q{5&*T_y}rAb>UjnpQ6u7=&gUYVO% zoVxw`E-pB6LTuOYfY%G>oS9)}mYH5{vebCOO35OhnGUf{19M&onJ;GMkH=dpG_Ni{ zOcR-6DpjovjnCE0T-J4YL1`-U^@fP`3JHoe&9DXmHP9X2G)mwrSfJ)iOs&*zjdHb+ zVrFuPCayn8Y?e3>M#6K0h}$tFEQsycx4i&dhJo*S43dO<8WD!Eqkqt0E;y!L%p4UJBRk={^4Bpnh=rsV6B7YJVcCSFs66!^wLnlQM^nc#*~z5u#keROi_(hxSbs6y*^qBgaOw3D@&(=%izBVoOFnwiwPnMoW?o$U yqY_qThl{PT<@qt&*L_Z(#_n~YuOgmD1! zCJBH5BLF5$6D9xzWMX145WoNkFaS&d5X8YS00dwJ$%16S0E~=GMgkZB0R{jGfC3np zCIA480GTjMm;e!xiHN{M000R@CXE15nrdmOnkS%%X6k>fKb9YpnpIbo(O5Lg_(b46r zGM~M%598>U5SQ+q z#{eufDUL`1V7h5)K}9an-3Esi!APeaRPi>z+6b(y{*;LE#d2-%H%e8G)Ku80$O|LikkB?^)I9(=y!p9HoCvUs9#A zR@l(*c-+G`B!hEV7>D`KT#Bfwy>vshfeBdA54AHytP~2iKH%UEKwr2vyOeY&F}Oj; z0jg&e8*tz^%}>B___7V;JbMZkoY9R~3&7eMHUk)|2GUY_?lfsAN{c3I=POfI9S4t4 z8X%?drcq5pCmj(irSb-PJ^4h@5F9pQIMlAXN(Yh`;5eq52NRYGNm${mB#b3U6F##j z|C<8A%VXprSkjrvMiLLo94&=}k%EyE6NI)zO=F4UrUM>QIFy)x_?Tl24mX#4LjvuY z$||T%Qt@LSW_@pFU|@lJU36xz?*We>%fVKL(ZyR-sM)^=FUHM)64RE5!2SCq8{k6d z$cG0>=wF~V!MG(<@ULIqsEOiU4xVT1=OK>rOm5=j^(*B|mI@o7rp`CUicF!gdNkG9 zU`)66b$h#$qId+*?09r!w3ICgfqv$cQ5bYXPSu}NK&tU#YLf=GAXQORBqny3hz4PdPDmI)z8QM@ZwbPH zp#h}P>s9K5otPVF`6E;&QO`N(a!dvTA!i$oMG=Q4D~6bP;iwar@?u33Oc)9-XbKxy zXbx&2f<#N24mY#%3PDi}A}ePJgE|pW^M?S5Usk}^M~7bSJz6;`4@#1~SYQJw67>?G zTn_QpUQs}>NRWb{(AW+qSQ>!f?3s~?o4OT~?1T~OKve`##)xkMwM2FAPgrHaD>G0S z1onw3vh*uJG=O9a4ie|ejLI2>P0UP2O>1v~pc1i`h{Zq@93~MS480H!oCZ#S#7-*G z6}%z`I4=`~6h}zF92#1KZUqwHJ71sl=@UI_3HWLbAW(5cM#Ij&7R19DkQ`7>fuk2; zgEhrqXK{NwF#_eQFh$Us5C~GR4GvR|1}xgy)1;1BMXWpk!p7y3ETOzQYD0 R0*wE~+>uTcBq0Wwy#Tf^RCxdZ literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/8a1f4155ca9e8784d0a41e5a9b5b715af7f096945143e6be4f69489eb59a4aa8-primary.xml.gz b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/8a1f4155ca9e8784d0a41e5a9b5b715af7f096945143e6be4f69489eb59a4aa8-primary.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..c88e0dad149e85e4f793408cd2349ddc93cdd5f7 GIT binary patch literal 1667 zcmV-}27LJ+iwFP!000021Fcxwa@)2Reb-lD_|TE35w9Xexsp0*;wGMPF6Y>J=u-v+ zK@lU6U;)sw`t@f6q;8Ha+39()NN}xv!^Y;KXTLvG9Nkl?n5gGY;Q9`tH4!`F$~%RaD~~Ym5M1tGQEZ-CTMeXLbAF=Ix5QG;h5v$|ItxMD29wOW9Os8Gvz6 zgUJdnDcBDkaN6G@y=my&F^I(gp;?V9x*(!fR6^jR2ZHs?vy0{_mZV%X4N1nF&OCc( zmirVDZ3HRj4x|Yyb0>8}H*k=o9FliD3ne8bE7exLUsd8TP9V6|lI3&fud7>ULGUyj zCt=}7MS#<39*-we;%B&sCYhflemueBh)$9?j&MLRHH(YruR9aD}u$Yph9$@IW2A2Z}Bs3aBj7tfDSL*BTKp&Bf9_GCTKXYj4d4eEyjzWsg2aw zt96St?NZ9HVgwa!O-!1YGre(V-eFZtmHIxCi$SUUDY&YIwbD>13XEi$ zjDx9zOmDJ#z)bugorXP~i+;~aNsGC2+~*_PucN^28{9RAqT>}pR#=-$xPj$M*nA4y z#UHotXWrq$9&%6XTuAR=Whq75EN(YS(+XYH_e_eqf|7ghZ4;`_Qis~JY$-~i^ny$S zA5H}cf>i)fij}MMlH*LdEUQdiI|F;d-iQ*dBowX|&*ZEmG5K~D_UOHZlHwdl64x*^ zpxjc=ov}H(kR}}UG#NXGxi(VVGw79Wsb7R#QnyS+LtwDl$F-z}3TYVT#N_EdQy#4Q3f zlAcb6vy8Y(xXJLt&GjGezC)msi(xX(80_Y0n%p$nP=n#C2|wjaSgt?(3Cg4UmswDX zzslnte|YmUZmSu8O)dBMSCvv~o)15K{`URj+uM&9$DMfGc9tqK^H$QQ$G}e?*3Rvb zkC}OuEIg`-cksq3W}aPt4$xqw*7=hl7>l{bYNp|5NB9BRDrrwl{~CVsx!M9AoA9=8 zm)#rmj67?o7Ut)?Jd0dE+Rl`zOZnvG60I0dQyio|p(IVF1;NRb zPO~V<5*An1XS zqR>|qGN~wrw`09grbSY7P8p%T684ZuHYbI*O+PRr@-0!^9u^dvzP7X%tLiI9*Sv+c-(X^hn$W@njl= z2jUh!dZs(}BXRp^N{q~LA9V-a?MB2)1n!5gH@_m-skc(w{yeRAkE`8b`zMcO@Oyes zxoE8Zy+THO$GggbsWjwy83~&%$7uF>>A-e5k7v(&}lwu={7v N;(ue}2!3`F003i(JG}q^ literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/98590d4faf7b8f997493a85d6fcbb6aa2ede7a9b30078ecc06d5710c0520dc56-primary.sqlite.bz2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/98590d4faf7b8f997493a85d6fcbb6aa2ede7a9b30078ecc06d5710c0520dc56-primary.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1b6b9ceacb7c713b9b158be788a19b7be94e18aa GIT binary patch literal 3376 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 Gnr(nBp*t)9 literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/bd36e0c2e540280fd45799e9f755a72f63b394ce110227f7d48f999a86d90ede-other.xml.gz b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/bd36e0c2e540280fd45799e9f755a72f63b394ce110227f7d48f999a86d90ede-other.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d8db7544abdd46e97ef7e6c66cb9deeb3203a2a GIT binary patch literal 729 zcmV;~0w(<*iwFP!000021HG2ba-292$M1Ox6^GmaeSjo39w&!g-?HUOIcJv;4QMSs z3N+3%gF^0G~K`dza_!N+fC=mJxsG3`c=dd8WHI2P`SQY zMIUdjVjaD`e04E|7N*JsLomLdS5X_n_(z(0*RMB8wZ4M{s&(2yFiTXrjgQD^?44-< z<9UQx_Cqq>HLhAk))YLGyr!aNMi*6{slw9I)IycClr&c+6QE?C3scuN#|W)Uh6i9G zGb|##=>YQ#{R|U|h&R@Rh?vQ?t7sgp%sgOSLN4|S35>(?3{~QtRiqQ1V44X$YL8Mx zO!ti6($-m_4b#+u)v~Cqkp&c`kfk(AiHeoEWwfH2Qz2@ZQ!WZ)3`K!eUgsivq#a@M z@!t^Q8}L0GaQk67|1YgbsCa}e67Xsv#&Fx3z5zcp#H>R*VB~wu1>TVNX7;8Z?hSeE z!<(+#4c|>rwI(EX=w3JB4T;H;Ic8V~n}>*uD_*E9qcpmVmn1V*E!WOhKoSsOiSJc7A=pVZ{B$~hdHUY!C3Dfupt?y<_S1I0ar}Qy@?;T#9>Rk zteqJb&o_zEPwvj8JD6LR-!9JI?%u4}Y<3;xfx6eRfCHnH{}`Fp+CFn`sL@j?3luypu;v zQLtQo)kOK|-K&^fxecjc#5IC@y@MGCwd-BLJ?FPNtB%MSS9-Dbna=7noqa(O`Y1wD zoeBPI5yhDz{xrPPhj_k79cG6S({j LgL4+xJO}^)d@W-Q literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/e3cf2fc42c62b0328effe9e44a4ab1296905ae92f845dd773b0550c7f191e3f8-filelists.sqlite.bz2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/e3cf2fc42c62b0328effe9e44a4ab1296905ae92f845dd773b0550c7f191e3f8-filelists.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9cd72d1210cc5d5f3a46eb18b4cd0bbf6a189837 GIT binary patch literal 1628 zcmV-i2BY~xT4*^jL0KkKS>Jy;&;SD4|NsC0{>ta?|Nj5){OiB(-}|6C07eo+#5&56 z$01l^u*}c}U9ft4o$E)pU97gSR>UG|Z3riz6KZ;=>Yt@NNc~MC+Mbm1Muvbi+Mbit zX`pCmdWN2$XaT3FX^^=0ieM!CIk$P7>yY;&@>V#ik_$CG+`4O zo}d5*jT!)GdVl}`0000000000G|(jongKLzO*J-^KSe!2^qOcg9)#0C&;Zla85#kg z#Lxf?KmarV0RFjW(aR{ej9=!LBa_?g_~o~z?VYVM4wf=9k|04*qLrjkLrOT=pg>0v zDASLZU1PeGf_u{y0U~G>YC~Kh92*Ua0O2x-BC7a%%vR@zN~ff|Yv2par+^N|R*YHq z&V%!H%x(nc7#1;Um~qGigr@ic-&+EQbHwJJhK-AtcN`pvA{;oBGvoja@1B0^OP7Nv zJk)uh6sqyn!TU=Oq?*^Y$=my-WYz0JuRm7Bm&TAwL`KV>y*8US`WBdNu+DTsV zM6rn86x3VI%fs)@n^EQ5mosS6^fi&)cS!^aY7c3qSTLf+h_qF&V_C+g!|v5vOvhCh z?*T9|wEHGv3#uxRTD5sXy@nS1SX{=XMz6dSB7v&3Z zNwXRDI)LJm^ir@DJ${RHgm5M93oe{~2p}OD502*<7|SmO5di0H@rjT8#XE);M=U4= z)4#uh@^ZSz0YDXu3OslvWjyV+(VFPEWF&B+;^N}s$d=(VJ(w|(I)~b1H01ruO;Yk| z7U`UX2uyran5Qd8)K5#=wM3xq#%&5LM1uD6=m_XRZZyV9vaD1J5iCO>m^F=L0#NOM z`xcij)kY#h1m$F*d~EH^b)4{4S3yZY^0ADD1hFfSVlfFEQasG_0zxKPbUL}qC@3j0 zl9OW8M2#g@mXn1hg3^UJ4=k{r!Nx*Tf?R>I&CS$n>n^OgbXyz&IYU!Zgy==qNZXZ< zLQ73dJbOsPg!hUsgqhCIuQDKjUmOX70vtHp5eu83Es=p`(mwD?%2Ejb+zJ)Z1hw(p z$HL>iuWB24nUhL+--gj~U^XfQx3lW~z{l*K#> z;=K&k85E3R+d_x~<*NyDZn~FB1(jFfw`WRkP2T-?#`_MtN!E-p8cB&U zcPjZU6^l}0)V@nHSVn&QX0Sn^NK;WnYNd2uXD+z7iOnxCM-$6qDzZXP2y2D|P^8dk zHHWBeuPYM8(Hi1S-0_myKnk-c36O};J0gWkcahpK=Zt^YQgka444`dbCk|z5Lp2TK zY)EY1zVcgU>i}N@X(gVjb&gd`;t7V6Ukv69P4$|l+PaQ&KHPE9sD{cJ2A~zBmPsOv z42lwjj4h>cQGwozQz`D|#tn7^~LToWY0#*Q83{oi(1fJ&> z3W!3`VFWK!nk`pCQGkU#l=70+034{82sMbHisMo>D;XIPL8KW!?oWQ?A3aq}m%@`@ zOp<^c?*k~{p#dWZ0_1##i{elbHrD8jym@KYk%k_o6H#4Qle9SXX9|#m2spH&({PL% aiw8~$E-;cI1c8u0;_gVN3KARd=UM>jFy3SU literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/repomd.xml b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/repomd.xml new file mode 100644 index 000000000..69b1fb968 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/repodata/repomd.xml @@ -0,0 +1,55 @@ + + + 1529054651 + + 2f8132e926de0ada34da23f1a63713a9e6761fa5a5171ab309a2aef1d4f6efe3 + eca64f042d41d524c9c40e6fe48c1e21afa2d31a09f82dd478002056931b52f0 + + 1529054651 + 664 + 2941 + + + 8a1f4155ca9e8784d0a41e5a9b5b715af7f096945143e6be4f69489eb59a4aa8 + 623db61f62a982b63ead5171a5fa6b04ab09f19975df695b4f6d3ac3b7b3fa92 + + 1529054651 + 1667 + 4726 + + + 98590d4faf7b8f997493a85d6fcbb6aa2ede7a9b30078ecc06d5710c0520dc56 + 2cae2914ab3574b7d97a4a971f7556282a0bfbecd9ef3ebc3ba0836c6126cc7c + + 1529054653 + 10 + 3376 + 23552 + + + 771b092d010ec878233b66dc1dba2ab81b614c5a9ea473f9f5f6da76997276c1 + b539bc27136e110f6147ea3265153dda8096f11987a1383adb6c991471d05b7b + + 1529054652 + 10 + 1359 + 8192 + + + bd36e0c2e540280fd45799e9f755a72f63b394ce110227f7d48f999a86d90ede + 9e9e4f10ecd14f0a067bf48948b241e9b83d0d73619864d5185d0d4bafdf95f8 + + 1529054651 + 729 + 2108 + + + e3cf2fc42c62b0328effe9e44a4ab1296905ae92f845dd773b0550c7f191e3f8 + 4d88f10b76e7bf9ff1e25aa53c8415e6959d6f1cc3a1371ee424ee2d8459cfcb + + 1529054652 + 10 + 1628 + 9216 + + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/dhcp-4.2.5-68.el7.ppc64le.rpm b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/dhcp-4.2.5-68.el7.ppc64le.rpm new file mode 100644 index 0000000000000000000000000000000000000000..157c129510cf7edb5b9717babd1f99daadc1b9f3 GIT binary patch literal 512044 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

nPbc%G<~I4AKczSNY0t#? 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%0AROpcNz#R^#qpKf`dm4^TI0MJjSRK<`cP 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%0D^0^m{nsQ0>MWdP>z@mR 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
~^Y#+40)!ZG)83%>7A%hXa~TYQRlsEA%laz= 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

Hz#-7b(MS`Nr`|+t@;as6`i4bKC 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 b00I5>8MNSRq3aP?w&~v-0ssI2018=J4kZUV literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/2a9abe54b23615850e70c41456bd49ff3994eae972ea2347d46b43de8cf48931-filelists.sqlite.bz2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/2a9abe54b23615850e70c41456bd49ff3994eae972ea2347d46b43de8cf48931-filelists.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a0da9408f427745e794f863642a6d674a0f997d0 GIT binary patch literal 1482 zcmV;*1vUCYT4*^jL0KkKSwfH)TmS-WfB*mg`s@CG|N8&${Ncav-}xX60KyT6={!PE zrXg8kFw9T{-u64$Q@kn`z|av2Vl7(t<+F#s?TqX~$_4NRs+q&+F8 z=?xhfL-jOF1i;V)!er3FFaV7PnqNL^nXwzym^)h;cKmZJY02%-Q(dsm4B_e3h8k#gBc~4QMgVfN_4^RynG5`Po0009( z27ojG4^YOvbjDI~REF_Ejp)bp)+myPFBnZz(72Ux?ps+vd%ki=aA zG9R*BV%h;BFH2o>JAH3Q;CGvya|65iF3kQYgWyEl|OA5$~&>94P=ZjR7nYlHT52 zQ-blaRtGMspC}F`xPe?+b+})B6a{%wU^cNBh`p##(}Qeh4VH*_gA6=KfbdDxfmqly z2;v)^!UEhjOw}OL!a_YE&_Jt9$b)VMLKz642&jUII!Tq*?mkOWB2B|?Oq8Zm zg50tSwZ~#VU@4Z;jf-zA#Dh)AWpdgVdoh7HIEAE&h+y#XPKM+mEG8>Q6fKoP8gw~f zOpuvtT2?E+@fJeWvM{L1)y2YUl>uB}`22Abj8QQxq(a9Mkvu{;sTn~V#hNZ(R(`|! z7Gc|aI+n)VS|l%RQE_YWF>Ps}&t3CUp6_h05B|A) zeQlesdlnrc2!yr21*r`d1qmUKArA@E9#j_aDH^2NCJL?7oG(0=cdHdzoV2(8PWFap zfQzcS6Je^Up)GP?Uwaqt_C#?PD;wg+2-!Glt~y!;TO;jJq?1SDKrMu8BC(A7gZvV) zQ)1+yFv!)`FOg)0`4iS{1w|047@%s1BpWA64MB+q?_6-5WI!N@ z57zXJz{o-)#IxW|L=S_ZHr9c_#RZJ9F%%b=H3K6U@l7;Wz*0r}ToC0cU=n#zR*9Op zh}JYz-N!ee+Lk#)20gQtcTBYu+MAR;I_W#(6%}bNi-}03J!4;)fdsRWp3;^iToTMc z8ZsJKg}+!$7A26K{n(OqQWny-BaN40Xss+d`{WTiv({Zqx_Sg+$8t*qqD>*X<|@#? z))EDqCDWmdx=6H25ELpM0YD8v^URoqEI2d4R0&I{HrU505kR3ui6lv8VnB!xIKP4B znfnq_$6;=hG%O1SLXg-5i3w1u!EyrVstZEoIj|df%Et2vXSfR#6Qr1x;>fLH1TZTT zE7YhA)oH64ccs{PcZ!OHs!rv!vNG-Pn4-`lX@&zP1%(=QAiA21U~=`5)pZ+^#`a$} k$x|k#Fl0oc8VF-x*xni<6rBx7N&n*RNT&)C2vP$JfY4)>EdT%j literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/4160c0db6523d465541345245e8463eacd03e5f823e5ba319d0ddbed4b2a2397-filelists.xml.gz b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/4160c0db6523d465541345245e8463eacd03e5f823e5ba319d0ddbed4b2a2397-filelists.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b6d9d48a8403f4b783ef41ce2a59a9fae762ea9 GIT binary patch literal 527 zcmV+q0`UDGiwFP!000021D%!8lA9nDhVT0n4EI7bYDgz$r!(E&Z7(|Q1F&$6Oi&ph zY0{^!7_+l!-I(M81^GYV!0%!8bf`7jgLSHH3LKLeM$m{>s%BH*Uq8P^3_qFavhKnuVK*z+m8);}Fv)w4!eUs^8 z$r+n3K`e8Y#&a%#!E9EFjB&_hnP*v&qzSMkljWjZW^$3tW4=hUn6Vh6hSyMFSqXy? zx1uVrF(OYjbh9C}8e&6W+Rzs#ID}i^lq4j>$bv3#&IsrQracgrzNX*>{SN+jYqu}F z=@x9MRL*cODzHS-IEliPa@B|W4;Xs-ha{qH$_Y(AA#%bh;~o9+{N?M*GZ~tr`qn_B zB@avmHSc+Hs*md3(S^CyhK>ibbC$lUhPJh@Bg6)X-L5_vZ2~y?(s#Sn6$k$OGx-1a zYR^xW?iCj?+#=1#wa6b$$cM_}u`G6<`Xc8|q3@H`HSI?pdxW7QCcFSIHtsB3(cu;f R)wio^{TD*fsq760002%+0Gyd<=ZfnLRH@|t2P{SR)rlZq`D}y3L5lVQx-2W0282+ z&<$C0(2oK*w4EZiE%`j~h^&XuOp$_TET`oxtcQM$7@B8gNhc%8XJI|_%dKOGmzw6F z8VBCjc`(8;9tX&9IS(c&<}wMwnm}_-H?}I;Gi^@d@dOOptOc6~Ul-Rw7O_z>C24vx z<#akpN6`skJmtgTijGsl$80qjkK=e0^K_cBRkE6nSrVT_BpHpPG>v9qcSwCA{4a>v zW@lS)Mo^S%>k!pyCDxT8&Rbs^?KIUAS-o=i#DIq#%PTN$sS%}zW@qQ8SE%1avH64j+Se4}&gnAb4FYF+9 zTrvGaKpSkkvxBaUuFC9s3)xkmg}M_)s{$@6JgYCt$UESUoO5VfW?+bd4219-2cbSmN522VJ)}vL zOqu|;gf2^)rFIegG+X4`aB~*{T1m2o2EOc;$q&2Vm>F?mn>pXS4@WEbT9b{0V7LrPyjb z>3{s=;2hL3*mhderg^Gmqht5 zXUK#tiG#hFoLw$(JAD$bORju2 z0Vn4Lsrk4WKZ%E^G|##4X=f^H>L#ZPn{z3j+_xU^b9%R3KXHCQw6Aa`Oz>31Ux$8l fKQB@D1G|R}ySK!{gUJuOA2HcKw``&FP7MG6IM7t= literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/811daeb0fde54384fec22af72ecdcdd2d4d8060ad5227802c0c02bb73dd72ce1-other.sqlite.bz2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/811daeb0fde54384fec22af72ecdcdd2d4d8060ad5227802c0c02bb73dd72ce1-other.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d2b4c5f4039892762fe07c1484c98b3b249c0baa GIT binary patch literal 1388 zcmV-y1(W(hT4*^jL0KkKS;1$Y&j12#|NsB?uA1og|NsC0{qeu=|Nfvrg`fjN&^T}a zmLVBp(2P(7o{qL_M%y8v6cUjMqfHqp2c*+# z4Fl9RqtqTqgC+^4MiV0wO)wJzUqP00_ij1Y~GnjWRUJrUan?fJuqzOpPa@ zsgP;vGyrLc(WW2(W}pBbpfm$O&<2edh%#WBWMMKfG}8evCICz(m;z#CzyOR!07gcJ z2-71>nqW#H6!Mu*#Wc|#qttqh222D7Y5*EE3;>NZ(9qLHOicjM>KjC8Xk^K#o@Zx#PDO9sHFJk{nPNc8+)2Gpf1TJqQC-|zc!?z@-HqQ{@b zYX+74t8u=#cfP$t5kO}*wb0j-E%}3O^`=aTc@u9065DDlb*ju+6=s5PWzVMjW{41@ zU&WDd4*V{*kdwS$qw#GSfSSzZV#}qB%L}<7MpUi032V_1 zt=g3BKFZ?n2uqbi!Ojr1bMLKUD=AFQbKRO+Oe#h}zhktagh8pqbnXlN_gEo?TX*62 z)>W?#PQF;x2|4*147fv~_C6NvwKZyJ)IRFhC3d|}rzQB->ZxmCp6Ez}Id~QTrtoAw zuBSf78qw-LGqhY`6Z~9N-O@0_AvnM(2tx+p>f#iHCx}cZV^g6L9<`0myJT2!?T5*f z5l0GyiYEx9tsPD$8tyb_K5&Jo{G_-eX-%;r5NWj< z^mE{&6uEVUTEtC(zfMtV8pTv7g&>Cg`ee~A!nVH_kwfioiR2RtwAV4gIM#J-GfNuVw4PoRzf<6 z;-Vb22M&7lVdFgwO0``Os_fjOEF2v&`B^GY(k5fC77gzrKbbf2>C8bIzXr@70SF|w zq6>wYARM=Hv^fbRD~P1p+@y-B$nPKM2w(-BDWGBqKKsNM z4T5Tp+(dj(J7;KtF%2CW+#xl+jfWFgGc|*Sa{~f3i>N@F)@M8=#nJq!a`>15V{cN!p$<5*Q>9l|PLo8F=#BQ{#lZ_8C)%sM}jj u!cNqe`aFM5*aC^u>h*Y|mQWRIQ;#;OdaCFQj36s7{x0N-aG@cB&p)0?$AK>Z literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/9fcfad63d06bdaba2be3507fbb1cd080db5f7423ec46cf25221fb1193e35611b-other.xml.gz b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/9fcfad63d06bdaba2be3507fbb1cd080db5f7423ec46cf25221fb1193e35611b-other.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..d64c515f32658e3867a309a6170c395c22dac9fa GIT binary patch literal 749 zcmVKuF zMUEhX1AvN~r_Vz1xQf-@svAJ=0^ctF-Ce(Z+*>%H4}%*wjAuCm99w6Gal2uE-2bwW z?CsT0YZrU;Mn?@~KZXtKW1LpYr5(okF*EZHGc@yZk5MP9<}6_=7T81)`E z%=GQVK>N1euxV;*VUcbFSU<%DIJxwX7c7OkVInKCih)PFVYSTAHf(uxXnQ?w(Yh_@ zIrffBf7b`J@K-tFR^g3p(+rQq%H?RO+td8d{D#?J7Kww-bp~^bX zb9S|W&lsFNU;th=f^)TkYh%ES0RnpBf`j&hey|A9f&MysT(s8BCJQ};)(=x$FP{Pb zM_l!cTjhn6LjH)mBHp@e6elOjv>kAaFi*(^yqhB_1>zA~cafr?mj{bFAmHOP_`fd# zUFT=e{72|lyilsD3-Yo{oOBp0u(G<;hTA(IzRBD)~ zV@5-yY-&%6PLlpEkZ>8)@&vU~xs>OqLgkH2kALf6boAa-V16Lt_n+?WKVE-$2g3+Y zV!mK;)#3!TR-&r^4YjGuoV+?c*u)9x<^W&l(cytQDJhop8wYI{ts6T#v=@S{{(G+DG^ji^;mc6VGwQQeb;MTWb;@1-7q>^+ f(v(K3!Fh}?xYx_4F`JgpbNlKW0R6w2>IVP-zuj~d literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/e4f965fd5f4b914c4e89d54b8784394b7760e051dd788e791d259673af365373-primary.sqlite.bz2 b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/repodata/e4f965fd5f4b914c4e89d54b8784394b7760e051dd788e791d259673af365373-primary.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..36c15fcd6f61bef8b8f73b83956a23f01cc882b0 GIT binary patch literal 2967 zcmV;I3uyF0T4*^jL0KkKS@wb7v;YQBfB*mg|NsC0|NsC0|Ng)4|NOVZ6C;0>`7de~ z#x;G~5$<3L&icn%-H4%c05-r-0YH#NK>?^isii!RRM-)w5_+DdjWo?Po`5ky>R~-Y z(?kYF)D1Lb&^l0pDXMnFv(2p*=VsivmT z%50~k^qWErJtwHi>TMvAvnpjx~YvzLZ3VbwsaLsTGZ__RuX z<-q>2c7X^31Vx`*#3lhlf{;UKEira%^%_T+fAag@|Hu3PzxL=FvsO2j_4vU-o6|@f zKzA|kIWS2Hc&(j;P{IX6C7Ro9$&)r~=)WFXk+fn1E#Yc$Q6aN+mJY~rw-)AO6OG19c(^LZC|SR>D4@2&Y_%@r(ctgpUv zs8F0bHc74MZ3u(Gqv_XB5QHVo!NStCCYdD|P3eJGSj{m_fR+y>=!JqL_=W(eSo;{@ z7fu0e(q}6QEo<)`CftDBrR}54-)kG#)o5mg>|A$cgQsO)GyXi#RIS}Y?}i1N z)ocuWmT^cK9M4t@P9xk#d^B!EJbWYIM3j>!~yxa(2BdW0v_XuAR$b#GR! zoxe@Pl;23;s<7u+*6^s7so9rEQ8kGxN^|^fHya4;zZ-&Tb9OjuW#rv|o70QO=RS== z&>WaylAr^TUuOxv#gm4LJjmp3h*n;#?eIT~P9Aq3x1`}^hWN&1WX_UsuSb&U3dzb0 za)-bc&Yo+;c)zihmhG}6y#g5w$qE4|^*5*h%%GhRD^%K$BE2-1o-JZV7suOOydZ=n z7!XSWD7_@&(Xk#qq_B;PB!W++iQynTES1QBb349F*du#&8c7jO9Caco<(d=a%VA8_ zQ;2CHE(dbn_^Or2?_r#h0T*q9Efqqj^h!#?k}NUP3Lo~7iz5WEmnEgNF-wrbdMv8B zqmmdT!$t}bnrWt*Xuz(t*z~1jxW@efuW*QQ8CBl8pQX!`F&>z>9+T)eV}mJ6tgP3_#$Qn}qSA7lqiC9d zw3cABCmc#=Bm_+)?(epi>Bf1b(Tx-SIdN zy~8&l=)sQj6mg=qLDsfVh|*XGkcw6i$WHJStauuGk)B|(&Lks39}s9u$iga0OOP8q z#KFc=qAZgajCw&n5hcQk04hiu!fa^5mg#Rp7m4cVVVM#d>J6)$gkU2OZ*;kca9!)- zq}xD$D31%MTy$=ez(9+VwG#+t1FjOdwjl`L$G*=wS@r^X&Ln8juL3}%Yy{pWmq^XR z&{A-YA;;^RZ?}k3wNovWYVtH-(XFV?(9s!RnM-B?&RR4JBw0E};xSjs6lNzf83jR_ zFDAR1UnrOm?z~(lRAU&Ne>cCuL|N`b4C$M+FEWGeQ4EX-=A3DcVyo!O2aIsp*zMrqJA4V=V=8-ifH^?B@- zFswln16U)eNvy3-WbUP74Y2C7ZitI$adQc=xW6{u)B_ds4so6{9%<6y&qlpbZCtXn zYzz)z(!+C)EO2zBfZ7dCYfX~Uxlb-(j1&{2dHe(jb|Vue*&(`=5IDrZz*Z-f5*%!D z<0{J`Yo&8;AMKSCYUJ0cB2w5>U_}KzRr`&x9L_M9k8~CXq`Hl&ULK z;*HiTNg)_{A_{=XMW&zAJ%nXGey zgob9d%V^2OK&o>INXR6C72}0eLF-~&Y16>6q{70I4X)&zh>4}~`CMLC7|3CBFl3+n^};^wJgM~gcZ`3oACzRAPCfS zb4OC7W&+>~^PmmE=EqA+jU#U>%hGwW7+x4n;-S|>m}I1Eijhm^P+-JV1l`#-+ikYn zdh#K>dw^an-7JnB(#;8D!mW=N29!Ap^foZ!A_5YjOk#3bD2SRwGb$d4*(jJeOd?=R zpeXW{3$h2iV_Db^jFlnTWeJcF2xT1M^^SALBelj{wcrF^#S3~?$XVRNqi3@Jz&9GLO6*#C#;wxh{ndWibP~ + + 1528961260 + + 4160c0db6523d465541345245e8463eacd03e5f823e5ba319d0ddbed4b2a2397 + bcff832273199f571ac15e62d127f4eb8df6a51100a949f68213ba70330c3fe9 + + 1528961260 + 527 + 1805 + + + 75c2df3e4d5ca66a0c105562f4d0cea1c0c1203bb1f59a73e373b5cebcf03d65 + 7701b889349f89e485ec68b1346a636853fb7554069f0ac92f104d498c54f767 + + 1528961260 + 1269 + 3406 + + + e4f965fd5f4b914c4e89d54b8784394b7760e051dd788e791d259673af365373 + af8b49cdc4a0219f531fcbd559cb19808aea1055f010aea9b41cb66dd94ebd5d + + 1528961262 + 10 + 2967 + 21504 + + + 811daeb0fde54384fec22af72ecdcdd2d4d8060ad5227802c0c02bb73dd72ce1 + bcf276a03b51aad62cb750782f5ffd6d20d4eb327d6bf6bb1ec329fde9f63b78 + + 1528961261 + 10 + 1388 + 8192 + + + 9fcfad63d06bdaba2be3507fbb1cd080db5f7423ec46cf25221fb1193e35611b + 336bfd6337f648db1b6ba085a94b88bc79c20e1be056d1c168a88b6d62c15c0e + + 1528961260 + 749 + 2026 + + + 2a9abe54b23615850e70c41456bd49ff3994eae972ea2347d46b43de8cf48931 + 36d40a93865269f7f5d5fa69ac32b2eb2090061451adbcb57ccde1dbd15bc5e4 + + 1528961261 + 10 + 1482 + 7168 + + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/tftp-5.2-22.el7.ppc64le.rpm b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/tftp-5.2-22.el7.ppc64le.rpm new file mode 100644 index 0000000000000000000000000000000000000000..2208047d1c4978283345d4bdcfd0c1b7bbf7317b GIT binary patch literal 40068 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 literal 0 HcmV?d00001 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.yaml b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.yaml new file mode 100644 index 000000000..89a511b21 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.yaml @@ -0,0 +1,23 @@ +osimage: + test.environments.osimage: + basic_attributes: + arch: ppc64le + distribution: rhels7.5-alternate + osdistro: rhels7.5-alternate-ppc64le + osname: Linux + filestosync: {{GITREPO}}/syncfiles/synclist + deprecated: + comments: rhels7.5,test_environment_variables + genimgoptions: + permission: '755' + postinstall: /opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.postinstall,{{GITREPO}}/postinstall/test1.postinstall + rootimgdir: /install/custom/test.environments.osimage + imagetype: linux + package_selection: + otherpkgdir: {{SWDIR}}/otherpkgdir/ + otherpkglist: {{GITREPO}}/otherpkglist/test1.otherpkglist,{{GITREPO}}/otherpkglist/test2.otherpkglist, + pkgdir: /install/rhels7.5-alternate/ppc64le,{{SWDIR}}/pkgdir/ + pkglist: /opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.pkglist,{{GITREPO}}/pkglist/test1.pkglist,{{GITREPO}}/pkglist/test2.pkglist + provision_mode: netboot + role: compute +schema_version: '1.0' From d49c990d506e621f5eef06ca318ed91eca58c8c1 Mon Sep 17 00:00:00 2001 From: huweihua Date: Fri, 22 Jun 2018 01:12:15 -0400 Subject: [PATCH 31/93] Add labels for all hardware control test case --- .../UT_openbmc/reventlog_resolved_cases0 | 7 ++++ .../testcase/UT_openbmc/rflash_cases0 | 9 +++++ .../autotest/testcase/UT_openbmc/rinv_cases0 | 3 ++ .../testcase/UT_openbmc/rspconfig_cases0 | 5 +++ .../UT_openbmc/supported_commands_case0 | 8 ++++ xCAT-test/autotest/testcase/rbeacon/cases0 | 5 +++ xCAT-test/autotest/testcase/reventlog/cases0 | 5 +++ .../autotest/testcase/rflash/rflash_openbmc.0 | 33 ++++++++++++++++ xCAT-test/autotest/testcase/rinv/cases0 | 34 +++++++++++++++++ xCAT-test/autotest/testcase/rinv/cases2 | 3 ++ xCAT-test/autotest/testcase/rpower/cases0 | 17 +++++++++ xCAT-test/autotest/testcase/rsetboot/cases0 | 12 ++++++ xCAT-test/autotest/testcase/rspconfig/cases0 | 38 +++++++++++++++++++ xCAT-test/autotest/testcase/rspconfig/cases1 | 14 +++++++ xCAT-test/autotest/testcase/rvitals/cases0 | 20 ++++++++++ xCAT-test/autotest/testcase/rvitals/cases1 | 1 + 16 files changed, 214 insertions(+) diff --git a/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 b/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 index 64bf22eb4..448eb3435 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 @@ -2,6 +2,7 @@ start:reventlog_resolved_parse_error1 description: Do not pass in any logs to clear os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved check:rc==1 check:output=~Error: (\[.*?\]: )?Usage error. Provide a comma separated @@ -11,6 +12,7 @@ start:reventlog_resolved_parse_error2 description: Do not pass in any logs to clear, include = sign os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved= check:rc==1 check:output=~Error: (\[.*?\]: )?Usage error. Provide a comma separated @@ -20,6 +22,7 @@ start:reventlog_resolved_parse_error3 description: forgot the = sign os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved 1,2,3 check:rc==1 check:output=~Error: (\[.*?\]: )?Usage error. Provide a comma separated @@ -29,6 +32,7 @@ start:reventlog_resolved_parse_error4 description: Pass in a negative number os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved=-1 check:rc==1 check:output=~Error: (\[.*?\]: )?Invalid ID= @@ -38,6 +42,7 @@ start:reventlog_resolved_parse_error5 description: Pass in a string os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved=abc check:rc==1 check:output=~Error: (\[.*?\]: )?Invalid ID= @@ -47,6 +52,7 @@ start:reventlog_resolved_list description: Pass in a list of ids os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved=100,101 check:rc==0 check:output=~Attempting to resolve the following log entries: 100,101... @@ -56,6 +62,7 @@ start:reventlog_resolved_LED description: Pass in a LED keyword os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN resolved=Led check:rc==0 check:output=~Attempting to resolve the following log entries: Led... diff --git a/xCAT-test/autotest/testcase/UT_openbmc/rflash_cases0 b/xCAT-test/autotest/testcase/UT_openbmc/rflash_cases0 index 8f4eadb75..9cff4f9ef 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/rflash_cases0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/rflash_cases0 @@ -2,6 +2,7 @@ start:rflash_check description: Make sure the --check option works os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN --check check:rc==0 check:output=~$$CN: BMC Firmware Product @@ -12,6 +13,7 @@ start:rflash_invalid_activate description: Provide an invalid option for activte, file does not end in .tar os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -a /tmp/abc123.tz check:rc==1 check:output=~Error: (\[.*?\]: )?Invalid firmware specified with -a @@ -21,6 +23,7 @@ start:rflash_invalid_activate_and_delete description: Cannot specify -a and --delete at the same time os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -a 123 --delete 123 check:rc==1 check:output=~Error: (\[.*?\]: )?Multiple options are not supported @@ -30,6 +33,7 @@ start:rflash_invalid_id description: Passing an invalid ID to activate os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -a 123 check:rc==1 check:output=~Error: (\[.*?\]: )?Invalid ID provided to activate @@ -39,6 +43,7 @@ start:rflash_invalid_multiple_id_3 description: Code does not currently support multiple IDs to activate os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -a 123 abc asdbas check:rc==1 check:output=~Error: (\[.*?\]: )?More than one firmware specified is not supported @@ -48,6 +53,7 @@ start:rflash_invalid_multiple_id_2 description: Code does not currently support multiple IDs to activate os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -a asdbas 123 check:rc==1 check:output=~Error: (\[.*?\]: )?More than one firmware specified is not supported @@ -57,6 +63,7 @@ start:rflash_invalid_node description: Activate a valid ID hash but forget to put in a node range os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash -a 221d9020 check:rc==1 check:output=~Error: (\[.*?\]: )?Invalid nodes and/or groups in noderange: 221d9020 @@ -66,6 +73,7 @@ start:rflash_invalid_delete_2 description: Attempt to delete more than 1 ID from the FW os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN --delete 221d9020 221d9020 check:rc==1 check:output=~Error: (\[.*?\]: )?More than one firmware specified is not supported @@ -75,6 +83,7 @@ start:rflash_delete_active_bmc description: Attempt to delete the active BMC firmware os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rflash $$CN -l | grep \* | grep BMC | awk '{print $2}' | xargs -i{} rflash $$CN --delete {} check:rc==1 check:output=~$$CN: (\[.*?\]: )?Error: Deleting currently active BMC firmware is not supported diff --git a/xCAT-test/autotest/testcase/UT_openbmc/rinv_cases0 b/xCAT-test/autotest/testcase/UT_openbmc/rinv_cases0 index 2faa0d1e4..44bc46855 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/rinv_cases0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/rinv_cases0 @@ -1,6 +1,7 @@ start:rinv_record_firmware_level description: Record the firmware level for the start of each testcase hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rinv $$CN firm check:rc==0 end @@ -8,6 +9,7 @@ end start:rinv_check_active_fw_count description: Ensure that there is only 2 active firmware, one for bmc and one for pnor hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rinv $$CN firm | tee /tmp/xcattest.rinv_check_active_fw_count.output check:rc==0 cmd: grep -i ibm /tmp/xcattest.rinv_check_active_fw_count.output | grep -i 'HOST Firmware Product' | grep -i 'Active)\*' | wc -l @@ -23,6 +25,7 @@ end start:rinv_check_active_fw_count_verbose description: Ensure that there is only 2 active firmware, one for bmc and one for pnor (in verbose mode) (Issue #4236) hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rinv $$CN firm -V | tee /tmp/xcattest.rinv_check_active_fw_count_verbose.output check:rc==0 cmd: grep -i ibm /tmp/xcattest.rinv_check_active_fw_count_verbose.output| grep -i 'HOST Firmware Product' | grep -i 'Active)\*' | wc -l diff --git a/xCAT-test/autotest/testcase/UT_openbmc/rspconfig_cases0 b/xCAT-test/autotest/testcase/UT_openbmc/rspconfig_cases0 index 8004c3605..750516a15 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/rspconfig_cases0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/rspconfig_cases0 @@ -1,6 +1,7 @@ start:rspconfig_record_firmware_level description: Record the firmware level for the start of each testcase hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rinv $$CN firm check:rc==0 end @@ -9,6 +10,7 @@ start:rspconfig_get_all description: Check that we can get all the attributes from the BMC os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ip netmask gateway hostname vlan check:rc==0 check:output=~$$CN: BMC IP: @@ -21,6 +23,7 @@ end start:rspconfig_get_all_error description: Check the parsing code for rspconfig (error cases) hcp: openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rspconfig $$CN ip,netmask,gateway,hostname,vlan check:rc==1 check:output=~Error: (\[.*?\]: )?Unsupported command @@ -29,6 +32,7 @@ end start:rspconfig_get_set_error description: Check the parsing code for rspconfig (error cases) - Cannot get/set in same line hcp: openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rspconfig $$CN ip netmask=255.0.0.0 check:rc==1 check:output=~Error: (\[.*?\]: )?Can not set and query OpenBMC information at the same time @@ -38,6 +42,7 @@ start:rspconfig_get_and_set_hostname description: Test setting and getting hostname on the BMC os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc # Save the hostname to a file.... cmd:rspconfig $$CN hostname | tee /tmp/xcattest.rspconfig.hostname check:rc==0 diff --git a/xCAT-test/autotest/testcase/UT_openbmc/supported_commands_case0 b/xCAT-test/autotest/testcase/UT_openbmc/supported_commands_case0 index 5e5cc23f3..9567dbf35 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/supported_commands_case0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/supported_commands_case0 @@ -2,6 +2,7 @@ start:supported_cmds_rpower description: Make sure the rpower command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rpower $$CN state check:rc==0 check:output=~$$CN: @@ -14,6 +15,7 @@ start:supported_cmds_rinv description: Make sure that the rinv command works... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rinv $$CN check:rc==0 check:output=~$$CN: @@ -39,6 +41,7 @@ start:supported_cmds_rvitals description: Make sure that the rvitals command works... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: rvitals $$CN check:rc==0 check:output=~$$CN: @@ -71,6 +74,7 @@ start:supported_cmds_rbeacon description: Make sure the rbeacon command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon $$CN on check:rc==0 check:output=~$$CN: on @@ -83,6 +87,7 @@ start:supported_cmds_reventlog description: Make sure the reventlog command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN check:rc==0 check:output=~$$CN: @@ -98,6 +103,7 @@ start:supported_cmds_rflash description: Make sure the rflash command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c check:rc==0 check:output=~$$CN: BMC Firmware Product: @@ -111,6 +117,7 @@ start:supported_cmds_rsetboot description: Make sure the rsetboot command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rsetboot $$CN stat check:rc==0 check:output=~$$CN: @@ -120,6 +127,7 @@ start:supported_cmds_rspconfig description: Make sure the rspconfig command works ... os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ipsrc check:rc==0 check:output=~$$CN: BMC IP Source: diff --git a/xCAT-test/autotest/testcase/rbeacon/cases0 b/xCAT-test/autotest/testcase/rbeacon/cases0 index b202d46bc..229722014 100644 --- a/xCAT-test/autotest/testcase/rbeacon/cases0 +++ b/xCAT-test/autotest/testcase/rbeacon/cases0 @@ -2,6 +2,7 @@ start:rbeacon_null description: this case is to test rbeacon usage os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon check:rc==0 check:output=~Usage @@ -11,6 +12,7 @@ start:rbeacon_stat description: this case is to test rbeacon CN stat os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon $$CN stat check:rc==0 check:output=~$$CN\s*:\s*Front:Off Rear:Off|Front:On Rear:On|Front:Off Rear:On|Front:On Rear:Off|Front:Blink Rear:Blink @@ -20,6 +22,7 @@ start:rbeacon_help description: this case is to test rbeacon -h and --help output os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon -h check:rc==0 check:output=~Usage @@ -34,6 +37,7 @@ start:rbeacon_version description: this case is to test rbeacon -v and --version output os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon -v check:rc==0 check:output=~Version @@ -48,6 +52,7 @@ start:rbeacon_false description: this case is to test rbeacon could process false input os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rbeacon $$CN abc check:rc!=0 check:output=~$$CN\s*:\s*Error:\s*Only \'on\', \'off\' or \'stat\' is supported diff --git a/xCAT-test/autotest/testcase/reventlog/cases0 b/xCAT-test/autotest/testcase/reventlog/cases0 index db17b616b..102cd238e 100644 --- a/xCAT-test/autotest/testcase/reventlog/cases0 +++ b/xCAT-test/autotest/testcase/reventlog/cases0 @@ -1,22 +1,26 @@ start:reventlog_null +label:cn_bmc_ready,hctrl_gen cmd:reventlog check:rc==0 check:output=~Usage end start:reventlog_all +label:cn_bmc_ready,hctrl_gen cmd:reventlog $$CN all check:rc==0 check:output=~$$CN\s*:\s*.*\d\d/\d\d/\d\d\s*\S+|No attributes returned from the BMC end start:reventlog_clear +label:cn_bmc_ready,hctrl_gen cmd:reventlog $$CN clear check:rc==0 check:output=~$$CN\s*:\s*Logs cleared|SEL cleared end start:reventlog_numofentries +label:cn_bmc_ready,hctrl_gen cmd:reventlog $$CN 5 check:rc==0 check:output=~$$CN\s*:\s*.*\d\d/\d\d/\d\d\s*\S+|$$CN: no SEL entries|Entry|No attributes returned from the BMC @@ -26,6 +30,7 @@ start:reventlog_s_openbmc description: For openbmc, reventlog has dropped option s os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:reventlog $$CN 10 -s check:output=~The -s option is not supported for OpenBMC check:rc!=0 diff --git a/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 b/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 index b1a1c77f6..96dac873e 100644 --- a/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 +++ b/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 @@ -2,6 +2,7 @@ start:rflash_option_c_without_specify_noderange description: basic usage check for option c. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -c check:output=~Usage: cmd:rflash -c 1.tar @@ -13,6 +14,7 @@ start:rflash_option_l_without_specify_noderange description: basic usage check for option l. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -l check:output=~Usage: end @@ -21,6 +23,7 @@ start:rflash_option_a_without_specify_noderange description: basic usage check for option a. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -a check:output=~Usage: cmd:rflash -a 1.tar @@ -35,6 +38,7 @@ start:rflash_option_u_without_specify_noderange description: basic usage check for option u. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -u check:output=~Usage: cmd:rflash -u 1.tar @@ -46,6 +50,7 @@ start:rflash_option_d_without_specify_noderange description: basic usage check for option d. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -d check:output=~Usage: cmd:rflash -d /1234 @@ -59,6 +64,7 @@ start:rflash_without_option description: basic usage check, if without option, should throw out a error os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN 1.tar check:rc != 0 check:output=~Error: (\[.*?\]: )?Invalid option specified when a file is provided: @@ -68,6 +74,7 @@ start:rflash_unsupport_multiple_option_a_u description: basic usage check. If specify multiple options a+u, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a 1.tz -u check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -77,6 +84,7 @@ start:rflash_unsupport_multiple_option_a_c description: basic usage check. If specify multiple options a+c, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a 1.tz -c check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -86,6 +94,7 @@ start:rflash_unsupport_multiple_option_a_l description: basic usage check. If specify multiple options a+l, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a 1.tz -l check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -95,6 +104,7 @@ start:rflash_unsupport_multiple_option_a_d description: basic usage check. If specify multiple options a+d, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a 1.tz -d check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -104,6 +114,7 @@ start:rflash_unsupport_multiple_option_c_l description: basic usage check. If specify multiple options c+l, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c 1.tz -l check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -113,6 +124,7 @@ start:rflash_unsupport_multiple_option_c_u description: basic usage check. If specify multiple options c+u, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c 1.tz -u check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -122,6 +134,7 @@ start:rflash_unsupport_multiple_option_c_d description: basic usage check. If specify multiple options c+d, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c 1.tz -d check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -131,6 +144,7 @@ start:rflash_unsupport_multiple_option_l_d description: basic usage check. If specify multiple options l+d, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -l -d check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -140,6 +154,7 @@ start:rflash_unsupport_multiple_option_l_u description: basic usage check. If specify multiple options l+u, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -l -u check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -149,6 +164,7 @@ start:rflash_unsupport_multiple_option_u_d description: basic usage check. If specify multiple options u+d, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -u -d check:output=~Error: (\[.*?\]: )?Multiple options are not supported check:rc != 0 @@ -158,6 +174,7 @@ start:rflash_option_c_file_not_exist description: basic usage check for option c. if the file does not exist, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c /tmp/abc123.tz check:output=~Error: (\[.*?\]: )?Invalid firmware specified with check:rc != 0 @@ -182,6 +199,7 @@ start:rflash_option_c_with_multiple_values description: basic usage check for option c. if there are multiple value assigned to c option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c /tmp/abc123.tz /tmp/abc124.tz check:output=~Error: (\[.*?\]: )?Invalid firmware specified with check:rc != 0 @@ -200,6 +218,7 @@ start:rflash_option_c_against_node description: Make sure the -c option against node works os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -c |tee /tmp/rflash_option_c.output check:rc == 0 cmd:grep -i ibm /tmp/rflash_option_c.output |grep -i 'HOST Firmware Product' | grep -i 'Active)\*' | wc -l @@ -216,6 +235,7 @@ start:rflash_option_check_with_V_against_node description: Make sure the --check option with V works os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN --check -V |tee /tmp/rflash_option_check_with_V.output check:rc == 0 cmd:grep -i ibm /tmp/rflash_option_check_with_V.output |grep -i 'HOST Firmware Product' | grep -i 'Active)\*' | wc -l @@ -233,6 +253,7 @@ start:rflash_option_l_with_value description: basic usage check for option l. if there is value for l option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -l /tmp/abc123.tz check:output=~Error: (\[.*?\]: )?Invalid option check:rc != 0 @@ -245,6 +266,7 @@ start:rflash_option_l description: Make sure the -l option works os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -l |tee /tmp/rflash_option_l.output check:rc == 0 cmd:grep -i ' bmc ' /tmp/rflash_option_l.output | grep -i 'Active(\*)' | wc -l @@ -262,6 +284,7 @@ start:rflash_option_u_file_not_exist description: basic usage check for option u. if the file does not exist, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -u /tmp/abc123.tz check:output=~Error: (\[.*?\]: )?Invalid firmware specified with check:output!~Attempting to @@ -292,6 +315,7 @@ start:rflash_option_u_with_multiple_values description: basic usage check for option u. if there are multiple value assigned to u option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -u /tmp/abc123.tz /tmp/abc124.tz check:output=~Error: (\[.*?\]: )?Invalid firmware specified with check:output!~Attempting to @@ -314,6 +338,7 @@ start:rflash_option_a_file_not_exist description: basic usage check for option a. if the file does not exist, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a /tmp/abc123.tz check:output=~rror: Invalid firmware specified with check:output!~Attempting to @@ -344,6 +369,7 @@ start:rflash_option_a_with_multiple_values description: basic usage check for option a. if there are multiple value assigned to a option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a /tmp/abc123.tz /tmp/abc124.tz check:output=~Error: (\[.*?\]: )?Invalid firmware specified with check:output!~Attempting to @@ -375,6 +401,7 @@ start:rflash_option_a_with_non_existent_id description: basic usage check for option a. if active a non-existent firmware ID, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -a 1234567 check:output=~Error: (\[.*?\]: )?Invalid ID provided to activate check:rc != 0 @@ -387,6 +414,7 @@ start:rflash_option_delete_with_multiple_values description: basic usage check for option delete. if there are multiple value assigned to delete option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN --delete 1234567 2345678 check:output=~Error: (\[.*?\]: )?More than one firmware specified is not supported check:output!~Attempting to delete @@ -405,6 +433,7 @@ start:rflash_option_delete_with_non_existent_id description: basic usage check for option --delete. if delete a non-existent firmware ID, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN --delete 1234567 check:output=~Error: (\[.*?\]: )?Invalid ID provided to delete check:rc != 0 @@ -417,6 +446,7 @@ start:rflash_option_d_with_multiple_values description: basic usage check for option d. if there are multiple value assigned to d option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash $$CN -d /123/ /234/ check:output=~Error: (\[.*?\]: )?More than one check:output!~Attempting to @@ -436,6 +466,7 @@ start:rflash_option_d_with_non_existent_dir description: basic usage check for option -d. if try to oprate non-existent dir by d option, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rm -rf /tmp/bogus123 check:rc == 0 cmd:rflash $$CN -d /tmp/bogus123 @@ -471,6 +502,7 @@ start:rflash_usage description:checke the usage of rflash for openbmc os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rflash -h check:output =~Usage: check:output =~OpenPOWER OpenBMC specific: @@ -483,6 +515,7 @@ start:rflash_delete_no_active description:this case is to check if --delete is not allowed to be used for the active state firmware. This case is for issue 4770. os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:activenum=`rflash $$CN -l |grep -w "Host\s*Active(\*)" |awk '{print $2}'`;rflash $$CN $activenum --delete check:rc != 0 check:output =~$$CN\s*:\s*(\[.*?\]: )?Error: Deleting currently active firmware on powered on host is not supported diff --git a/xCAT-test/autotest/testcase/rinv/cases0 b/xCAT-test/autotest/testcase/rinv/cases0 index 25709872f..4ac186909 100644 --- a/xCAT-test/autotest/testcase/rinv/cases0 +++ b/xCAT-test/autotest/testcase/rinv/cases0 @@ -4,22 +4,28 @@ #check:rc!=0 #check:output=~Usage #end + start:rinv_h description:show help information for rinv +label:cn_bmc_ready,hctrl_gen cmd:rinv -h check:rc==0 check:output=~Usage check:output=~rinv end + start:rinv_help description:show help information for rinv +label:cn_bmc_ready,hctrl_gen cmd:rinv --help check:rc==0 check:output=~Usage check:output=~rinv end + start:rinv_v description:show version for Version +label:cn_bmc_ready,hctrl_gen cmd:rinv -v check:rc==0 check:output=~Version @@ -28,76 +34,100 @@ end start:rinv_bus description:rinv list all buses for each I/O slot Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_fsp cmd:rinv $$CN bus check:rc==0 check:output=~I/O Bus Information end + start:rinv_config description:Retrieves number of processors, speed, total memory, and DIMM locations. Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_fsp cmd:rinv $$CN config check:rc==0 check:output=~Machine Configuration Info check:output=~Number of Processors:\s*\d+ check:output=~Total Memory \(\w+\):\s*\d+ end + start:rinv_serial description:Retrieves serial number. Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN serial check:rc==0 end + start:rinv_model description:Retrieves serial number. Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN model check:rc==0 end + start:rinv_firm description:Retrieves firmware versions. Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN firm check:rc==0 end + start:rinv_all description:get serial,model Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN all check:rc==0 end + start:rinv_cpu description:get cpu information Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN cpu check:rc==0 end + start:rinv_dimm description:get dimm information Attribute: $$CN-The operation object of rinv command +hcp:openbmc +arch:ppc64le +label:cn_bmc_ready,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN dimm check:rc==0 end + start:rinv_uuid description:get uuid information Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_openpower_ipmi cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN uuid check:rc==0 end + start:rinv_vpd description:get vpd information Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_openpower_ipmi cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN vpd check:rc==0 end start:rinv_noderange_err +label:cn_bmc_ready,hctrl_gen cmd:rinv testnode check:rc!=0 check:output=~Error end + start:rinv_mixnode description:get mixnode information,one is invalid node Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_gen cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:chdef testnode groups=test mgt=__GETNODEATTR($$CN,mgt)__ @@ -112,9 +142,11 @@ check:rc==0 cmd:rmdef testnode;if [[ -e /tmp/testnode.stanza ]]; then cat /tmp/testnode.stanza | chdef -z;rm -rf /tmp/testnode.stanza;fi check:rc==0 end + start:rinv_wrongbmcpasswd description:get right return if bmc's passwd wrong Attribute: $$CN-The operation object of rinv command +label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_fsp,hctrl_openbmc cmd:lsdef -l $$CN -z >/tmp/testnode.stanza check:rc==0 cmd:chdef $$CN bmcpassword=test @@ -125,8 +157,10 @@ check:output=~$$CN: (\[.*?\]: )?Error:.+Invalid username or password|Error: (\[. cmd:cat /tmp/testnode.stanza | chdef -z;rm -rf /tmp/testnode.stanza check:rc==0 end + start:rinv_errorcommand description:get right return if input error command +label:cn_bmc_ready,hctrl_gen cmd:rinv $$CN dafds check:rc==1 check:output=~Unsupported command|Error: (\[.*?\]: )?Usage: diff --git a/xCAT-test/autotest/testcase/rinv/cases2 b/xCAT-test/autotest/testcase/rinv/cases2 index 388ae6ce5..45f2b071b 100644 --- a/xCAT-test/autotest/testcase/rinv/cases2 +++ b/xCAT-test/autotest/testcase/rinv/cases2 @@ -2,6 +2,7 @@ start:rinv_mprom description:this case is to test mprom option for rinv on x86_64 servers. hcp:ipmi arch:x86_64 +label:cn_bmc_ready,hctrl_bmc_ipmi cmd:rinv $$CN mprom check:rc==0 check:output=~BMC Firmware:\s*\w+.\w+ @@ -11,6 +12,7 @@ start:rinv_guid description:this case is to test guid option for rinv on x86_64 servers. hcp:ipmi arch:x86_64 +label:cn_bmc_ready,hctrl_bmc_ipmi cmd:rinv $$CN guid check:rc==0 check:output=~UUID/GUID:\s*\w+-\w+-\w+-\w+-\w+ @@ -20,6 +22,7 @@ start:rinv_dimm description:this case is to test dimm option for rinv on x86_64 servers. hcp:ipmi arch:x86_64 +label:cn_bmc_ready,hctrl_bmc_ipmi cmd:rinv $$CN dimm check:rc==0 check:output=~DIMM 1 :\s*\w+ diff --git a/xCAT-test/autotest/testcase/rpower/cases0 b/xCAT-test/autotest/testcase/rpower/cases0 index 78310d253..01c6cdfc6 100644 --- a/xCAT-test/autotest/testcase/rpower/cases0 +++ b/xCAT-test/autotest/testcase/rpower/cases0 @@ -1,6 +1,7 @@ start:rpower_off description:This case is to test off option could remote power off nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN on cmd:a=0;while ! `rpower $$CN stat|grep "Running\|on" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done check:ouptut=~Running|on @@ -14,6 +15,7 @@ end start:rpower_stat description:This case is to test stat option could show the power status of nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN on cmd:a=0;while ! `rpower $$CN stat|grep "Running\|on" >/dev/null`; do sleep 5;((a++));if [ $a -gt 5 ];then break;fi done cmd:rpower $$CN stat @@ -35,6 +37,7 @@ end start:rpower_boot description:This case is to test boot option could power on the nodes if nodes in off state. Or could hard reset the nodes if they are on. Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN stat|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN stat @@ -49,6 +52,7 @@ end start:rpower_status description:This case is to test status option could show the power status of nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN status|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN status @@ -63,6 +67,7 @@ end start:rpower_state description:This case is to test state option could show the power status of nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN state|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN state @@ -77,6 +82,7 @@ end start:rpower_on description:This case is to test on option could remote power on nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN stat|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN stat @@ -91,6 +97,7 @@ end start:rpower_reset description:This case is to test reset option could hard reset nodes when nodes are in on state. Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:stat=`rpower $$CN stat`;if ([[ $stat =~ on ]] || [[ $stat =~ Running ]]) ;then rpower $$CN reset;sleep 300;stat1=`rpower $$CN stat`;if ([[ $stat1 =~ on ]] || [[ $stat1 =~ Running ]]);then exit 0;else exit 1;fi;else rpower $$CN reset;sleep 300;stat1=`rpower $$CN stat`;if ([[ $stat1 =~ off ]] || [[ $stat1 =~ "Not Activated" ]]);then exit 0;else exit 1;fi;fi check:rc==0 end @@ -98,6 +105,7 @@ end start:rpower_noderange description:This case is to test rpower could process error usage and return help information. Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN check:rc!=0 check:output=~Unsupported|Usage|Please enter an action @@ -106,6 +114,7 @@ end start:rpower_noderange_nodeps description:This case is to test rpower could process error usage and return help information. Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_gen cmd:rpower $$CN --nodeps check:rc!=0 check:output=~Unsupported|Usage @@ -114,6 +123,7 @@ end start:rpower_err_noderange description:This case is to test rpower could process error usage and return help information. Attribute:N/A +label:cn_bmc_ready,hctrl_gen cmd:rpower testnode stat check:rc!=0 check:output=~Error @@ -122,6 +132,7 @@ end start:rpower_softoff description:This case is to test softoff option could remote shutdown nodes Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_fsp,hctrl_openbmc cmd:rpower $$CN on cmd:a=0;while ! `rpower $$CN stat|grep "Running\|on" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done check:ouptut=~Running|on @@ -135,6 +146,7 @@ end start:rpower_onstandby description:This case is to test onstandby option could bring server to standby state Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_fsp arch:ppc64 cmd:rpower $$CN off check:rc==0 @@ -149,6 +161,7 @@ end start:rpower_wrongpasswd description:rpower ipmi and openbmc using wrong passwd Attribute: $$CN-The operation object of rpower command +label:cn_bmc_ready,hctrl_openpower_ipmi cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rpower/rpower_wrongpasswd_test.sh -pt $$CN $$bmcpasswd $$bmcusername check:rc==0 cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rpower/rpower_wrongpasswd_test.sh -c $$CN @@ -161,6 +174,7 @@ end start:rpower_suspend_OpenpowerBmc hcp:openbmc +label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN suspend check:output=~Error: (\[.*?\]: )?Unsupported command: rpower suspend check:rc==1 @@ -169,6 +183,7 @@ end start:rpower_wake_OpenpowerBmc hcp:openbmc +label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN wake check:output=~Error: (\[.*?\]: )?Unsupported command: rpower wake check:rc==1 @@ -176,6 +191,7 @@ end start:rpower_errorcommand_OpenpowerBmc hcp:openbmc +label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN ddd check:output=~Error: (\[.*?\]: )?Unsupported command: rpower ddd check:rc==1 @@ -184,6 +200,7 @@ end start:rpower_bmcreboot_perl_python_output description:record the output for rpower bmcreboot and compare the output for perl and python version. hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd: /opt/xcat/share/xcat/tools/autotest/testcase/UT_openbmc/scripts/bmcreboot.sh $$CN /tmp/xcattest.rpower.bmcstate.perl.out PERL check:rc==0 cmd: grep "Login to BMC failed: 500" /tmp/xcattest.rpower.bmcstate.perl.out | sort | uniq | wc -l diff --git a/xCAT-test/autotest/testcase/rsetboot/cases0 b/xCAT-test/autotest/testcase/rsetboot/cases0 index 1520b3699..2240669ac 100644 --- a/xCAT-test/autotest/testcase/rsetboot/cases0 +++ b/xCAT-test/autotest/testcase/rsetboot/cases0 @@ -1,6 +1,7 @@ start:rsetboot_hd_statcheck description:set the boot device from hd Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc cmd:if [[ -f /tmp/rsetboot.stat ]];then mv -f /tmp/rsetboot.stat /tmp/rsetboot.stat.bak;fi; rsetboot $$CN state > /tmp/rsetboot.stat; check:rc==0 cmd:rsetboot $$CN hd @@ -18,6 +19,7 @@ end start:rsetboot_net_statcheck description:set the boot device from net Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:if [[ -f /tmp/rsetboot.stat ]];then mv -f /tmp/rsetboot.stat /tmp/rsetboot.stat.bak;fi; rsetboot $$CN state > /tmp/rsetboot.stat; check:rc==0 cmd:rsetboot $$CN net @@ -35,6 +37,7 @@ end start:rsetboot_cd_statcheck description:set the boot device from CD/DVD Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:if [[ -f /tmp/rsetboot.stat ]];then mv -f /tmp/rsetboot.stat /tmp/rsetboot.stat.bak;fi; rsetboot $$CN state > /tmp/rsetboot.stat; check:rc==0 cmd:rsetboot $$CN cd @@ -52,6 +55,7 @@ end start:rsetboot_default_statcheck description:set the boot device default Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:if [[ -f /tmp/rsetboot.stat ]];then mv -f /tmp/rsetboot.stat /tmp/rsetboot.stat.bak;fi; rsetboot $$CN state > /tmp/rsetboot.stat; check:rc==0 cmd:rsetboot $$CN default @@ -68,6 +72,7 @@ end start:rsetboot_h description:get rsetboot help information +label:cn_bmc_ready,hctrl_gen cmd:rsetboot -h check:rc==0 check:output=~Usage: rsetboot @@ -75,6 +80,7 @@ end start:rsetboot_help description:get rsetboot help information using rsetboot help +label:cn_bmc_ready,hctrl_gen cmd:rsetboot -help check:rc==0 check:output=~Usage: rsetboot @@ -82,12 +88,15 @@ end start:rsetboot_v desription:get rsetboot version +label:cn_bmc_ready,hctrl_gen cmd:rsetboot -v check:rc==0 check:output=~Version end + start:rsetboot_node_invalidnode desription:rsetboot using invalidenode +label:cn_bmc_ready,hctrl_gen cmd:rsetboot testnode boot check:rc!=0 end @@ -95,6 +104,7 @@ end start:rsetboot_noderange_net description:rsetboot noderange net Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:chdef testnode groups=test mgt=__GETNODEATTR($$CN,mgt)__ @@ -118,6 +128,7 @@ end start:rsetboot_node_invalidaction description:rsetboot node using invalidaction Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:rsetboot $$CN dsdf check:rc!=0 check:output=~Error: (\[.*?\]: )?unsupported command|Unsupported command @@ -126,6 +137,7 @@ end start:rsetboot_group_net description:rsetboot group node Attribute: $$CN-The operation object of rsetboot command. +label:cn_bmc_ready,hctrl_openbmc,hctrl_bmc_ipmi cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:if [[ -f /tmp/rsetboot.stat ]];then mv -f /tmp/rsetboot.stat /tmp/rsetboot.stat.bak;fi; rsetboot $$CN state > /tmp/rsetboot.stat; diff --git a/xCAT-test/autotest/testcase/rspconfig/cases0 b/xCAT-test/autotest/testcase/rspconfig/cases0 index 431c7e5fe..9d6578b5d 100644 --- a/xCAT-test/autotest/testcase/rspconfig/cases0 +++ b/xCAT-test/autotest/testcase/rspconfig/cases0 @@ -1,12 +1,15 @@ #Need to test later start:rspconfig_autopower hcp:fsp +label:cn_bmc_ready,hctrl_fsp cmd:rspconfig $$CEC autopower check:rc==0 check:output=~$$CEC: autopower: \w+ end + start:rspconfig_iocap hcp:fsp +label:cn_bmc_ready,hctrl_fsp cmd:rspconfig $$CEC iocap check:rc==0 check:output=~$$CEC: iocap: \w+ @@ -14,18 +17,23 @@ end start:rspconfig_time hcp:fsp +label:cn_bmc_ready,hctrl_fsp cmd:rspconfig $$CEC time check:rc==0 check:output=~$$CEC: Time: \d\d:\d\d:\d\d end + start:rspconfig_date hcp:fsp +label:cn_bmc_ready,hctrl_fsp cmd:rspconfig $$CEC date check:rc==0 check:output=~$$CEC: Date: \d\d-\d\d-\d\d\d\d end + start:rspconfig_decfg hcp:fsp +label:cn_bmc_ready,hctrl_fsp cmd:rspconfig $$CEC decfg check:rc==0 check:output=~$$CEC @@ -34,8 +42,10 @@ check:output=~predictive check:output=~system bus check:output=~functional end + start:rspconfig_sshcfg hcp:hmc +label:cn_bmc_ready,hctrl_hmc,hctrl_openbmc cmd:rspconfig __GETNODEATTR($$CN,hcp)__ sshcfg check:rc==0 check:output=~__GETNODEATTR($$CN,hcp)__: \w+ @@ -44,6 +54,7 @@ end start:rspconfig_list_ntpservers description: rspconfig list ntpservers info Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ntpservers check:rc==0 check:output=~$$CN: BMC NTP Servers @@ -52,6 +63,7 @@ end start:rspconfig_set_ntpservers description: rspconfig set ntpservers Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rspconfig/rspconfig_ntp.sh $$CN $$MN check:rc==0 end @@ -61,6 +73,7 @@ description:To test change openbmc ip separately by rspconfig. should not suppor Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ip=__GETNODEATTR($$CN,bmc)__ check:output=~Error: (\[.*?\]: )?IP, netmask and gateway must be configured together. check:rc!=0 @@ -71,6 +84,7 @@ description:rspconfig could not change openbmc ip using invalid ip Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ip=ddd gateway=0.0.0.0 netmask=255.255.0.0 check:output=~Error: (\[.*?\]: )?Invalid parameter for option ip check:rc!=0 @@ -81,6 +95,7 @@ description:rspconfig could not set ip to null Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ip= check:output=~Invalid parameter for option ip check:rc!=0 @@ -94,6 +109,7 @@ description:To test change openbmc netmask separately by rspconfig. should not s Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN netmask=255.255.0.0 check:output=~Error: (\[.*?\]: )?IP, netmask and gateway must be configured together. check:rc!=0 @@ -102,6 +118,7 @@ end start:rspconfig_netmask_invalid despcription:rspconfig could not change openbmc netmask using invalid netmask Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN netmask=ddd check:output=~Error: (\[.*?\]: )?Invalid parameter for option netmask check:rc!=0 @@ -118,6 +135,7 @@ description:To test change openbmc gateway by rspconfig. should not support and Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN gateway=0.0.0.0 check:output=~Error: (\[.*?\]: )?IP, netmask and gateway must be configured together. check:rc!=0 @@ -126,6 +144,7 @@ end start:rspconfig_set_vlan description:rspconfig change openbmc gateway Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN vlan=0 check:output=~Error: (\[.*?\]: )?Invalid parameter for option vlan|Error: (\[.*?\]: )?VLAN must be configured with IP, netmask and gateway check:rc!=0 @@ -137,6 +156,7 @@ end start:rspconfig_set_all description:rspconfig change openbmc ip/netmask/gateway/vlan Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rspconfig/rspconfig.sh -a $$CN check:rc==0 end @@ -146,6 +166,7 @@ despcription:rspconfig could not change openbmc gatway using invalid gateway Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN gateway=ddd check:output=~Error: (\[.*?\]: )?Invalid parameter for option gateway check:rc!=0 @@ -162,6 +183,7 @@ despcription:rspconfig could not change openbmc gatway using invalid vlan Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN vlan=dddsdsdfs check:output=~Error: (\[.*?\]: )?VLAN must be configured with IP, netmask and gateway check:rc!=0 @@ -172,6 +194,7 @@ despcription:rspconfig could not change openbmc gatway using invalid vlan Attribute: $$CN-The operation object of rspconfig command os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ip=dsd gateway=ooo netmask=asfsf vlan=dddsdsdfs check:output=~Error: (\[.*?\]: )?Invalid parameter check:rc!=0 @@ -181,6 +204,7 @@ start:rspconfig_node_invalid despcription:rspconfig could not do any action using invalid node os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:rspconfig testnode ip @@ -194,6 +218,7 @@ start:rspconfig_noderange_invalid despcription:rspconfig could not do any action using invalid node os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:rspconfig testnode,$$CN ip @@ -205,6 +230,7 @@ end start:rspconfig_list_ip despcription:rspconfig list bmc ip +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openbmc cmd:rspconfig $$CN ip check:rc==0 check:output=~__GETNODEATTR($$CN,bmc)__ @@ -214,6 +240,7 @@ start:rspconfig_list_gateway hcp:openbmc description:rspconfig list openbmc gateway Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openbmc cmd:rspconfig $$CN gateway check:output=~$$CN: BMC Gateway: check:rc==0 @@ -223,6 +250,7 @@ start:rspconfig_list_netmask hcp:openbmc description:rspconfig list openbmc netmask Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openbmc cmd:rspconfig $$CN netmask check:rc==0 check:output=~$$CN: BMC Netmask: @@ -231,6 +259,7 @@ end start:rspconfig_list_vlan description:rspconfig list openbmc vlan Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openbmc cmd: rspconfig $$CN vlan check:rc==0 check:output=~$$CN: BMC VLAN ID: @@ -239,6 +268,7 @@ end start:rspconfig_list_all description:rspconfig list openbmc ip gateway netmask vlan Attribute: $$CN-The operation object of rspconfig command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openbmc cmd: rspconfig $$CN ip gateway netmask vlan check:rc==0 check:output=~$$CN: BMC VLAN ID: @@ -252,6 +282,7 @@ start:rspconfig_set_hostname_equal_star_with_bmc_is_ip description:when bmc=, rspconfig hostname=* should throw out error os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc #in automation environment, bmc is ip by default. cmd:lsdef $$CN -i bmc -c check:rc == 0 @@ -266,6 +297,7 @@ start:rspconfig_set_hostname_equal_star_with_bmc_is_hostname description:when bmc=, rspconfig hostname=* should set bmc_hostname into bmc os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:mkdir -p /tmp/rspconfig_set_hostname_equal_star_with_bmc_is_hostname check:rc == 0 cmd:lsdef $$CN -z > /tmp/rspconfig_set_hostname_equal_star_with_bmc_is_hostname/$$CN.stanza @@ -299,6 +331,7 @@ start:rspconfig_get_hostname description:To test get bmc hostname by rspconfig. os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:mkdir -p /tmp/rspconfig_get_hostname check:rc == 0 cmd:rspconfig $$CN sshcfg @@ -322,6 +355,7 @@ start:rspconfig_hostname_with_error_input description: To test with error input, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN hostname bogus check:output =~Error: (\[.*?\]: )?Unsupported command check:rc != 0 @@ -337,6 +371,7 @@ start:rspconfig_set_hostname description:To test set bmc hostname by rspconfig os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:mkdir -p /tmp/rspconfig_set_hostname check:rc == 0 cmd:rspconfig $$CN sshcfg @@ -363,6 +398,7 @@ start:rspconfig_set_admin_passwd_with_error_input description: To test "rspconfig admin_passwd=xxx,yyy". If the format of "xxx,yyy" is wrong, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN admin_passwd=cluster, check:output =~Error: (\[.*?\]: )?Invalid parameter for option admin_passwd check:rc != 0 @@ -383,6 +419,7 @@ start:rspconfig_set_admin_passwd_with_error_origin_password description: To test "rspconfig admin_passwd=xxx,yyy". If the original password is wrong, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN admin_passwd=bogus__GETNODEATTR($$CN,bmcpassword)__,cluster check:output =~Current BMC password is incorrect #check:rc != 0 @@ -392,6 +429,7 @@ start:rspconfig_sshcfg_with_error_input description: To test "rspconfig sshcfg" with error input, should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN sshcfg aaa check:output =~Error: (\[.*?\]: )?Configure sshcfg must be issued without other options. check:rc != 0 diff --git a/xCAT-test/autotest/testcase/rspconfig/cases1 b/xCAT-test/autotest/testcase/rspconfig/cases1 index 5eade2cb5..1900c1ebf 100644 --- a/xCAT-test/autotest/testcase/rspconfig/cases1 +++ b/xCAT-test/autotest/testcase/rspconfig/cases1 @@ -2,6 +2,7 @@ start:rspconfig_ipsrc description: To test "rspconfig ipsrc",to get the IP source for OpenBMC os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ipsrc check:output=~$$CN\s*:\s*BMC IP Source: Static|BMC IP Source: Dynamic check:rc == 0 @@ -14,6 +15,7 @@ start:rspconfig_dump_list description: To test "rspconfig dump -l" and "rspconfig dump --list" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN dump -l check:output =~$$CN:\s*No attributes returned from the BMC.|\s*\[\d+\]\s* Generated: check:rc == 0 @@ -26,6 +28,7 @@ start:rspconfig_dump_generate description: To test "rspconfig dump -g" and "rspconfig dump --generate" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN dump -l|tee /tmp/dumplistold check:output =~$$CN:\s*No attributes returned from the BMC.|\s*\[\d+\]\s* Generated: check:rc == 0 @@ -60,6 +63,7 @@ start:rspconfig_dump_clear description: To test "rspconfig dump -c" and "rspconfig dump --clear" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN dump -g |tee /tmp/dumpgenerate check:rc == 0 check:output =~$$CN:\s*\[\d+\]\s* success @@ -100,6 +104,7 @@ start:rspconfig_dump_download description: To test rspconfig dump -d" and "rspconfig dump --download" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN dump -g |tee /tmp/dumpgenerate check:rc == 0 check:output =~$$CN:\s*\[\d+\]\s* success @@ -133,6 +138,7 @@ start:rspconfig_dump_no_option description: To test "rspconfig dump" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN dump check:rc == 0 check:output =~$$CN:\s*Dump requested @@ -148,6 +154,7 @@ start:rspconfig_gard description: To test "rspconfig gard -c" os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN gard -c check:output =~$$CN:\s*GARD cleared check:rc == 0 @@ -160,6 +167,7 @@ start:rspconfig_ntpserver description: To test "rspconfig ntpservers" to show the ntp server of the node os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN ntpservers check:output =~$$CN:\s*BMC NTP Servers:\s*None|\s*\d+.\d+.\d+.\d+ check:rc == 0 @@ -169,6 +177,7 @@ start:rspconfig_powerrestorepolicy description: To test "rspconfig powerrestorepolicy" to show the policy os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN powerrestorepolicy |tee /tmp/powerrestorepolicy check:output =~$$CN:\s*BMC PowerRestorePolicy:\s*AlwaysOff|AlwaysOn|Restore check:rc == 0 @@ -202,6 +211,7 @@ start:rspconfig_powersupplyredundancy description: To test "rspconfig powersupplyredundancy" to show the powersupplyredundancy state os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN powersupplyredundancy |tee /tmp/powersupplyredundancy check:output =~$$CN:\s*BMC PowerSupplyRedundancy:\s*Enabled|Disabled check:rc == 0 @@ -229,6 +239,7 @@ start:rspconfig_timesyncmethod description: To test "rspconfig timesyncmethod" to show the timesyncmethod os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN timesyncmethod |tee /tmp/timesyncmethod check:output =~$$CN:\s*BMC TimeSyncMethod:\s*NTP|Manual check:rc == 0 @@ -256,6 +267,7 @@ start:rspconfig_bootmode description: To test "rspconfig bootmode" to show and change bootmode os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN bootmode|tee /tmp/bootmode check:output =~$$CN:\s*BMC BootMode:\s*Regular|Safe|Setup check:rc == 0 @@ -289,6 +301,7 @@ start:rspconfig_autoreboot description: To test "rspconfig autoreboot" to show and change autoreboot os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN autoreboot|tee /tmp/autoreboot check:output =~$$CN:\s*BMC AutoReboot:\s*1|0 check:rc == 0 @@ -316,6 +329,7 @@ start:rspconfig_invalid description: To test "rspconfig invalid_value" should throw out error message os:Linux hcp:openbmc +label:cn_bmc_ready,hctrl_openbmc cmd:rspconfig $$CN aaa check:output =~Error: (\[.*?\]: )?Unsupported command: rspconfig aaa check:rc != 0 diff --git a/xCAT-test/autotest/testcase/rvitals/cases0 b/xCAT-test/autotest/testcase/rvitals/cases0 index 4a40f6b5c..4d904a98d 100644 --- a/xCAT-test/autotest/testcase/rvitals/cases0 +++ b/xCAT-test/autotest/testcase/rvitals/cases0 @@ -1,6 +1,7 @@ start:rvitals_h description:get rvitals's usage Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_gen cmd:rvitals -h check:rc==0 check:output=~Usage: @@ -10,6 +11,7 @@ end start:rvitals_v description:get rvitals's version Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_gen cmd:rvitals -v check:rc==0 check:output=~Version @@ -18,6 +20,7 @@ end start:rvitals_temp description:Retrieves temperatures Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN temp check:rc==0 end @@ -27,6 +30,7 @@ description:Retrieves disk temperatures Attribute: $$CN-The operation object of rvitals command arch:ppc64le hcp:ipmi +label:cn_bmc_ready,hctrl_openpower_ipmi cmd:rvitals $$CN disktemp check:rc==0 check:output=~Ambient Temp @@ -37,6 +41,7 @@ description:Retrieves cpu temperatures Attribute: $$CN-The operation object of rvitals command arch:ppc64le hcp:ipmi +label:cn_bmc_ready,hctrl_openpower_ipmi cmd:rvitals $$CN cputemp check:rc==0 check:output=~Ambient Temp @@ -45,6 +50,7 @@ end start:rvitals_voltage description:Retrieves power supply and VRM voltage readings Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN voltage check:rc==0 end @@ -52,6 +58,7 @@ end start:rvitals_power description:Retrieves power status Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openpower_ipmi,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN power check:rc==0 end @@ -59,6 +66,7 @@ end start:rvitals_state description:Retrieves the system state. Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready cmd:rvitals $$CN state check:rc==0 check:output=~System State: @@ -68,6 +76,7 @@ start:rvitals_lcds description:Retrieves LCDs status Attribute: $$CN-The operation object of rvitals command hcp:hmc,ivm,fsp,ipmi +label:cn_bmc_ready,hctrl_fsp cmd:rvitals $$CN lcds check:rc==0 check:output=~Current LCD @@ -76,6 +85,7 @@ end start:rvitals_all description:Retrieves all status Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN all check:rc==0 end @@ -83,6 +93,7 @@ end start:rvitals_leds description:Retrieves leds status Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openpower_ipmi,hctrl_openbmc cmd:rvitals $$CN leds check:rc==0 check:output=~LED @@ -91,28 +102,37 @@ end start:rvitals_fanspeed description:Retrieves fan speeds. Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openpower_ipmi,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN fanspeed check:rc==0 end + start:rvitals_wattage description:Retrieves wattage readings. Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_bmc_ipmi,hctrl_openpower_ipmi,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN wattage check:rc==0 end + start:rvitals_altitude description:Retrieves altitude readings. Attribute: $$CN-The operation object of rvitals command +label:cn_bmc_ready,hctrl_openbmc cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN altitude check:rc==0 end + start:rvitals_noderange_err description:using not defined node +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals testnode check:rc!=0 end + start:rvitals_errorcommand description:using wrong command +label:cn_bmc_ready,hctrl_gen cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN errorcommand check:rc!=0 end diff --git a/xCAT-test/autotest/testcase/rvitals/cases1 b/xCAT-test/autotest/testcase/rvitals/cases1 index f18dca405..c59c99cf0 100644 --- a/xCAT-test/autotest/testcase/rvitals/cases1 +++ b/xCAT-test/autotest/testcase/rvitals/cases1 @@ -1,5 +1,6 @@ start:rvitals_outputs_format_checking description: Check the output formats of rvitals +label:cn_bmc_ready,hctrl_gen cmd:rvitals $$CN | grep -v -E '^[^:]+:[^:]+:[^:]+$' check:rc==1 end From fceff79d5dc6a81443babe81df4e4406ca156f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Fri, 22 Jun 2018 14:31:09 +0800 Subject: [PATCH 32/93] Specify the new GPG key 5619700D used for signing (#5316) --- build-ubunturepo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-ubunturepo b/build-ubunturepo index ba4cd8dcb..a44c886c8 100755 --- a/build-ubunturepo +++ b/build-ubunturepo @@ -335,7 +335,7 @@ __EOF__ echo "GPGSIGN=$GPGSIGN specified, the repo will not be signed" echo "" >> conf/distributions else - echo "SignWith: yes" >> conf/distributions + echo "SignWith: 5619700D" >> conf/distributions echo "" >> conf/distributions fi done @@ -462,7 +462,7 @@ __EOF__ echo "GPGSIGN=$GPGSIGN specified, the repo will not be signed" echo "" >> conf/distributions else - echo "SignWith: yes" >> conf/distributions + echo "SignWith: 5619700D" >> conf/distributions echo "" >> conf/distributions fi From 3f43be72e6aa5386163e89c9be5d1b58274a3145 Mon Sep 17 00:00:00 2001 From: robin2008 Date: Fri, 22 Jun 2018 15:24:41 +0800 Subject: [PATCH 33/93] UT testcase for secureroot --- xCAT-test/autotest/testcase/nodeset/cases0 | 12 ++++++ .../testcase/packimg/cases_secure_protect | 42 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 xCAT-test/autotest/testcase/packimg/cases_secure_protect diff --git a/xCAT-test/autotest/testcase/nodeset/cases0 b/xCAT-test/autotest/testcase/nodeset/cases0 index c95fbec9c..62d53b4e4 100644 --- a/xCAT-test/autotest/testcase/nodeset/cases0 +++ b/xCAT-test/autotest/testcase/nodeset/cases0 @@ -473,3 +473,15 @@ check:output=~$$CN:\s*install cmd:imagename=`cat /tmp/imagename`;osversion=`lsdef -t osimage -o $imagename |grep osvers|awk -F= '{print $2}'`;versionnum=`echo $osversion |sed 's:[a-zA-Z]::g'`;grep -w -A10 "$$CN" /var/lib/dhcpd/dhcpd.leases | grep "/install/$osversion/armel/cumulus-linux-$versionnum-bcm-armel.bin" check:rc==0 end + +start:nodeset_secureroot +os: rhels +description: Test nodeset could generate right installation files when site.secureroot=1 +label: others,security +cmd: chdef -t site secureroot=1 +cmd: nodeset $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-install-compute +check:rc==0 +cmd: cat /install/autoinst/$$CN | grep '^rootpw --iscrypted \*' > /dev/null +check:rc==0 +cmd: chdef -t site secureroot= +end diff --git a/xCAT-test/autotest/testcase/packimg/cases_secure_protect b/xCAT-test/autotest/testcase/packimg/cases_secure_protect new file mode 100644 index 000000000..0b4bd2c8d --- /dev/null +++ b/xCAT-test/autotest/testcase/packimg/cases_secure_protect @@ -0,0 +1,42 @@ +start:packimage_nosyncfiles +os:Linux +description: Test packimage with --nosyncfiles +label: others,security +cmd: myimage=$$OSIMAGE +lsdef -t osimage -o $myimage -z > /tmp/packimage_nosyncfiles.osimage && \ +chdef -t osimage -o "$myimage" rootimgdir=/tmp/packimage_nosyncfiles/rootimgdir && \ +chdef -t osimage -o "$myimage" synclists=/tmp/packimage_nosyncfiles.sensitive.$$ && \ +touch /tmp/packimage_nosyncfiles.sensitive && \ +echo "/tmp/packimage_nosyncfiles.sensitive -> /etc/sensitive.xcattesting" > /tmp/packimage_nosyncfiles.sensitive.$$ && \ +genimage "$myimage" && \ +packimage "$myimage" --nosyncfiles +if [ $? = 0 ]; then + test ! -e /tmp/packimage_nosyncfiles/rootimgdir/rootimg/etc/sensitive.xcattesting +else + false +fi +check:rc==0 +cmd: test -e /tmp/packimage_nosyncfiles.osimage && cat /tmp/packimage_nosyncfiles.osimage | mkdef -t osimage $$OSIMAGE -f +cmd: rm -rf /tmp/packimage_nosyncfiles* +end + +start:packimage_secureroot +os:Linux +description: Test packimage with site.secureroot=1 +label: others,security +cmd: chdef -t site secureroot=1 +cmd: myimage=$$OSIMAGE +lsdef -t osimage $myimage -z > /tmp/packimage_secureroot.osimage && \ +chdef -t osimage -o "$myimage" rootimgdir=/tmp/packimage_secureroot/rootimgdir && \ +genimage "$myimage" && \ +packimage "$myimage" --nosyncfiles +if [ $? = 0 ]; then + grep '^root\:\*\:' /tmp/packimage_secureroot/rootimgdir/rootimg/etc/shadow +else + false +fi +check:rc==0 +cmd: test -e /tmp/packimage_secureroot.osimage && cat /tmp/packimage_secureroot.osimage | mkdef -t osimage $$OSIMAGE -f +cmd: rm -rf /tmp/packimage_secureroot* +cmd: chdef -t site secureroot= +end From 69d4ef25afd2570565b1cb0c35d568b645b98df9 Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Fri, 22 Jun 2018 17:22:59 +0800 Subject: [PATCH 34/93] Refine option l of xcattest (#5293) --- xCAT-test/xcattest | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/xCAT-test/xcattest b/xCAT-test/xcattest index 6ef98f6cd..2e72eff2a 100755 --- a/xCAT-test/xcattest +++ b/xCAT-test/xcattest @@ -16,10 +16,10 @@ BEGIN use lib "$::XCATROOT/lib/perl"; #--------------global attributes---------------- -my $prpgram_path = dirname(File::Spec->rel2abs(__FILE__)); +my $program_path = dirname(File::Spec->rel2abs(__FILE__)); my $program_name = basename($0); -my $rootdir = "$prpgram_path/../share/xcat/tools/autotest"; +my $rootdir = "$program_path/../share/xcat/tools/autotest"; my $casedir = "$rootdir/testcase/"; $casedir = $ENV{'XCATTEST_CASEDIR'} if exists $ENV{'XCATTEST_CASEDIR'}; my $bundledir = "$rootdir/bundle/"; @@ -100,6 +100,8 @@ To list the information about specific cases To list cases information that satisfy specific filter expression $program_name -l {caselist|caseinfo|casenum} -s \"filter_expression\" +For short, show the cases list can use below command + $program_name -l -s \"filter_expression\" To list information about cases in specific bundles and satisfy specific filter expression at same time $program_name -l {caselist|caseinfo|casenum} -b -s \"filter_expression\" @@ -114,7 +116,7 @@ To run test cases that satisfy specific filter expression Options: -h : Get $program_name usage information. - -l : list specific information. The valid options are caselist,caseinfo,casenum,bundleinfo. + -l : list specific information. The valid options are caselist,caseinfo,casenum,bundleinfo. For list case information, caselist is default value. -f : specify the configuration file. If 'System' tag is used, only [System] section in the configuration file will be used. If 'System' is not used all other sections of the configuration file will be used, like [Table], [Object], etc. -c : Comma separated list of command names to test. -t : Comma separated list of test case names to test. @@ -122,9 +124,9 @@ Options: -r : Back up the original environment settings before running test, and restore them after running test. -q : Just record all the output of $program_name into log file under $resultdir, not print to STDOUT. Print to STDOUT by default. -s : Filter case by label. The acceptable value looks like 'label1+label2-label3\|label4\|label5', 'label1+label2-label3' works as sub expression. - '|' means union filter, it has higher priority, expression1|expression2 means the case either satisfies expression1 or satisfies expression2. - '+' means the case need have specific label. low priority. - '-' means the case does not have specific label. low priority. + '|' means union filter, it has lower priority, expression1|expression2 means the case either satisfies expression1 or satisfies expression2. + '+' means the case need have specific label. higher priority. + '-' means the case does not have specific label. higher priority. "; #============================================================================================== @@ -142,7 +144,7 @@ if ( "b=s" => \$bundlelist, "t=s" => \$caselist, "c=s" => \$cmdlist, - "l=s" => \$list, + "l:s" => \$list, "q" => \$quiet, "s=s" => \$search_expression, "r" => \$restore) @@ -180,13 +182,15 @@ if ($rst) { to_exit(1); } - if ($xcatdebug) { print "----case to be run-----------------\n"; print Dumper \@cases_to_be_run; } -if ($list) { +if (defined $list) { + + $list="caselist" if ($list eq ""); + if ($list eq "caselist") { if (@cases_to_be_run) { @@ -194,6 +198,8 @@ if ($list) { foreach (@cases_to_be_run) { log_this($running_log_fd, "$_"); } + } elsif (!@cases_to_be_run && $search_expression){ + log_this($running_log_fd, "There is no cases match search expression $search_expression"); } else { #list the cases shipped by xcat test package @@ -206,13 +212,17 @@ if ($list) { } } } elsif ($list eq "caseinfo") { - $rst = show_case_info(\@cases_to_be_run, \$error); - if ($rst) { - log_this($running_log_fd, "$error"); - to_exit(1); + if (!@cases_to_be_run && $search_expression){ + log_this($running_log_fd, "There is no cases match search expression $search_expression"); + } else { + $rst = show_case_info(\@cases_to_be_run, \$error); + if ($rst) { + log_this($running_log_fd, "$error"); + to_exit(1); + } } } elsif ($list eq "casenum") { - if (@cases_to_be_run) { + if (@cases_to_be_run || (!@cases_to_be_run && $search_expression)) { #list the case number indicated by option -b,-c,-t my $casenum = @cases_to_be_run; @@ -622,7 +632,7 @@ sub check_option_validity { if ($list) { my @vaild_list_method = (); - if ($bundlelist || $caselist || $cmdlist) { + if ($bundlelist || $caselist || $cmdlist || $search_expression) { @vaild_list_method = ("caselist", "caseinfo", "casenum"); } else { @vaild_list_method = ("caselist", "caseinfo", "casenum", "bundleinfo", "labelinfo"); @@ -2000,7 +2010,7 @@ sub filter_case_by_label { for (my $i = 0 ; $i <= $#label_order ; $i++) { foreach my $l (@{ $label_order[$i] }) { foreach my $c (@targetcases) { - push @{$rest_cases_to_be_run_ref}, $c unless (($case_label_map_ref->{$c}->{label} & $label_map{$l}) == 0); + push @{$rest_cases_to_be_run_ref}, $c if (defined ($label_map{$l}) && (($case_label_map_ref->{$c}->{label} & $label_map{$l}) != 0)); } } } From 22c06a90399da3d5ff3d74ecd564e8338fb271d1 Mon Sep 17 00:00:00 2001 From: robin2008 Date: Fri, 22 Jun 2018 17:34:46 +0800 Subject: [PATCH 35/93] secureroot doc --- docs/source/advanced/security/security.rst | 9 +++++++++ .../guides/admin-guides/references/man5/site.5.rst | 3 +++ 2 files changed, 12 insertions(+) diff --git a/docs/source/advanced/security/security.rst b/docs/source/advanced/security/security.rst index 32d9b9c4e..e47ca74e9 100644 --- a/docs/source/advanced/security/security.rst +++ b/docs/source/advanced/security/security.rst @@ -136,6 +136,15 @@ Here is an example about how to store a MD5 encrypted password for root in ``pas tabch key=system passwd.username=root passwd.password=`openSSL passwd -1 ` +During the provisioning, the root password will be set on the compute nodes. By default, xCAT stores the encrypted hash of password into installation files directly for better performance. + +For example, ``/etc/shadow`` in stateless image for stateless nodes or installation files ( ``/install/autoinst/`` ) for stateful nodes. + +You can enable **secureroot** feature for more secure consideration. :: + + chdef -t site secureroot=1 + +Then, after the new ``packimage`` or ``nodeset`` command, the root password hash can only be acquired on-the-fly with strict security control. Nodes Inter-Access in The Cluster diff --git a/docs/source/guides/admin-guides/references/man5/site.5.rst b/docs/source/guides/admin-guides/references/man5/site.5.rst index b43e6a12f..b77143fd2 100644 --- a/docs/source/guides/admin-guides/references/man5/site.5.rst +++ b/docs/source/guides/admin-guides/references/man5/site.5.rst @@ -295,6 +295,9 @@ site Attributes: for each node, and put them in a directory of tftpdir(such as: /tftpboot) If no, it will not generate the mypostscript file in the tftpdir. + secureroot: If set to 1, xCAT will use secure mode to transfer root password hash + during the installation. Default is 0. + setinstallnic: Set the network configuration for installnic to be static. sharedtftp: Set to 0 or no, xCAT should not assume the directory From 74113c6b17a6cda78fd1c53af5d7eb0a9e3f2ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Fri, 22 Jun 2018 18:00:16 +0800 Subject: [PATCH 36/93] Hack travis.pl to resolve the GPG signing problem (#5318) --- travis.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis.pl b/travis.pl index d35f0a8ad..7dc5ea8de 100644 --- a/travis.pl +++ b/travis.pl @@ -272,7 +272,7 @@ sub send_back_comment{ sub build_xcat_core{ my @output; my @cmds = ("gpg --list-keys", - "sed -i '/SignWith: yes/d' $ENV{'PWD'}/build-ubunturepo"); + "sed -i '/SignWith: /d' $ENV{'PWD'}/build-ubunturepo"); foreach my $cmd (@cmds){ print "[build_xcat_core] running $cmd\n"; @output = runcmd("$cmd"); From 187c972d3265139a0b7055360c5d4d3bf37d5f75 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Fri, 22 Jun 2018 16:23:25 -0400 Subject: [PATCH 37/93] Format cleanup --- xCAT-probe/subcmds/xcatmn | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/xCAT-probe/subcmds/xcatmn b/xCAT-probe/subcmds/xcatmn index 2c1f2cd25..0f0bd74eb 100755 --- a/xCAT-probe/subcmds/xcatmn +++ b/xCAT-probe/subcmds/xcatmn @@ -13,20 +13,20 @@ use File::Copy; use Data::Dumper; use Getopt::Long qw(:config no_ignore_case); -my $help = 0; #command line attribute '-h', get usage information -my $test = 0; #command line attribute '-T' -my $hierarchy = 0; -my $verbose = 0; #command line attribute '-V' -my $noderange; #command line attribute '-n' -my $output = "stdout"; #used by probe_utils->send_msg("$output", "o", "xxxxxxxxxx"); print output to STDOUT -my $rst = 0; #the exit code of current command -my $terminal = 0; #means get INT signal from STDIN +my $help = 0; #command line attribute '-h', get usage information +my $test = 0; #command line attribute '-T' +my $hierarchy = 0; +my $verbose = 0; #command line attribute '-V' +my $noderange; #command line attribute '-n' +my $output = "stdout"; #used by probe_utils->send_msg("$output", "o", "xxxxxxxxxx"); print output to STDOUT +my $rst = 0; #the exit code of current command +my $terminal = 0; #means get INT signal from STDIN my $installnic; -#save all output from commands running on SNs and MN -# one example: -# $summaryoutput{mn} = @mn_output_history -# $summaryoutput{SN1} = @SN1_output_history +# Save all output from commands running on SNs and MN +# Example: +# $summaryoutput{mn} = @mn_output_history +# $summaryoutput{SN1} = @SN1_output_history my %summaryoutput; my $is_sn; From 7018121285ac80fa80247caf931f06a07dab35ba Mon Sep 17 00:00:00 2001 From: xuweibj Date: Sun, 24 Jun 2018 21:24:24 -0400 Subject: [PATCH 38/93] modified depending on comments --- .../advanced/confluent/client/confluent_client.rst | 12 ++++++------ .../advanced/confluent/server/confluent_server.rst | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/source/advanced/confluent/client/confluent_client.rst b/docs/source/advanced/confluent/client/confluent_client.rst index 8fdce725f..335ed8c6c 100644 --- a/docs/source/advanced/confluent/client/confluent_client.rst +++ b/docs/source/advanced/confluent/client/confluent_client.rst @@ -14,15 +14,15 @@ It's recommenteed to create a non root user to use to connect to confetty #. Create a non-root user on the management node: :: - useradd -m vhu + useradd -m xcat #. As root, create a non-root user in confetty: :: - /opt/confluent/bin/confetty create users/vhu + /opt/confluent/bin/confetty create users/xcat #. Set the password for the non-root user: :: - /opt/confluent/bin/confetty set users/vhu password="mynewpassword" + /opt/confluent/bin/confetty set users/xcat password="mynewpassword" password="********" @@ -42,17 +42,17 @@ If you want to use the xCAT Keys, you can simple copy them into ``/etc/confluent The user and password may alternatively be provided via environment variables: :: - CONFLUENT_USER=vhu + CONFLUENT_USER=xcat CONFLUENT_PASSPHRASE="mynewpassword" export CONFLUENT_USER CONFLUENT_PASSPHRASE Start confetty, specify the server IP address: :: - confetty -s 127.0.0.1 + confetty -s If you want to run a confluent command against another host, could set the CONFLUENT_HOST variable: :: - CONFLUENT_HOST=127.0.0.1 + CONFLUENT_HOST= export CONFLUENT_HOST diff --git a/docs/source/advanced/confluent/server/confluent_server.rst b/docs/source/advanced/confluent/server/confluent_server.rst index c0634506b..bcc2322e4 100644 --- a/docs/source/advanced/confluent/server/confluent_server.rst +++ b/docs/source/advanced/confluent/server/confluent_server.rst @@ -92,13 +92,13 @@ Confluent-api and confluent-consoles are able to be accessed from the browser. It is **highly** recommended that you create a non-root user to access the sessions:: Create the non-root user on the management node - # useradd -m vhu + # useradd -m xcat Create a non-root user in confetty - # /opt/confluent/bin/confetty create users/vhu + # /opt/confluent/bin/confetty create users/xcat Set the password for the non-root user - # /opt/confluent/bin/confetty set users/vhu password="mynewpassword" + # /opt/confluent/bin/confetty set users/xcat password="mynewpassword" password="********" Rest Explorer From f7c7ea884fb0daf23efb76135107474d073a2fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Mon, 25 Jun 2018 20:51:10 +0800 Subject: [PATCH 39/93] [go-xcat] Fix package version checking on Ubuntu 18.04 (#5320) --- xCAT-server/share/xcat/tools/go-xcat | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/xCAT-server/share/xcat/tools/go-xcat b/xCAT-server/share/xcat/tools/go-xcat index 4ae3f65cc..6fe87e9a2 100755 --- a/xCAT-server/share/xcat/tools/go-xcat +++ b/xCAT-server/share/xcat/tools/go-xcat @@ -2,7 +2,7 @@ # # go-xcat - Install xCAT automatically. # -# Version 1.0.27 +# Version 1.0.28 # # Copyright (C) 2016, 2017, 2018 International Business Machines # Eclipse Public License, Version 1.0 (EPL-1.0) @@ -438,7 +438,12 @@ function check_package_version_deb() do if [[ "$1" = "${name[i]}" ]] then - echo "${ver[i]}" + if [[ -n "${ver[i]}" ]] + then + echo "${ver[i]}" + else + echo "(not installed)" + fi unset "name[${i}]" "ver[${i}]" shift && continue 2 fi From dbeac84fd78c09b40b6fbea5f069994d8b5eeb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Mon, 25 Jun 2018 20:52:45 +0800 Subject: [PATCH 40/93] For Ubuntu 18.04 support, search a different place for Linux kernel and initrd (#5322) --- xCAT-server/lib/xcat/plugins/debian.pm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/debian.pm b/xCAT-server/lib/xcat/plugins/debian.pm index 7fde6382a..3d2c6ce6b 100644 --- a/xCAT-server/lib/xcat/plugins/debian.pm +++ b/xCAT-server/lib/xcat/plugins/debian.pm @@ -768,7 +768,8 @@ sub mkinstall { next; } - if ($arch =~ /ppc64/i and !(-e "$pkgdir/install/netboot/initrd.gz")) { + if ($arch =~ /ppc64/i and !(-e "$pkgdir/install/netboot/initrd.gz") and + !(-e "$pkgdir/install/netboot/ubuntu-installer/$darch/initrd.gz")) { xCAT::MsgUtils->report_node_error($callback, $node, "The network boot initrd.gz is not found in $pkgdir/install/netboot. This is provided by Ubuntu, please download and retry." ); @@ -804,10 +805,16 @@ sub mkinstall { ) ) or ( $arch =~ /ppc64/i and ( - -r "$pkgdir/install/vmlinux" - and $kernpath = "$pkgdir/install/vmlinux" - and -r "$pkgdir/install/netboot/initrd.gz" - and $initrdpath = "$pkgdir/install/netboot/initrd.gz" + (-r "$pkgdir/install/netboot/ubuntu-installer/$darch/vmlinux" + and $kernpath = "$pkgdir/install/install/netboot/ubuntu-installer/$darch/vmlinux" + and -r "$pkgdir/install/netboot/ubuntu-installer/$darch/initrd.gz" + and $initrdpath = "$pkgdir/install/netboot/ubuntu-installer/$darch/initrd.gz" + ) or + (-r "$pkgdir/install/vmlinux" + and $kernpath = "$pkgdir/install/vmlinux" + and -r "$pkgdir/install/netboot/initrd.gz" + and $initrdpath = "$pkgdir/install/netboot/initrd.gz" + ) ) ) ) From f2c0727bcf16e2997b05b334089a70a4bd71ad27 Mon Sep 17 00:00:00 2001 From: robin2008 Date: Mon, 25 Jun 2018 22:18:04 +0800 Subject: [PATCH 41/93] backup/recover the osimage for node in nodeset_secureroot --- xCAT-test/autotest/testcase/nodeset/cases0 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xCAT-test/autotest/testcase/nodeset/cases0 b/xCAT-test/autotest/testcase/nodeset/cases0 index 62d53b4e4..ae13c016f 100644 --- a/xCAT-test/autotest/testcase/nodeset/cases0 +++ b/xCAT-test/autotest/testcase/nodeset/cases0 @@ -479,9 +479,15 @@ os: rhels description: Test nodeset could generate right installation files when site.secureroot=1 label: others,security cmd: chdef -t site secureroot=1 -cmd: nodeset $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-install-compute +cmd: myimage=__GETNODEATTR($$CN,provmethod)__; osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-install-compute; cn=$$CN +test -f /install/autoinst/$cn && mv -f /install/autoinst/$cn /install/autoinst/$cn.secureroot +nodeset $cn osimage=$osimage +myresult=$? +chdef $cn provmethod=$myimage +test $myresult -eq 0 check:rc==0 cmd: cat /install/autoinst/$$CN | grep '^rootpw --iscrypted \*' > /dev/null check:rc==0 cmd: chdef -t site secureroot= +cmd: test -f /install/autoinst/$$CN.secureroot && mv -f /install/autoinst/$$CN.secureroot /install/autoinst/$$CN end From 214d0bd5f466ba0053cbcbfba40db2744d0d20e5 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Mon, 25 Jun 2018 12:04:43 -0400 Subject: [PATCH 42/93] Create a function to obtain varables from xCAT tables, transparent on probe functions --- xCAT-probe/subcmds/xcatmn | 49 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/xCAT-probe/subcmds/xcatmn b/xCAT-probe/subcmds/xcatmn index 0f0bd74eb..b4735a5bd 100755 --- a/xCAT-probe/subcmds/xcatmn +++ b/xCAT-probe/subcmds/xcatmn @@ -1134,42 +1134,47 @@ sub check_network_parameter { return ($rst, $rst_type); } +sub get_attribute_value { + my $table = shift; + my $attr = shift; + + my $cmd_value = ""; + my $command_info = `lsdef -t $table -i $attr -c 2>&1`; + if ($command_info =~ /$attr=(\d+)/) { + $cmd_value = $1 + } + print_check_result("Checking $table table attribute... $attr=$cmd_value", 0, 0, \@error); + return $cmd_value +} + + sub check_daemon_attributes { my $checkpoint_ref = shift; my $error_ref = shift; my $rst = 0; $rst_type = "w"; - + my $node_limit = 500; $$checkpoint_ref = "Checking xCAT daemon attributes configuration..."; @$error_ref = (); my $node_num = `nodels 2>&1 | wc -l`; chomp($node_num); my $xcatmaxconnections = 64; - my $xcatmaxconnections_site = 64; my $xcatmaxbatchconnections = 50; - my $xcatmaxbatchconnections_site = 50; - - my @site_max_info = `lsdef -t site -i xcatmaxconnections,xcatmaxbatchconnections -c 2>&1`; - foreach my $site_max (@site_max_info) { - if ($site_max =~ /xcatmaxconnections=(\d+)/) { - $xcatmaxconnections_site = $1; - } - if ($site_max =~ /xcatmaxbatchconnections=(\d+)/) { - $xcatmaxbatchconnections_site = $1; + my $xcatmaxconnections_site = get_attribute_value("site","xcatmaxconnections"); + my $xcatmaxbatchconnections_site = get_attribute_value("site","xcatmaxbatchconnections"); + if ($xcatmaxconnections_site != "" and $xcatmaxbatchconnections_site != "") { + if ($xcatmaxbatchconnections_site > $xcatmaxconnections_site) { + push @$error_ref, "Error: xcatmaxbatchconnections > xcatmaxconnections"; + $rst = 1; + $rst_type = "f"; + } elsif ($xcatmaxconnections_site < $xcatmaxconnections or + $xcatmaxbatchconnections_site < $xcatmaxbatchconnections and + $node_num >= $node_limit) { + push @$error_ref, "Detected >= $node_limnit nodes, refer to xCAT documentation for xCAT daemon tuning recommendations."; + $rst = 1; } } - - if ($xcatmaxconnections_site <= $xcatmaxbatchconnections_site) { - push @$error_ref, "Attribute xcatmaxbatchconnections must be less than xcatmaxconnections."; - $rst = 1; - $rst_type = "f"; - } elsif ($xcatmaxconnections_site < $xcatmaxconnections or - $xcatmaxbatchconnections_site < $xcatmaxbatchconnections and - $node_num >= 500) { - push @$error_ref, "Management nodes are more than 500, please tuning xCAT daemon attributes as document"; - $rst = 1; - } return ($rst, $rst_type); } From 2559d28cb4fb891c6050b277c73d1923cc227aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Tue, 26 Jun 2018 13:06:52 +0800 Subject: [PATCH 43/93] Revise Ubuntu 18.04 package list, add ifupdown, remove ntp and ntpdate (#5324) --- .../xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist | 3 +-- .../xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist | 3 +-- .../xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist index a2a01bc6e..80a145e6a 100644 --- a/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist +++ b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.ppc64el.pkglist @@ -1,4 +1,5 @@ bash +ifupdown nfs-common openssl isc-dhcp-client @@ -7,8 +8,6 @@ openssh-server openssh-client wget vim -ntp -ntpdate rsync busybox-static gawk diff --git a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist index df556b887..583d62ad1 100644 --- a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist +++ b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.ppc64el.pkglist @@ -1,4 +1,5 @@ bash +ifupdown nfs-common openssl isc-dhcp-client @@ -8,8 +9,6 @@ openssh-server openssh-client wget vim -ntp -ntpdate rsync busybox-static gawk diff --git a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist index df556b887..583d62ad1 100644 --- a/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist +++ b/xCAT-server/share/xcat/netboot/ubuntu/compute.ubuntu18.04.x86_64.pkglist @@ -1,4 +1,5 @@ bash +ifupdown nfs-common openssl isc-dhcp-client @@ -8,8 +9,6 @@ openssh-server openssh-client wget vim -ntp -ntpdate rsync busybox-static gawk From b2c9ba06fc2019042d1236ba1c9347532801c4b9 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Tue, 26 Jun 2018 01:03:46 -0400 Subject: [PATCH 44/93] modify man page of rcons about exit code --- docs/source/guides/admin-guides/references/man1/rcons.1.rst | 2 +- xCAT-client/pods/man1/rcons.1.pod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/guides/admin-guides/references/man1/rcons.1.rst b/docs/source/guides/admin-guides/references/man1/rcons.1.rst index df8e0853f..394edb226 100644 --- a/docs/source/guides/admin-guides/references/man1/rcons.1.rst +++ b/docs/source/guides/admin-guides/references/man1/rcons.1.rst @@ -35,7 +35,7 @@ multiple read-only instances of the console, plus console logging. If \ *conserver-host*\ is specified, the conserver daemon on that host will be contacted, instead of on the local host. -To exit the console session, enter: e c . +To exit the console session, enter: 'ctrl-e c .' (3 characters: ctrl-e, 'c' and '.'). *************** diff --git a/xCAT-client/pods/man1/rcons.1.pod b/xCAT-client/pods/man1/rcons.1.pod index f6b80b19f..2cce5735b 100644 --- a/xCAT-client/pods/man1/rcons.1.pod +++ b/xCAT-client/pods/man1/rcons.1.pod @@ -16,7 +16,7 @@ multiple read-only instances of the console, plus console logging. If I is specified, the conserver daemon on that host will be contacted, instead of on the local host. -To exit the console session, enter: e c . +To exit the console session, enter: 'ctrl-e c .' (3 characters: ctrl-e, 'c' and '.'). =head1 B From d37779bb70978e6ffa2e05155321093776b31e7b Mon Sep 17 00:00:00 2001 From: xuweibj Date: Tue, 26 Jun 2018 01:26:00 -0400 Subject: [PATCH 45/93] modify renergy powerusage/temperature Usage --- perl-xCAT/xCAT/Usage.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl-xCAT/xCAT/Usage.pm b/perl-xCAT/xCAT/Usage.pm index 4f36bea66..dca66a6b5 100755 --- a/perl-xCAT/xCAT/Usage.pm +++ b/perl-xCAT/xCAT/Usage.pm @@ -492,7 +492,7 @@ my %usage = ( renergy noderange [-V] { cappingstatus={on | enable | off | disable} | {cappingwatt|cappingvalue}=watt } OpenPOWER server specific : - renergy noderange [ powerusage | temperature] + renergy noderange { powerusage | temperature } ", "updatenode" => "Usage: From 9836e6ec0f3d9bc832e0c6a46c9b4373eba14d33 Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 26 Jun 2018 01:38:34 -0400 Subject: [PATCH 46/93] replace hctrl_gen by hctrl_general and tag usage check test cases as mn_only --- xCAT-test/autotest/testcase/rbeacon/cases0 | 6 +++--- xCAT-test/autotest/testcase/reventlog/cases0 | 8 ++++---- .../autotest/testcase/rflash/rflash_openbmc.0 | 14 ++++++------- xCAT-test/autotest/testcase/rinv/cases0 | 20 +++++++++---------- xCAT-test/autotest/testcase/rpower/cases0 | 20 +++++++++---------- xCAT-test/autotest/testcase/rsetboot/cases0 | 8 ++++---- xCAT-test/autotest/testcase/rvitals/cases0 | 16 +++++++-------- xCAT-test/autotest/testcase/rvitals/cases1 | 2 +- 8 files changed, 46 insertions(+), 48 deletions(-) diff --git a/xCAT-test/autotest/testcase/rbeacon/cases0 b/xCAT-test/autotest/testcase/rbeacon/cases0 index 229722014..6b007bfe1 100644 --- a/xCAT-test/autotest/testcase/rbeacon/cases0 +++ b/xCAT-test/autotest/testcase/rbeacon/cases0 @@ -2,7 +2,7 @@ start:rbeacon_null description: this case is to test rbeacon usage os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rbeacon check:rc==0 check:output=~Usage @@ -22,7 +22,7 @@ start:rbeacon_help description: this case is to test rbeacon -h and --help output os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rbeacon -h check:rc==0 check:output=~Usage @@ -37,7 +37,7 @@ start:rbeacon_version description: this case is to test rbeacon -v and --version output os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rbeacon -v check:rc==0 check:output=~Version diff --git a/xCAT-test/autotest/testcase/reventlog/cases0 b/xCAT-test/autotest/testcase/reventlog/cases0 index 102cd238e..b07293b9d 100644 --- a/xCAT-test/autotest/testcase/reventlog/cases0 +++ b/xCAT-test/autotest/testcase/reventlog/cases0 @@ -1,26 +1,26 @@ start:reventlog_null -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:reventlog check:rc==0 check:output=~Usage end start:reventlog_all -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:reventlog $$CN all check:rc==0 check:output=~$$CN\s*:\s*.*\d\d/\d\d/\d\d\s*\S+|No attributes returned from the BMC end start:reventlog_clear -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:reventlog $$CN clear check:rc==0 check:output=~$$CN\s*:\s*Logs cleared|SEL cleared end start:reventlog_numofentries -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:reventlog $$CN 5 check:rc==0 check:output=~$$CN\s*:\s*.*\d\d/\d\d/\d\d\s*\S+|$$CN: no SEL entries|Entry|No attributes returned from the BMC diff --git a/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 b/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 index 96dac873e..4853e8dfa 100644 --- a/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 +++ b/xCAT-test/autotest/testcase/rflash/rflash_openbmc.0 @@ -2,7 +2,7 @@ start:rflash_option_c_without_specify_noderange description: basic usage check for option c. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -c check:output=~Usage: cmd:rflash -c 1.tar @@ -14,7 +14,7 @@ start:rflash_option_l_without_specify_noderange description: basic usage check for option l. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -l check:output=~Usage: end @@ -23,7 +23,7 @@ start:rflash_option_a_without_specify_noderange description: basic usage check for option a. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -a check:output=~Usage: cmd:rflash -a 1.tar @@ -38,7 +38,7 @@ start:rflash_option_u_without_specify_noderange description: basic usage check for option u. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -u check:output=~Usage: cmd:rflash -u 1.tar @@ -50,11 +50,11 @@ start:rflash_option_d_without_specify_noderange description: basic usage check for option d. if without specify noderange for rflash command, should offer usage message os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -d check:output=~Usage: cmd:rflash -d /1234 -check:Usage: +check:output=~Usage: cmd:rflash --delete 1234abc check:rc != 0 check:output=~Error: (\[.*?\]: )?Invalid nodes and/or groups in noderange @@ -502,7 +502,7 @@ start:rflash_usage description:checke the usage of rflash for openbmc os:Linux hcp:openbmc -label:cn_bmc_ready,hctrl_openbmc +label:mn_only,hctrl_openbmc cmd:rflash -h check:output =~Usage: check:output =~OpenPOWER OpenBMC specific: diff --git a/xCAT-test/autotest/testcase/rinv/cases0 b/xCAT-test/autotest/testcase/rinv/cases0 index 4ac186909..38634c382 100644 --- a/xCAT-test/autotest/testcase/rinv/cases0 +++ b/xCAT-test/autotest/testcase/rinv/cases0 @@ -7,7 +7,7 @@ start:rinv_h description:show help information for rinv -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rinv -h check:rc==0 check:output=~Usage @@ -16,7 +16,7 @@ end start:rinv_help description:show help information for rinv -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rinv --help check:rc==0 check:output=~Usage @@ -25,7 +25,7 @@ end start:rinv_v description:show version for Version -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rinv -v check:rc==0 check:output=~Version @@ -54,7 +54,7 @@ end start:rinv_serial description:Retrieves serial number. Attribute: $$CN-The operation object of rinv command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN serial check:rc==0 end @@ -62,7 +62,7 @@ end start:rinv_model description:Retrieves serial number. Attribute: $$CN-The operation object of rinv command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN model check:rc==0 end @@ -70,7 +70,7 @@ end start:rinv_firm description:Retrieves firmware versions. Attribute: $$CN-The operation object of rinv command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN firm check:rc==0 end @@ -78,7 +78,7 @@ end start:rinv_all description:get serial,model Attribute: $$CN-The operation object of rinv command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rinv $$CN all check:rc==0 end @@ -118,7 +118,7 @@ check:rc==0 end start:rinv_noderange_err -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rinv testnode check:rc!=0 check:output=~Error @@ -127,7 +127,7 @@ end start:rinv_mixnode description:get mixnode information,one is invalid node Attribute: $$CN-The operation object of rinv command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:test=$(lsdef testnode);if [[ $? -eq 0 ]]; then lsdef -l testnode -z >/tmp/testnode.stanza ;rmdef testnode;fi check:rc==0 cmd:chdef testnode groups=test mgt=__GETNODEATTR($$CN,mgt)__ @@ -160,7 +160,7 @@ end start:rinv_errorcommand description:get right return if input error command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rinv $$CN dafds check:rc==1 check:output=~Unsupported command|Error: (\[.*?\]: )?Usage: diff --git a/xCAT-test/autotest/testcase/rpower/cases0 b/xCAT-test/autotest/testcase/rpower/cases0 index 01c6cdfc6..243d8a6fb 100644 --- a/xCAT-test/autotest/testcase/rpower/cases0 +++ b/xCAT-test/autotest/testcase/rpower/cases0 @@ -1,7 +1,7 @@ start:rpower_off description:This case is to test off option could remote power off nodes Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN on cmd:a=0;while ! `rpower $$CN stat|grep "Running\|on" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done check:ouptut=~Running|on @@ -15,7 +15,7 @@ end start:rpower_stat description:This case is to test stat option could show the power status of nodes Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN on cmd:a=0;while ! `rpower $$CN stat|grep "Running\|on" >/dev/null`; do sleep 5;((a++));if [ $a -gt 5 ];then break;fi done cmd:rpower $$CN stat @@ -37,7 +37,7 @@ end start:rpower_boot description:This case is to test boot option could power on the nodes if nodes in off state. Or could hard reset the nodes if they are on. Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN stat|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN stat @@ -52,7 +52,7 @@ end start:rpower_status description:This case is to test status option could show the power status of nodes Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN status|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN status @@ -67,7 +67,7 @@ end start:rpower_state description:This case is to test state option could show the power status of nodes Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN state|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN state @@ -82,7 +82,7 @@ end start:rpower_on description:This case is to test on option could remote power on nodes Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN off cmd:a=0;while ! `rpower $$CN stat|grep "Not Activated\|off" >/dev/null`; do sleep 5;((a++));if [ $a -gt 11 ];then break;fi done cmd:rpower $$CN stat @@ -97,7 +97,7 @@ end start:rpower_reset description:This case is to test reset option could hard reset nodes when nodes are in on state. Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:stat=`rpower $$CN stat`;if ([[ $stat =~ on ]] || [[ $stat =~ Running ]]) ;then rpower $$CN reset;sleep 300;stat1=`rpower $$CN stat`;if ([[ $stat1 =~ on ]] || [[ $stat1 =~ Running ]]);then exit 0;else exit 1;fi;else rpower $$CN reset;sleep 300;stat1=`rpower $$CN stat`;if ([[ $stat1 =~ off ]] || [[ $stat1 =~ "Not Activated" ]]);then exit 0;else exit 1;fi;fi check:rc==0 end @@ -105,7 +105,7 @@ end start:rpower_noderange description:This case is to test rpower could process error usage and return help information. Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN check:rc!=0 check:output=~Unsupported|Usage|Please enter an action @@ -114,7 +114,7 @@ end start:rpower_noderange_nodeps description:This case is to test rpower could process error usage and return help information. Attribute: $$CN-The operation object of rpower command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rpower $$CN --nodeps check:rc!=0 check:output=~Unsupported|Usage @@ -123,7 +123,7 @@ end start:rpower_err_noderange description:This case is to test rpower could process error usage and return help information. Attribute:N/A -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rpower testnode stat check:rc!=0 check:output=~Error diff --git a/xCAT-test/autotest/testcase/rsetboot/cases0 b/xCAT-test/autotest/testcase/rsetboot/cases0 index 2240669ac..20e563ee5 100644 --- a/xCAT-test/autotest/testcase/rsetboot/cases0 +++ b/xCAT-test/autotest/testcase/rsetboot/cases0 @@ -72,7 +72,7 @@ end start:rsetboot_h description:get rsetboot help information -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rsetboot -h check:rc==0 check:output=~Usage: rsetboot @@ -80,7 +80,7 @@ end start:rsetboot_help description:get rsetboot help information using rsetboot help -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rsetboot -help check:rc==0 check:output=~Usage: rsetboot @@ -88,7 +88,7 @@ end start:rsetboot_v desription:get rsetboot version -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rsetboot -v check:rc==0 check:output=~Version @@ -96,7 +96,7 @@ end start:rsetboot_node_invalidnode desription:rsetboot using invalidenode -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rsetboot testnode boot check:rc!=0 end diff --git a/xCAT-test/autotest/testcase/rvitals/cases0 b/xCAT-test/autotest/testcase/rvitals/cases0 index 4d904a98d..ecc4276ff 100644 --- a/xCAT-test/autotest/testcase/rvitals/cases0 +++ b/xCAT-test/autotest/testcase/rvitals/cases0 @@ -1,7 +1,6 @@ start:rvitals_h description:get rvitals's usage -Attribute: $$CN-The operation object of rvitals command -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rvitals -h check:rc==0 check:output=~Usage: @@ -10,8 +9,7 @@ end start:rvitals_v description:get rvitals's version -Attribute: $$CN-The operation object of rvitals command -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:rvitals -v check:rc==0 check:output=~Version @@ -20,7 +18,7 @@ end start:rvitals_temp description:Retrieves temperatures Attribute: $$CN-The operation object of rvitals command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN temp check:rc==0 end @@ -50,7 +48,7 @@ end start:rvitals_voltage description:Retrieves power supply and VRM voltage readings Attribute: $$CN-The operation object of rvitals command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN voltage check:rc==0 end @@ -85,7 +83,7 @@ end start:rvitals_all description:Retrieves all status Attribute: $$CN-The operation object of rvitals command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN all check:rc==0 end @@ -125,14 +123,14 @@ end start:rvitals_noderange_err description:using not defined node -label:cn_bmc_ready,hctrl_gen +label:mn_only,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals testnode check:rc!=0 end start:rvitals_errorcommand description:using wrong command -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:/opt/xcat/share/xcat/tools/autotest/testcase/rvitals/openbmctest.sh rvitals $$CN errorcommand check:rc!=0 end diff --git a/xCAT-test/autotest/testcase/rvitals/cases1 b/xCAT-test/autotest/testcase/rvitals/cases1 index c59c99cf0..0e73ebe2b 100644 --- a/xCAT-test/autotest/testcase/rvitals/cases1 +++ b/xCAT-test/autotest/testcase/rvitals/cases1 @@ -1,6 +1,6 @@ start:rvitals_outputs_format_checking description: Check the output formats of rvitals -label:cn_bmc_ready,hctrl_gen +label:cn_bmc_ready,hctrl_general cmd:rvitals $$CN | grep -v -E '^[^:]+:[^:]+:[^:]+$' check:rc==1 end From c3eceb7a7533da2fd1a170cc186080e0592bae66 Mon Sep 17 00:00:00 2001 From: bybai Date: Tue, 26 Jun 2018 05:06:53 -0400 Subject: [PATCH 47/93] create HA doc --- .../ha/ha_mgmt_node_with_shared_data.rst | 276 ++++++++++++++++++ docs/source/references/coral/ha/index.rst | 7 + docs/source/references/coral/index.rst | 3 +- 3 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst create mode 100644 docs/source/references/coral/ha/index.rst diff --git a/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst new file mode 100644 index 000000000..2c95d98e8 --- /dev/null +++ b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst @@ -0,0 +1,276 @@ +.. _ha_mgmt_node_with_shared_data: + +Prerequisite +============ + +User has xCAT management node ``xcatmn1`` with ``postgresql`` database, and there are production data in this management node. The xCAT management IP is ``10.5.106.7`` on ``eth0``. It can be the primary MN. User prepare another node ``xcatmn2`` with IP ``10.5.106.5`` on ``eth0``. + +Configure xCAT Primary Management Node +====================================== + +Export Cluster Data +``````````````````` + +Use ``xcat-inventory`` to export the cluster data and save as ``xcatmn1.yaml``. This data file can be used to compare with that data from standby MN node :: + + xcat-inventory export --format yaml -f /tmp/xcatmn1.yaml + +Disable And Stop All Related Services +````````````````````````````````````` + +Before configure VIP and shared data, make sure stop related services. Since primary MN node may break down at any time, all related services should be configured disable from auto starting at boot time. + +Use ``xcatha.py -d`` interactive mode to disable and stop all related services: :: + + ./xcatha.py -d + 2018-06-22 03:43:51,600 - INFO - [xCAT] Shutting down services: + ... goconserver + ... conserver + ... ntpd + ... dhcpd + ... named + ... xcatd + ... postgresql + Continue? [[Y]es/[N]o/[D]ryrun]: + Y + ... ... + [xCAT] Disabling services from starting on reboot: + ... goconserver + ... conserver + ... ntpd + ... dhcpd + ... named + ... xcatd + ... postgresql + Continue? [[Y]es/[N]o/[D]ryrun]: + Y + +Configure VIP +````````````` + +The xCAT management IP should be configured as Virtual IP address, the Virtual IP address can be any unused ip address that all the compute nodes and service nodes could reach. The Virtual IP address should be non-persistent, it needs to be re-configured right after the management node is rebooted. This non-persistent Virtual IP address is designed to avoid ip address conflict when the crashed previous primary management is recovered with the Virtual IP address configured. Since the VIP is non-persistent, the network interface should have a persistent IP address. + +#. Configure another IP for network interface as static IP, for example, ``10.5.106.70``: + + #. Configure ``10.5.106.70`` as static ip:: + + ip addr add 10.5.106.70/8 dev eth0 + + #. Edit ``ifcfg-eth0`` file as:: + + DEVICE="eth0" + BOOTPROTO="static" + NETMASK="255.0.0.0" + IPADDR="10.5.106.70" + ONBOOT="yes" + + #. If want to take new static ip effect immediately, login ``xcatmn1`` using ``10.5.106.70``, and restart network service, then add original IP ``10.5.106.7`` as VIP :: + + ssh 10.5.106.70 -l root + service network restart + ip addr add 10.5.106.7/8 brd + dev eth0 label eth0:0 + +#. Add ``10.5.106.70`` into ``postgresql`` configuration file + + #. Add ``10.5.106.70`` into ``/var/lib/pgsql/data/pg_hba.conf``:: + + host all all 10.5.106.7/32 md5 + + #. Add ``10.5.106.70`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: + + listen_addresses = 'localhost,10.5.106.7,10.5.106.70' + +#. Modify provision network entry ``mgtifname`` as ``eth0:0``:: + + tabedit networks + "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, + +Configure Shared Data +````````````````````` + +The following xCAT directory structure should be on the shared data:: + + /etc/xcat + /install + ~/.xcat + /var/lib/pgsql + /tftpboot + +If some directories are not in shared data, make these directories in shared data, take ``/etc/xcat``, ``/var/lib/pgsql`` and ``/tftpboot`` as an example, ``/HA`` is original shared data directory: :: + + cp -r /etc/xcat /HA/ + cp -r /tftpboot /HA/ + cp -r /var/lib/pgsql /HA/ + mv /etc/xcat /etc/xcat.bak + mv /tftpboot /tftpboot.bak + mv /var/lib/pgsql /HA/ + ln -s /HA/xcat /etc/xcat + ln -s /HA/tftpboot /tftpboot + ln -s /HA/pgsql /var/lib/pgsql + chown -R postgres:postgres pgsql + +Activate Primary MN +``````````````````` +Use ``xcatha.py -a`` to start all related services: :: + + ./xcatha.py -a + [Admin] Verify VIP 10.5.106.7 is configured on this node + Continue? [[Y]es/[N]o]: + Y + [Admin] Verify that the following is configured to be saved in shared storage and accessible from this node: + ... /install + ... /etc/xcat + ... /root/.xcat + ... /var/lib/pgsql + ... /tftpboot + Continue? [[Y]es/[N]o]: + Y + [xCAT] Starting up services: + ... postgresql + ... xcatd + ... named + ... dhcpd + ... ntpd + ... conserver + ... goconserver + Continue? [[Y]es/[N]o/[D]ryrun]: + Y + 2018-06-24 22:13:09,428 - INFO - ===> Start all services stage <=== + 2018-06-24 22:13:10,559 - DEBUG - systemctl start postgresql [Passed] + 2018-06-24 22:13:13,298 - DEBUG - systemctl start xcatd [Passed] + domain=cluster.com + 2018-06-24 22:13:13,715 - DEBUG - lsdef -t site -i domain|grep domain [Passed] + Handling bybc0607 in /etc/hosts. + Handling localhost in /etc/hosts. + Handling bybc0609 in /etc/hosts. + Handling localhost in /etc/hosts. + Getting reverse zones, this may take several minutes for a large cluster. + Completed getting reverse zones. + Updating zones. + Completed updating zones. + Restarting named + Restarting named complete + Updating DNS records, this may take several minutes for a large cluster. + Completed updating DNS records. + DNS setup is completed + 2018-06-24 22:13:17,320 - DEBUG - makedns -n [Passed] + Renamed existing dhcp configuration file to /etc/dhcp/dhcpd.conf.xcatbak + + Warning: No dynamic range specified for 10.0.0.0. If hardware discovery is being used, a dynamic range is required. + 2018-06-24 22:13:17,811 - DEBUG - makedhcp -n [Passed] + 2018-06-24 22:13:18,746 - DEBUG - makedhcp -a [Passed] + 2018-06-24 22:13:18,800 - DEBUG - systemctl start ntpd [Passed] + 2018-06-24 22:13:19,353 - DEBUG - makeconservercf [Passed] + 2018-06-24 22:13:19,449 - DEBUG - systemctl start conserver [Passed] + +synchronize ``/etc/hosts`` +`````````````````````````` + +Since the ``/etc/hosts`` is very important for xCAT commands, the ``/etc/hosts`` will be synchronized between the primary management node and standby management node. Here is an example of the crontab entries for synchronizing the /etc/hosts:: + + 0 2 * * * /usr/bin/rsync -Lprogtz /etc/hosts xcatmn2:/etc/ + +Verification +```````````` + +#. Run ``xcatprobe xcatmn`` to find no fatal error. +#. Provision an existed compute node like ``cn1`` successfully. + +Setup And Configure xCAT Standby Management Node +================================================ + +Setup Standby Management Node +````````````````````````````` + +Install xCAT on ``xcatmn2`` refer to :ref:`Installation Guide for Red Hat Enterprise Linux ` + +Switch to ``PostgreSQL`` refer to :ref:`postgresql_reference_label` + +Configure Hostname +`````````````````` + +#. Add VIP into ``/etc/hosts`` file :: + + 10.5.106.7 xcatmn1 xcatmn1.cluster.com + +Synchronize Clock +````````````````` + +Synchronize the clock the same with primary MN ``xcatmn1``, if ``xcatmn1`` use NTP server ``10.0.0.103``, add the following line in ``/etc/ntp.conf`` on ``xcatmn2``:: + + server 10.0.0.103 + +Manually synchronize clock:: + + ntpdate -u 10.0.0.103 + +Deactivate the Standby Management Node +`````````````````````````````````````` + +Run ``xcatha.py -d`` to deactivate the MN ``xcatmn2`` + +Failover +======== +There are two kinds of failover, planned failover and unplanned failover. In a planned failover, you can do necessary cleanup work on the previous primary management node before failover to the previous standby management node. In a unplanned failover, the previous management node probably is not functioning at all, you can simply shutdown the system. + +Planned failover: active xCAT MN xcatmn1 has problems, but OS is still accessible +````````````````````````````````````````````````````````````````````````````````` + +Deactivate Primary MN +''''''''''''''''''''' + + #. Use ``xcatha.py -d`` to deactivate the primary MN + #. Remove VIP from primary MN :: + + ip addr del 10.5.106.7/8 dev eth0:0 + +Activate Standby MN +''''''''''''''''''' + + #. Configure VIP refer to `Configure VIP`_ + #. Configure shared data refer to `Configure Shared Data`_ + #. Add standby MN network interface IP ``10.5.106.5`` into ``PostgreSQL`` configuration file + + #. Add ``10.5.106.5`` into ``/var/lib/pgsql/data/pg_hba.conf``:: + + host all all 10.5.106.5/32 md5 + + #. Add ``10.5.106.5`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: + + listen_addresses = 'localhost,10.5.106.7,10.5.106.70,10.5.105.5' + + #. Use ``xcatha.py -a`` to activate the standby MN + #. Modify provision network entry ``mgtifname`` as ``eth0:0``:: + + tabedit networks + "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, + + +Unplanned failover: active xCAT MN xcatmn1 is not accessible +```````````````````````````````````````````````````````````` + +Reboot this xCAT MN node ``xcatmn1``, after it boots: + +#. If we can access to its OS, we can execute a planned failover, the steps are the same with above `Planned failover: active xCAT MN xcatmn1 has problems, but OS is still accessible`_. + +#. If we cannot access to xcatmn1 OS + + #. Activate Standby MN ``xcatmn2`` as `Activate Standby MN`_ + #. Recommend recover ``xcatmn1`` + +Verification on new active MN +````````````````````````````` + +#. Check Data consistent + + #. Use ``xcat-inventory`` to export ``xcatmn2`` cluster data:: + + xcat-inventory export --format yaml -f /tmp/xcatmn2.yaml + + #. Make diff:: + + diff xcatmn1.yaml xcatmn2.yaml + +#. Run ``xcatprobe xcatmn -i eth0:0`` to find no fatal error + +#. Provision an existed compute node like ``cn1`` successfully. diff --git a/docs/source/references/coral/ha/index.rst b/docs/source/references/coral/ha/index.rst new file mode 100644 index 000000000..93e8d663c --- /dev/null +++ b/docs/source/references/coral/ha/index.rst @@ -0,0 +1,7 @@ +HA +== + +.. toctree:: + :maxdepth: 2 + + ha_mgmt_node_with_shared_data.rst diff --git a/docs/source/references/coral/index.rst b/docs/source/references/coral/index.rst index 58de81eac..c89735c71 100644 --- a/docs/source/references/coral/index.rst +++ b/docs/source/references/coral/index.rst @@ -8,6 +8,7 @@ CORAL stands for Collaboration of Oak Ridge, Argonne, and Livermore and is solut :maxdepth: 2 cluster_mgmt/index.rst - known_issues/index.rst + known_issues/index.rst + ha/index.rst .. mn/index.rst .. discovery/index.rst From 75f20e93b08841c2878039f69b7c12ca80559c1d Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Tue, 26 Jun 2018 11:51:51 -0400 Subject: [PATCH 48/93] Simplified HA instructions --- .../ha/ha_mgmt_node_with_shared_data.rst | 201 +++++------------- 1 file changed, 57 insertions(+), 144 deletions(-) diff --git a/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst index 2c95d98e8..afd69482d 100644 --- a/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst +++ b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst @@ -1,26 +1,19 @@ .. _ha_mgmt_node_with_shared_data: -Prerequisite -============ -User has xCAT management node ``xcatmn1`` with ``postgresql`` database, and there are production data in this management node. The xCAT management IP is ``10.5.106.7`` on ``eth0``. It can be the primary MN. User prepare another node ``xcatmn2`` with IP ``10.5.106.5`` on ``eth0``. +HA Solution Overview +==================== -Configure xCAT Primary Management Node -====================================== +While a xCAT management node ``xcatmn1`` is running as a primary management node, another node - ``xcatmn2`` can be configured to act as primary management node in case ``xcatmn1`` becomes unavailable. The process is manual and requires disabling primary ``xcatmn1`` and activating backup ``xcatmn2``. Both nodes require access to shared storage described below. Use of Virtual IP is also requred. -Export Cluster Data -``````````````````` +An interactive sample script ``xcatha`` is availabe to guide through the steps of disabling and activation of xCAT management nodes. ``Dryrun`` option in that scrip allows viewing the actions without executing them. -Use ``xcat-inventory`` to export the cluster data and save as ``xcatmn1.yaml``. This data file can be used to compare with that data from standby MN node :: +Disable And Stop All Related Services on Primary xCAT Management Node +````````````````````````````````````````````````````````````````````` - xcat-inventory export --format yaml -f /tmp/xcatmn1.yaml +Before configuring Virtual IP and shared data, make sure to stop related services. Since primary management node may become unavailable at any time, all related services should be configured to not auto start at boot time. -Disable And Stop All Related Services -````````````````````````````````````` - -Before configure VIP and shared data, make sure stop related services. Since primary MN node may break down at any time, all related services should be configured disable from auto starting at boot time. - -Use ``xcatha.py -d`` interactive mode to disable and stop all related services: :: +Use ``xcatha.py -d`` to disable and stop all related services: :: ./xcatha.py -d 2018-06-22 03:43:51,600 - INFO - [xCAT] Shutting down services: @@ -45,14 +38,14 @@ Use ``xcatha.py -d`` interactive mode to disable and stop all related services: Continue? [[Y]es/[N]o/[D]ryrun]: Y -Configure VIP -````````````` +Configure Virtual IP +```````````````````` -The xCAT management IP should be configured as Virtual IP address, the Virtual IP address can be any unused ip address that all the compute nodes and service nodes could reach. The Virtual IP address should be non-persistent, it needs to be re-configured right after the management node is rebooted. This non-persistent Virtual IP address is designed to avoid ip address conflict when the crashed previous primary management is recovered with the Virtual IP address configured. Since the VIP is non-persistent, the network interface should have a persistent IP address. +Existing xCAT management node IP should be configured as Virtual IP address, the Virtual IP address should be non-persistent, it needs to be re-configured right after the management node is rebooted. This non-persistent Virtual IP address is designed to avoid ip address conflict when the original primary management node is recovered with this Virtual IP address configured. Since the Virtual IP is non-persistent, the network interface should have a persistent IP address. -#. Configure another IP for network interface as static IP, for example, ``10.5.106.70``: +#. Configure another IP on primary management node for network interface as static IP, for example, ``10.5.106.70``: - #. Configure ``10.5.106.70`` as static ip:: + #. Configure ``10.5.106.70`` as static IP:: ip addr add 10.5.106.70/8 dev eth0 @@ -64,13 +57,13 @@ The xCAT management IP should be configured as Virtual IP address, the Virtual I IPADDR="10.5.106.70" ONBOOT="yes" - #. If want to take new static ip effect immediately, login ``xcatmn1`` using ``10.5.106.70``, and restart network service, then add original IP ``10.5.106.7`` as VIP :: + #. If want to take new static ip effect immediately, login ``xcatmn1`` using ``10.5.106.70``, and restart network service, then add original static IP on primary management node ``10.5.106.7`` as Virtual IP :: ssh 10.5.106.70 -l root service network restart ip addr add 10.5.106.7/8 brd + dev eth0 label eth0:0 -#. Add ``10.5.106.70`` into ``postgresql`` configuration file +#. Add ``10.5.106.70`` into ``postgresql`` configuration file on primary management node #. Add ``10.5.106.70`` into ``/var/lib/pgsql/data/pg_hba.conf``:: @@ -80,7 +73,7 @@ The xCAT management IP should be configured as Virtual IP address, the Virtual I listen_addresses = 'localhost,10.5.106.7,10.5.106.70' -#. Modify provision network entry ``mgtifname`` as ``eth0:0``:: +#. Modify provision network entry ``mgtifname`` as ``eth0:0`` on primary management node:: tabedit networks "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, @@ -88,7 +81,7 @@ The xCAT management IP should be configured as Virtual IP address, the Virtual I Configure Shared Data ````````````````````` -The following xCAT directory structure should be on the shared data:: +The following xCAT directory structure should be accessible from both primary and backup xCAT management nodes:: /etc/xcat /install @@ -96,22 +89,44 @@ The following xCAT directory structure should be on the shared data:: /var/lib/pgsql /tftpboot -If some directories are not in shared data, make these directories in shared data, take ``/etc/xcat``, ``/var/lib/pgsql`` and ``/tftpboot`` as an example, ``/HA`` is original shared data directory: :: +Synchronize ``/etc/hosts`` +`````````````````````````` - cp -r /etc/xcat /HA/ - cp -r /tftpboot /HA/ - cp -r /var/lib/pgsql /HA/ - mv /etc/xcat /etc/xcat.bak - mv /tftpboot /tftpboot.bak - mv /var/lib/pgsql /HA/ - ln -s /HA/xcat /etc/xcat - ln -s /HA/tftpboot /tftpboot - ln -s /HA/pgsql /var/lib/pgsql - chown -R postgres:postgres pgsql +Since the ``/etc/hosts`` is used by xCAT commands, the ``/etc/hosts`` should be synchronized between the primary management node and bakup management node. -Activate Primary MN -``````````````````` -Use ``xcatha.py -a`` to start all related services: :: +Synchronize Clock +````````````````` + +It is recommended that the clocks are synchrinized between the primary management node and bakup management node. + +Remove Virtual IP from primary xCAT Management Node +``````````````````````````````````````````````````` + + ``ip addr del 10.5.106.7/8 dev eth0:0`` + +Activate Backup xCAT Management Node to be Primary Management Node +`````````````````````````````````````````````````````````````````` +# Configure Virtual IP + +# Add Virtual IP into ``/etc/hosts`` file :: + + 10.5.106.7 xcatmn1 xcatmn1.cluster.com + +# Install xCAT on backup xCAT management node ``xcatmn2`` + +# Switch to ``PostgreSQL`` database + +# Add static management node network interface IP ``10.5.106.5`` into ``PostgreSQL`` configuration file + + #. Add ``10.5.106.5`` into ``/var/lib/pgsql/data/pg_hba.conf``:: + + host all all 10.5.106.5/32 md5 + + #. Add ``10.5.106.5`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: + + listen_addresses = 'localhost,10.5.106.7,10.5.106.70,10.5.105.5' + +# Use ``xcatha.py -a`` to start all related services: :: ./xcatha.py -a [Admin] Verify VIP 10.5.106.7 is configured on this node @@ -163,114 +178,12 @@ Use ``xcatha.py -a`` to start all related services: :: 2018-06-24 22:13:19,353 - DEBUG - makeconservercf [Passed] 2018-06-24 22:13:19,449 - DEBUG - systemctl start conserver [Passed] -synchronize ``/etc/hosts`` -`````````````````````````` - -Since the ``/etc/hosts`` is very important for xCAT commands, the ``/etc/hosts`` will be synchronized between the primary management node and standby management node. Here is an example of the crontab entries for synchronizing the /etc/hosts:: - - 0 2 * * * /usr/bin/rsync -Lprogtz /etc/hosts xcatmn2:/etc/ - -Verification -```````````` - -#. Run ``xcatprobe xcatmn`` to find no fatal error. -#. Provision an existed compute node like ``cn1`` successfully. - -Setup And Configure xCAT Standby Management Node -================================================ - -Setup Standby Management Node -````````````````````````````` - -Install xCAT on ``xcatmn2`` refer to :ref:`Installation Guide for Red Hat Enterprise Linux ` - -Switch to ``PostgreSQL`` refer to :ref:`postgresql_reference_label` - -Configure Hostname -`````````````````` - -#. Add VIP into ``/etc/hosts`` file :: - - 10.5.106.7 xcatmn1 xcatmn1.cluster.com - -Synchronize Clock -````````````````` - -Synchronize the clock the same with primary MN ``xcatmn1``, if ``xcatmn1`` use NTP server ``10.0.0.103``, add the following line in ``/etc/ntp.conf`` on ``xcatmn2``:: - - server 10.0.0.103 - -Manually synchronize clock:: - - ntpdate -u 10.0.0.103 - -Deactivate the Standby Management Node -`````````````````````````````````````` - -Run ``xcatha.py -d`` to deactivate the MN ``xcatmn2`` - -Failover -======== -There are two kinds of failover, planned failover and unplanned failover. In a planned failover, you can do necessary cleanup work on the previous primary management node before failover to the previous standby management node. In a unplanned failover, the previous management node probably is not functioning at all, you can simply shutdown the system. - -Planned failover: active xCAT MN xcatmn1 has problems, but OS is still accessible -````````````````````````````````````````````````````````````````````````````````` - -Deactivate Primary MN -''''''''''''''''''''' - - #. Use ``xcatha.py -d`` to deactivate the primary MN - #. Remove VIP from primary MN :: - - ip addr del 10.5.106.7/8 dev eth0:0 - -Activate Standby MN -''''''''''''''''''' - - #. Configure VIP refer to `Configure VIP`_ - #. Configure shared data refer to `Configure Shared Data`_ - #. Add standby MN network interface IP ``10.5.106.5`` into ``PostgreSQL`` configuration file - - #. Add ``10.5.106.5`` into ``/var/lib/pgsql/data/pg_hba.conf``:: - - host all all 10.5.106.5/32 md5 - - #. Add ``10.5.106.5`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: - - listen_addresses = 'localhost,10.5.106.7,10.5.106.70,10.5.105.5' - - #. Use ``xcatha.py -a`` to activate the standby MN - #. Modify provision network entry ``mgtifname`` as ``eth0:0``:: +# Modify provision network entry ``mgtifname`` as ``eth0:0``:: tabedit networks "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, -Unplanned failover: active xCAT MN xcatmn1 is not accessible -```````````````````````````````````````````````````````````` - -Reboot this xCAT MN node ``xcatmn1``, after it boots: - -#. If we can access to its OS, we can execute a planned failover, the steps are the same with above `Planned failover: active xCAT MN xcatmn1 has problems, but OS is still accessible`_. - -#. If we cannot access to xcatmn1 OS - - #. Activate Standby MN ``xcatmn2`` as `Activate Standby MN`_ - #. Recommend recover ``xcatmn1`` - -Verification on new active MN -````````````````````````````` - -#. Check Data consistent - - #. Use ``xcat-inventory`` to export ``xcatmn2`` cluster data:: - - xcat-inventory export --format yaml -f /tmp/xcatmn2.yaml - - #. Make diff:: - - diff xcatmn1.yaml xcatmn2.yaml - -#. Run ``xcatprobe xcatmn -i eth0:0`` to find no fatal error - -#. Provision an existed compute node like ``cn1`` successfully. +Unplanned failover: primary xCAT management node is not accessible +`````````````````````````````````````````````````````````````````` +If primary xCAT management node becomes not accessible before being deactivated and backup xCAT management node is activated, it is recommended that the primary node is disconnected from the network before being rebooted. This will ensure that when services are started on reboot, they do not interfere with the same services running on the backup xCAT management node. From 7c331d87a507947b655e438787801f8c54eb2354 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Tue, 26 Jun 2018 20:46:21 -0400 Subject: [PATCH 49/93] Add model type for 'stratton' boxes, 8001-12C model type --- xCAT-server/lib/xcat/plugins/ipmi.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index a1cda1a6f..3e7171c35 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -1978,7 +1978,7 @@ sub do_firmware_update { # P9 Boston (9006-22C, 9006-12C, 5104-22C) or P8 Briggs (8001-22C) # firmware update is done using pUpdate utility expected to be in the # specified data directory along with the update files .bin for BMC or .pnor for Host - if ($output =~ /8001-22C|9006-22C|5104-22C|9006-12C/) { + if ($output =~ /8001-22C|9006-22C|5104-22C|8001-12C|9006-12C/) { # Verify valid data directory was specified if (defined $directory_name) { unless (File::Spec->file_name_is_absolute($directory_name)) { From 72bf29ae5410a5fde9a4c81a13a8960dc5d29eda Mon Sep 17 00:00:00 2001 From: xuweibj Date: Tue, 26 Jun 2018 21:35:13 -0400 Subject: [PATCH 50/93] add --nodeps in confluent doc for rpm install --- docs/source/advanced/confluent/server/confluent_server.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/advanced/confluent/server/confluent_server.rst b/docs/source/advanced/confluent/server/confluent_server.rst index bcc2322e4..6eccd2d71 100644 --- a/docs/source/advanced/confluent/server/confluent_server.rst +++ b/docs/source/advanced/confluent/server/confluent_server.rst @@ -38,8 +38,8 @@ confluent Installing ``xCAT-confluent`` via rpm:: - rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_server-*.noarch.rpm - rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_client-*.noarch.rpm + rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_server-*.noarch.rpm --nodeps + rpm -ivh /root/rpmbuild/RPMS/noarch/confluent_client-*.noarch.rpm --nodeps You may find it helpful to add the confluent paths into your system path:: From dfce294b2f0b46820aee45d990f7f241f8ebdf10 Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 26 Jun 2018 22:12:04 -0400 Subject: [PATCH 51/93] Add labels for all installation test cases --- xCAT-test/autotest/testcase/installation/SN_diskless_setup_case | 1 + xCAT-test/autotest/testcase/installation/SN_setup_case | 1 + .../testcase/installation/reg_linux_diskfull_installation_flat | 1 + .../reg_linux_diskfull_installation_flat_postscripts_failed | 2 +- .../installation/reg_linux_diskfull_installation_hierarchy | 1 + .../testcase/installation/reg_linux_diskless_installation_flat | 1 + .../reg_linux_diskless_installation_flat_postscripts_failed | 1 + .../installation/reg_linux_diskless_installation_hierarchy | 1 + .../testcase/installation/reg_linux_statelite_installation_flat | 1 + .../reg_linux_statelite_installation_hierarchy_by_nfs | 1 + .../reg_linux_statelite_installation_hierarchy_by_ramdisk | 1 + .../autotest/testcase/installation/switch_to_dns_forward_mode | 2 +- .../testcase/installation/ubuntu_full_installation_vm_docker | 1 + 13 files changed, 13 insertions(+), 2 deletions(-) diff --git a/xCAT-test/autotest/testcase/installation/SN_diskless_setup_case b/xCAT-test/autotest/testcase/installation/SN_diskless_setup_case index 4184572fc..574ab5307 100644 --- a/xCAT-test/autotest/testcase/installation/SN_diskless_setup_case +++ b/xCAT-test/autotest/testcase/installation/SN_diskless_setup_case @@ -1,6 +1,7 @@ start:SN_diskless_setup_case description:this case is used to test diskless service node installation os:Linux +label:sn_diskless,provision #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/SN_setup_case b/xCAT-test/autotest/testcase/installation/SN_setup_case index 0853c7cd3..4b3e5f1ee 100644 --- a/xCAT-test/autotest/testcase/installation/SN_setup_case +++ b/xCAT-test/autotest/testcase/installation/SN_setup_case @@ -1,5 +1,6 @@ start:SN_setup_case os:Linux +label:sn_diskful,provision #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat index be95f5d86..403dde795 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat @@ -1,5 +1,6 @@ start:reg_linux_diskfull_installation_flat os:Linux +label:provision,flat_cn_diskful #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed index 713b04959..a5037a5e1 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed @@ -2,7 +2,7 @@ start:reg_linux_diskfull_installation_flat_postscripts_failed description:This case is for postscripts failed the status will return failed during diskfull installation. attribute:$$CN-The operation object of diskfull installation. os:Linux - +label:others,invoke_provison,postscripts cmd:if ping -c 1 $$SN > /dev/null;then rpower $$SN off > /dev/null;fi cmd:MINIISO=NUll;if [[ "__GETNODEATTR($$CN,os)__" =~ "ubuntu" ]] && [[ "__GETNODEATTR($$CN,arch)__" =~ "ppc64" ]];then mkdir /tmp/iso; mount -o loop $$MINIISO /tmp/iso ; mkdir -p /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot; cp /tmp/iso/install/initrd.gz /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot;umount /tmp/iso; rmdir /tmp/iso; fi check:rc==0 diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy index a21b71002..48253d4c5 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy @@ -1,5 +1,6 @@ start:reg_linux_diskfull_installation_hierarchy os:Linux +label:provision,hierarchy_cn_diskful #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat index 6fde471d5..35b58e34d 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat @@ -1,5 +1,6 @@ start:reg_linux_diskless_installation_flat os:Linux +label:provision,flat_cn_diskless #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed index 37f3d0d0f..7b4cbd4a2 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed @@ -2,6 +2,7 @@ start:reg_linux_diskless_installation_flat_postscripts_failed description:This case is for postscripts failed the status will return failed during diskless installation. attribute:$$CN-The operation object of diskless installation. os:Linux +label:others,invoke_provison,postscripts cmd:chdef -t node -o $$CN servicenode= monserver=$$MN nfsserver=$$MN tftpserver=$$MN xcatmaster=$$MN check:rc==0 diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy index d846fca5a..86ec893a1 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy @@ -1,6 +1,7 @@ start:reg_linux_diskless_installation_hierarchy os:Linux #stop:yes +label:provision,hierarchy_cn_diskless cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T cmd:xdsh $$SN "echo "test"> /test.hierarchy" diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_flat b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_flat index de1331b54..2b3c37a7b 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_flat +++ b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_flat @@ -1,5 +1,6 @@ start:reg_linux_statelite_installation_flat os:Linux +label:others,provision,statelite #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs index 802491f64..f3438e552 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs +++ b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs @@ -1,5 +1,6 @@ start:reg_linux_statelite_installation_hierarchy_by_nfs os:Linux +label:provision,others,statelite #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk index c61e15ac2..258cec473 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk +++ b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk @@ -1,5 +1,6 @@ start:reg_linux_statelite_installation_hierarchy_by_ramdisk os:Linux +label:provision,others,statelite #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T diff --git a/xCAT-test/autotest/testcase/installation/switch_to_dns_forward_mode b/xCAT-test/autotest/testcase/installation/switch_to_dns_forward_mode index 62197d18c..bded58aa9 100644 --- a/xCAT-test/autotest/testcase/installation/switch_to_dns_forward_mode +++ b/xCAT-test/autotest/testcase/installation/switch_to_dns_forward_mode @@ -1,7 +1,7 @@ start:switch_to_dns_forward_mode description:The test case is used to switch the whole testing cluster to run in dns forward mode. This test case should run after service node deployment. os:Linux - +label:others,dns ## # Check if everything is fine ## diff --git a/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm_docker b/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm_docker index fb47e1044..590853fe4 100644 --- a/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm_docker +++ b/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm_docker @@ -1,5 +1,6 @@ start:Full_installation_flat_docker os:Linux +label:others,docker,invoke_provison cmd:copycds $$ISO check:rc==0 cmd:makedns -n From 7df937966a78d41910268c4e771f38395e80e15c Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 26 Jun 2018 23:06:25 -0400 Subject: [PATCH 52/93] Delete useless test cases --- .../Diskless_installation_flat_p8_le | 60 ----------- .../installation/Full_installation_flat_p8_le | 46 --------- .../reg_linux_SN_installation_hierarchy | 99 ------------------- .../ubuntu_diskless_installation_vm | 50 ---------- .../installation/ubuntu_full_installation_vm | 32 ------ 5 files changed, 287 deletions(-) delete mode 100644 xCAT-test/autotest/testcase/installation/Diskless_installation_flat_p8_le delete mode 100644 xCAT-test/autotest/testcase/installation/Full_installation_flat_p8_le delete mode 100644 xCAT-test/autotest/testcase/installation/reg_linux_SN_installation_hierarchy delete mode 100644 xCAT-test/autotest/testcase/installation/ubuntu_diskless_installation_vm delete mode 100644 xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm diff --git a/xCAT-test/autotest/testcase/installation/Diskless_installation_flat_p8_le b/xCAT-test/autotest/testcase/installation/Diskless_installation_flat_p8_le deleted file mode 100644 index 95cfd0751..000000000 --- a/xCAT-test/autotest/testcase/installation/Diskless_installation_flat_p8_le +++ /dev/null @@ -1,60 +0,0 @@ -start:Diskless_installation_flat_p8_le -os:Linux - -cmd:copycds $$ISO -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:makedhcp -n -check:rc==0 -cmd:makedhcp -a -check:rc==0 -cmd:makeconservercf $$CN -check:rc==0 -cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir ]; then mv $rootimgdir $rootimgdir.regbak -f;fi -check:rc==0 - -cmd:if cat /etc/*release |grep SUSE >/dev/null;then if [ ! -d /install/custom/netboot/sles ]; then mkdir -p /install/custom/netboot/sles; fi; elif cat /etc/*release |grep "Red Hat" >/dev/null;then if [ ! -d /install/custom/netboot/rh ]; then mkdir -p /install/custom/netboot/rh; fi; elif cat /etc/*release |grep "Ubuntu" >/dev/null;then if [ ! -d /install/custom/netboot/ubuntu ]; then mkdir -p /install/custom/netboot/ubuntu; fi; fi -check:rc==0 -cmd:if cat /etc/*release |grep SUSE >/dev/null;then if [ ! -e /install/custom/netboot/sles/compute.synclist ]; then echo "/etc/resolv.conf -> /etc/resolv.conf" > /install/custom/netboot/sles/compute.synclist; fi; elif cat /etc/*release |grep "Red Hat" >/dev/null;then if [ ! -e /install/custom/netboot/rh/compute.synclist ]; then echo "/etc/resolv.conf -> /etc/resolv.conf" > /install/custom/netboot/rh/compute.synclist; fi; elif cat /etc/*release |grep "Ubuntu" >/dev/null;then if [ ! -e /install/custom/netboot/ubuntu/compute.synclist ]; then echo "/etc/resolv.conf -> /etc/resolv.conf" > /install/custom/netboot/ubuntu/compute.synclist;fi; fi -check:rc==0 -cmd:if cat /etc/*release |grep SUSE >/dev/null;then chdef -t osimage -o __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute synclists=/install/custom/netboot/sles/compute.synclist; elif cat /etc/*release |grep "Red Hat" >/dev/null;then chdef -t osimage -o __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute synclists=/install/custom/netboot/rh/compute.synclist;elif cat /etc/*release |grep "Ubuntu" >/dev/null; then chdef -t osimage -o __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute synclists=/install/custom/netboot/ubuntu/compute.synclist;fi -check:rc==0 -cmd:if [ ! -d /tmp/mountoutput ]; then mkdir -p /tmp/mountoutput; fi -cmd:mount |sort > /tmp/mountoutput/file.org -cmd:cat /tmp/mountoutput/file.org -cmd:genimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -cmd:mount |sort > /tmp/mountoutput/file.new -cmd:cat /tmp/mountoutput/file.new -cmd:diff /tmp/mountoutput/file.org /tmp/mountoutput/file.new -check:rc==0 -cmd:rm -rf /tmp/mountoutput -cmd:packimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -cmd:chdef $$CN status= -check:rc==0 -cmd:rinstall $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -check:output=~Provision node\(s\)\: $$CN -cmd:sleep 200 -cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ $a -gt 100 ];then break;fi done -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -cmd:rinstall $$CN osimage -check:rc==0 -cmd:sleep 200 -cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ $a -gt 100 ];then break;fi done -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir.regbak ]; then rm -rf $rootimgdir; mv $rootimgdir.regbak $rootimgdir; fi -check:rc==0 -end diff --git a/xCAT-test/autotest/testcase/installation/Full_installation_flat_p8_le b/xCAT-test/autotest/testcase/installation/Full_installation_flat_p8_le deleted file mode 100644 index c7d72b166..000000000 --- a/xCAT-test/autotest/testcase/installation/Full_installation_flat_p8_le +++ /dev/null @@ -1,46 +0,0 @@ -start:Full_installation_flat_p8_le -os:Linux - -cmd:copycds $$ISO -check:rc==0 -cmd:if [[ "__GETNODEATTR($$CN,os)__" =~ "ubuntu" ]];then mkdir /tmp/iso; mount -o loop $$MINIISO /tmp/iso ; mkdir -p /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot; cp /tmp/iso/install/initrd.gz /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot;umount /tmp/iso; rmdir /tmp/iso; fi -check:rc==0 -cmd:chtab key=extntpservers site.value="" -check:rc==0 -cmd:chtab key=ntpservers site.value="" -check:rc==0 -cmd:makentp -check:rc==0 -cmd:makedhcp -n -check:rc==0 -cmd:makedhcp -a -check:rc==0 -cmd:a=0;while true; do [ $a -eq 100 ] && exit 1;output=$(makedhcp -q $$CN);[ $? -ne 0 ] && exit 1;echo $output|grep $$CN 2>/dev/null && exit 0;a=$[$a+1];sleep 1;done -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:makeconservercf $$CN -check:rc==0 -cmd:cat /etc/conserver.cf | grep $$CN -check:output=~$$CN -cmd:if [ "__GETNODEATTR($$CN,os)__" != "sles12.1" ];then chdef -t node -o $$CN postscripts=setupntp; fi -cmd:lsdef -l $$CN -check:rc==0 -cmd:rinstall $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-install-compute -check:rc==0 -check:output=~Provision node\(s\)\: $$CN -cmd:sleep 600 -cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 60;((a++));if [ $a -gt 50 ];then break;fi done -cmd:ping $$CN -c 3 -check:output=~64 bytes from $$CN -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -#comment for futher discussion. -#cmd:xdsh $$CN service ntpd status -#check:rc==0 -#check:output=~running -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -end diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_SN_installation_hierarchy b/xCAT-test/autotest/testcase/installation/reg_linux_SN_installation_hierarchy deleted file mode 100644 index b79e4e9fd..000000000 --- a/xCAT-test/autotest/testcase/installation/reg_linux_SN_installation_hierarchy +++ /dev/null @@ -1,99 +0,0 @@ -start:reg_linux_SN_installation_hierarchy -os:Linux - -cmd:chtab key=nameservers site.value="" -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:makeconservercf -check:rc==0 -cmd:cat /etc/conserver.cf | grep $$SN -check:output=~$$SN -cmd:sleep 20 -cmd:if [[ "__GETNODEATTR($$SN,arch)__" =~ "ppc64" ]]; then getmacs -D $$SN; fi -check:rc==0 -cmd:makedhcp -n -check:rc==0 -cmd:makedhcp -a -check:rc==0 -cmd:a=0;while true; do [ $a -eq 100 ] && exit 1;output=$(makedhcp -q $$SN);[ $? -ne 0 ] && exit 1;echo $output|grep $$SN 2>/dev/null && exit 0;a=$[$a+1];sleep 1;done -check:rc==0 -cmd:chdef -t node $$SN groups=service,all -check:rc==0 -cmd:chdef -t group -o service profile=service primarynic=mac installnic=mac -check:rc==0 -cmd:chdef -t group -o service setupnfs=1 setupdhcp=1 setuptftp=1 setupnameserver=1 setupconserver=1 -check:rc==0 -cmd:chdef -t group -o service nfsserver=$$MN tftpserver=$$MN xcatmaster=$$MN monserver=$$MN -check:rc==0 -cmd:chtab node=service postscripts.postscripts="servicenode" -check:rc==0 - -cmd:copycds $$ISO -check:rc==0 - -cmd:chdef -t site clustersite installloc="/install" -check:rc==0 - -cmd:cd /install/post/otherpkgs/__GETNODEATTR($$SN,os)__/__GETNODEATTR($$SN,arch)__/xcat/xcat-core && createrepo . -check:rc==0 -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`; cd /install/post/otherpkgs/__GETNODEATTR($$SN,os)__/__GETNODEATTR($$SN,arch)__/xcat/xcat-dep/sles$ver/__GETNODEATTR($$SN,arch)__ && createrepo . ;elif cat /etc/*release |grep "Red Hat" >/dev/null;then ver=`cat /etc/*release |awk '{print $7}' |awk -F"." '{print $1}'|head -n 1`;cd /install/post/otherpkgs/__GETNODEATTR($$SN,os)__/__GETNODEATTR($$SN,arch)__/xcat/xcat-dep/rh$ver/__GETNODEATTR($$SN,arch)__ && createrepo . ;fi -#check:rc==0 - -cmd:chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkgdir=/install/post/otherpkgs/__GETNODEATTR($$SN,os)__/__GETNODEATTR($$SN,arch)__ -check:rc==0 -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`; chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/sles/service.sles$ver.__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist; elif cat /etc/*release |grep "Red Hat" >/dev/null;then ver=`cat /etc/*release |awk '{print $7}' |awk -F"." '{print $1}'|head -n 1`;chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/rh/service.rhels$ver.__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist;fi -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`; chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/sles/service.sles$ver.__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist; elif cat /etc/*release |grep "Red Hat" >/dev/null;then chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/rh/service.__GETNODEATTR($$SN,os).__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist;fi -#check:rc==0 - -cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`; chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/sles/service.sles$ver.__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist; elif cat /etc/*release |grep "7.0" |grep "Red Hat">/dev/null;then chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/rh/service.__GETNODEATTR($$SN,os)__.ppc64.otherpkgs.pkglist;elif cat /etc/*release |grep "Red Hat" |grep "6.5">/dev/null;then ver=`cat /etc/*release |awk '{print $7}' |awk -F"." '{print $1}'|head -n 1`;chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service otherpkglist=/opt/xcat/share/xcat/install/rh/service.rhels$ver.__GETNODEATTR($$SN,arch)__.otherpkgs.pkglist;fi - -check:rc==0 - -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`;for i in mysql-client libmysqlclient_r15 libqt4-sql-mysql libmysqlclient15 perl-DBD-mysql mysql; do cat /opt/xcat/share/xcat/install/sles/service.sles$ver.pkglist|grep "$i$";if [ $? -ne 0 ] ; then echo "$i" >> /opt/xcat/share/xcat/install/sles/service.sles$ver.pkglist; fi done; elif cat /etc/*release |grep "Red Hat" >/dev/null;then ver=`cat /etc/*release |awk '{print $7}' |awk -F"." '{print $1}'|head -n 1`;for i in mysql; do cat /opt/xcat/share/xcat/install/rh/service.rhels$ver.ppc64.pkglist|grep "$i$";if [ $? -ne 0 ] ; then echo "$i" >> /opt/xcat/share/xcat/install/rh/service.rhels$ver.ppc64.pkglist; fi done;fi -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`;for i in mariadb-devel-5.5.35-3.el7 mariadb-libs-5.5.35-3.el7 mariadb-server-5.5.35-3.el7 mariadb-bench-5.5.35-3.el7 mariadb-5.5.35-3.el7 perl-DBD-MySQL mysql-connector-odbc unixODBC; do cat /opt/xcat/share/xcat/install/sles/service.sles$ver.pkglist|grep "$i$";if [ $? -ne 0 ] ; then echo "$i" >> /opt/xcat/share/xcat/install/sles/service.sles$ver.pkglist; fi done; elif cat /etc/*release |grep "Red Hat" >/dev/null;then ver=__GETNODEATTR($$SN,os)__;for i in mysql; do cat /opt/xcat/share/xcat/install/rh/service.$ver.ppc64.pkglist|grep "$i$";if [ $? -ne 0 ] ; then echo "$i" >> /opt/xcat/share/xcat/install/rh/service.$ver.ppc64.pkglist; fi done;fi -check:rc==0 -#cmd:if cat /etc/*release |grep SUSE >/dev/null;then ver=`cat /etc/*release |grep "VERSION = " | sed 's:VERSION = \(.*\):\1:g'`;chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service pkglist=/opt/xcat/share/xcat/install/sles/service.sles$ver.pkglist; elif cat /etc/*release |grep "Red Hat" >/dev/null;then ver=`cat /etc/*release |awk '{print $7}' |awk -F"." '{print $1}'|head -n 1`;chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service pkglist=/opt/xcat/share/xcat/install/rh/service.rhels$ver.__GETNODEATTR($$SN,arch)__.pkglist;fi -check:rc==0 -cmd:chdef -t osimage __GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service pkgdir="/install/__GETNODEATTR($$SN,os)__/__GETNODEATTR($$SN,arch)__" -check:rc==0 - -cmd:rinstall $$SN osimage=__GETNODEATTR($$SN,os)__-__GETNODEATTR($$SN,arch)__-install-service -check:rc==0 -check:output=~Provision node\(s\)\: $$SN - -cmd:sleep 600 -cmd:a=0;while ! `lsdef -l $$SN|grep status|grep booted >/dev/null`; do sleep 60;((a++));if [ $a -gt 70 ];then break;fi done - -cmd:ping $$SN -c 3 -check:rc==0 -check:output=~64 bytes from $$SN -cmd:lsdef -l $$SN | grep status -check:rc==0 -check:output=~booted -cmd:xdsh $$SN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$SN "ps -ef |grep xcatd" -check:rc==0 -check:output=~xcatd: -cmd:xdsh $$SN "lsdef" -check:rc==0 -check:output=~$$SN: $$SN -cmd:xdsh $$SN "tabdump site" -check:rc==0 -check:output=~tftpdir -cmd:xdsh $$SN "mount" -check:rc==0 -check:output=~/install on /install -cmd:xdsh $$SN "mount" -check:rc==0 -check:output=~/tftpboot on /tftpboot -#cmd:xdsh $$SN "nslookup $$CN" -#check:rc==0 -#check:output!~server can't find $$CN - -cmd:if [[ "__GETNODEATTR($$SN,arch)__" =~ "x86_64" ]]; then if cat /etc/*release |grep SUSE >/dev/null;then xdsh $$SN "zypper -n install perl-Sys-Virt"; elif cat /etc/*release |grep "Red Hat" >/dev/null;then xdsh $$SN "yum install -y perl-Sys-Virt";fi;fi -check:rc==0 -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -end diff --git a/xCAT-test/autotest/testcase/installation/ubuntu_diskless_installation_vm b/xCAT-test/autotest/testcase/installation/ubuntu_diskless_installation_vm deleted file mode 100644 index 107cca3dc..000000000 --- a/xCAT-test/autotest/testcase/installation/ubuntu_diskless_installation_vm +++ /dev/null @@ -1,50 +0,0 @@ -start:Ubuntu_diskless_installation_flat_x86_vm -os:Linux - -cmd:copycds $$ISO -check:rc==0 -cmd:if [[ "__GETNODEATTR($$CN,arch)__" != "ppc64" ]]; then tabdump -w node==$$CN kvm_nodedata; fi -check:rc=0 -#comment for vm debug -#cmd:if [ "__GETNODEATTR($$CN,arch)__" != "ppc64" -a "__GETNODEATTR($$CN,mgt)__" != "ipmi" ];then if [[ "__GETNODEATTR($$CN,vmstorage)__" =~ "phy" ]]; then rmvm $$CN -f -p; mkvm $$CN; else rmvm $$CN -f -p ;mkvm $$CN -s 20G; fi;fi -cmd:if [ "__GETNODEATTR($$CN,arch)__" != "ppc64" -a "__GETNODEATTR($$CN,mgt)__" != "ipmi" ];then if [[ "__GETNODEATTR($$CN,vmstorage)__" =~ "phy" ]]; then rmvm $$CN -f -p; mkvm $$CN; else rmvm $$CN -f -p;mkvm $$CN;rmvm $$CN -f -p;mkvm $$CN -s 20G; fi;fi -check:rc=0 -cmd:makedns -n -check:rc==0 -cmd:makedhcp -n -check:rc==0 -cmd:makedhcp -a -check:rc==0 -cmd:a=0;while true; do [ $a -eq 100 ] && exit 1;output=$(makedhcp -q $$CN);[ $? -ne 0 ] && exit 1;echo $output|grep $$CN 2>/dev/null && exit 0;a=$[$a+1];sleep 1;done -check:rc==0 -cmd:makeconservercf $$CN -check:rc==0 -cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir ]; then mv $rootimgdir $rootimgdir.regbak -f;fi -check:rc==0 -cmd:genimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -cmd:packimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -cmd:rinstall $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute -check:rc==0 -check:output=~Provision node\(s\)\: $$CN -cmd:sleep 200 -cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ $a -gt 300 ];then break;fi done -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -cmd:rinstall $$CN osimage -check:rc==0 -cmd:sleep 200 -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -cmd:rootimgdir=`lsdef -t osimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute|grep rootimgdir|awk -F'=' '{print $2}'`; if [ -d $rootimgdir.regbak ]; then rm -rf $rootimgdir; mv $rootimgdir.regbak $rootimgdir; fi -check:rc==0 -end diff --git a/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm b/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm deleted file mode 100644 index 35f0dd22b..000000000 --- a/xCAT-test/autotest/testcase/installation/ubuntu_full_installation_vm +++ /dev/null @@ -1,32 +0,0 @@ -start:Ubuntu_full_installation_flat_x86_vm -os:Linux - -cmd:copycds $$ISO -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:sleep 60 -cmd:makedhcp -n -check:rc==0 -cmd:makedhcp -a -check:rc==0 -cmd:a=0;while true; do [ $a -eq 100 ] && exit 1;output=$(makedhcp -q $$CN);[ $? -ne 0 ] && exit 1;echo $output|grep $$CN 2>/dev/null && exit 0;a=$[$a+1];sleep 1;done -check:rc==0 -cmd:makeconservercf $$CN -check:rc==0 -cmd:cat /etc/conserver.cf | grep $$CN -check:output=~$$CN -cmd:rinstall $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-install-compute -check:rc==0 -check:output=~Provision node\(s\)\: $$CN -cmd:sleep 300 -cmd:a=0;while ! `lsdef -l $$CN|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ $a -gt 300 ];then break;fi done -cmd:ping $$CN -c 3 -check:output=~64 bytes from $$CN -cmd:lsdef -l $$CN | grep status -check:output=~booted -cmd:xdsh $$CN date -check:rc==0 -check:output=~\d\d:\d\d:\d\d -cmd:xdsh $$CN "cat /var/log/xcat/xcat.log" -end From b9a6868b68d7b68ebd5176a787f6fbe2f280bf0c Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 26 Jun 2018 23:11:49 -0400 Subject: [PATCH 53/93] delete AIX test cases of chkosimage --- xCAT-test/autotest/testcase/chkosimage/cases0 | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 xCAT-test/autotest/testcase/chkosimage/cases0 diff --git a/xCAT-test/autotest/testcase/chkosimage/cases0 b/xCAT-test/autotest/testcase/chkosimage/cases0 deleted file mode 100644 index a5f312a6f..000000000 --- a/xCAT-test/autotest/testcase/chkosimage/cases0 +++ /dev/null @@ -1,44 +0,0 @@ -start:chkosimage_h -description:chkosimage -h and --help -os:AIX -cmd:chkosimage -h -check:output=~usage|Usage -cmd:chkosimage --help -check:output=~usage|Usage -end - - -start:chkosimage_imagename -description: chkosimage autotest -os:AIX -cmd:mknimimage -V -s $$SOURCE autotest -check:rc==0 -cmd:lsnim | grep autotest -check:rc==0 -check:output=~lpp_source -check:output=~spot -check:output=~bosinst_data -cmd:nim -o update -a packages=all -a source=$$SSHPKG autotest_lpp_source -check:rc==0 -cmd:mkdir -p /install/nim/installp_bundle -cmd:cp $$SSHPKG/xCATaixCN71.bnd /install/nim/installp_bundle/ -check:rc==0 -cmd:nim -o define -t installp_bundle -a server=master -a location=/install/nim/installp_bundle/xCATaixCN71.bnd xCATaixCN71 -cmd:chdef -t osimage -o autotest installp_bundle="xCATaixCN71" -check:rc==0 -cmd:chkosimage autotest -check:rc==0 -end - -start:chkosimage_V_c_imagename -description:chkosimage -V -c autotest -os:AIX -cmd:lsnim | grep autotest -check:rc==0 -check:output=~lpp_source -check:output=~spot -check:output=~bosinst_data -cmd:chkosimage -V -c autotest -check:rc==0 -end - From af099caccd48ebd9465a73430a109bb9a2e2566a Mon Sep 17 00:00:00 2001 From: bybai Date: Wed, 27 Jun 2018 02:57:43 -0400 Subject: [PATCH 54/93] adjust some steps --- .../ha/ha_mgmt_node_with_shared_data.rst | 81 +++++++++++-------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst index afd69482d..0d62646ee 100644 --- a/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst +++ b/docs/source/references/coral/ha/ha_mgmt_node_with_shared_data.rst @@ -6,7 +6,10 @@ HA Solution Overview While a xCAT management node ``xcatmn1`` is running as a primary management node, another node - ``xcatmn2`` can be configured to act as primary management node in case ``xcatmn1`` becomes unavailable. The process is manual and requires disabling primary ``xcatmn1`` and activating backup ``xcatmn2``. Both nodes require access to shared storage described below. Use of Virtual IP is also requred. -An interactive sample script ``xcatha`` is availabe to guide through the steps of disabling and activation of xCAT management nodes. ``Dryrun`` option in that scrip allows viewing the actions without executing them. +An interactive sample script `xcatha.py `_ is availabe to guide through the steps of disabling and activation of xCAT management nodes. ``Dryrun`` option in that scrip allows viewing the actions without executing them. + +Configure and Activate Primary xCAT Management Node +=================================================== Disable And Stop All Related Services on Primary xCAT Management Node ````````````````````````````````````````````````````````````````````` @@ -81,7 +84,7 @@ Existing xCAT management node IP should be configured as Virtual IP address, the Configure Shared Data ````````````````````` -The following xCAT directory structure should be accessible from both primary and backup xCAT management nodes:: +The following xCAT directory structure should be accessible from primary xCAT management node:: /etc/xcat /install @@ -99,34 +102,10 @@ Synchronize Clock It is recommended that the clocks are synchrinized between the primary management node and bakup management node. -Remove Virtual IP from primary xCAT Management Node -``````````````````````````````````````````````````` +Activate Primary xCAT Management Node +````````````````````````````````````` - ``ip addr del 10.5.106.7/8 dev eth0:0`` - -Activate Backup xCAT Management Node to be Primary Management Node -`````````````````````````````````````````````````````````````````` -# Configure Virtual IP - -# Add Virtual IP into ``/etc/hosts`` file :: - - 10.5.106.7 xcatmn1 xcatmn1.cluster.com - -# Install xCAT on backup xCAT management node ``xcatmn2`` - -# Switch to ``PostgreSQL`` database - -# Add static management node network interface IP ``10.5.106.5`` into ``PostgreSQL`` configuration file - - #. Add ``10.5.106.5`` into ``/var/lib/pgsql/data/pg_hba.conf``:: - - host all all 10.5.106.5/32 md5 - - #. Add ``10.5.106.5`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: - - listen_addresses = 'localhost,10.5.106.7,10.5.106.70,10.5.105.5' - -# Use ``xcatha.py -a`` to start all related services: :: +Use ``xcatha.py`` interactive activate ``xcatmn1``:: ./xcatha.py -a [Admin] Verify VIP 10.5.106.7 is configured on this node @@ -178,11 +157,49 @@ Activate Backup xCAT Management Node to be Primary Management Node 2018-06-24 22:13:19,353 - DEBUG - makeconservercf [Passed] 2018-06-24 22:13:19,449 - DEBUG - systemctl start conserver [Passed] -# Modify provision network entry ``mgtifname`` as ``eth0:0``:: +Activate Backup xCAT Management Node to be Primary Management Node +================================================================== - tabedit networks - "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, +#. Install xCAT on backup xCAT management node ``xcatmn2`` with local disk +#. Switch to ``PostgreSQL`` database + +#. Disable and deactivate services using ``xcatha.py -d`` on both ``xcatmn2`` and ``xcatmn1`` + +#. Remove Virtual IP from primary xCAT Management Node ``xcatmn1``:: + + ip addr del 10.5.106.7/8 dev eth0:0 + +#. Configure Virtual IP on ``xcatmn2`` + +#. Add Virtual IP into ``/etc/hosts`` file :: + + 10.5.106.7 xcatmn1 xcatmn1.cluster.com + +#. Connect the following xCAT directories to shared data on ``xcatmn2``:: + + /etc/xcat + /install + ~/.xcat + /var/lib/pgsql + /tftpboot + +#. Add static management node network interface IP ``10.5.106.5`` into ``PostgreSQL`` configuration file + + #. Add ``10.5.106.5`` into ``/var/lib/pgsql/data/pg_hba.conf``:: + + host all all 10.5.106.5/32 md5 + + #. Add ``10.5.106.5`` into ``listen_addresses`` variable in ``/var/lib/pgsql/data/postgresql.conf``:: + + listen_addresses = 'localhost,10.5.106.7,10.5.106.70,10.5.105.5' + +#. Use ``xcatha.py -a`` to start all related services on ``xcatmn2`` + +#. Modify provision network entry ``mgtifname`` as ``eth0:0``:: + + tabedit networks + "10_0_0_0-255_0_0_0","10.0.0.0","255.0.0.0","eth0:0","10.0.0.103",,"",,,,,,,,,,,"1500",, Unplanned failover: primary xCAT management node is not accessible `````````````````````````````````````````````````````````````````` From b00f1f81887f61a68a3ee9da64f7c78bcc48de74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Wed, 27 Jun 2018 16:45:41 +0800 Subject: [PATCH 55/93] Add compute.ubuntu18.04.x86_64.pkglist for Ubuntu 18.04 x86-64 support (#5343) --- .../ubuntu/compute.ubuntu18.04.x86_64.pkglist | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.x86_64.pkglist diff --git a/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.x86_64.pkglist b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.x86_64.pkglist new file mode 100644 index 000000000..80a145e6a --- /dev/null +++ b/xCAT-server/share/xcat/install/ubuntu/compute.ubuntu18.04.x86_64.pkglist @@ -0,0 +1,14 @@ +bash +ifupdown +nfs-common +openssl +isc-dhcp-client +libc-bin +openssh-server +openssh-client +wget +vim +rsync +busybox-static +gawk +dnsutils From b63a0aa4aed55dd224f63701cc3b8f7086546dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Wed, 27 Jun 2018 16:46:52 +0800 Subject: [PATCH 56/93] Fix $kernelpath for Ubuntu 18.04 on ppc64el (#5342) --- xCAT-server/lib/xcat/plugins/debian.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/debian.pm b/xCAT-server/lib/xcat/plugins/debian.pm index 3d2c6ce6b..370b270ad 100644 --- a/xCAT-server/lib/xcat/plugins/debian.pm +++ b/xCAT-server/lib/xcat/plugins/debian.pm @@ -806,7 +806,7 @@ sub mkinstall { ) or ( $arch =~ /ppc64/i and ( (-r "$pkgdir/install/netboot/ubuntu-installer/$darch/vmlinux" - and $kernpath = "$pkgdir/install/install/netboot/ubuntu-installer/$darch/vmlinux" + and $kernpath = "$pkgdir/install/netboot/ubuntu-installer/$darch/vmlinux" and -r "$pkgdir/install/netboot/ubuntu-installer/$darch/initrd.gz" and $initrdpath = "$pkgdir/install/netboot/ubuntu-installer/$darch/initrd.gz" ) or From b9601208eee5d869a7f868e3b45280a8ab524702 Mon Sep 17 00:00:00 2001 From: huweihua Date: Wed, 27 Jun 2018 04:56:50 -0400 Subject: [PATCH 57/93] modify depending on comments --- .../testcase/installation/reg_linux_diskfull_installation_flat | 2 +- .../reg_linux_diskfull_installation_flat_postscripts_failed | 2 +- .../installation/reg_linux_diskfull_installation_hierarchy | 2 +- .../testcase/installation/reg_linux_diskless_installation_flat | 2 +- .../reg_linux_diskless_installation_flat_postscripts_failed | 2 +- .../installation/reg_linux_diskless_installation_hierarchy | 2 +- .../reg_linux_statelite_installation_hierarchy_by_nfs | 2 +- .../reg_linux_statelite_installation_hierarchy_by_ramdisk | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat index 403dde795..0df3cf3dd 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat @@ -1,6 +1,6 @@ start:reg_linux_diskfull_installation_flat os:Linux -label:provision,flat_cn_diskful +label:flat_cn_diskful,provision #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed index a5037a5e1..5d6d45f87 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_flat_postscripts_failed @@ -2,7 +2,7 @@ start:reg_linux_diskfull_installation_flat_postscripts_failed description:This case is for postscripts failed the status will return failed during diskfull installation. attribute:$$CN-The operation object of diskfull installation. os:Linux -label:others,invoke_provison,postscripts +label:others,postscripts,invoke_provison cmd:if ping -c 1 $$SN > /dev/null;then rpower $$SN off > /dev/null;fi cmd:MINIISO=NUll;if [[ "__GETNODEATTR($$CN,os)__" =~ "ubuntu" ]] && [[ "__GETNODEATTR($$CN,arch)__" =~ "ppc64" ]];then mkdir /tmp/iso; mount -o loop $$MINIISO /tmp/iso ; mkdir -p /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot; cp /tmp/iso/install/initrd.gz /install/__GETNODEATTR($$CN,os)__/__GETNODEATTR($$CN,arch)__/install/netboot;umount /tmp/iso; rmdir /tmp/iso; fi check:rc==0 diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy index 48253d4c5..2dc2af6ac 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskfull_installation_hierarchy @@ -1,6 +1,6 @@ start:reg_linux_diskfull_installation_hierarchy os:Linux -label:provision,hierarchy_cn_diskful +label:hierarchy_cn_diskful,provision #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat index 35b58e34d..f183bba92 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat @@ -1,6 +1,6 @@ start:reg_linux_diskless_installation_flat os:Linux -label:provision,flat_cn_diskless +label:flat_cn_diskless,provision #stop:yes cmd:fdisk -l cmd:df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed index 7b4cbd4a2..0121d2249 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_flat_postscripts_failed @@ -2,7 +2,7 @@ start:reg_linux_diskless_installation_flat_postscripts_failed description:This case is for postscripts failed the status will return failed during diskless installation. attribute:$$CN-The operation object of diskless installation. os:Linux -label:others,invoke_provison,postscripts +label:others,postscripts,invoke_provison cmd:chdef -t node -o $$CN servicenode= monserver=$$MN nfsserver=$$MN tftpserver=$$MN xcatmaster=$$MN check:rc==0 diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy index 86ec893a1..23354bf69 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy +++ b/xCAT-test/autotest/testcase/installation/reg_linux_diskless_installation_hierarchy @@ -1,7 +1,7 @@ start:reg_linux_diskless_installation_hierarchy os:Linux #stop:yes -label:provision,hierarchy_cn_diskless +label:hierarchy_cn_diskless,provision cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T cmd:xdsh $$SN "echo "test"> /test.hierarchy" diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs index f3438e552..7fdbd8707 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs +++ b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_nfs @@ -1,6 +1,6 @@ start:reg_linux_statelite_installation_hierarchy_by_nfs os:Linux -label:provision,others,statelite +label:others,provision,statelite #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T diff --git a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk index 258cec473..822c68b58 100644 --- a/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk +++ b/xCAT-test/autotest/testcase/installation/reg_linux_statelite_installation_hierarchy_by_ramdisk @@ -1,6 +1,6 @@ start:reg_linux_statelite_installation_hierarchy_by_ramdisk os:Linux -label:provision,others,statelite +label:others,provision,statelite #stop:yes cmd:xdsh $$SN fdisk -l cmd:xdsh $$SN df -T From b5e5efa62a5bae386cfb66cad5ba4f7b6630e7d4 Mon Sep 17 00:00:00 2001 From: huweihua Date: Wed, 27 Jun 2018 05:43:11 -0400 Subject: [PATCH 58/93] delete test cases of AIX --- xCAT-test/autotest/testcase/makedhcp/cases0 | 13 -- .../autotest/testcase/makenetworks/cases0 | 13 -- .../autotest/testcase/mkdsklsnode/cases0 | 114 ------------------ xCAT-test/autotest/testcase/mknimimage/cases0 | 113 ----------------- .../autotest/testcase/rmdsklsnode/cases0 | 57 --------- xCAT-test/autotest/testcase/rmnimimage/cases0 | 59 --------- xCAT-test/autotest/testcase/xcat2nim/cases0 | 48 -------- 7 files changed, 417 deletions(-) delete mode 100644 xCAT-test/autotest/testcase/mkdsklsnode/cases0 delete mode 100644 xCAT-test/autotest/testcase/mknimimage/cases0 delete mode 100644 xCAT-test/autotest/testcase/rmdsklsnode/cases0 delete mode 100644 xCAT-test/autotest/testcase/rmnimimage/cases0 delete mode 100644 xCAT-test/autotest/testcase/xcat2nim/cases0 diff --git a/xCAT-test/autotest/testcase/makedhcp/cases0 b/xCAT-test/autotest/testcase/makedhcp/cases0 index d676640ba..91535b814 100644 --- a/xCAT-test/autotest/testcase/makedhcp/cases0 +++ b/xCAT-test/autotest/testcase/makedhcp/cases0 @@ -42,19 +42,6 @@ check:output=~dhcpd cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi end -start:makedhcp_n_aix -description:Create a new dhcp configuration file with a network statement for each network the dhcp daemon should listen on -os:Aix -cmd:mv -f /etc/dhcpsd.cnf /etc/dhcpsd.conf.bak -cmd:makedhcp -n -check:rc==0 -cmd:ls /etc/dhcpsd.cnf -check:rc==0 -cmd:ps -e | grep dhcpd -check:rc==0 -check:output=~dhcpd -end - start:makedhcp_a_linux description:Define all nodes to the DHCP server. (Will only add nodes that can be reached, network-wise, by this DHCP server.) The dhcp daemon does not have to be restarted after this. os:Linux diff --git a/xCAT-test/autotest/testcase/makenetworks/cases0 b/xCAT-test/autotest/testcase/makenetworks/cases0 index 11d24da82..def304fe6 100644 --- a/xCAT-test/autotest/testcase/makenetworks/cases0 +++ b/xCAT-test/autotest/testcase/makenetworks/cases0 @@ -19,19 +19,6 @@ check:rc==0 check:output=~Version end -start:makenetworks_d -os:AIX -cmd:makenetworks -d > /tmp/mynetworksstanzas -check:rc==0 -cmd:echo "auto-testnetworks:\n objtype=network\n gateway=1.2.3.0\n mask=255.255.255.0\n net=1.2.3.1\n" >> /tmp/mynetworksstanzas -cmd:cat /tmp/mynetworksstanzas | chdef -z -check:rc==0 -cmd:tabdump networks -check:output=~("auto-testnetworks","1.2.3.1","255.255.255.0",,"1.2.3.0",,,,,,,,,,,,) -cmd:chtab -d netname=auto-testnetworks networks -cmd:rm -f /tmp/mynetworksstanzas -end - start:makenetworks_d os:Linux cmd:makenetworks -d > /tmp/mynetworksstanzas diff --git a/xCAT-test/autotest/testcase/mkdsklsnode/cases0 b/xCAT-test/autotest/testcase/mkdsklsnode/cases0 deleted file mode 100644 index 5aee012b6..000000000 --- a/xCAT-test/autotest/testcase/mkdsklsnode/cases0 +++ /dev/null @@ -1,114 +0,0 @@ -start:mkdsklsnode_h -os:AIX -cmd:mkdsklsnode -h -check:rc==0 -check:output=~Usage -end - -start:mkdsklsnode_i_f -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -i autotestdsklsimage $$CN -f -check:rc==0 -check:output=~Initializing NIM machine '$$CN' -check:output=~AIX/NIM diskless nodes were initialized -cmd:lsnim -l $$CN -check:rc==0 -cmd:rmdsklsnode $$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - -start:mkdsklsnode_i_f_V -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -i autotestdsklsimage $$CN -f -check:rc==0 -check:output=~$$MN: AIX/NIM diskless nodes were initialized -check:output=~Initializing NIM machine '$$CN' -check:output=~AIX/NIM diskless nodes were initialized -cmd:lsnim -l $$CN -check:rc==0 -cmd:rmdsklsnode $$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - - -start:mkdsklsnode_n_i -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -n -i autotestdsklsimage $$CN -check:rc==0 -cmd:lsnim |grep $$CN|sed -e 's/_/ /g'|cut -d" " -f2 |grep ^autotestdsklsimage$ -check:rc==0 -cmd:rmdsklsnode -i autotestdsklsimage $$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - -start:mkdsklsnode_node -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode $$CN -check:rc==0 -check:output=~Initializing NIM machine '$$CN' -cmd:lsnim -l $$CN -check:rc==0 -cmd:rmdsklsnode $$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -cmd:rm -rf /install/nim/spot/autotestdsklsimage -end - -start:mkdsklsnode_i_psize_sparse_paging -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -i autotestdsklsimage $$CN psize=128 sparse_paging=yes -check:rc==0 -cmd:lsnim -l $$CN -check:rc==0 -cmd:rmdsklsnode $$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - diff --git a/xCAT-test/autotest/testcase/mknimimage/cases0 b/xCAT-test/autotest/testcase/mknimimage/cases0 deleted file mode 100644 index f3400ef1a..000000000 --- a/xCAT-test/autotest/testcase/mknimimage/cases0 +++ /dev/null @@ -1,113 +0,0 @@ -start:mknimimage_h -description:mknimimage -h and --help -os:AIX -cmd:mknimimage -h -check:output=~Usage|usage -cmd:mknimimage --help -check:output=~Usage|usage -end - -start:mknimimage_s -description:mknimimage -s source imagename -os:AIX -cmd:mknimimage -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:lsnim |grep testimage -check:rc==0 -check:output=~testimage -check:output=~testimage_lpp_source -check:output=~testimage_bosinst_data -cmd:nim -o remove testimage -cmd:nim -o remove testimage_lpp_source -cmd:nim -o remove testimage_bosinst_data -cmd:chtab -d imagename=testimage osimage -cmd:rm -rf /install/nim/lpp_source/testimage_lpp_source -cmd:rm -rf /install/nim/bosinst_data/testimage_bosinst_data -cmd:rm -rf /install/nim/spot/testimage -end - -start:mknimimage_s_iamgename_attr -description:mknimimage -s source imagename attr=val -os:AIX -cmd:mknimimage -s $$SOURCE testimage installp_bundle=mybndlres -check:rc==0 -check:output=~installp_bundle=mybndlres -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:lsnim |grep testimage -check:rc==0 -check:output=~testimage -check:output=~testimage_lpp_source -check:output=~testimage_bosinst_data -cmd:nim -o remove testimage -cmd:nim -o remove testimage_lpp_source -cmd:nim -o remove testimage_bosinst_data -cmd:chtab -d imagename=testimage osimage -cmd:rm -rf /install/nim/lpp_source/testimage_lpp_source -cmd:rm -rf /install/nim/bosinst_data/testimage_bosinst_data -cmd:rm -rf /install/nim/spot/testimage -end - -start:mknimimage_t_s -description:mknimimage -t diskless -s source imagename -os:AIX -cmd:mknimimage -t diskless -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:ouput=~nimtype=diskless -check:output=~testimage -cmd:lsnim |grep testimage -check:rc==0 -check:output=~testimage -check:output=~testimage_lpp_source -cmd:nim -o remove testimage -cmd:nim -o remove testimage_lpp_source -cmd:nim -o remove testimage_bosinst_data -cmd:nim -o remove testimage_paging -cmd:chtab -d imagename=testimage osimage -cmd:rm -rf /install/nim/lpp_source/testimage_lpp_source -cmd:rm -rf /install/nim/paging/testimage_paging -cmd:rm -rf /install/nim/spot/testimage -end - - -start:mknimimage_t_i -description:mknimimage -t diskless -i imagename imagename -os:AIX -cmd:mknimimage -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:mknimimage -t diskless -i testimage testimage_updt -check:rc==0 -check:output=~spot=testimage_updt -check:output=~root=testimage_updt_root -check:output=~testimage_updt -cmd:lsnim |grep testimage_updt -ckeck:rc==0 -check:output=~testimage_updt -check:output=~testimage_updt_root -cmd:nim -o remove testimage -cmd:nim -o remove testimage_lpp_source -cmd:nim -o remove testimage_bosinst_data -cmd:nim -o remove testimage_updt -cmd:nim -o remove testimage_root -cmd:nim -o remove testimage_updt_root -cmd:chtab -d imagename=testimage osimage -cmd:chtab -d imagename=testimage_updt osimage -cmd:rm -rf /install/nim/lpp_source/testimage_lpp_source -cmd:rm -rf /install/nim/paging/testimage_paging -cmd:rm -rf /install/nim/spot/testimage -cmd:rm -rf /install/nim/lpp_source/testimage_updt_lpp_source -cmd:rm -rf /install/nim/paging/testimage_updt_paging -cmd:rm -rf /install/nim/spot/testimage_updt -cmd:rm -rf /install/nim/bosinst_data/testimage_bosinst_data -end - - - diff --git a/xCAT-test/autotest/testcase/rmdsklsnode/cases0 b/xCAT-test/autotest/testcase/rmdsklsnode/cases0 deleted file mode 100644 index ea1abf740..000000000 --- a/xCAT-test/autotest/testcase/rmdsklsnode/cases0 +++ /dev/null @@ -1,57 +0,0 @@ -start:rmdsklsnode_h -os:AIX -cmd:rmdsklsnode -h -check:rc==0 -check:output=~Usage -end - -start:rmdsklsnode_node -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -i autotestdsklsimage $$CN -f -check:rc==0 -check:output=~Initializing NIM machine '$$CN' -check:output=~AIX/NIM diskless nodes were initialized -cmd:lsnim -l $$CN -check:rc==0 -cmd:rmdsklsnode $$CN -check:rc==0 -cmd:lsnim |grep $$CN -check:rc!=0 -check:output!~$$CN -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - - -start:rmdsklsnode_i -os:AIX -cmd:mknimimage -r -t diskless -s $$SOURCE autotestdsklsimage -check:rc==0 -cmd:mkdsklsnode -n -i autotestdsklsimage $$CN -check:rc==0 -cmd:lsnim |grep $$CN|sed -e 's/_/ /g'|cut -d" " -f2 |grep ^autotestdsklsimage$ -check:rc==0 -cmd:rmdsklsnode -i autotestdsklsimage $$CN -V -check:rc==0 -cmd:lsnim |grep $$CN|sed -e 's/_/ /g'|cut -d" " -f2 |grep ^autotestdsklsimage$ -check:rc!=0 -cmd:nim -o remove autotestdsklsimage -cmd:nim -o remove autotestdsklsimage_lpp_source -cmd:nim -o remove autotestdsklsimage_shared_root -cmd:nim -o remove autotestdsklsimage_paging -cmd:chtab -d imagename=autotestdsklsimage osimage -cmd:rm -rf /install/nim/lpp_source/autotestdsklsimage_lpp_source -cmd:rm -rf /install/nim/paging/autotestdsklsimage_paging -cmd:rm -rf /install/nim/spot/autotestdsklsimage -cmd:rm -rf /install/nim/shared_root/autotestdsklsimage_shared_root -end - diff --git a/xCAT-test/autotest/testcase/rmnimimage/cases0 b/xCAT-test/autotest/testcase/rmnimimage/cases0 deleted file mode 100644 index 1bfa1de20..000000000 --- a/xCAT-test/autotest/testcase/rmnimimage/cases0 +++ /dev/null @@ -1,59 +0,0 @@ -start:rmnimimage_imagename -description:rmnimimage testimage -os:AIX -cmd:mknimimage -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:rmnimimage testimage -check:rc==0 -cmd:lsnim -check:output!~testimage_bosinst_data -check:output=~testimage_lpp_source -cmd:rmdef -t osimage -o testimage -end - -start:rmnimimage_d_imagename -description:rmnimimage -d imagename -os:AIX -cmd:mknimimage -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:rmnimimage -d testimage -check:rc==0 -cmd:lsnim -check:output!~testimage -cmd:tabdump osimage -check:output=~testimage -cmd:rmdef -t osimage -o testimage -end - -start:rmnimimage_x_imagename -os:AIX -cmd:mknimimage -s $$SOURCE testimage -check:rc==0 -check:output=~lpp_source=testimage_lpp_source -check:output=~bosinst_data=testimage_bosinst_data -check:output=~testimage -cmd:rmnimimage testimage -check:rc==0 -cmd:tabdump osimage -check:output=~testimage -cmd:rmnimimage -x testimage -ckeck:rc==0 -cmd:tabdump osimage -ckeck:output!~testimage -end - -start:rmnimimage_h -description:rmnimimage -h and --help -os:AIX -cmd:rmnimimage -h -check:output=~usage|Usage -cmd:rmnimimage --help -check:output=~usage|Usage -end - diff --git a/xCAT-test/autotest/testcase/xcat2nim/cases0 b/xCAT-test/autotest/testcase/xcat2nim/cases0 deleted file mode 100644 index 42875b943..000000000 --- a/xCAT-test/autotest/testcase/xcat2nim/cases0 +++ /dev/null @@ -1,48 +0,0 @@ -start:xcat2nim_h -description:xcat2nim -h and --help -os:AIX -cmd:xcat2nim -h -check:output=~usage|Usage -cmd:xcat2nim --help -check:output=~usage|Usage -end - - -start:xcat2nim_t_f_o_V_att -description:xcat2nim -f -t node -o CN -V att= -os:AIX -cmd:xcat2nim -t node -f -o $$CN -V netboot_kernel=mp -check:rc==0 -cmd:lsnim -l $$CN -check:output=~netboot_kernel = mp -cmd:xcat2nim -t node -f -o $$CN -V -end - - -start:xcat2nim_l -description:xcat2nim -l CN -os:AIX -cmd:xcat2nim -l $$CN -check:rc==0 -check:output=~$$CN: -end - -start:xcat2nim_r -description:xcat2nim -r CN -os:AIX -cmd:xcat2nim -r $$CN -check:rc==0 -cmd:lsnim -check:output!~$$CN -cmd:xcat2nim -t node -o $$CN -end - -start:xcat2nim_u -description:xcat2nim -u CN -os:AIX -cmd:lsnim -check:output=~$$CN -cmd:xcat2nim -u $$CN -check:rc==0 -end - From 133cc97f34ebd9648ad49ab701ca670293db750e Mon Sep 17 00:00:00 2001 From: huweihua Date: Wed, 27 Jun 2018 05:46:31 -0400 Subject: [PATCH 59/93] delete test cases of aix and old type machine --- .../autotest/testcase/renergy/case_8233-E8B | 405 ------------- .../autotest/testcase/renergy/case_9125-F2C | 534 ------------------ .../autotest/testcase/restartxcatd/cases0 | 32 -- 3 files changed, 971 deletions(-) delete mode 100644 xCAT-test/autotest/testcase/renergy/case_8233-E8B delete mode 100644 xCAT-test/autotest/testcase/renergy/case_9125-F2C delete mode 100644 xCAT-test/autotest/testcase/restartxcatd/cases0 diff --git a/xCAT-test/autotest/testcase/renergy/case_8233-E8B b/xCAT-test/autotest/testcase/renergy/case_8233-E8B deleted file mode 100644 index 9dfddf719..000000000 --- a/xCAT-test/autotest/testcase/renergy/case_8233-E8B +++ /dev/null @@ -1,405 +0,0 @@ - -start:query_8233-E8B_reset -description:Reset the value of power saving and capping to a default one -type:8233-E8B-E8B -cmd:renergy $$CN savingstatus=off -check:rc==0 -check:output=~Set savingstatus succeeded -cmd:renergy $$CN dsavingstatus=off -check:rc==0 -check:output=~Set dsavingstatus succeeded -cmd:renergy $$CN cappingstatus=off -check:rc==0 -check:output=~Set cappingstatus succeeded -cmd:renergy $$CN cappingwatt=2000 -check:rc==0 -end - -start:query_8233-E8B_all -description:query all the attributes of the node -type:8233-E8B -cmd:renergy $$CN all -check:rc==0 -check:output=~savingstatus: off -check:output=~cappingstatus: off -check:output=~dsavingstatus: off -check:output=~cappingmin: 1716 -check:output=~cappingmax: 2121 -check:output=~cappingvalue: 2000 -check:output=~cappingsoftmin: 304 -check:output=~averageAC: na -check:output~~averageDC: 681 -check:output~~ambienttemp: 22 -check:output~~ exhausttemp: 38 -check:output~~CPUspeed: 3556 -check:output=~syssbpower: na -check:output~~sysIPLtime: 900 -end - -start:query_8233-E8B_savingstatus -description: -type:8233-E8B -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: off -check:output!~dsavingstatus -check:output!~cappingstatus -end - -start:query_8233-E8B_dsavingstatus -description: -type:8233-E8B -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: off -check:output!~: savingstatus -check:output!~cappingstatus -end - -start:query_8233-E8B_cappingstatus -description: -type:8233-E8B -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: off -check:output!~dsavingstatus -check:output!~savingstatus -end - -start:query_8233-E8B_cappingmaxmin -description: -type:8233-E8B -cmd:renergy $$CN cappingmaxmin -check:rc==0 -check:output=~cappingmin: 1716 -check:output=~cappingmax: 2121 -check:output!~cappingvalue -check:output!~cappingsoftmin -end - -start:query_8233-E8B_cappingvalue -description: -type:8233-E8B -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 2000 -check:output!~cappingmin -check:output!~cappingmax -check:output!~cappingsoftmin -end - -start:query_8233-E8B_cappingsoftmin -description: -type:8233-E8B -cmd:renergy $$CN cappingsoftmin -check:rc==0 -check:output=~cappingsoftmin: 304 -check:output!~cappingmin -check:output!~cappingmax -check:output!~cappingvalue -end - -start:query_8233-E8B_averageAC -description: -type:8233-E8B -cmd:renergy $$CN averageAC -check:rc==0 -check:output=~averageAC: na -check:output!~averageDC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_8233-E8B_averageDC -description: -type:8233-E8B -cmd:renergy $$CN averageDC -check:rc==0 -check:output~~averageDC: 620 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_8233-E8B_ambienttemp -description: -type:8233-E8B -cmd:renergy $$CN ambienttemp -check:rc==0 -check:output~~ambienttemp: 22 -check:output!~averageAC -check:output!~averageDC -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_8233-E8B_exhausttemp -description: -type:8233-E8B -cmd:renergy $$CN exhausttemp -check:rc==0 -check:output~~exhausttemp: 38 -check:output!~averageAC -check:output!~ambienttemp -check:output!~averageDC -check:output!~CPUspeed -end - -start:query_8233-E8B_CPUspeed -description: -type:8233-E8B -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3556 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -end - -start:query_8233-E8B_syssbpower -description: -type:8233-E8B -cmd:renergy $$CN syssbpower -check:rc==0 -check:output=~syssbpower: na -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -check:output!~sysIPLtime -end - -start:query_8233-E8B_sysIPLtime -description: -type:8233-E8B -cmd:renergy $$CN sysIPLtime -check:rc==0 -check:output=~sysIPLtime: 900 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -check:output!~syssbpower -end - -start:set_8233-E8B_savingstatus -description: -type:8233-E8B -cmd:renergy $$CN savingstatus=on -check:rc==0 -check:output=~Set savingstatus succeeded -check:output=~This setting may need several minutes to take effect. -check:output!~Set savingstatus failed. -cmd:sleep 60 - -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: on - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 2492 - -cmd:renergy $$CN savingstatus=onxx -check:rc!=0 -check:output=~Usage: - -cmd:renergy $$CN dsavingstatus=on-norm -check:rc!=0 -check:output=~Cannot enable static and dynamic power -check:output=~Set dsavingstatus failed. - -cmd:renergy $$CN savingstatus=off -check:rc==0 -check:output=~Set savingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set savingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: off - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3556 -end - - -start:set_8233-E8B_dsavingstatus -description: -type:8233-E8B -cmd:renergy $$CN dsavingstatus=on -check:rc!=0 -check:output=~ Usage: - -cmd:renergy $$CN dsavingstatus=on-norm -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: on-norm - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 1652 - -cmd:renergy $$CN savingstatus=on -check:rc!=0 -check:output=~Cannot enable static and dynamic power -check:output=~Set savingstatus failed. - -cmd:renergy $$CN dsavingstatus=onxx -check:rc!=0 -check:output=~ Usage: - -cmd:renergy $$CN dsavingstatus=on-maxp -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: on-maxp - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3864 - -cmd:renergy $$CN dsavingstatus=off -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: off - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3556 -end - -start:set_8233-E8B_cappingstatus -description: -type:8233-E8B -cmd:renergy $$CN cappingstatus=on -check:rc==0 -check:output=~Set cappingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set cappingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: on - -cmd:renergy $$CN cappingstatus=onxx -check:rc!=0 -check:output=~Usage: - -cmd:renergy $$CN cappingstatus=off -check:rc==0 -check:output=~Set cappingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set cappingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: off -end - -start:set_8233-E8B_cappingwatt -description: -type:8233-E8B -cmd:renergy $$CN cappingwatt=2050 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 2050 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 2050 - -cmd:renergy $$CN cappingwatt=100 -check:rc!=0 -check:output!~Set cappingwatt succeeded. -check:output=~Set cappingwatt failed. -check:output=~Invalid value for cappingwatt. - -cmd:renergy $$CN cappingwatt=3000 -check:rc!=0 -check:output!~Set cappingwatt succeeded. -check:output=~Set cappingwatt failed. -check:output=~Invalid value for cappingwatt. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 2050 - -cmd:renergy $$CN cappingwatt=2000 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 2000 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 2000 -end - -start:set_8233-E8B_cappingperc -description: -type:8233-E8B -cmd:renergy $$CN cappingperc=0 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 1716 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=50 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 1918 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=100 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 2121 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=110 -check:rc!=0 -check:output!~Set cappingperc succeeded. -check:output=~Invalid value for cappingperc. -check:output=~Set cappingperc failed. - -cmd:renergy $$CN cappingwatt=2000 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 2000 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 2000 - -end diff --git a/xCAT-test/autotest/testcase/renergy/case_9125-F2C b/xCAT-test/autotest/testcase/renergy/case_9125-F2C deleted file mode 100644 index f82300796..000000000 --- a/xCAT-test/autotest/testcase/renergy/case_9125-F2C +++ /dev/null @@ -1,534 +0,0 @@ - -start:query_9125-F2C_reset -description:Reset the value of power saving and capping to a default one -type:9125-F2C -cmd:renergy $$CN savingstatus=off -check:rc==0 -check:output=~Set savingstatus succeeded -cmd:renergy $$CN dsavingstatus=off -check:rc==0 -check:output=~Set dsavingstatus succeeded -cmd:renergy $$CN cappingstatus=off -check:rc==0 -check:output=~Set cappingstatus succeeded -cmd:renergy $$CN fsavingstatus=off -check:rc==0 -check:output=~Set fsavingstatus succeeded -cmd:renergy $$CN ffovalue=3000 -check:rc==0 -cmd:renergy $$CN cappingwatt=14555 -check:rc==0 -end - -start:query_9125-F2C_all -description:query all the attributes of the node -type:9125-F2C -cmd:renergy $$CN all -check:rc==0 -check:output=~savingstatus: off -check:output=~cappingstatus: off -check:output=~dsavingstatus: off -check:output=~cappingmin: 14505 -check:output=~cappingmax: 14585 -check:output=~cappingvalue: 14555 -check:output=~cappingsoftmin: 5556 -check:output=~averageAC: na -check:output~~averageDC: 6976 -check:output~~ambienttemp: 24 -check:output~~ exhausttemp: 24 -check:output~~CPUspeed: 3836 -check:output=~syssbpower: na -check:output~~sysIPLtime: 900 -check:output=~fsavingstatus: off -check:output=~ffoMin: 2856 MHz -check:output=~ffoVmin: 2856 MHz -check:output=~ffoTurbo: 3836 MHz -check:output=~ffoNorm: 3836 MHz -check:output=~ffovalue: 3000 MHz -end - -start:query_9125-F2C_savingstatus -description: -type:9125-F2C -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: off -check:output!~dsavingstatus -check:output!~cappingstatus -end - -start:query_9125-F2C_dsavingstatus -description: -type:9125-F2C -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: off -check:output!~: savingstatus -check:output!~cappingstatus -end - -start:query_9125-F2C_cappingstatus -description: -type:9125-F2C -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: off -check:output!~dsavingstatus -check:output!~savingstatus -end - -start:query_9125-F2C_cappingmaxmin -description: -type:9125-F2C -cmd:renergy $$CN cappingmaxmin -check:rc==0 -check:output=~cappingmin: 14505 -check:output=~cappingmax: 14585 -check:output!~cappingvalue -check:output!~cappingsoftmin -end - -start:query_9125-F2C_cappingvalue -description: -type:9125-F2C -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 14555 -check:output!~cappingmin -check:output!~cappingmax -check:output!~cappingsoftmin -end - -start:query_9125-F2C_cappingsoftmin -description: -type:9125-F2C -cmd:renergy $$CN cappingsoftmin -check:rc==0 -check:output=~cappingsoftmin: 5556 -check:output!~cappingmin -check:output!~cappingmax -check:output!~cappingvalue -end - -start:query_9125-F2C_averageAC -description: -type:9125-F2C -cmd:renergy $$CN averageAC -check:rc==0 -check:output=~averageAC: na -check:output!~averageDC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_9125-F2C_averageDC -description: -type:9125-F2C -cmd:renergy $$CN averageDC -check:rc==0 -check:output~~averageDC: 6976 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_9125-F2C_ambienttemp -description: -type:9125-F2C -cmd:renergy $$CN ambienttemp -check:rc==0 -check:output~~ambienttemp: 24 -check:output!~averageAC -check:output!~averageDC -check:output!~exhausttemp -check:output!~CPUspeed -end - -start:query_9125-F2C_exhausttemp -description: -type:9125-F2C -cmd:renergy $$CN exhausttemp -check:rc==0 -check:output~~exhausttemp: 24 -check:output!~averageAC -check:output!~ambienttemp -check:output!~averageDC -check:output!~CPUspeed -end - -start:query_9125-F2C_CPUspeed -description: -type:9125-F2C -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3836 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -end - -start:query_9125-F2C_syssbpower -description: -type:9125-F2C -cmd:renergy $$CN syssbpower -check:rc==0 -check:output=~syssbpower: 20 W -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -check:output!~sysIPLtime -end - -start:query_9125-F2C_sysIPLtime -description: -type:9125-F2C -cmd:renergy $$CN sysIPLtime -check:rc==0 -check:output=~sysIPLtime: 900 -check:output!~averageAC -check:output!~ambienttemp -check:output!~exhausttemp -check:output!~averageDC -check:output!~syssbpower -end - -start:query_9125-F2C_fsavingstatus -description: -type:9125-F2C -cmd:renergy $$CN fsavingstatus -check:rc==0 -check:output=~fsavingstatus: off -check:output!~dsavingstatus -check:output!~cappingstatus -end - -start:query_9125-F2C_ffoMin -description: -type:9125-F2C -cmd:renergy $$CN ffoMin -check:rc==0 -check:output=~ffoMin: 2856 MHz -check:output!~ffoVmin -check:output!~ffoTurbo -check:output!~ffoNorm -check:output!~ffovalue -end - -start:query_9125-F2C_ffoVmin -description: -type:9125-F2C -cmd:renergy $$CN ffoVmin -check:rc==0 -check:output=~ffoVmin: 2856 MHz -check:output!~ffomin -check:output!~ffoTurbo -check:output!~ffoNorm -check:output!~ffovalue -end - -start:query_9125-F2C_ffoTurbo -description: -type:9125-F2C -cmd:renergy $$CN ffoTurbo -check:rc==0 -check:output=~ffoTurbo: 3836 MHz -check:output!~ffomin -check:output!~ffoVmin -check:output!~ffoNorm -check:output!~ffovalue -end - -start:query_9125-F2C_ffoNorm -description: -type:9125-F2C -cmd:renergy $$CN ffoNorm -check:rc==0 -check:output=~ffoNorm: 3836 MHz -check:output!~ffomin -check:output!~ffoVmin -check:output!~ffoTurbo -check:output!~ffovalue -end - -start:query_9125-F2C_ffovalue -description: -type:9125-F2C -cmd:renergy $$CN ffovalue -check:rc==0 -check:output=~ffovalue: 3000 MHz -check:output!~ffomin -check:output!~ffoVmin -check:output!~ffoTurbo -check:output!~ffoNorm -end - -start:set_9125-F2C_savingstatus -description: -type:9125-F2C -cmd:renergy $$CN savingstatus=on -check:rc==0 -check:output=~Set savingstatus succeeded -check:output=~This setting may need several minutes to take effect. -check:output!~Set savingstatus failed. -cmd:sleep 60 - -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: on - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 2856 - -cmd:renergy $$CN savingstatus=onxx -check:rc!=0 -check:output=~Usage: - -cmd:renergy $$CN dsavingstatus=on-norm -check:rc!=0 -check:output=~Cannot enable static and dynamic power -check:output=~Set dsavingstatus failed. - -cmd:renergy $$CN savingstatus=off -check:rc==0 -check:output=~Set savingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set savingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN savingstatus -check:rc==0 -check:output=~savingstatus: off - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3836 -end - - -start:set_9125-F2C_dsavingstatus -description: -type:9125-F2C -cmd:renergy $$CN dsavingstatus=on -check:rc!=0 -check:output=~ Usage: - -cmd:renergy $$CN dsavingstatus=on-norm -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: on-norm - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3836 - -cmd:renergy $$CN savingstatus=on -check:rc!=0 -check:output=~Cannot enable static and dynamic power -check:output=~Set savingstatus failed. - -cmd:renergy $$CN dsavingstatus=onxx -check:rc!=0 -check:output=~ Usage: - -cmd:renergy $$CN dsavingstatus=on-maxp -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: on-maxp - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3836 - -cmd:renergy $$CN dsavingstatus=off -check:rc==0 -check:output=~Set dsavingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set dsavingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN dsavingstatus -check:rc==0 -check:output=~dsavingstatus: off - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3836 -end - -start:set_9125-F2C_cappingstatus -description: -type:9125-F2C -cmd:renergy $$CN cappingstatus=on -check:rc==0 -check:output=~Set cappingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set cappingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: on - -cmd:renergy $$CN cappingstatus=onxx -check:rc!=0 -check:output=~Usage: - -cmd:renergy $$CN cappingstatus=off -check:rc==0 -check:output=~Set cappingstatus succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set cappingstatus failed. - -cmd:sleep 60 - -cmd:renergy $$CN cappingstatus -check:rc==0 -check:output=~cappingstatus: off -end - -start:set_9125-F2C_cappingwatt -description: -type:9125-F2C -cmd:renergy $$CN cappingwatt=14560 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 14560 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 14560 - -cmd:renergy $$CN cappingwatt=100 -check:rc!=0 -check:output!~Set cappingwatt succeeded. -check:output=~Set cappingwatt failed. -check:output=~Invalid value for cappingwatt. - -cmd:renergy $$CN cappingwatt=15000 -check:rc!=0 -check:output!~Set cappingwatt succeeded. -check:output=~Set cappingwatt failed. -check:output=~Invalid value for cappingwatt. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 14560 - -cmd:renergy $$CN cappingwatt=14555 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 14555 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 14555 -end - -start:set_9125-F2C_cappingperc -description: -type:9125-F2C -cmd:renergy $$CN cappingperc=0 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 14505 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=50 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 14545 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=100 -check:rc==0 -check:output=~Set cappingperc succeeded. -check:output=~cappingvalue: 14585 -check:output!~Set cappingperc failed. - -cmd:renergy $$CN cappingperc=110 -check:rc!=0 -check:output!~Set cappingperc succeeded. -check:output=~Invalid value for cappingperc. -check:output=~Set cappingperc failed. - -cmd:renergy $$CN cappingwatt=14555 -check:rc==0 -check:output=~Set cappingwatt succeeded. -check:output=~cappingvalue: 14555 -check:output!~Set cappingwatt failed. - -cmd:renergy $$CN cappingvalue -check:rc==0 -check:output=~cappingvalue: 14555 - -end - - -start:set_9125-F2C_fsavingstatus -description: -type:9125-F2C -cmd:renergy $$CN fsavingstatus=on -check:rc==0 -check:output=~Set fsavingstatus succeeded. -check:output!~Set fsavingstatus failed. - -cmd:renergy $$CN fsavingstatus -check:rc==0 -check:output=~fsavingstatus: on - -cmd:renergy $$CN fsavingstatus=onxx -check:rc!=0 -check:output=~ Usage: - -cmd:renergy $$CN ffovalue=3100 -check:rc==0 -check:output=~Set ffovalue succeeded. -check:output=~This setting may need several minutes to take effect. -check:output!~Set ffovalue failed. - -cmd:sleep 90 - -cmd:renergy $$CN CPUspeed -check:rc==0 -check:output~~CPUspeed: 3100 - -cmd:renergy $$CN ffovalue=2000 -check:rc!=0 -check:output=~Set ffovalue failed. -check:output=~Invalid value for ffovalue -check:output!~Set ffovalue succeeded. - -cmd:renergy $$CN fsavingstatus=off -check:rc==0 -check:output=~Set fsavingstatus succeeded. -check:output!~Set fsavingstatus failed. - -cmd:renergy $$CN fsavingstatus -check:rc==0 -check:output=~fsavingstatus: off - -end - - diff --git a/xCAT-test/autotest/testcase/restartxcatd/cases0 b/xCAT-test/autotest/testcase/restartxcatd/cases0 deleted file mode 100644 index 83dd70a6a..000000000 --- a/xCAT-test/autotest/testcase/restartxcatd/cases0 +++ /dev/null @@ -1,32 +0,0 @@ -start:restartxcatd_v -os:AIX -cmd:restartxcatd -v -check:rc==0 -check:output=~Version -end - -start:restartxcatd_h -os:AIX -cmd:restartxcatd -h -check:rc==0 -cmd:restartxcatd --help -check:rc==0 -end - -start:restartxcatd -os:AIX -cmd:restartxcatd -check:rc==0 -check:output=~The xcatd Subsystem was requested to stop -check:output=~The xcatd Subsystem has been started. Subsystem PID is \d+ -end - -start:restartxcatd_V -os:AIX -cmd:restartxcatd -V -check:output=~Stopped the xcatd subsystem -check:output=~The xcatd Subsystem has been started -check:output=~Running command on -check:output=~Started the xcatd subsystem -end - From 40ecdec4d4748412ce30bda11db06a5aef9507cf Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Wed, 27 Jun 2018 12:48:48 -0400 Subject: [PATCH 60/93] rflash for ipmi machines enhancements --- xCAT-server/lib/xcat/plugins/ipmi.pm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index 3e7171c35..2d208bd5a 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -2040,6 +2040,7 @@ sub do_firmware_update { $exit_with_error_func->($sessdata->{node}, $callback, "At least one update file (.bin or .pnor) needs to be in data directory $pUpdate_directory."); } + # All checks are done, run pUpdate utility on each of the update files found in # the specified data directory xCAT::SvrUtils::sendmsg("rflash started, Please wait...", $callback, $sessdata->{node}); @@ -2107,11 +2108,16 @@ sub do_firmware_update { $exit_with_success_func->($sessdata->{node}, $callback, "Firmware updated, powering chassis on to populate FRU information..."); } + # If we get here, the target machine is *NOT* IBM Power S822LC for Big Data (Supermicro) + # Only .hpm files is supported for such machine, no directory option is supported + if (defined $directory_name) { + $exit_with_error_func->($sessdata->{node}, $callback, "Directory option is not supported for target machine: \n$output"); + } if (($hpm_data_hash{deviceID} ne $sessdata->{device_id}) || ($hpm_data_hash{productID} ne $sessdata->{prod_id}) || ($hpm_data_hash{manufactureID} ne $sessdata->{mfg_id})) { $exit_with_error_func->($sessdata->{node}, $callback, - "The image file doesn't match this machine"); + "The image file doesn't match target machine: \n$output"); } # check for 8335-GTB Firmware above 1610A release. If below, exit From 9f629c5176ceff0c83aa739ccdd235056d99ec73 Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Wed, 27 Jun 2018 15:34:44 -0400 Subject: [PATCH 61/93] Improvement from review --- xCAT-server/lib/xcat/plugins/ipmi.pm | 35 +++++++++++++++++++--------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index 2d208bd5a..9207bd4b4 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -50,6 +50,7 @@ my $xcatdebugmode = 0; my $IPMIXCAT = "/opt/xcat/bin/ipmitool-xcat"; my $NON_BLOCK = 1; +my $BIG_DATA_MACHINE_MODELS = "8001-22C|9006-22C|5104-22C|8001-12C|9006-12C"; use constant RFLASH_LOG_DIR => "/var/log/xcat/rflash"; if (-d RFLASH_LOG_DIR) { chmod 0700, RFLASH_LOG_DIR; @@ -1978,7 +1979,7 @@ sub do_firmware_update { # P9 Boston (9006-22C, 9006-12C, 5104-22C) or P8 Briggs (8001-22C) # firmware update is done using pUpdate utility expected to be in the # specified data directory along with the update files .bin for BMC or .pnor for Host - if ($output =~ /8001-22C|9006-22C|5104-22C|8001-12C|9006-12C/) { + if ($output =~ /$BIG_DATA_MACHINE_MODELS/) { # Verify valid data directory was specified if (defined $directory_name) { unless (File::Spec->file_name_is_absolute($directory_name)) { @@ -2106,18 +2107,30 @@ sub do_firmware_update { } $exit_with_success_func->($sessdata->{node}, $callback, "Firmware updated, powering chassis on to populate FRU information..."); + } else { + + # The target machine is *NOT* IBM Power S822LC for Big Data (Supermicro) + # Only .hpm files is supported for such machine, no directory option is supported + if (defined $directory_name) { + my ($part1, $part2) = split(/Chassis Part Number :/, $output); + my ($part3, $model) = split(/\s+/, $part2); + $exit_with_error_func->($sessdata->{node}, $callback, "Flashing of $model is not supported with pUpdate, supported Model Types: $BIG_DATA_MACHINE_MODELS"); + } } - # If we get here, the target machine is *NOT* IBM Power S822LC for Big Data (Supermicro) - # Only .hpm files is supported for such machine, no directory option is supported - if (defined $directory_name) { - $exit_with_error_func->($sessdata->{node}, $callback, "Directory option is not supported for target machine: \n$output"); - } - if (($hpm_data_hash{deviceID} ne $sessdata->{device_id}) || - ($hpm_data_hash{productID} ne $sessdata->{prod_id}) || - ($hpm_data_hash{manufactureID} ne $sessdata->{mfg_id})) { - $exit_with_error_func->($sessdata->{node}, $callback, - "The image file doesn't match target machine: \n$output"); + # If we fall through here, it is *NOT* IBM Power S822LC for Big Data (Supermicro) and we expact some data in hpm_data_hash. + # Verify hpm_data_hash has some values + if ((defined $hpm_data_hash{deviceID}) || + (defined $hpm_data_hash{productID}) || + (defined $hpm_data_hash{manufactureID})) { + + if (($hpm_data_hash{deviceID} ne $sessdata->{device_id}) || + ($hpm_data_hash{productID} ne $sessdata->{prod_id}) || + ($hpm_data_hash{manufactureID} ne $sessdata->{mfg_id})) { + $exit_with_error_func->($sessdata->{node}, $callback, "The image file doesn't match target machine: \n$output"); + } + } else { + $exit_with_error_func->($sessdata->{node}, $callback, "No data was extracted from .hpm update file"); } # check for 8335-GTB Firmware above 1610A release. If below, exit From 75e54dc58990267f8bc16268662e165fc9e33f88 Mon Sep 17 00:00:00 2001 From: Yuan Bai Date: Thu, 28 Jun 2018 17:09:33 +0800 Subject: [PATCH 62/93] fixed (#5352) --- xCAT-server/lib/xcat/plugins/statelite.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/statelite.pm b/xCAT-server/lib/xcat/plugins/statelite.pm index 2d76a55b8..42b1715c3 100644 --- a/xCAT-server/lib/xcat/plugins/statelite.pm +++ b/xCAT-server/lib/xcat/plugins/statelite.pm @@ -469,7 +469,7 @@ sub process_request { $verbose && $callback->({ info => ["put the statelite rc file to $rootimg_dir/etc/init.d/"] }); # rh5,rh6.1 to rh6.4 use rc.statelite.ppc.redhat, otherwise use rc.statelite - if (($osver =~ m/^rh[a-zA-Z]*5/) or ($osver =~ m/^rh[a-zA-Z]*6(\.)?[1-4]/) and $arch eq "ppc64") { # special case for redhat5/6.x on PPC64 + if (($osver =~ m/^rh[a-zA-Z]*5/) or ($osver =~ m/^rh[a-zA-Z]*6(\.)?[1-4]$/) and $arch eq "ppc64") { # special case for redhat5/6.x on PPC64 system("cp -a $::XCATROOT/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat $rootimg_dir/etc/init.d/statelite"); } else { system("cp -a $::XCATROOT/share/xcat/netboot/add-on/statelite/rc.statelite $rootimg_dir/etc/init.d/statelite"); From 7083f185348a7fc96cdb094071e909c52ebf9222 Mon Sep 17 00:00:00 2001 From: huweihua Date: Thu, 28 Jun 2018 05:25:10 -0400 Subject: [PATCH 63/93] Add labels for mn_only test cases --- xCAT-test/autotest/testcase/chdef/cases0 | 16 +++- xCAT-test/autotest/testcase/chtab/cases0 | 8 ++ xCAT-test/autotest/testcase/dumpxCATdb/cases0 | 9 +++ xCAT-test/autotest/testcase/gettab/cases0 | 4 + xCAT-test/autotest/testcase/lsdef/cases0 | 21 +++++- xCAT-test/autotest/testcase/mkdef/cases0 | 26 +++++-- xCAT-test/autotest/testcase/mkdef/cases1 | 5 ++ xCAT-test/autotest/testcase/nodeadd/cases0 | 6 ++ xCAT-test/autotest/testcase/nodech/cases0 | 18 +++++ xCAT-test/autotest/testcase/nodegrpch/cases0 | 4 + xCAT-test/autotest/testcase/nodels/cases0 | 49 ++++++++---- xCAT-test/autotest/testcase/noderange/cases0 | 16 ++++ xCAT-test/autotest/testcase/noderm/cases0 | 4 + xCAT-test/autotest/testcase/regnotif/case0 | 8 +- .../autotest/testcase/restorexCATdb/cases0 | 6 ++ xCAT-test/autotest/testcase/rmdef/cases0 | 10 ++- xCAT-test/autotest/testcase/tabdump/cases0 | 19 ++++- xCAT-test/autotest/testcase/tabgrep/cases0 | 4 + xCAT-test/autotest/testcase/tabprune/cases0 | 8 +- xCAT-test/autotest/testcase/tabrestore/cases0 | 4 + xCAT-test/autotest/testcase/unregnotif/case0 | 4 + .../autotest/testcase/xcatstanzafile/cases0 | 74 +++---------------- 22 files changed, 223 insertions(+), 100 deletions(-) diff --git a/xCAT-test/autotest/testcase/chdef/cases0 b/xCAT-test/autotest/testcase/chdef/cases0 index f0e32c59c..d32f8d31b 100644 --- a/xCAT-test/autotest/testcase/chdef/cases0 +++ b/xCAT-test/autotest/testcase/chdef/cases0 @@ -1,11 +1,13 @@ start:chdef_null description:chdef without any flag +label:mn_only,db cmd:chdef check:output=~Usage end start:chdef_t_node description:chdef -t node +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:chdef -t node -o testnode groups=aix @@ -34,6 +36,7 @@ end start:chdef_t_network description:chdef -t network +label:mn_only,db cmd:chdef -t network -o testnetwork net=111.222.33.0 mask=255.255.255.254 check:rc==0 cmd:lsdef -t network -l testnetwork @@ -52,6 +55,7 @@ end start:chdef_p description:chdef -p -t node +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:chdef -p -t node -o testnode groups=aix @@ -63,6 +67,7 @@ end start:chdef_m description:chdef -m -t node +label:mn_only,db cmd:mkdef -t node -o testnode groups=all,testgroup check:rc==0 cmd:chdef -m -t node -o testnode groups=testgroup @@ -74,6 +79,7 @@ end start:chdef_z description:chdef -z +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:lsdef testnode -z > /tmp/testnode.stanza @@ -91,6 +97,7 @@ end start:chdef_group description:chdef with node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t node -o testnode3-testnode4 mgt=ipmi cons=ipmi groups=all,systemx @@ -127,6 +134,7 @@ end start:chdef_group_p +label:mn_only,db cmd:chdef abcnode1 -p groups=abc check:rc==0 cmd:chdef abcnode2 -p groups=abcabc @@ -144,6 +152,7 @@ end start:chdef_dynamic_group description:chdef with dynamic node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t node -o testnode3-testnode4 mgt=hmc cons=ipmi groups=all,systemx @@ -190,6 +199,7 @@ end start:chdef_multiple_keys description:mkdef support for multiple keys in a table, such as ppcdirect +label:mn_only,db cmd: mkdef -t node -o testfsp mgt=fsp cons=fsp groups=all,fsp nodetype=fsp passwd.HMC=abc123 passwd.general=abc123 passwd.admin=abc123 check:rc==0 cmd:lsdef testfsp @@ -210,6 +220,7 @@ end start:chdef_n description:chdef -n +label:mn_only,db cmd:mkdef -t node -o testnode1 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:chdef testnode1 -n testnode2 @@ -228,6 +239,7 @@ end start:chdef_t_o_error description:chdef -t wrongtype +label:mn_only,db cmd:chdef -t wrongtype -o testnode groups=all,aix check:rc!=0 check:output=~not a valid @@ -235,8 +247,8 @@ end start:chdef_template -os:linux description:try to change a template, a new node is created according to chdef. +label:mn_only,db cmd:result=`lsdef | grep switch-template`; if [[ $result =~ "switch-template" ]]; then echo $result; noderm switch-template; fi cmd:chdef -t node -o switch-template groups=test check:output=~1 object definitions have been created or modified @@ -249,8 +261,10 @@ check:rc==0 cmd:noderm switch-template check:rc==0 end + start:chdef_site_check description:This case is use to check site table could be changed successfully +label:mn_only,db cmd:var=`lsdef -t site clustersite -i dhcplease|grep 'dhcplease=' |awk -F= '{print $2}'`;echo $var>/tmp/sitevalue;chdef -t site clustersite dhcplease=300 check:rc==0 check:output=~1 object definitions have been created or modified. diff --git a/xCAT-test/autotest/testcase/chtab/cases0 b/xCAT-test/autotest/testcase/chtab/cases0 index cedb96420..769bd1f91 100644 --- a/xCAT-test/autotest/testcase/chtab/cases0 +++ b/xCAT-test/autotest/testcase/chtab/cases0 @@ -1,5 +1,6 @@ start:chtab_null description:Check chtab with no attr +label:mn_only,db cmd:chtab check:rc!=0 check:output=~Usage @@ -8,6 +9,7 @@ end start:chtab_d description:check chtab -d +label:mn_only,db cmd:chtab key=rsh_test site.value=/opt/xcat/bin/rcp site.comments="the rcp command" site.disable=no check:rc==0 cmd:tabdump site | grep rsh_test @@ -21,6 +23,7 @@ end start:chtab_modify_node description:test chtab with node=XXX +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:chtab node=testnode nodelist.groups=all @@ -33,6 +36,7 @@ end start:chtab_modify_key description:check chtab with key=xxx +label:mn_only,db cmd:chtab key=rsh_test site.value=/opt/xcat/bin/rcp site.comments="the rcp command" check:rc==0 cmd:tabdump site | grep rsh_test @@ -52,6 +56,7 @@ end start:chtab_err_symble description: check chtab with error attr +label:mn_only,db cmd:chtab -t check:output=~Usage end @@ -59,6 +64,7 @@ end start:chtab_err_table description:chtab with error table +label:mn_only,db cmd:chtab error=error site.comment=error check:rc!=0 check:output=~no such column|column \"error\" does not exist @@ -67,6 +73,7 @@ end start:chtab_h description:chtab -h and --help +label:mn_only,db cmd:chtab -h check:output=~Usage cmd:chtab --help @@ -76,6 +83,7 @@ end start:chtab_v description:chtab -v and -version +label:mn_only,db cmd:chtab -v check:output=~Version cmd:chtab -version diff --git a/xCAT-test/autotest/testcase/dumpxCATdb/cases0 b/xCAT-test/autotest/testcase/dumpxCATdb/cases0 index d82ffa5c4..232ba7dd5 100644 --- a/xCAT-test/autotest/testcase/dumpxCATdb/cases0 +++ b/xCAT-test/autotest/testcase/dumpxCATdb/cases0 @@ -1,5 +1,6 @@ start:dumpxCATdb_h description:dumpxCATdb -h +label:mn_only,db cmd:dumpxCATdb -h check:rc==0 check:output=~dumpxCATdb @@ -7,6 +8,7 @@ end start:dumpxCATdb_v description:Command Version +label:mn_only,db cmd:dumpxCATdb -v check:rc==0 check:output=~Version @@ -14,6 +16,7 @@ end start:dumpxCATdb_p_nullskiptables description:dumpxCATdb -p path,not skiptables +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -p /tmp/db @@ -29,6 +32,7 @@ end start:dumpxCATdb_a_p_nullskiptables description:dump all,without this flag the eventlog and auditlog will be skipped +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -a -p /tmp/db.all @@ -43,6 +47,7 @@ end start:dumpxCATdb_p_skiptables description:To have dumpxCATdb not backup the hosts or passwd table +label:mn_only,db cmd:chtab key=skiptables site.value="hosts,passwd" check:rc==0 cmd:dumpxCATdb -p /tmp/db.skiptables @@ -56,6 +61,7 @@ end start:dumpxCATdb_a_p_skiptables description:To have dumpxCATdb all but not backup the hosts or passwd table +label:mn_only,db cmd:chtab key=skiptables site.value="hosts,passwd" check:rc==0 cmd:dumpxCATdb -a -p /tmp/db.skiptables @@ -70,6 +76,7 @@ end start:dumpxCATdb_p_nullskiptables_V description:test verbose and -p +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -p /tmp/db -V @@ -83,6 +90,7 @@ end start:dumpxCATdb_a_p_nullskiptables_V description:test -V and -a +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -a -p /tmp/db -V @@ -95,6 +103,7 @@ end start:dumpxCATdb_p_V description:test -p -V +label:mn_only,db cmd:chtab key=skiptables site.value="passwd" check:rc==0 cmd:dumpxCATdb -p /tmp/db -V diff --git a/xCAT-test/autotest/testcase/gettab/cases0 b/xCAT-test/autotest/testcase/gettab/cases0 index 1f12d14d8..ce4b1bea4 100644 --- a/xCAT-test/autotest/testcase/gettab/cases0 +++ b/xCAT-test/autotest/testcase/gettab/cases0 @@ -1,4 +1,5 @@ start:gettab_key_table +label:mn_only,db cmd:gettab key=xcatdport site.value check:rc==0 check:output==3001 @@ -7,6 +8,7 @@ end start:gettab_H description:gettab -H and --with-fieldname +label:mn_only,db cmd:gettab -H key=master site.value check:rc==0 check:output=~site.value: @@ -17,6 +19,7 @@ end start:gettab_err description:gettab with error symble ,error key ,error attr. +label:mn_only,db cmd:gettab -c check:rc!=0 check:output=~Usage @@ -30,6 +33,7 @@ end start:gettab_h description:gettab -h and -? and --help +label:mn_only,db cmd:gettab -h check:output=~Usage cmd:gettab -? diff --git a/xCAT-test/autotest/testcase/lsdef/cases0 b/xCAT-test/autotest/testcase/lsdef/cases0 index eeae5f910..731065f5f 100644 --- a/xCAT-test/autotest/testcase/lsdef/cases0 +++ b/xCAT-test/autotest/testcase/lsdef/cases0 @@ -1,5 +1,6 @@ start:lsdef_null description: lsdef without any flag +label:mn_only,db cmd:mkdef -t node -o testnodell groups=all check:rc==0 cmd:lsdef @@ -11,6 +12,7 @@ end start:lsdef_a description: lsdef -a and lsdef --all +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:mkdef -t network -o testnetwork net=1.2.3.0 mask=255.255.255.0 @@ -35,6 +37,7 @@ end start:lsdef_t_o_l description: lsdef -o -l +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:mkdef -t network -o testnetwork net=1.2.3.0 mask=255.255.255.0 @@ -56,6 +59,7 @@ end start:lsdef_t_o_l_z description: lsdef -l -z +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:mkdef -t network -o testnetwork net=1.2.3.0 mask=255.255.255.0 @@ -76,6 +80,7 @@ end start:lsdef_t description: lsdef -t +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:mkdef -t network -o testnetwork net=1.2.3.0 mask=255.255.255.0 @@ -90,6 +95,7 @@ end start:lsdef_t_i_o description: lsdef -i +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:lsdef -t node -o testnode -i groups @@ -107,6 +113,7 @@ cmd:rmdef -t network testnetwork end start:lsdef_t_w +label:mn_only,db cmd:mkdef -t node -o testnode11,testnode21 cons=hmc groups=all check:rc==0 cmd:mkdef -t node -o testnode31,testnode41 cons=ipmi groups=linux @@ -137,6 +144,7 @@ end start:lsdef_s description: lsdef -s +label:mn_only,db cmd:mkdef -t node -o testnode groups=all check:rc==0 cmd:lsdef -s testnode @@ -147,6 +155,7 @@ end start:lsdef_t_auditlog description:lsdef -t auditlog +label:mn_only,db cmd:tabprune auditlog -a check:rc==0 cmd:lsdef -t auditlog @@ -156,6 +165,7 @@ end start:lsdef_t_eventlog description:lsdef -t eventlog +label:mn_only,db cmd:tabprune eventlog -a check:rc==0 cmd:lsdef -t eventlog @@ -165,6 +175,7 @@ end start:lsdef_t_policy description:lsdef -t policy +label:mn_only,db cmd:lsdef -t policy check:rc==0 check:output=~1\s+\(policy\) @@ -175,6 +186,7 @@ end start:lsdef_t_site description:lsdef -t site +label:mn_only,db cmd:lsdef -t site check:rc==0 check:output=~clustersite @@ -185,6 +197,7 @@ end start:lsdef_t_err description:lsdef -t wrongtype -o +label:mn_only,db cmd:lsdef -t wrongtype -o test check:rc!=0 check:output=~Error @@ -192,6 +205,7 @@ end start:lsdef_t_h_i description:lsdef -t node -h -i status +label:mn_only,db cmd:lsdef -t node -h -i status check:rc==0 check:output=~status @@ -199,6 +213,7 @@ end start:lsdef_nics description:lsdef --nics +label:mn_only,db cmd:mkdef -t node -o testnode1 groups=all mgt=ipmi nicips.eth0=1.1.1.1 check:rc==0 cmd:lsdef testnode1 --nics @@ -211,8 +226,8 @@ check:output=~Could not find end start:lsdef_template -os:linux description:check xCAT supported template +label:mn_only,db cmd:lsdef --template check:rc==0 check:output=~hmc\-template \(node\) @@ -224,8 +239,8 @@ check:output=~x86_64kvmguest\-template \(node\) end start:lsdef_template_switch_template -os:linux description:check xCAT supported template for switch template +label:mn_only,db cmd:lsdef --template switch-template check:rc==0 check:output=~Object name\: switch-template @@ -241,7 +256,7 @@ check:output=~switchtype\=OPTIONAL\:The type of switch end start:lsdef_template_with_invalid_name -os:linux +label:mn_only,db description:lsdef --template with invalid template name cmd:result=`lsdef | grep test_with_invalid_name`; if [[ $result =~ "test_with_invalid_name" ]]; then noderm test_with_invalid_name; fi cmd:lsdef --template "test_with_invalid_name" diff --git a/xCAT-test/autotest/testcase/mkdef/cases0 b/xCAT-test/autotest/testcase/mkdef/cases0 index 968783972..6ed8a06b7 100644 --- a/xCAT-test/autotest/testcase/mkdef/cases0 +++ b/xCAT-test/autotest/testcase/mkdef/cases0 @@ -1,11 +1,13 @@ start:mkdef_null description:mkdef without any flag +label:mn_only,db cmd:mkdef check:output=~Usage end start:mkdef_node description:mkdef -t node +label:mn_only,db cmd:mkdef -t node -o testnode,testnode1 groups=all,aix check:rc==0 cmd:lsdef -i groups testnode @@ -19,6 +21,7 @@ end start:mkdef_f description:mkdef -f +label:mn_only,db cmd:mkdef -t node -o testnode groups=all,aix check:rc==0 cmd:mkdef -f -t node -o testnode nodetype=lpar,osi groups=all @@ -32,6 +35,7 @@ end start:mkdef_z description:mkdef -z +label:mn_only,db cmd:mkdef -t node -o orignode mgt=fsp cons=hmc pprofile=orignode groups=lpar,all check:rc==0 cmd:lsdef -l orignode -z > /tmp/orignode.stanza @@ -51,6 +55,7 @@ end start:mkdef_group description: mkdef static node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t node -o testnode3-testnode4 mgt=ipmi cons=ipmi groups=all,systemx @@ -89,6 +94,7 @@ end start:mkdef_dynamic_group description:mkdef with dynamic node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t node -o testnode3-testnode4 mgt=ipmi cons=ipmi groups=all,systemx @@ -125,6 +131,7 @@ end start:mkdef_multiple_keys description:mkdef support for multiple keys in a table, such as ppcdirect +label:mn_only,db cmd: mkdef -t node -o testfsp mgt=fsp cons=fsp groups=all,fsp nodetype=fsp passwd.HMC=abc123 passwd.general=abc123 passwd.admin=abc123 check:rc==0 cmd:lsdef testfsp @@ -138,6 +145,7 @@ end start:mkdef_t_network description: mkdef -t network +label:mn_only,db cmd:mkdef -t network -o testnetwork net=1.2.3.0 mask=255.255.255.0 gateway=1.2.3.1 check:rc==0 cmd:lsdef -t network @@ -153,6 +161,7 @@ end start:mkdef_t_o_error description:mkdef -t wrongtype +label:mn_only,db cmd:mkdef -t wrongtype -o testnode groups=all,aix check:rc!=0 check:output=~not a valid @@ -160,8 +169,8 @@ end start:mkdef_template_switch_template_without_attribute -os:linux description:create a node with swtich template without any attributes +label:mn_only,db cmd:result=`lsdef | grep auto_test_node_1`; if [[ $result =~ "auto_test_node_1" ]]; then echo $result; noderm auto_test_node_1; fi cmd:mkdef -t node -o auto_test_node_1 --template switch-template check:rc==0 @@ -183,8 +192,8 @@ check:rc==0 end start:mkdef_template_cec_template_without_remainder -os:linux description:create a node with cec template once +label:mn_only,db cmd:result=`lsdef | grep auto_test_cec_node_1`; if [[ $result =~ "auto_test_cec_node_1" ]]; then echo $result; noderm auto_test_cec_node_1; fi cmd:mkdef -t node -o auto_test_cec_node_1 --template cec-template serial=test mtm=test hcp=test check:rc==0 @@ -206,8 +215,8 @@ check:rc==0 end start:mkdef_template_invalid_template -os:linux description:create a node with invalid template +label:mn_only,db cmd:result=`lsdef | grep auto_test_node`; if [[ $result =~ "auto_test_node" ]]; then echo $result; noderm auto_test_node; fi cmd:result=`lsdef | grep auto_test_invalid_template`; if [[ $result =~ "auto_test_invalid_template" ]]; then echo $result; noderm auto_test_invalid_template; fi cmd:lsdef --template auto_test_invalid_template @@ -219,8 +228,8 @@ check:output=~Error\: (\[.*?\]: )?Could not find the template object named \'aut end start:mkdef_node_with_a_node_template -os:linux description:create a node with a node template, using cec template to create node at beginning +label:mn_only,db cmd:result=`lsdef | grep auto_test_cec_node_1`; if [[ $result =~ "auto_test_cec_node_1" ]]; then echo $result; noderm auto_test_cec_node_1; fi cmd:result=`lsdef | grep auto_test_cec_node_2`; if [[ $result =~ "auto_test_cec_node_2" ]]; then echo $result; noderm auto_test_cec_node_2; fi cmd:mkdef -t node -o auto_test_cec_node_1 --template cec-template serial=test mtm=test hcp=test groups=test_template @@ -250,8 +259,8 @@ check:rc==0 end start:mkdef_template_cec_template_step_by_step -os:linux description:create a node with cec template step by step +label:mn_only,db cmd:result=`lsdef | grep auto_test_cec_node_1`; if [[ $result =~ "auto_test_cec_node_1" ]]; then echo $result; noderm auto_test_cec_node_1; fi cmd:mkdef -t node -o auto_test_cec_node_1 --template cec-template check:rc==1 @@ -282,8 +291,8 @@ check:rc==0 end start:check_mkdef_node_with_template_priority -os:linux description:create node named cec-template with cec template at beginning, the node is priority high than tempalate to create a new node +label:mn_only,db cmd:result=`lsdef | grep cec-template`; if [[ $result =~ "cec-template" ]]; then echo $result; noderm cec-template; fi cmd:result=`lsdef | grep auto_test_cec_node`; if [[ $result =~ "auto_test_cec_node" ]]; then echo $result; noderm auto_test_cec_node; fi cmd:mkdef -t node -o cec-template --template cec-template serial=test mtm=test hcp=test groups=test_template_priority @@ -312,8 +321,8 @@ check:rc==0 end start:mkdef_template_diskless_osimage_rootimgdir -os:linux description:check rootimgdir warning message after make new osimage with mkdef --template +label:cn_os_ready,db cmd:mkdef -t osimage -o test-osimage_with_template --template __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute check:rc==0 output=~1 object definitions have been created or modified @@ -324,9 +333,10 @@ check:output=~__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-comput cmd:rmdef -t osimage -o test-osimage_with_template check:rc==0 end + start:mkdef_rhels73 -os:linux description:create rhels7.3 osimage +label:mn_only,db cmd:mkdef -t osimage -o rhels7.3-test-osimage --template __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute check:rc==0 output=~1 object definitions have been created or modified diff --git a/xCAT-test/autotest/testcase/mkdef/cases1 b/xCAT-test/autotest/testcase/mkdef/cases1 index b4db39f83..95cad5f8e 100644 --- a/xCAT-test/autotest/testcase/mkdef/cases1 +++ b/xCAT-test/autotest/testcase/mkdef/cases1 @@ -1,5 +1,6 @@ start:mkdef_github_issue2582 description:Verify github issue 2582 +label:mn_only,db cmd:mkdef -t group -o doubletrouble bmc='|\z|-imm|' mgt=ipmi check:rc==0 cmd:mkdef mgt02 groups=doubletrouble @@ -12,6 +13,7 @@ end start:mkdef_regex_bmc description:The second example in xCAT document Using Regular Expressions in the xCAT Tables +label:mn_only,db cmd:chtab node=compute 'ipmi.bmc=/\z/-bmc/' check:rc==0 cmd:mkdef com02 groups=compute mgt=ipmi @@ -26,6 +28,7 @@ end start:mkdef_regex_ip description:The third example in xCAT document Using Regular Expressions in the xCAT Tables +label:mn_only,db cmd:chtab node=compute 'hosts.ip=|node(\d+)|10.0.0.($1+0)|' check:rc==0 cmd:mkdef node254 groups=compute @@ -40,6 +43,7 @@ end start:mkdef_regex_kvm description:The fourth example in xCAT document Using Regular Expressions in the xCAT Tables +label:mn_only,db cmd:chtab node=kvms 'vm.host=|\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)|c($1)f($2)x($3)|' 'vm.storage=|\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)|dir:///install/vms/vm($4+0)|' vm.memory=3072 vm.cpus=2 vm.nics=virbr2 vm.nicmodel=virtio check:rc==0 cmd:mkdef -t node -o c01f02x03v04 groups=kvms mgt=kvm @@ -64,6 +68,7 @@ end start:mkdef_regex_nicsip description:Verify the GitHub issue #3047. +label:mn_only,db cmd:rmdef xcattest_tmp_node_sn[01-16] cmd:rmdef -t group -o xcattest_tmp_group_regex cmd:mkdef -t group -o xcattest_tmp_group_regex diff --git a/xCAT-test/autotest/testcase/nodeadd/cases0 b/xCAT-test/autotest/testcase/nodeadd/cases0 index 53d7114cc..f36dc6749 100644 --- a/xCAT-test/autotest/testcase/nodeadd/cases0 +++ b/xCAT-test/autotest/testcase/nodeadd/cases0 @@ -1,10 +1,12 @@ start:nodeadd_null description:nodeadd without any flag +label:mn_only,db cmd:nodeadd check:output=~Usage end start:nodeadd_noderange +label:mn_only,db cmd:nodeadd testnode1-testnode2 groups="lpar,all" nodetype.nodetype="lpar,osi" check:rc==0 cmd:lsdef -i groups,nodetype testnode1 @@ -21,6 +23,7 @@ cmd:rmdef -t node -o testnode1-testnode2 end start:nodeadd_noderange_nodetype +label:mn_only,db cmd:nodeadd testnode1-testnode2 groups=all,rhel5 nodetype.os=rhel5 check:rc=0 cmd:lsdef -i groups,os testnode1 @@ -36,16 +39,19 @@ cmd:rmdef -t node -o testnode1-testnode2 end start:nodeadd_v +label:mn_only,db cmd:nodeadd -v check:output=~Version end start:nodeadd_h +label:mn_only,db cmd:nodeadd -h check:output=~Usage end start:nodeadd_err_symbol +label:mn_only,db cmd:nodeadd testnode magt=unknown check:rc!=0 check:output=~Error diff --git a/xCAT-test/autotest/testcase/nodech/cases0 b/xCAT-test/autotest/testcase/nodech/cases0 index 8529b4a8c..58b6345bf 100644 --- a/xCAT-test/autotest/testcase/nodech/cases0 +++ b/xCAT-test/autotest/testcase/nodech/cases0 @@ -1,5 +1,6 @@ start:nodech_noderange_table description:nodech testnode groups=all,rhels5.5 nodetype.os=rhels5.5 nodehm.mgt=hmc +label:mn_only,db cmd:chdef -t node -o testnode groups=all,rhels5.4 check:rc==0 cmd:nodech testnode groups=all,rhels5.5 nodetype.os=rhels5.5 nodehm.mgt=hmc @@ -14,6 +15,7 @@ end start:nodech_noderange_table_comma description:nodech testnode groups,=rhels5.5.Check nodech command with ,=. +label:mn_only,db cmd:chdef -t node -o testnode groups=all check:rc==0 cmd:nodech testnode groups,=rhels5.5 @@ -25,6 +27,7 @@ end start:nodech_noderange_table_arrow +label:mn_only,db cmd:chdef -t node -o testnode groups=all,rhels5.5 check:rc==0 cmd:nodech testnode groups^=rhels5.5 @@ -37,6 +40,7 @@ end start:nodech_noderange_table_comma_arrow description:nodech testnode groups^=rhels5.5 groups,=rhels5.4 . Check nodech command with both ^= and ,=. +label:mn_only,db cmd:chdef -t node -o testnode groups=all,rhels5.5 check:rc==0 cmd:nodech testnode groups^=rhels5.5 groups,=rhels5.4 @@ -48,6 +52,7 @@ end start:nodech_noderanage_table_at description:nodech testnode nodetype.os=@=helloworld.Check nodech command with =@=. +label:mn_only,db cmd:chdef -t node -o testnode os=hello groups=all check:rc==0 cmd:nodech testnode nodetype.os=@=helloworld @@ -60,6 +65,7 @@ end start:nodech_noderange_table_include description:nodech groups=~rh4.123456789 groups=rhels5.5.The command nodech with =~. +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.123456789 check:rc==0 cmd:nodech groups=~rh4.123456789 groups=rhels5.5 @@ -71,6 +77,7 @@ end start:nodech_noderange_table_uninclude description:nodech testnode1-testnode2 nodelist.groups\!~rhels5.5 nodelist.groups=rhels5.5,all.The command nodech with !~. +label:mn_only,db cmd:chdef -t node -o testnode1 groups=rhels5.5,all check:rc==0 cmd:chdef -t node -o testnode2 groups=rhels5.4,all @@ -85,6 +92,7 @@ end start:nodech_noderange_table_equal description:nodech groups==rh4.123456789 groups=rhels5.5.The command nodech with ==. +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.123456789 check:rc==0 cmd:nodech groups==rh4.123456789 groups=rhels5.5 @@ -97,6 +105,7 @@ end start:nodech_noderange_table_unequal description::nodech testnode1-testnode2 groups!=rhels5.5 groups=rhels5.5.The command nodech with !=. +label:mn_only,db cmd:chdef -t node -o testnode1 groups=rhels5.5 check:rc==0 cmd:chdef -t node -o testnode2 groups=rhels5.4 @@ -110,6 +119,7 @@ end start:nodech_noderange_shortname_groups description:nodech testnode groups=rhels5.4.The nodech use shortname groups +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:nodech testnode groups=rhels5.4 @@ -122,6 +132,7 @@ end start:nodech_noderange_shortname_tags description:nodech testnode tags=rhels5.4.The nodech use shortname tags +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:nodech testnode tags=rhels5.4 @@ -134,6 +145,7 @@ end start:nodech_noderange_shortname_mgt description:nodech testnode mgt=hmc.The nodech use shortname mgt +label:mn_only,db cmd:chdef -t node -o testnode mgt=blade groups=all check:rc==0 cmd:nodech testnode mgt=hmc @@ -145,6 +157,7 @@ end start:nodech_delete description:nodech -d +label:mn_only,db cmd:chdef -t node -o testnode os=hello groups=all check:rc==0 cmd:nodech -d testnode nodetype @@ -156,6 +169,7 @@ end start:nodech_h description:nodech -h +label:mn_only,db cmd:nodech -h check:output=~Usage cmd:nodech -? @@ -166,6 +180,7 @@ end start:nodech_v description:nodech -v +label:mn_only,db cmd:nodech -v check:output=~Version end @@ -173,6 +188,7 @@ end start:nodech_d_error description:nodech --delete +label:mn_only,db cmd:chdef -t node -o testnode os=hello groups=test check:rc==0 cmd:nodech --delete @@ -187,6 +203,7 @@ end start:nodech_error_node description: nodech error noderange,nodech testnode1 groups=all,rhels5.5 nodetype.os=rhels5.5 nodehm.mgt=hmc +label:mn_only,db cmd:chdef -t node -o testnode groups=all,rhels5.4 check:rc==0 cmd:nodech testnode1 groups=all,rhels5.5 nodetype.os=rhels5.5 nodehm.mgt=hmc @@ -198,6 +215,7 @@ end start:nodech_error_table description: nodech error table. +label:mn_only,db cmd:chdef -t node -o testnode groups=all,rhels5.4 check:rc==0 cmd:nodech testnode groups=all,rhels5.5 nodetypes.os=rhels5.5 nodehm.mgt=hmc diff --git a/xCAT-test/autotest/testcase/nodegrpch/cases0 b/xCAT-test/autotest/testcase/nodegrpch/cases0 index f1ccf68e8..0ae5ff69e 100644 --- a/xCAT-test/autotest/testcase/nodegrpch/cases0 +++ b/xCAT-test/autotest/testcase/nodegrpch/cases0 @@ -1,5 +1,6 @@ start:nodegrpch_v description:nodegrpch -v and --version +label:mn_only,db cmd:nodegrpch -v check:output=~Version cmd:nodegrpch --version @@ -8,6 +9,7 @@ end start:nodegrpch_h description:nodegrpch -? and -h --help +label:mn_only,db cmd:nodegrpch -h check:output=~Usage cmd:nodegrpch -? @@ -19,6 +21,7 @@ end start:nodegrpch_groups description:nodegrpch rh4.1234567890 mgt=hmc +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.1234567890 mgt=blade check:rc==0 cmd:nodegrpch rh4.1234567890 mgt=hmc @@ -32,6 +35,7 @@ end start:nodegrpch_err description: +label:mn_only,db cmd:nodegrpch -c check:rc!=0 check:output=~Usage diff --git a/xCAT-test/autotest/testcase/nodels/cases0 b/xCAT-test/autotest/testcase/nodels/cases0 index 7c87abf05..cb3ebeeaf 100644 --- a/xCAT-test/autotest/testcase/nodels/cases0 +++ b/xCAT-test/autotest/testcase/nodels/cases0 @@ -1,5 +1,6 @@ start:nodels_null description:nodels | grep testnode +label:mn_only,db cmd:chdef -t node -o testnode groups="all,aix" check:rc==0 cmd:nodels | grep testnode @@ -11,6 +12,7 @@ end start:nodels_noderange_shortname_groups description:The nodels use shortname groups +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:nodels testnode groups @@ -22,6 +24,7 @@ end start:nodels_noderange_shortname_tags description:The nodels use shortname tags +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:nodels testnode tags @@ -33,6 +36,7 @@ end start:nodels_noderange_shortname_mgt description:The nodels use shortname mgt +label:mn_only,db cmd:chdef -t node -o testnode mgt=blade groups=all check:rc==0 cmd:nodels testnode mgt @@ -43,6 +47,7 @@ end start:nodels_table_include description:Check the command nodels with =~. +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.123456789 check:rc==0 cmd:nodels groups=~rh4.123456789 @@ -54,6 +59,7 @@ end start:nodels_noderange_table_uninclude description:Check the command nodels with !~. +label:mn_only,db cmd:chdef -t node -o testnode1 groups=rhels5.5,all check:rc==0 cmd:chdef -t node -o testnode2 groups=rhels5.4,all @@ -67,6 +73,7 @@ end start:nodels_noderange_table_equal description:Check the command nodels with ==. +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.123456789 check:rc==0 cmd:nodels groups==rh4.123456789 @@ -78,6 +85,7 @@ end start:nodels_noderange_table_unequal description:Check the command nodels with !=. +label:mn_only,db cmd:chdef -t node -o testnode1 groups=rhels5.5 check:rc==0 cmd:chdef -t node -o testnode2 groups=rhels5.4 @@ -90,6 +98,7 @@ end start:nodels_b description:nodels -b and nodels --blame +label:mn_only,db cmd:chdef -t node -o testnode groups=rhels5.5 check:rc==0 cmd:nodels testnode -b groups @@ -103,6 +112,7 @@ end start:nodels_S description:nodels -S +label:mn_only,db cmd:chdef -t node -o testnode hidden=1 groups=rhels5.5 check:rc==0 cmd:nodels -S @@ -114,6 +124,7 @@ end start:nodels_H description:nodels -H all groups mgt | grep testnode +label:mn_only,db cmd:chdef -t node -o testnode groups="all,aix" mgt="hmc" check:rc==0 cmd:nodels -H all groups mgt | grep testnode @@ -125,6 +136,7 @@ end start:nodels_noderange description:nodels testnode +label:mn_only,db cmd:chdef -t node -o testnode groups="all,aix" check:rc==0 cmd:nodels testnode @@ -136,6 +148,7 @@ end start:nodels_noderange_table description:nodels testnode nodelist +label:mn_only,db cmd:chdef -t node -o testnode groups=all check:rc==0 cmd:nodels testnode nodelist @@ -147,6 +160,7 @@ end start:nodels_tablevalue description:nodels rh4.1234567890 +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.1234567890 check:rc==0 cmd:nodels rh4.1234567890 @@ -158,28 +172,13 @@ end start:nodels_tablevalue_tablecolumn description:nodels rh4.1234567890 mgt +label:mn_only,db cmd:chdef -t node -o testnode groups=rh4.1234567890 mgt=hmc check:rc==0 cmd:nodels rh4.1234567890 mgt check:rc==0 check:output=~testnode:\s*hmc cmd:rmdef -t node testnode -end - - -start:nodels_noderange_tablecolumn -description:nodels testnode nodehm.mgt -cmd:chdef -t node -o testnode mgt=hmc groups=all -check:rc==0 -cmd:nodels testnode nodehm.mgt -check:rc==0 -check:output=~testnode:\s*hmc -cmd:rmdef -t node testnode -end - - -start:nodels_tablevalue_tablecolumn -description:nodels groups==rh4.1234567890 mgt cmd:chdef -t node -o testnode1-testnode4 groups=rh4.1234567890 mgt=hmc check:rc==0 cmd:nodels groups==rh4.1234567890 mgt @@ -192,8 +191,23 @@ cmd:rmdef -t node testnode1-testnode4 end +start:nodels_noderange_tablecolumn +description:nodels testnode nodehm.mgt +label:mn_only,db +cmd:chdef -t node -o testnode mgt=hmc groups=all +check:rc==0 +cmd:nodels testnode nodehm.mgt +check:rc==0 +check:output=~testnode:\s*hmc +cmd:rmdef -t node testnode +end + + + + start:nodels_h description:nodels -h and nodels -? and nodels --help +label:mn_only,db cmd:nodels -h check:output=~Usage cmd:nodels -? @@ -204,6 +218,7 @@ end start:nodels_v +label:mn_only,db cmd:nodels -v check:output=~Version cmd:nodels --version @@ -212,12 +227,14 @@ end start:nodels_err_symbol +label:mn_only,db cmd:nodels -H all unknown check:rc!=0 check:output=~Error end start:nodels_err_noderange +label:mn_only,db cmd:nodels douniwan check:rc!=0 check:output=~Error diff --git a/xCAT-test/autotest/testcase/noderange/cases0 b/xCAT-test/autotest/testcase/noderange/cases0 index 59b401628..8a4d2e4cb 100644 --- a/xCAT-test/autotest/testcase/noderange/cases0 +++ b/xCAT-test/autotest/testcase/noderange/cases0 @@ -1,5 +1,6 @@ start:noderange_individual_node description: noderange individual node +label:mn_only,db cmd:mkdef -t node -o testnode01 -f groups=all cmd:nodels testnode01 check:rc==0 @@ -9,6 +10,7 @@ end start:noderange_individual_grp description: noderange individual group +label:mn_only,db cmd:mkdef -t node -o testnode01,testnode02 groups=nrtestgrp cmd:nodels nrtestgrp check:rc==0 @@ -20,6 +22,7 @@ end start:noderange_node01-node10 description: noderange node01-node10 +label:mn_only,db cmd:mkdef -t node -o nrtestnode01-nrtestnode10 groups=all check:rc==0 cmd:nodels nrtestnode01-nrtestnode10 @@ -33,6 +36,7 @@ end start:noderange_node_01-10 description: noderange node[01-10] +label:mn_only,db cmd:mkdef -t node -o nrtestnode[01-10] groups=all check:rc==0 cmd:nodels nrtestnode[01-10] @@ -46,6 +50,7 @@ end start:noderange_node01_10 description: noderange node[01:10] +label:mn_only,db cmd:mkdef -t node -o nrtestnode[01:10] groups=all check:rc==0 cmd:nodels nrtestnode[01:10] @@ -59,6 +64,7 @@ end start:noderange_f1-f2_n1-n3 description: noderange f[1-2]n[1-3] +label:mn_only,db cmd:mkdef -t node -o f[1-2]n[1-3] groups=all check:rc==0 cmd:nodels f[1-2]n[1-3] @@ -75,6 +81,7 @@ end start:noderange_group1-group3 description: noderange group1-group3 +label:mn_only,db cmd:mkdef -t node -o testnode01 groups=nrtestgrp1 cmd:mkdef -t node -o testnode02 groups=nrtestgrp2 cmd:mkdef -t node -o testnode03 groups=nrtestgrp3 @@ -89,6 +96,7 @@ end #start:noderange_node001-node200 #description: noderange node001-node200 +#label:mn_only,db #cmd:mkdef -t node -o nrtestnode001-nrtestnode200 groups=all #check:rc==0 #cmd:nodels nrtestnode001-nrtestnode200 @@ -103,6 +111,7 @@ end start:noderange_node10_plus_3 description: noderange node10+3 +label:mn_only,db cmd:mkdef -t node -o nrtestnode10+3 groups=all check:rc==0 cmd:nodels nrtestnode10+3 @@ -117,6 +126,7 @@ end start:noderange_10-20 description: noderange 10-20 +label:mn_only,db cmd:mkdef -t node -o 10-20 groups=all check:rc==0 cmd:nodels 10-20 @@ -132,18 +142,21 @@ end start:noderange_XCAT_NODE_PREFIX description: noderange XCAT_NODE_PREFIX +label:mn_only,db cmd: XCAT_NODE_PREFIX=abc XCATBYPASS=1 nodels 10-20 check:output=~abc10,abc11,abc12,abc13,abc14,abc15,abc16,abc17,abc18,abc19,abc20 end start:noderange_XCAT_NODE_SUFFIX description: noderange XCAT_NODE_SUFFIX +label:mn_only,db cmd: XCAT_NODE_PREFIX=abc XCAT_NODE_SUFFIX=def XCATBYPASS=1 nodels 10-20 check:output=~abc10def,abc11def,abc12def,abc13def,abc14def,abc15def,abc16def,abc17def,abc18def,abc19def,abc20def end start:noderange_slash_urtestnode_dot_star description: noderange /nrtestnode.* +label:mn_only,db cmd:mkdef -t node -o nrtestnode1-nrtestnode3 groups=all check:rc==0 cmd:nodels /nrtestnode.* @@ -157,6 +170,7 @@ end start:noderange_dir_tmp-nodelistfile description: noderange ^/tmp/nodelistfile +label:mn_only,db #cmd:echo #testnode1 > /tmp/nodelist cmd:mkdef -t node -o nrnode1,nrnode2 groups=all cmd:echo nrnode1 > /tmp/nodelist @@ -171,6 +185,7 @@ end start:noderange_exclusion description: noderange exnode1-exnode5,-exnode3,-exnode4 +label:mn_only,db cmd:mkdef -t node -o exnode1-exnode5 groups=all check:rc==0 cmd:nodels exnode1-exnode5,-exnode3,-exnode4 @@ -186,6 +201,7 @@ end start:noderange_group_intersection description: noderange group1@group2 +label:mn_only,db cmd:mkdef -t node -o nrtestnode1-nrtestnode3 groups=group1 check:rc==0 cmd:chdef -t node -o nrtestnode1 -p groups=group2 diff --git a/xCAT-test/autotest/testcase/noderm/cases0 b/xCAT-test/autotest/testcase/noderm/cases0 index c8a0cb4a4..31e5f386e 100644 --- a/xCAT-test/autotest/testcase/noderm/cases0 +++ b/xCAT-test/autotest/testcase/noderm/cases0 @@ -1,5 +1,6 @@ start:noderm_noderange description:noderm testnode1,testnode2 +label:mn_only,db cmd:nodeadd testnode1,testnode2 groups=all check:rc==0 cmd:lsdef -t node testnode1,testnode2 @@ -14,6 +15,7 @@ end start:noderm_h description:noderm -h +label:mn_only,db cmd:noderm -h check:output=~Usage cmd:noderm --help @@ -22,12 +24,14 @@ end start:noderm_null description:noderm +label:mn_only,db cmd:noderm check:output=~Usage end start:noderm_err_node description:noderm err +label:mn_only,db cmd:rmdef -t node testnode cmd:noderm testnode check:rc!=0 diff --git a/xCAT-test/autotest/testcase/regnotif/case0 b/xCAT-test/autotest/testcase/regnotif/case0 index 84767bc01..2fcb65d2a 100644 --- a/xCAT-test/autotest/testcase/regnotif/case0 +++ b/xCAT-test/autotest/testcase/regnotif/case0 @@ -1,5 +1,6 @@ start:regnotif_null description:regnotif with no argument +label:mn_only,db cmd:regnotif check:rc==0 check:output=~Usage @@ -7,6 +8,7 @@ end start:regnotif_o description:regnotif with normal argument +label:mn_only,db cmd:echo "hello,world" > test.pm check:rc==0 cmd:regnotif test.pm nodelist -o a,d @@ -18,9 +20,9 @@ cmd:unregnotif test.pm cmd:rm -f test.pm end - start:regnotif_err description:regnotif with error arguments +label:mn_only,db cmd:echo "hello,world" > test.pm check:rc==0 cmd:regnotif test.pm -o a,d @@ -32,10 +34,9 @@ check:output=~Usage cmd:rm -f test.pm end - - start:regnotif_h description:regnotif -h and --help +label:mn_only,db cmd:regnotif -h check:rc==0 check:output=~Usage @@ -47,6 +48,7 @@ end start:regnotif_v description:regnotif -v and --version +label:mn_only,db cmd:regnotif -v check:rc==0 check:output=~Version|version diff --git a/xCAT-test/autotest/testcase/restorexCATdb/cases0 b/xCAT-test/autotest/testcase/restorexCATdb/cases0 index eeb8c87e3..f2cc5c43f 100644 --- a/xCAT-test/autotest/testcase/restorexCATdb/cases0 +++ b/xCAT-test/autotest/testcase/restorexCATdb/cases0 @@ -1,10 +1,12 @@ start:restorexCAT_h +label:mn_only,db cmd:restorexCATdb -h check:rc==0 check:output=~restorexCATdb end start:restorexCATdb_v +label:mn_only,db cmd:restorexCATdb -v check:rc==0 check:output=~Version @@ -12,6 +14,7 @@ end start:restorexcatdb_p description:restore the xcat database from the /tmp/db +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -p /tmp/db1 @@ -33,6 +36,7 @@ cmd:rm -rf /tmp/db1 /tmp/db2 /tmp/db.1 /tmp/db.2 end start:restorexCATdb_p_V +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -a -p /tmp/db @@ -47,6 +51,7 @@ cmd:rm -rf /tmp/db end start:restorexCATdb_a_p_V +label:mn_only,db cmd:chtab key=skiptables site.value="" check:rc==0 cmd:dumpxCATdb -a -p /tmp/db @@ -60,6 +65,7 @@ cmd:rm -rf /tmp/db end start:restorexCATdb_wrongpath +label:mn_only,db cmd:restorexCATdb -p /tmp/testpath check:rc!=0 end diff --git a/xCAT-test/autotest/testcase/rmdef/cases0 b/xCAT-test/autotest/testcase/rmdef/cases0 index f6e2848ce..e84a5365a 100644 --- a/xCAT-test/autotest/testcase/rmdef/cases0 +++ b/xCAT-test/autotest/testcase/rmdef/cases0 @@ -1,11 +1,13 @@ start:rmdef_null description:rmdef without any flag +label:mn_only,db cmd:rmdef check:output=~Usage end start:rmdef_t_o_node description:rmdef -t node -o +label:mn_only,db cmd:mkdef -t node -o testnode,testnode1 groups=all,aix check:rc==0 cmd:lsdef -t node testnode,testnode1 @@ -20,6 +22,7 @@ end start:rmdef_t_node description:rmdef -t node +label:mn_only,db cmd:mkdef -t node -o testnode,testnode1 groups=all,aix check:rc==0 cmd:lsdef -t node testnode,testnode1 @@ -34,6 +37,7 @@ end start:rmdef_node description:rmdef nodename +label:mn_only,db cmd:mkdef -t node -o testnode,testnode1 groups=all,aix check:rc==0 cmd:lsdef -t node testnode,testnode1 @@ -48,6 +52,7 @@ end start:rmdef_t_o_network description:rmdef -t network +label:mn_only,db cmd:mkdef -t network -o testnet net=1.2.3.0 mask=255.0.0.0 gateway=1.2.3.1 check:rc==0 cmd:lsdef -t network @@ -60,6 +65,7 @@ end start:rmdef_group description:rmdef to remove static node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t group -o testgrp members=testnode1,testnode2 @@ -81,6 +87,7 @@ end start:rmdef_dynamic_group description:rmdef to remove dynamic node group +label:mn_only,db cmd:mkdef -t node -o testnode1-testnode2 mgt=hmc cons=hmc groups=all,systemp check:rc==0 cmd:mkdef -t group -o dyngrp -d -w mgt==hmc -w cons==hmc -w groups==all,systemp @@ -124,14 +131,15 @@ end start:rmdef_t_err description:rmdef -t wrongtype +label:mn_only,db cmd:rmdef -t wrongtype -o testnode check:rc!=0 check:output=~not a valid end start:rmdef_template -os:linux description:try to delete a template, then error messages appear +label:mn_only,db cmd:result=`lsdef | grep switch-template`; if [[ $result =~ "switch-template" ]]; then echo $result; noderm switch-template; fi cmd:rmdef switch-template check:rc==1 diff --git a/xCAT-test/autotest/testcase/tabdump/cases0 b/xCAT-test/autotest/testcase/tabdump/cases0 index db16cf431..0652fe1bf 100644 --- a/xCAT-test/autotest/testcase/tabdump/cases0 +++ b/xCAT-test/autotest/testcase/tabdump/cases0 @@ -1,11 +1,13 @@ start:tabdump_null description:display table list +label:mn_only,db cmd:tabdump check:rc==0 check:output=~site end start:tabdump_table +label:mn_only,db cmd:tabdump site | grep xcatiport check:rc==0 check:output=="xcatiport","3002",, @@ -13,6 +15,7 @@ end start:tabdump_v description:version +label:mn_only,db cmd:tabdump -v check:rc==0 check:output=~Version @@ -20,6 +23,7 @@ end start:tabdump_h description:usage +label:mn_only,db cmd:tabdump -h check:rc==0 check:output=~Usage @@ -27,6 +31,7 @@ end start:tabdump_help description:usage +label:mn_only,db cmd:tabdump -? check:rc==0 check:output=~Usage @@ -36,6 +41,7 @@ end start:tabdump_w_match description:-w flags to specify the selection string,Select nodes where the attribute value matches the SQL LIKE value. +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="all,aix" check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" @@ -50,6 +56,7 @@ end start:tabdump_w_equal description:-w flags to specify the selection string,Select nodes where the attribute value is exactly this value +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="all,aix" check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" @@ -63,6 +70,7 @@ cmd:rmdef testnode02 end start:tabdump_w_ne +label:mn_only,db cmd:mkdef -t node -o testnode01,testnode02,testnode03 groups="aix" check:rc==0 cmd:mkdef -t node -o testnode04 groups="linux" @@ -80,6 +88,7 @@ cmd:rmdef testnode04 end start:tabdump_w_notmatch +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="all" check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" @@ -94,6 +103,7 @@ end start:tabdump_w_gt description:Select nodes where the attribute value is greater than this specific value +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="aix" statustime=2011-04-19 check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" statustime=2011-04-18 @@ -106,6 +116,7 @@ end start:tabdump_w_ge description:Select nodes where the attribute value is greater than this specific value +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="aix" statustime=2011-04-19 check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" statustime=2011-04-18 @@ -119,6 +130,7 @@ end start:tabdump_w_lt description:Select nodes where the attribute value is greater than this specific value +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="aix" statustime=2011-04-19 check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" statustime=2011-04-18 @@ -130,8 +142,8 @@ cmd:rmdef -t node testnode01-testnode02 end start:tabdump_w_le -description:Select nodes where the attribute value is greater than this specifi -c value +description:Select nodes where the attribute value is greater than this specific value +label:mn_only,db cmd:mkdef -t node -o testnode01 groups="aix" statustime=2011-04-19 check:rc==0 cmd:mkdef -t node -o testnode02 groups="aix" statustime=2011-04-18 @@ -145,12 +157,14 @@ end start:tabdump_d +label:mn_only,db cmd:tabdump -d |grep site check:rc==0 check:output=~site: end start:tabdump_f_d +label:mn_only,db cmd:tabdump -f /tmp/table -d site|grep site check:rc==0 check:output=~site @@ -158,6 +172,7 @@ cmd:rm -f /tmp/table end start:tabdump_d_nodehm +label:mn_only,db cmd:tabdump -d site | grep xcatiport check:rc==0 check:output=~xcatiport diff --git a/xCAT-test/autotest/testcase/tabgrep/cases0 b/xCAT-test/autotest/testcase/tabgrep/cases0 index b0c2d8cbb..e9fbac170 100644 --- a/xCAT-test/autotest/testcase/tabgrep/cases0 +++ b/xCAT-test/autotest/testcase/tabgrep/cases0 @@ -1,5 +1,6 @@ start:tabgrep_null description: tabgrep with no argument +label:mn_only,db cmd:tabgrep check:output=~Usage end @@ -8,6 +9,7 @@ end start:tabgrep_h description:tabgrep -h an d -? and --help +label:mn_only,db cmd:tabgrep -h check:output=~Usage cmd:tabgrep -? @@ -18,6 +20,7 @@ end start:tabgrep_node +label:mn_only,db cmd:mkdef -t node testnode groups=all check:rc==0 cmd:tabgrep testnode @@ -29,6 +32,7 @@ end start:tabgrep_err description:tabgrep with error noderange +label:mn_only,db cmd:rmdef -t node testnode cmd:tabgrep testnode check:rc!=0 diff --git a/xCAT-test/autotest/testcase/tabprune/cases0 b/xCAT-test/autotest/testcase/tabprune/cases0 index 79b646035..b0154bf41 100644 --- a/xCAT-test/autotest/testcase/tabprune/cases0 +++ b/xCAT-test/autotest/testcase/tabprune/cases0 @@ -1,5 +1,6 @@ start:tabprune_h description:tabprune -h +label:mn_only,db cmd:tabprune -h check:rc==0 check:output=~Usage @@ -7,6 +8,7 @@ end start:tabprune_v description:tabprune -v +label:mn_only,db cmd:tabprune -v check:rc==0 check:output=~Version @@ -14,6 +16,7 @@ end start:tabprune_a_eventlog description:tabprune eventlog -a +label:mn_only,db cmd:tabprune eventlog -a check:rc==0 check:output!~not a valid xCAT object type @@ -21,6 +24,7 @@ end start:tabprune_V_a_eventlog description:tabprune eventlog -V -a > /tmp/eventlog.csv +label:mn_only,db cmd:tabprune eventlog -V -a > /tmp/eventlog.csv check:rc==0 cmd:ls /tmp/eventlog.csv @@ -31,6 +35,7 @@ end start:tabprune_p_auditlog description:to remove 50% of the auditlog table,if the original number is odd number,the final result is 1;or else the final number is 0; +label:mn_only,db #cmd:n1=`lsdef -t auditlog|wc -l`;tabprune auditlog -p 50;n2=`lsdef -t auditlog|wc -l`;echo $((n1-($n2-2)*2)) cmd:n1=`lsdef -t auditlog|wc -l`;tabprune auditlog -p 50;n2=`lsdef -t auditlog|wc -l`;echo $($n2 /tmp/site.csv check:rc==0 cmd:chtab key=db2installloc site.value=/test @@ -20,12 +22,14 @@ cmd:rm -f /tmp/site.csv /tmp/site1.csv end start:tabrestore_h +label:mn_only,db cmd:tabrestore -h check:output=~Usage end start:tabrestore_err description:tabrestore wrong.csv +label:mn_only,db cmd:tabrestore wrong.csv check:rc!=0 check:output=~Error diff --git a/xCAT-test/autotest/testcase/unregnotif/case0 b/xCAT-test/autotest/testcase/unregnotif/case0 index 180ae9fac..4c146386d 100644 --- a/xCAT-test/autotest/testcase/unregnotif/case0 +++ b/xCAT-test/autotest/testcase/unregnotif/case0 @@ -1,5 +1,6 @@ start:unregnotif_null description:unregnotif with no argument +label:mn_only,db cmd:unregnotif check:output=~Usage end @@ -7,6 +8,7 @@ end start:unregnotif_f description:unregnotif with a argument filename +label:mn_only,db cmd:echo "hello" > test.pm check:rc==0 cmd:regnotif test.pm nodelist -o a,d @@ -24,6 +26,7 @@ end start:unregnotif_h description:unregnotif -h and -help +label:mn_only,db cmd:unregnotif -h check:output=~Usage cmd:unregnotif -help @@ -32,6 +35,7 @@ end start:unregnotif_v description:unregnotif -v and -version +label:mn_only,db cmd:unregnotif -v check:output=~version|Version cmd:unregnotif -version diff --git a/xCAT-test/autotest/testcase/xcatstanzafile/cases0 b/xCAT-test/autotest/testcase/xcatstanzafile/cases0 index d8b672a8b..b671c668c 100644 --- a/xCAT-test/autotest/testcase/xcatstanzafile/cases0 +++ b/xCAT-test/autotest/testcase/xcatstanzafile/cases0 @@ -1,6 +1,6 @@ start:xcatstanzafile_normal -os:Linux description:xcatstanzafile in normal format +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmaster=MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|chdef -z @@ -13,24 +13,10 @@ cmd:rmdef -t node testnode cmd:rm -f testfile end -start:xcatstanzafile_normal -os:Aix -description:xcatstanzafile in normal format -cmd:echo "default-node:\n groups=all,compute\n testnode:\n objtype=node\n xcatmaster=MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile -check:rc==0 -cmd:cat testfile|chdef -z -check:rc==0 -cmd:lsdef testnode -check:output=~(groups=all,compute) -check:output=~xcatmaster=MS02.ppd.pok.com -check:output=~nfsserver=IS227.ppd.pok.com -cmd:rmdef -t node testnode -cmd:rm -f testfile -end - start:xcatstanzafile_colon description:xcatstanzafile's header without colon +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode\n objtype=node\n xcatmaster=MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|chdef -z @@ -44,6 +30,7 @@ end start:xcatstanzafile_attribute description:xcatstanzafile with error attribute line +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmasterMS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|chdef -z @@ -69,6 +56,7 @@ end start:xcatstanzafile_objtype description:xcatstanzafile,a stanza without objtype definition +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n xcatmaster=MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|mkdef -z @@ -80,6 +68,7 @@ end #start:xcatstanzafile_comment #description:xcatstanzafile,a stanza without objtype definition +#label:mn_only,db #cmd:echo -ne "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmaster=MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile #check:rc==0 #cmd:echo '#abc' >> testfile @@ -91,8 +80,8 @@ end start:xcatstanzafile_tab -os:Linux description:xcatstanzafile,line with tab and space +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmaster = MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|mkdef -z @@ -101,21 +90,9 @@ cmd:rmdef -t node testnode cmd:rm -f testfile end -start:xcatstanzafile_tab -os:Aix -description:xcatstanzafile,line with tab and space -cmd:echo "default-node:\n groups=all,compute\n testnode:\n objtype=node\n xcatmaster = MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile -check:rc==0 -cmd:cat testfile|mkdef -z -check:rc==0 -cmd:rmdef -t node testnode -cmd:rm -f testfile -end - - start:xcatstanzafile_multattr -os:Linux description:xcatstanzafile,line with multiple attribute +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmaster= MS02.ppd.pok.com nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|mkdef -z @@ -126,24 +103,10 @@ cmd:rmdef -t node testnode cmd:rm -f testfile end -start:xcatstanzafile_multattr -os:Aix -description:xcatstanzafile,line with multiple attribute -cmd:echo "default-node:\n groups=all,compute\n testnode:\n objtype=node\n xcatmaster= MS02.ppd.pok.com nfsserver=IS227.ppd.pok.com" > testfile -check:rc==0 -cmd:cat testfile|mkdef -z -check:rc==0 -cmd:lsdef testnode -check:output=~\s*xcatmaster=MS02.ppd.pok.com\s*nfsserver=IS227.ppd.pok.com -cmd:rmdef -t node testnode -cmd:rm -f testfile -end - - start:xcatstanzafile_defaultvalue -os:Linux description:xcatstanzafile,If the header name is ``default-:'' the attribute values in the stanza are considered default values for subsequent definitions in the file that are the same object type. +label:mn_only,db cmd:echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n xcatmaster= MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile check:rc==0 cmd:cat testfile|mkdef -z @@ -154,23 +117,9 @@ cmd:rmdef -t node testnode cmd:rm -f testfile end -start:xcatstanzafile_defaultvalue -os:Aix -description:xcatstanzafile,If the header name is ``default-:'' the attribute values in the stanza are considered default va -lues for subsequent definitions in the file that are the same object type. -cmd:echo "default-node:\n groups=all,compute\n testnode:\n objtype=node\n xcatmaster= MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile -check:rc==0 -cmd:cat testfile|mkdef -z -check:rc==0 -cmd:lsdef testnode -check:output=~(groups=all,compute) -cmd:rmdef -t node testnode -cmd:rm -f testfile -end - - start:xcatstanzafile_specificvalue description:When a specific value for an attribute is provided in the stanza, it takes priority over any default value that had been set. +label:mn_only,db cmd:bash -c 'echo -e "default-node:\n groups=all,compute\ntestnode:\n objtype=node\n groups=all,rhels5.5\n xcatmaster= MS02.ppd.pok.com\n nfsserver=IS227.ppd.pok.com" > testfile' check:rc==0 cmd:cat testfile|mkdef -z @@ -182,8 +131,3 @@ cmd:rm -f testfile end - - - - - From 91e34bf84a01029b2553b988275eb0788e5d38be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Mon, 2 Jul 2018 17:06:38 +0800 Subject: [PATCH 64/93] Fix Ubuntu 18.04 postscript problem (#5356) * Reformat post.ubuntu.common * Revise post.ubuntu.common --- .../xcat/install/scripts/post.ubuntu.common | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/xCAT-server/share/xcat/install/scripts/post.ubuntu.common b/xCAT-server/share/xcat/install/scripts/post.ubuntu.common index c937a7273..cd592757e 100755 --- a/xCAT-server/share/xcat/install/scripts/post.ubuntu.common +++ b/xCAT-server/share/xcat/install/scripts/post.ubuntu.common @@ -9,39 +9,32 @@ echo "post scripts" >/root/post.log [ $MASTER_IP ] || export MASTER_IP="#ENV:MASTER_IP#" #INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/scriptlib# -export PRINIC=#TABLEBLANKOKAY:noderes:THISNODE:primarynic# -if [ "$PRINIC" == "mac" ] +export PRINIC="#TABLEBLANKOKAY:noderes:THISNODE:primarynic#" +if [ "$PRINIC" == "mac" ] || [ -z "$PRINIC" ] then export PRINIC='#GETPRINICMAC:THISNODE#' fi -if [ -z "$PRINIC" ] +if [ -n "$PRINIC" ] && [[ "$(echo "$PRINIC" | grep -sqE ^[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+$ ;echo $?)" == "0" ]] then - export PRINIC=eth0 -elif [[ `echo "$PRINIC" | grep -sqE ^[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+$ ;echo $?` == "0" ]]; then - #export PRINIC=`ifconfig -a | grep -i "HWaddr $PRINIC" | awk '{print $1}'` - export PRINIC=`ip -o link|grep -i "$PRINIC" |awk '{print $2}'|sed s/://` + export PRINIC="$(ip -o link | grep -i "$PRINIC" | awk '{print $2}' | sed 's/://')" fi -#IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}') -IP=$(ip -4 -o a sh dev $PRINIC | awk '/inet/{print $4}' | head -n 1 | awk -F '/' '{print $1}') -if [ -z $IP ] +IP="$(ip -4 -o a sh dev "$PRINIC" | awk '/inet/{print $4}' | head -n 1 | awk -F '/' '{print $1}')" +if [ -z "$IP" ] then - dhclient $PRINIC - #IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}') - IP=$(ip -4 -o a sh dev $PRINIC | awk '/inet/{print $4}' | head -n 1 | awk -F '/' '{print $1}') + dhclient "$PRINIC" + IP=$(ip -4 -o a sh dev "$PRINIC" | awk '/inet/{print $4}' | head -n 1 | awk -F '/' '{print $1}') fi if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then msgutil_r "$MASTER_IP" "debug" "PRINIC=$PRINIC,IP=$IP" "/var/log/xcat/xcat.log" fi - - if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then msgutil_r "$MASTER_IP" "debug" "generating /etc/resolv.conf" "/var/log/xcat/xcat.log" fi echo "search #TABLE:site:key=domain:value#" >/etc/resolv.conf -for i in $(echo #TABLE:site:key=nameservers:value# | tr ',' ' ') +for i in $(echo "#TABLE:site:key=nameservers:value#" | tr ',' ' ') do echo "nameserver $i" done >>/etc/resolv.conf From 420ac4f6824090cc1db82be0a0d789bf2524abb5 Mon Sep 17 00:00:00 2001 From: huweihua Date: Mon, 2 Jul 2018 05:27:01 -0400 Subject: [PATCH 65/93] Add labels for xcatd test cases --- xCAT-test/autotest/testcase/analyze_log/case0 | 2 +- xCAT-test/autotest/testcase/chvm/cases0 | 8 + xCAT-test/autotest/testcase/lsxcatd/cases0 | 4 + xCAT-test/autotest/testcase/xcatconfig/case0 | 28 +-- xCAT-test/autotest/testcase/xcatd/case0 | 204 +++--------------- xCAT-test/autotest/testcase/xcatsnap/cases0 | 4 + 6 files changed, 58 insertions(+), 192 deletions(-) diff --git a/xCAT-test/autotest/testcase/analyze_log/case0 b/xCAT-test/autotest/testcase/analyze_log/case0 index 3f39c38a1..2640bbbaa 100644 --- a/xCAT-test/autotest/testcase/analyze_log/case0 +++ b/xCAT-test/autotest/testcase/analyze_log/case0 @@ -1,6 +1,6 @@ start:check_mn_cluster_log_file -os:Linux description:check known error message in /var/log/xcat/cluster.log file. Only for redhat and sles. +label:mn_only cmd:cat /var/log/xcat/cluster.log | grep "xcatd: Error happened when receiving data from DB access" check:output!~xcatd: Error happened when receiving data from DB access cmd:cat /var/log/xcat/cluster.log | grep "Undefined subroutine &main" diff --git a/xCAT-test/autotest/testcase/chvm/cases0 b/xCAT-test/autotest/testcase/chvm/cases0 index b177591e5..eccd82b47 100644 --- a/xCAT-test/autotest/testcase/chvm/cases0 +++ b/xCAT-test/autotest/testcase/chvm/cases0 @@ -4,8 +4,10 @@ #check:rc!=0 #check:output=~Usage #end + start:chvm_p hcp:hmc +label:others,virtualization cmd:mkdef -t node -o testnode mgt=hmc groups=all cmd:mkvm testnode -i $$MaxLparID -l $$CN check:rc==0 @@ -26,8 +28,10 @@ check:output=~__GETNODEATTR($$CN, pprofile)__ cmd:rmvm testnode cmd:rm -f /tmp/autotest.profile end + start:chvm_attr hcp:hmc +label:others,virtualization cmd:mkdef -t node -o testnode mgt=hmc groups=all cmd:mkvm testnode -i $$MaxLparID -l $$CN check:rc==0 @@ -38,12 +42,16 @@ cmd:lsvm testnode check:output=~min_mem=1024 cmd:rmvm testnode end + start:chvm_node +label:mn_only,virtualization cmd:chvm $$CN check:rc!=0 check:output=~Usage end + start:chvm_err_node +label:mn_only,virtualization cmd:dir="/tmp/chvm_err_node";echo ${dir}".old";if [ -d "${dir}" ];then mv ${dir} ${dir}".old"; fi; mkdir -p $dir check:rc==0 cmd:lsdef bogusnode > /dev/null 2>&1;if [[ $? -eq 0 ]]; then lsdef bogusnode -z >/tmp/chvm_err_node/bogusnode.stanza ;rmdef bogusnode;fi diff --git a/xCAT-test/autotest/testcase/lsxcatd/cases0 b/xCAT-test/autotest/testcase/lsxcatd/cases0 index 54568165f..59f0f5bfa 100644 --- a/xCAT-test/autotest/testcase/lsxcatd/cases0 +++ b/xCAT-test/autotest/testcase/lsxcatd/cases0 @@ -1,11 +1,13 @@ start:lsxcatd_null description:lsxcatd without any flag +label:mn_only,xcatd cmd:lsxcatd check:output=~lsxcatd end start:lsxcatd_h description:lsxcatd -h +label:mn_only,xcatd cmd:lsxcatd -h check:rc==0 check:output=~lsxcatd @@ -13,6 +15,7 @@ end start:lsxcatd_d description:lsxcatd -d +label:mn_only,xcatd cmd:lsxcatd -d check:rc==0 check:output=~(cfgloc|dbengine|dbinstance|dbname|dbloc) @@ -20,6 +23,7 @@ end start:lsxcatd_a description:lsxcatd -a +label:mn_only,xcatd cmd:lsxcatd -a check:rc==0 check:output=~Version diff --git a/xCAT-test/autotest/testcase/xcatconfig/case0 b/xCAT-test/autotest/testcase/xcatconfig/case0 index 8b33d036e..275e720c4 100644 --- a/xCAT-test/autotest/testcase/xcatconfig/case0 +++ b/xCAT-test/autotest/testcase/xcatconfig/case0 @@ -1,11 +1,12 @@ start:testtest +label:mn_only,db cmd:/opt/xcat/share/xcat/tools/autotest/testcase/xcatconfig/change_site_table_values check:rc==0 end start:xcatconfig_null description:xcatconfig with no argument -os:Linux +label:mn_only cmd:xcatconfig check:output=~No parameters were supplied on the xcatconfig command. Run xcatconfig -h check:rc!=0 @@ -13,7 +14,7 @@ end start:xcatconfig_h description:xcatconfig -h and --help -os:Linux +label:mn_only cmd:xcatconfig -h check:rc==0 check:output=~Usage @@ -24,7 +25,7 @@ end start:xcatconfig_v description:xcatconfig -v and --version -os:Linux +label:mn_only cmd:xcatconfig -v check:rc==0 check:output=~version|Version @@ -35,7 +36,7 @@ end start:xcatconfig_k description:To regenerate root's ssh keys -os:Linux +label:mn_only #step1:backup /root/.ssh cmd:cp -rf /root/.ssh /root/sshbak check:rc==0 @@ -56,13 +57,12 @@ cmd:mv -f /root/sshbak/* /root/.ssh check:rc==0 cmd:rm -rf /root/sshbak check:rc==0 - end start:xcatconfig_k_c description:To regenerate root's ssh keys and cretials -os:Linux +label:mn_only #step1:backup /root/.ssh cmd:cp -rf /root/.ssh /root/sshbak check:rc==0 @@ -93,7 +93,7 @@ end start:xcatconfig_c description:To regenerate cretials -os:Linux +label:mn_only #step1:backup: /etc/xcat/ca /etc/xcat/cert cmd:cp -r /etc/xcat/ca /etc/xcat/cabak;cp -r /etc/xcat/cert /etc/xcat/certbak #step2:run command and check the output @@ -117,7 +117,7 @@ end start:xcatconfig_s description:To regenerate node host ssh keys -os:Linux +label:mn_only #step1:backup: /etc/xcat/hostkeys /install/postscripts/hostkeys cmd:cp -rf /etc/xcat/hostkeys /etc/xcat/hostkeysbak check:rc==0 @@ -147,7 +147,7 @@ end start:xcatconfig_s_c description:To regenerate node host ssh keys and credentials -os:Linux +label:mn_only #step1:backup: /etc/xcat/hostkeys /install/postscripts/hostkeys cmd:cp -rf /etc/xcat/hostkeys /etc/xcat/hostkeysbak check:rc==0 @@ -181,7 +181,7 @@ end start:xcatconfig_d_V description:This -d option will reinitialize the basic xCAT database table setup -os:Linux +label:mn_only #step1:backup database and prepare test data cmd:dumpxCATdb -p /tmp/xcatconfigtest check:rc==0 @@ -210,8 +210,8 @@ end start:xcatconfig_i -os:Linux description:Initial the xCAT installation in Management Node, only node host key regenerated, xcatd restart; xCAT credentials, database and the ssh key are not changed +label:mn_only #step1:backup test environment and prepare test data #backup test environment, including database, /root/.ssh/, /etc/xcat/hostkey/, install/postscripts/hostkeys cmd:dumpxCATdb -p /tmp/xcatconfigtest @@ -265,8 +265,8 @@ end start:xcatconfig_u -os:Linux description:Update xCAT in Management Node, xcatd restart; database, xCAT credentials, node ssh key and root ssh key are not changed +label:mn_only #step1:backup test environment and prepare test data #backup test environment, including database, /root/.ssh/, /etc/xcat/hostkey/, install/postscripts/hostkeys cmd:dumpxCATdb -p /tmp/xcatconfigtest @@ -317,8 +317,9 @@ check:rc==0 end start:xcatconfig_u_check_xcatsslversion_rhels_sles -os:rhels,sles description:after xcatconfig -u the site.xcatsslversion will not be changed +os:rhels,sles +label:mn_only cmd:lsdef -t site -i xcatsslversion -c | grep '=TLSv1$' check:rc==0 cmd:chtab key=xcatsslversion site.value=TLSv12 @@ -337,6 +338,7 @@ end start:xcatconfig_u_check_xcatsslversion_ubuntu description:after xcatconfig -u the site.xcatsslversion will not be changed os:ubuntu +label:mn_only cmd:lsdef -t site -i xcatsslversion -c | grep '=TLSv1$' check:rc==0 cmd:chtab key=xcatsslversion site.value=TLSv1_2 diff --git a/xCAT-test/autotest/testcase/xcatd/case0 b/xCAT-test/autotest/testcase/xcatd/case0 index dd9c72a65..83974ae52 100644 --- a/xCAT-test/autotest/testcase/xcatd/case0 +++ b/xCAT-test/autotest/testcase/xcatd/case0 @@ -1,10 +1,11 @@ start:xcatd_start description:stop then start xcatd daemon, and check all the 6 processes are running -os:linux +label:mn_only,xcatd cmd:if [ -d "/tmp/xcatd_start" ]; then mv /tmp/xcatd_start /tmp/xcatd_start.org; fi; mkdir -p /tmp/xcatd_start check:rc==0 cmd:service xcatd status check:rc==0 +check:output=~xcatd service|xcatd.service check:output=~Active: active \(running\)|xcatd service is running cmd:ps axjf |grep -v grep |grep "xcatd:" | tee /tmp/xcatd_start/original_xcatd_processes_status check:rc==0 @@ -22,6 +23,7 @@ check:rc==0 cmd:sleep 3 cmd:service xcatd status check:rc==0 +check:output=~xcatd service|xcatd.service check:output=~Active: active \(running\)|xcatd service is running cmd:ps axjf |grep -v grep |grep "xcatd:" | tee /tmp/xcatd_start/after_start_xcatd_processes_status check:rc==0 @@ -43,61 +45,22 @@ cmd: rm -rf /tmp/xcatd_start; if [ -d "/tmp/xcatd_start.org" ]; then mv /tmp/xca check:rc==0 end -start:xcatd_start_systemd -description:this is the test case when xcat service is managed by systemd on sles12* and ubuntu16.04, the output of service xcatd changes,stop then start xcatd daemon, and check all the 6 processes are running -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -check:output=~/system.slice/xcatd.service -check:output=~xcatd: SSL -check:output=~xcatd: DB -check:output=~xcatd: UDP -check:output=~xcatd: install -check:output=~xcatd: Discovery -check:output=~xcatd: Command log -cmd:service xcatd stop -check:rc==0 -cmd:sleep 3 -cmd:service xcatd status -check:rc!=0 -check:output=~xcatd.service -check:output=~inactive \(dead\) -cmd:service xcatd start -check:rc==0 -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -cmd:result=`ps -ef | grep "xcatd: SSL listener" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -cmd:result=`ps -ef | grep "xcatd: DB Access" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -cmd:result=`ps -ef | grep "xcatd: UDP listener" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -cmd:result=`ps -ef | grep "xcatd: install monitor" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -cmd:result=`ps -ef | grep "xcatd: Discovery worke" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -cmd:result=`ps -ef | grep "xcatd: Command log writer" | grep -v grep | wc -l`; if [ $result -eq 1 ]; then echo "only one process"; fi -check:output=~only one process -end - start:xcatd_stop description:stop xcatd daemon, then check all the 6 processes are stopped -os:linux +label:mn_only,xcatd cmd:service xcatd status check:rc==0 -check:output=~xcatd service is running +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) cmd:service xcatd stop check:rc==0 check:output=~Stopping x(cat|CAT)d check:output=~[ OK ] cmd:sleep 3 cmd:service xcatd status -check:output=~xcatd service is not running +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is not running|inactive \(dead\) cmd:ps -ef | grep xcatd check:output!~"xcatd: SSL listener" check:output!~"xcatd: DB Access" @@ -109,111 +72,39 @@ cmd:service xcatd start check:rc==0 end -start:xcatd_stop_systemd -description:this is the test case when xcat service is managed by systemd on sles12* and ubuntu16.04, the output of service xcatd changes,stop xcatd daemon, then check all the 6 processes are stopped -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -check:output=~/system.slice/xcatd.service -check:output=~xcatd: SSL -check:output=~xcatd: DB -check:output=~xcatd: UDP -check:output=~xcatd: install -check:output=~xcatd: Discovery -check:output=~xcatd: Command log -cmd:service xcatd stop -check:rc==0 -cmd:sleep 3 -cmd:service xcatd status -check:rc!=0 -check:output=~xcatd.service -check:output=~inactive \(dead\) -cmd:ps -ef | grep xcatd -check:output!~"xcatd: SSL" -check:output!~"xcatd: DB" -check:output!~"xcatd: UDP" -check:output!~"xcatd: install" -check:output!~"xcatd: Discovery" -check:output!~"xcatd: Command log" -cmd:service xcatd start -check:rc==0 -end start:xcatd_restart description:restart xcatd daemon -os:linux +label:mn_only,xcatd cmd:service xcatd status -check:output=~xcatd service is running +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) check:rc==0 cmd:times=10; while [ $times -gt 0 ]; do service xcatd restart; if [ "$?" -ne "0" ]; then break; fi; ((times--)); done; if [ $times -gt 0 ]; then $?=1; fi check:rc==0 cmd:service xcatd status -check:output=~xcatd service is running +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) check:rc==0 end -start:xcatd_restart_systemd -description:this is the test case when xcat service is managed by systemd on sles12* and ubuntu16.04, the output of service xcatd changes,restart xcatd daemon -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -cmd:times=10; while [ $times -gt 0 ]; do service xcatd restart; if [ "$?" -ne "0" ]; then break; fi; ((times--)); done; if [ $times -gt 0 ]; then $?=1; fi -check:rc==0 -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -end start:run_command_with_XCATBYPASS description:with XCATBYPASS=YES, the command works either xcatd deamon running or not -os:linux +label:mn_only,xcatd cmd:service xcatd status check:rc==0 -check:output=~xcatd service is running -cmd:XCATBYPASS=YES tabdump site -check:rc==0 -cmd:service xcatd stop -check:rc==0 -check:output=~Stopping x(cat|CAT)d -check:output=~[ OK ] -cmd:sleep 3 -cmd:service xcatd status -check:output=~xcatd service is not running -cmd:tabdump site -check:rc!=0 -cmd:XCATBYPASS=YES tabdump site -check:rc==0 -cmd:service xcatd start -check:rc==0 -check:output=~Starting x(cat|CAT)d -check:output=~[ OK ] -cmd:service xcatd status -check:rc==0 -check:output=~xcatd service is running -end - -start:run_command_with_XCATBYPASS_systemd -description:wis is the test case when xcat service is managed by systemd,on sles12* and ubuntu16.04, the output of service xcatd changes,with XCATBYPASS=YES, the command works either xcatd deamon running or not -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) cmd:XCATBYPASS=YES tabdump site check:rc==0 cmd:service xcatd stop check:rc==0 cmd:sleep 3 cmd:service xcatd status -eck:rc!=0 -check:output=~xcatd.service -check:output=~inactive \(dead\) +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is not running|inactive \(dead\) cmd:tabdump site check:rc!=0 cmd:XCATBYPASS=YES tabdump site @@ -222,23 +113,17 @@ cmd:service xcatd start check:rc==0 cmd:service xcatd status check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -check:output=~/system.slice/xcatd.service -check:output=~xcatd: SSL -check:output=~xcatd: DB -check:output=~xcatd: UDP -check:output=~xcatd: install -check:output=~xcatd: Discovery -check:output=~xcatd: Command log +check:output=~xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) end start:disable_root_permission_in_policy_table description:disable root permission, only with XCATBYPASS=YES, the command works -os:linux +label:mn_only,xcatd cmd:service xcatd status check:rc==0 -check:output=~xcatd service is running +check:output=~ xcatd service|xcatd.service +check:output=~xcatd service is running|active \(running\) cmd:chtab name=root policy.rule=disable check:rc==0 cmd:lsdef @@ -251,31 +136,14 @@ cmd:lsdef check:rc==0 end -start:disable_root_permission_in_policy_table_systemd -description:this is the test case when xcat service is managed by systemd on sles12* and ubuntu16.04, the output of service xcatd changes,disable root permission, only with XCATBYPASS=YES, the command works -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -cmd:chtab name=root policy.rule=disable -check:rc==0 -cmd:lsdef -check:output=~Error: (\[.*?\]: )?Permission denied for request -cmd:XCATBYPASS=YES lsdef -check:rc==0 -cmd:XCATBYPASS=YES chtab name=root policy.rule=allow -check:rc==0 -cmd:lsdef -check:rc==0 -end start:assign_certain_command_permission description:assign root permission to certain command, only this command works -os:linux +label:mn_only,xcatd cmd:service xcatd status check:rc==0 -check:output=~xcatd service is running +check:output=~ xcatd service |xcatd.service +check:output=~xcatd service is running|active \(running\) cmd:lsdef check:rc==0 cmd:tabdump policy @@ -290,24 +158,4 @@ cmd:chtab name=root policy.commands= policy.rule=allow check:rc==0 end -start:assign_certain_command_permission_systemd -description:this is the test case when xcat service is managed by systemd on sles12* and ubuntu16.04, the output of service xcatd changes,assign root permission to certain command, only this command works -os:linux -cmd:service xcatd status -check:rc==0 -check:output=~xcatd.service -check:output=~active \(running\) -cmd:lsdef -check:rc==0 -cmd:tabdump policy -check:rc==0 -cmd:chtab name=root policy.commands=lsdef policy.rule=allow -check:rc==0 -cmd:lsdef -check:rc==0 -cmd:tabdump policy -check:output=~Error: (\[.*?\]: )?Permission denied for request -cmd:chtab name=root policy.commands= policy.rule=allow -check:rc==0 -end diff --git a/xCAT-test/autotest/testcase/xcatsnap/cases0 b/xCAT-test/autotest/testcase/xcatsnap/cases0 index 3c336f61c..52607b868 100644 --- a/xCAT-test/autotest/testcase/xcatsnap/cases0 +++ b/xCAT-test/autotest/testcase/xcatsnap/cases0 @@ -1,5 +1,6 @@ start:xcatsnap_null description:xcatsnap with no argument +label:mn_only cmd:xcatsnap check:rc==0 check:output=~Send .* to IBM Support @@ -8,6 +9,7 @@ end start:xcatsnap_b_d description:xcatsnap -B -d +label:mn_only cmd:xcatsnap -B -d /tmp/testdir check:rc==0 check:output=~Send .* to IBM Support @@ -18,6 +20,7 @@ end start:xcatsnap_h description:xcatsnap -h and --help +label:mn_only cmd:xcatsnap -h check:output=~Usage cmd:xcatsnap --help @@ -27,6 +30,7 @@ end start:xcatsnap_v description:xcatsnap -v and --version +label:mn_only cmd:xcatsnap -v check:output=~version|Version cmd:xcatsnap --version From dc2ea9014d1d4e7932104159417f6335cea5fac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Mon, 2 Jul 2018 18:11:21 +0800 Subject: [PATCH 66/93] Remove -no_ssl2 command line argument for openssl. Since new version of openssl do not support it any more (#5358) --- xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk | 4 ++-- xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite | 2 +- .../xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat | 2 +- xCAT/postscripts/getcredentials.awk | 2 +- xCAT/postscripts/getpostscript.awk | 2 +- xCAT/postscripts/startsyncfiles | 2 +- xCAT/postscripts/startsyncfiles.awk | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk index 0e39ef125..d11230673 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk @@ -68,9 +68,9 @@ xCATCmd () { # $2 is the command ARCH=`uname -m` if [ x$ARCH = x"ppc64" -a x$OS = x"rh" ]; then - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null else - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null fi } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite index 6199919fd..b68358cec 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat index 2ea270de6..53e530e53 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT/postscripts/getcredentials.awk b/xCAT/postscripts/getcredentials.awk index a471631d7..31b8028e0 100755 --- a/xCAT/postscripts/getcredentials.awk +++ b/xCAT/postscripts/getcredentials.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if ((ENVIRON["USEOPENSSLFORXCAT"]) || (ENVIRON["AIX"])) { - server = "openssl s_client -quiet -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -quiet -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } diff --git a/xCAT/postscripts/getpostscript.awk b/xCAT/postscripts/getpostscript.awk index b4ae4e633..68ca3efc4 100755 --- a/xCAT/postscripts/getpostscript.awk +++ b/xCAT/postscripts/getpostscript.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } diff --git a/xCAT/postscripts/startsyncfiles b/xCAT/postscripts/startsyncfiles index 1f1be4fc2..9f9b79d15 100755 --- a/xCAT/postscripts/startsyncfiles +++ b/xCAT/postscripts/startsyncfiles @@ -42,7 +42,7 @@ while read LINE;do RET=${RET%<*} [ "$RET" != "0" ] && RETCODE=1 fi -done < <(openssl s_client -no_ssl3 -no_ssl2 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) +done < <(openssl s_client -no_ssl3 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) rm -rf $RESPFILE exit $RETCODE diff --git a/xCAT/postscripts/startsyncfiles.awk b/xCAT/postscripts/startsyncfiles.awk index 88f5a9e4a..4855cee0f 100755 --- a/xCAT/postscripts/startsyncfiles.awk +++ b/xCAT/postscripts/startsyncfiles.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" + server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } From 3bfaa75c063272c68a9581a4c87754d2e6d1e908 Mon Sep 17 00:00:00 2001 From: yangsbj Date: Mon, 2 Jul 2018 22:10:30 -0400 Subject: [PATCH 67/93] remove date in updatenode message, for ticket Request removal of date from line in xCAT framework, idea? #5348 --- xCAT/postscripts/xcatdsklspost | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT/postscripts/xcatdsklspost b/xCAT/postscripts/xcatdsklspost index 4ec93d7aa..c41577c12 100755 --- a/xCAT/postscripts/xcatdsklspost +++ b/xCAT/postscripts/xcatdsklspost @@ -887,7 +887,7 @@ run_ps () { fi if [ -f \$1 ]; then - echo \"\`date\` Running \$scriptype: \$1\" + echo \"Running \$scriptype: \$1\" msgutil_r \"\$MASTER_IP\" \"info\" "\"Running \$scriptype: \$1\"" \"\$logfile\" \"xcat.mypostscript\" if [ \"\$XCATDEBUGMODE\" = \"1\" ] || [ \"\$XCATDEBUGMODE\" = \"2\" ]; then local compt=\$(file \$1) From 76d72e64aab5cb62ee7cfb06043ea650a54f9ad1 Mon Sep 17 00:00:00 2001 From: tingtli Date: Tue, 3 Jul 2018 14:02:05 +0800 Subject: [PATCH 68/93] update case for task195 , add cases for bug #50, xcat-inventory import -d <> -c can only see the last one after imported (#5329) --- .../testcase/xcat-inventory/cases.osimage | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage b/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage index 0567e79c5..27df1ce48 100644 --- a/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.osimage @@ -1255,3 +1255,34 @@ cmd:file="/opt/xcat/share/xcat/install/rh/template"; rm -rf $file; if [ -d ${fil cmd:for file in /tmp/osimages/*.stanza; do cat $file|mkdef -z; done cmd:if [ -e /tmp/osimages.bak ]; then mv -f /tmp/osimages.bak /tmp/osimages; fi end + +start:export_import_osimages_by_dir_with_c +description:This case is used to test xcat-inventory export and import linux osimage definition witch -c option. +label:others,xcat_inventory +cmd:dir="/tmp/export";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir +cmd:imgdir='/tmp/export';for img in $(lsdef -t osimage -s|awk -F' ' '{print $1}'); do lsdef -t osimage -o $img -z > $imgdir/${img}.stanza;done +check:rc==0 +cmd:for img in $(lsdef -t osimage -s|awk -F' ' '{print $1}');do rmdef -t osimage -o $img;done +check:rc==0 +cmd:chdef -t osimage -o test_myimage1,test_myimage2,test_myimage3 imagetype=linux provmethod=install +check:rc==0 +cmd:xcat-inventory export -t osimage -o test_myimage1,test_myimage2 -d /tmp/export +check:rc==0 +check:output=~The osimage objects has been exported to directory /tmp/export +cmd:ls -lFR /tmp/export +cmd: xcat-inventory import -t osimage -d /tmp/export -c +check:rc==0 +check:output=~Importing object: test_myimage1 +check:output=~Inventory import successfully! +check:output=~The object test_myimage1 has been imported +check:output=~Importing object: test_myimage2 +check:output=~Inventory import successfully! +check:output=~The object test_myimage2 has been imported +cmd:lsdef -t osimage -o test_myimage1,test_myimage2 +check:rc==0 +cmd:lsdef -t osimage -o test_myimage3 +check:rc!=0 +cmd:rmdef -t osimage -o test_myimage1,test_myimage2 +cmd:for file in /tmp/export/*.stanza; do cat $file|mkdef -z; done +cmd:dir="/tmp/export"; rm -rf $dir; if [ -d ${dir}".bak" ];then mv ${dir}".bak" $dir; fi +end From ff7bf147a14c120d64c79361dcfcbb57b3336eab Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 3 Jul 2018 04:09:40 -0400 Subject: [PATCH 69/93] add labels for makedhcp makedns xdcp xdsh makehosts command test cases --- xCAT-test/autotest/testcase/makedhcp/cases0 | 41 +- xCAT-test/autotest/testcase/makedns/cases0 | 428 +------------------ xCAT-test/autotest/testcase/makehosts/cases0 | 9 + xCAT-test/autotest/testcase/xdcp/cases0 | 11 + xCAT-test/autotest/testcase/xdcp/cases1 | 1 + xCAT-test/autotest/testcase/xdsh/cases0 | 13 + xCAT-test/autotest/testcase/xdsh/cases1 | 1 + 7 files changed, 65 insertions(+), 439 deletions(-) diff --git a/xCAT-test/autotest/testcase/makedhcp/cases0 b/xCAT-test/autotest/testcase/makedhcp/cases0 index d676640ba..52435959f 100644 --- a/xCAT-test/autotest/testcase/makedhcp/cases0 +++ b/xCAT-test/autotest/testcase/makedhcp/cases0 @@ -1,5 +1,6 @@ start:makedhcp_n -os:Linux +description:Create a new dhcp configuration file with a network statement for each network the dhcp daemon should listen on +label:mn_only,dhcp cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi cmd:makedhcp -n check:rc==0 @@ -16,6 +17,7 @@ end start:makedhcp_h description:help +label:mn_only,dhcp cmd:makedhcp -h check:rc==0 check:output=~Usage @@ -23,41 +25,15 @@ end start:makedhcp_help description:help +label:mn_only,dhcp cmd:makedhcp -h check:rc==0 check:output=~Usage end -start:makedhcp_n_linux -description:Create a new dhcp configuration file with a network statement for each network the dhcp daemon should listen on -os:Linux -cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi -cmd:makedhcp -n -check:rc==0 -cmd:ls /etc/dhcp/dhcpd.conf || ls /etc/dhcpd.conf -check:rc==0 -cmd:ps -e | grep dhcpd -check:rc==0 -check:output=~dhcpd -cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi -end - -start:makedhcp_n_aix -description:Create a new dhcp configuration file with a network statement for each network the dhcp daemon should listen on -os:Aix -cmd:mv -f /etc/dhcpsd.cnf /etc/dhcpsd.conf.bak -cmd:makedhcp -n -check:rc==0 -cmd:ls /etc/dhcpsd.cnf -check:rc==0 -cmd:ps -e | grep dhcpd -check:rc==0 -check:output=~dhcpd -end - start:makedhcp_a_linux description:Define all nodes to the DHCP server. (Will only add nodes that can be reached, network-wise, by this DHCP server.) The dhcp daemon does not have to be restarted after this. -os:Linux +label:mn_only,dhcp cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 cmd:chdef -t node -o testnode1 netboot=yaboot tftpserver=192.16.10.0 nfsserver=192.16.10.0 monserver=192.16.10.0 xcatmaster=192.16.10.0 installnic="mac" primarynic="mac" cmd:lsdef -l testnode1 -z > /tmp/CN.stanza @@ -75,7 +51,7 @@ cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/d end start:makedhcp_a_d_linux -os:Linux +label:mn_only,dhcp cmd:lsdef -t node -l -z > /tmp/all.nodes cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 cmd:mkdef -t node -o testnode2 groups=compute mac=11:22:33:55:66:99 arch=ppc64 @@ -94,12 +70,12 @@ check:output=~testnode2 cmd:cat /tmp/all.nodes | chdef -z cmd:rmdef testnode1 cmd:rmdef testnode2 -#cmd:rm -f /tmp/1 /tmp/2 +cmd:rm -f /tmp/1 /tmp/2 end start:makedhcp_d_linux description:Delete all node entries, added by xCAT, in the noderange from the DHCP server configuration. -os:Linux +label:mn_only,dhcp cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 cmd:chdef -t node -o testnode1 netboot=yaboot tftpserver=192.16.10.0 nfsserver=192.16.10.0 monserver=192.16.10.0 xcatmaster=192.16.10.0 installnic="mac" primarynic="mac" cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi @@ -133,6 +109,7 @@ check:output=~11:22:33:44:55:66 cmd:chdef -t node -o $$CN mac= cmd:cat /tmp/$$CN.stanza | chdef -z end + start:makedhcp_a_ubuntu os:Linux cmd:lsdef -l $$CN -z > /tmp/$$CN.stanza diff --git a/xCAT-test/autotest/testcase/makedns/cases0 b/xCAT-test/autotest/testcase/makedns/cases0 index e39a35857..bc4f6aa96 100644 --- a/xCAT-test/autotest/testcase/makedns/cases0 +++ b/xCAT-test/autotest/testcase/makedns/cases0 @@ -1,5 +1,6 @@ start:makedns_h description:help +label:mn_only,dns cmd:makedns -h check:rc==0 cmd:makedns --help @@ -9,6 +10,7 @@ end start:makedns_d_node description:makedns -d noderange +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:chdef -t node -o dnstestnode groups=all ip=100.100.100.1 @@ -35,6 +37,7 @@ end start:makedns_node description:makedns noderange +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:chdef -t node -o dnstestnode groups=all ip=100.100.100.1 @@ -61,6 +64,8 @@ end start:makedns_ubuntu_n description:makedns -n +os:ubuntu +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -90,8 +95,11 @@ cmd:nslookup dnstestnode $$MN check:output~=Server: $$MN check:output~=(server can't find dnstestnode) end + start:makedns_n description:makedns -n +os:rhels,sles +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -124,6 +132,7 @@ end start:makedns description:makedns +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:makedns -n @@ -171,6 +180,7 @@ end start:makedns_environment_check_forworder_mode description:check basic environment of makedns in hierarchical arch and sn acts forworder os:rhels +label:cn_os_ready,dns cmd:chtab key=nameservers site.value="" check:rc==0 cmd:chdef service setupnameserver=1 setupdhcp=1 @@ -237,6 +247,7 @@ end start:makedns_environment_check_forworder_mode description:check basic environment of makedns in hierarchical arch and sn acts forworder os:sles +label:cn_os_ready,dns cmd:chtab key=nameservers site.value="" check:rc==0 cmd:chdef service setupnameserver=1 setupdhcp=1 @@ -301,88 +312,10 @@ check:output~=running end -start:makedns_environment_check_forworder_mode -description:check basic environment of makedns in hierarchical arch and sn acts forworder -os:AIX -cmd:chtab key=nameservers site.value="" -check:rc==0 -cmd:chdef service setupnameserver=1 setupdhcp=1 -check:rc==0 -cmd:tabdump servicenode -check:rc==0 -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:cp /etc/hosts /etc/hosts.testbak -check:rc==0 -cmd:echo "100.100.100.1 dnstestnode" >> /etc/hosts -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:more /etc/resolv.conf|grep nameserver -check:rc==0 -cmd:xdsh $$SN "more /etc/resolv.conf|grep nameserver" -check:rc==0 -cmd:xdsh $$CN "more /etc/resolv.conf|grep nameserver" -cmd:tabdump site|grep nameservers -check:rc==0 -cmd:tabdump networks -check:rc==0 -cmd:lsdef $$SN -i setupnameserver|grep setupnameserver -check:rc==0 -check:output~=1 -cmd:lsdef $$SN -i setupdhcp|grep setupdhcp -check:rc==0 -check:output~=1 -cmd:lssrc -s named -check:output~=active -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:xdsh $$SN "lssrc -s named" -check:output~=active -cmd:xdsh $$SN "more /etc/named.conf" -check:rc==0 -check:output~=forward only -cmd:nslookup $$SN $$MN -check:output~=Server: $$MN -check:output!~(server can't find $$SN) -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:rm -f /etc/hosts -check:rc==0 -cmd:mv /etc/hosts.testbak /etc/hosts -check:rc==0 -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -end - - start:makedns_environment_check_master_slave_mode description:check basic environment of makedns in hierarchical arch and sn acts slave os:rhels +label:cn_os_ready,dns cmd:chtab key=nameservers site.value=",$$MNIP" check:rc==0 cmd:chdef service setupnameserver=2 setupdhcp=1 @@ -453,6 +386,7 @@ end start:makedns_environment_check_master_slave_mode description:check basic environment of makedns in hierarchical arch and sn acts slave os:sles +label:cn_os_ready,dns cmd:chtab key=nameservers site.value=",$$MNIP" check:rc==0 cmd:chdef service setupnameserver=2 setupdhcp=1 @@ -520,88 +454,12 @@ cmd:xdsh $$SN "service xcatd status" check:output~=running end -start:makedns_environment_check_master_slave_mode -description:check basic environment of makedns in hierarchical arch and sn acts slave -os:AIX -cmd:chtab key=nameservers site.value=",$$MNIP" -check:rc==0 -cmd:chdef service setupnameserver=2 setupdhcp=1 -check:rc==0 -cmd:tabdump servicenode -check:rc==0 -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:cp /etc/hosts /etc/hosts.testbak -check:rc==0 -cmd:echo "100.100.100.1 dnstestnode" >> /etc/hosts -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:more /etc/resolv.conf|grep nameserver -check:rc==0 -cmd:xdsh $$SN "more /etc/resolv.conf|grep nameserver" -check:rc==0 -cmd:xdsh $$CN "more /etc/resolv.conf|grep nameserver" -cmd:tabdump site|grep nameservers -check:rc==0 -cmd:tabdump networks -check:rc==0 -cmd:lsdef $$SN -i setupnameserver|grep setupnameserver -check:rc==0 -check:output~=2 -cmd:lsdef $$SN -i setupdhcp|grep setupdhcp -check:rc==0 -check:output~=1 -cmd:lssrc -s named -check:output~=active -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:xdsh $$SN "lssrc -s named" -check:output~=active -cmd:xdsh $$SN "more /etc/named.conf" -check:rc==0 -check:output~=type slave -cmd:nslookup $$SN $$MN -check:output~=Server: $$MN -check:output!~(server can't find $$SN) -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:rm -f /etc/hosts -check:rc==0 -cmd:mv /etc/hosts.testbak /etc/hosts -check:rc==0 -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -end #--------------------------------------------------------------------- start:makedns_when_nameserver_on_mn_down description:when nameserver on mn down, nameserver on sn should provide service os:rhels +label:cn_os_ready,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -660,6 +518,7 @@ end start:makedns_when_nameserver_on_mn_down description:when nameserver on mn down, nameserver on sn should provide service os:sles +label:cn_os_ready,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -711,76 +570,11 @@ cmd:xdsh $$SN "service xcatd status" check:output~=running end -start:makedns_when_nameserver_on_mn_down -description:when nameserver on mn down, nameserver on sn should provide service -os:AIX -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:cp /etc/hosts /etc/hosts.testbak -check:rc==0 -cmd:echo "100.100.100.1 dnstestnode" >> /etc/hosts -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:lssrc -s named -check:output~=active -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:sleep 5 -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:stopsrc -s named -check:rc==0 -cmd:sleep 3 -cmd:lssrc -s named -check:output~=inoperative -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output~=(server can't find dnstestnode) -cmd:sleep 5 -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:startsrc -s named -check:rc==0 -cmd:lssrc -a |grep named -check:rc==0 -check:output~=active -cmd:rm -f /etc/hosts -check:rc==0 -cmd:mv /etc/hosts.testbak /etc/hosts -check:rc==0 -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -end start:makedns_when_nameserver_on_sn_down description:when nameserver on sn down, nameserver on mn should provide service os:rhels +label:cn_os_ready,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -841,6 +635,7 @@ end start:makedns_when_nameserver_on_sn_down description:when nameserver on sn down, nameserver on mn should provide service os:sles +label:cn_os_ready,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:cp /etc/hosts /etc/hosts.testbak @@ -893,78 +688,11 @@ check:rc==0 check:output~=running end - -start:makedns_when_nameserver_on_sn_down -description:when nameserver on sn down, nameserver on mn should provide service -os:AIX -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:cp /etc/hosts /etc/hosts.testbak -check:rc==0 -cmd:echo "100.100.100.1 dnstestnode" >> /etc/hosts -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:lssrc -s named -check:output~=active -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:sleep 10 -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:xdsh $$SN "stopsrc -s named" -check:rc==0 -cmd:xdsh $$SN "lssrc -s named" -check:rc==0 -check:output~=inoperative -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:sleep 5 -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output~=(server can't find dnstestnode) -cmd:xdsh $$SN "startsrc -s named" -check:rc==0 -cmd:xdsh $$SN "lssrc -s named" -check:rc==0 -check:output~=active -cmd:rm -f /etc/hosts -check:rc==0 -cmd:mv /etc/hosts.testbak /etc/hosts -check:rc==0 -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -end - #999999999999999999999999999 start:makedns_nameserver_on_sn_sync_db description:when nameserver's db on mn was changed, nameserver's db on sn should be synchronized os:Linux +label:cn_os_ready,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:makedns -n @@ -1004,67 +732,9 @@ check:rc==0 end -start:makedns_nameserver_on_sn_sync_db -description:when nameserver's db on mn was changed, nameserver's db on sn should be synchronized -os:AIX -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:chdef -t node -o dnstestnode groups=all ip=100.100.100.2 -check:rc==0 -cmd:makedns dnstestnode -check:rc==0 -cmd:nslookup dnstestnode $$MN -check:rc==0 -check:output~=Server: $$MN -check:output!~(server can't find dnstestnode) -cmd:sleep 2 -cmd:nslookup dnstestnode $$SN -check:rc==0 -check:output~=Server: $$SN -check:output!~(server can't find dnstestnode) -cmd:makedns -d dnstestnode -check:rc==0 -cmd:nslookup dnstestnode $$MN -check:output~=Server: $$MN -check:output~=(server can't find dnstestnode) -cmd:sleep 2 -cmd:nslookup dnstestnode $$SN -check:output~=Server: $$SN -check:output~=(server can't find dnstestnode) -cmd:rmdef -t node dnstestnode -check:rc==0 -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active - -end - start:makedns_nameserver_on_sn_sync_conf description:when nameserver's conf file on mn was changed, nameserver's conf file on sn should be synchronized when xcatd restart -os:Linux +label:cn_os_ready,dns, cmd:makedns -n check:rc==0 cmd:cat /etc/named.conf @@ -1105,68 +775,11 @@ check:rc==0 check:output!~=zone "100.100.100.IN-ADDR.ARPA." end -start:makedns_nameserver_on_sn_sync_conf -description:when nameserver's conf file on mn was changed, nameserver's conf file on sn should be synchronized when xcatd restart -os:AIX -cmd:makedns -n -check:rc==0 -cmd:cat /etc/named.conf -check:rc==0 -check:output!~zone "100.100.100.IN-ADDR.ARPA." -cmd:xdsh $$SN "cat /etc/named.conf" -check:rc==0 -check:output!~zone "100.100.100.IN-ADDR.ARPA." -cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:cat /etc/named.conf -check:rc==0 -check:output~=zone "100.100.100.IN-ADDR.ARPA." -cmd:xdsh $$SN "cat /etc/named.conf" -check:rc==0 -check:output!~zone "100.100.100.IN-ADDR.ARPA." -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:xdsh $$SN "cat /etc/named.conf" -check:rc==0 -check:output~=zone "100.100.100.IN-ADDR.ARPA." -cmd:chtab -d netname=testnetwork networks -check:rc==0 -cmd:makedns -n -check:rc==0 -cmd:cat /etc/named.conf -check:rc==0 -check:output!~zone "100.100.100.IN-ADDR.ARPA." -cmd:xdsh $$SN "cat /etc/named.conf" -check:rc==0 -check:output~=zone "100.100.100.IN-ADDR.ARPA." -cmd:xdsh $$SN "stopsrc -s xcatd" -check:rc==0 -cmd:sleep 5 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=inoperative -cmd:xdsh $$SN "startsrc -s xcatd" -check:rc==0 -cmd:sleep 10 -cmd:xdsh $$SN "lssrc -s xcatd" -check:output~=active -cmd:xdsh $$SN "cat /etc/named.conf" -check:rc==0 -check:output!~=zone "100.100.100.IN-ADDR.ARPA." -end start:makedns_nameserver_on_sn_sync_db_when_sn_down description:when nameserver's db on mn was changed and name server on SN down at the same time, when name server on SN restart, it should sync the latest name server db on MN os:rhels +label:cn_os_ready,dns cmd:makedns -n check:rc==0 cmd:service named status @@ -1221,6 +834,7 @@ end start:makedns_n_noderange description:to verify makedns -n noderange works as design. add case for bug #2572. Test case bug number is #2826. +label:mn_only,dns cmd:chtab netname=testnetwork networks.net=100.100.100.0 networks.mask=255.255.255.0 networks.mgtifname=eth0 networks.gateway=100.100.100.254 check:rc==0 cmd:chdef -t node -o dnstestnode[1-10] groups=dnsnode ip="|dnstestnode(\d+)|100.100.100.(\$1+0)|" diff --git a/xCAT-test/autotest/testcase/makehosts/cases0 b/xCAT-test/autotest/testcase/makehosts/cases0 index b0387aedd..077fd4db9 100644 --- a/xCAT-test/autotest/testcase/makehosts/cases0 +++ b/xCAT-test/autotest/testcase/makehosts/cases0 @@ -1,4 +1,5 @@ start:makehosts_h +label:mn_only,dns description:makehosts -h cmd:makehosts -h check:rc==0 @@ -6,6 +7,7 @@ check:output=~Usage end start:makehosts_help +label:mn_only,dns description:makehosts --help cmd:makehosts --help check:rc==0 @@ -14,6 +16,7 @@ end start:makehosts_null description:makehosts +label:mn_only,dns cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:chtab node=nouse_compute hosts.ip="|node(\d+)|1.2.3.(\$1+0)|" hosts.hostnames="|(.*)|(\$1).cluster.net|" check:rc==0 @@ -35,6 +38,7 @@ cmd:mv -f /etc/hosts.xcatbakautotest /etc/hosts end start:makehosts_l +label:mn_only,dns cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:chtab node=nouse_compute hosts.ip="|node(\d+)|1.2.3.(\$1+0)|" hosts.hostnames="|(.*)|(\$1).cluster.net|" check:rc==0 @@ -56,6 +60,7 @@ cmd:rm -rf /tmp/hosts end start:makehosts_d +label:mn_only,dns cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:chtab node=compute hosts.ip="|node(\d+)|1.2.3.(\$1+0)|" hosts.hostnames="|(.*)|(\$1).cluster.net|" check:rc==0 @@ -78,6 +83,7 @@ cmd:rm -f /tmp/1 /tmp/2 end start:makehosts_n +label:mn_only,dns cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:chtab node=nouse_compute hosts.ip="|node(\d+)|1.2.3.(\$1+0)|" hosts.hostnames="|(.*)|(\$1).cluster.net|" check:rc==0 @@ -102,6 +108,7 @@ cmd:rm -rf /tmp/hosts end start:makehosts_n_noderange +label:mn_only,dns cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:chtab node=compute hosts.ip="|node(\d+)|1.2.3.(\$1+0)|" hosts.hostnames="|(.*)|(\$1).cluster.net|" check:rc==0 @@ -126,6 +133,7 @@ cmd:rm -rf /tmp/hosts end start:makehost_n_r +label:mn_only,dns descriptions:modify makehosts testcases according to special node name eg:s01 and s01r* . for issue #2717 and #2683 cmd:cp -f /etc/hosts /etc/hosts.xcatbakautotest cmd:lsdef s01;if [ $? -eq 0 ]; then lsdef -l s01 -z >/tmp/s01.standa ;rmdef s01;fi @@ -173,6 +181,7 @@ cmd:mv -f /etc/hosts.xcatbakautotest /etc/hosts end start:makehosts_regex +label:mn_only,dns description:this case is to test if makehosts support regex. This case is for bug 2578. cmd:cp /etc/hosts /etc/hosts.bak cmd:if lsdef -z sn4b;then lsdef -z sn4b|tee /tmp/sn4bdef;noderm sn4b;fi diff --git a/xCAT-test/autotest/testcase/xdcp/cases0 b/xCAT-test/autotest/testcase/xdcp/cases0 index b23b1c647..39398ab43 100644 --- a/xCAT-test/autotest/testcase/xdcp/cases0 +++ b/xCAT-test/autotest/testcase/xdcp/cases0 @@ -1,15 +1,18 @@ start:xdcp_h +label:mn_only,parallel_cmds cmd:xdcp -h check:rc==0 end start:xdcp_V +label:mn_only,parallel_cmds cmd:xdcp -V check:rc==0 check:output=~Version end start:xdcp_src_dst +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN rm -f /tmp/hosts cmd:xdcp $$CN /etc/hosts /tmp/hosts check:rc==0 @@ -24,6 +27,7 @@ cmd:rm -f /tmp/hosts end start:xdcp_P_src_dst +label:cn_os_ready,parallel_cmds cmd:xdcp $$CN -P /etc/inittab /tmp/ check:rc==0 cmd:xdsh $$CN cat /etc/inittab > /tmp/inittab1 @@ -35,6 +39,7 @@ end start:xdcp_RP +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN "mkdir -p /tmp/xdcp/test1" check:rc==0 cmd:xdsh $$CN "echo "test1" > /tmp/xdcp/test1/test1.txt" @@ -63,6 +68,7 @@ check:rc==0 end start:xdcp_R +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/test1 check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1/test1.txt @@ -93,6 +99,7 @@ check:rc==0 end start:xdcp_all_files_of_dir +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/ check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1.txt @@ -116,6 +123,7 @@ end start:xdcp_rsync +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/ check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1.txt @@ -139,6 +147,7 @@ end start:xdcp_rsyncfile_single_file +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/ check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1.txt @@ -159,6 +168,7 @@ end start:xdcp_rsyncfile_files +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/ check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1.txt @@ -184,6 +194,7 @@ end start:xdcp_rsyncfile_files_changename +label:cn_os_ready,parallel_cmds cmd:mkdir -p /tmp/xdcp/ check:rc==0 cmd:echo "test1" > /tmp/xdcp/test1.txt diff --git a/xCAT-test/autotest/testcase/xdcp/cases1 b/xCAT-test/autotest/testcase/xdcp/cases1 index d5ab8a723..5282aa160 100644 --- a/xCAT-test/autotest/testcase/xdcp/cases1 +++ b/xCAT-test/autotest/testcase/xdcp/cases1 @@ -1,4 +1,5 @@ start:xdcp_nonroot_user +label:cn_os_ready,parallel_cmds cmd:useradd -m xyzzy check:rc==0 cmd:bash -c "( cd ~root && tar cf - .xcat .ssh ) | ( cd ~xyzzy && tar xf - )" diff --git a/xCAT-test/autotest/testcase/xdsh/cases0 b/xCAT-test/autotest/testcase/xdsh/cases0 index f267c658a..513ba2154 100644 --- a/xCAT-test/autotest/testcase/xdsh/cases0 +++ b/xCAT-test/autotest/testcase/xdsh/cases0 @@ -1,27 +1,32 @@ start:xdsh_h +label:mn_only,parallel_cmds cmd:xdsh -h check:rc==0 end start:xdsh_V +label:mn_only,parallel_cmds cmd:xdsh -V check:rc==0 check:output=~Version end start:xdsh_regular_command +label:cn_os_ready,parallel_cmds cmd:XCATBYPASS=1 xdsh $$CN "ps -ef" check:rc==0 check:output=~$$CN: UID PID PPID C STIME TTY TIME CMD end start:xdsh_Q_command +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN -Q "ps -ef" check:rc==0 check:output=~ end start:xdsh_c_sn +label:cn_os_ready,parallel_cmds cmd:xdsh $$SN "ls -l /var/xcat/syncfiles" > /dev/null 2>&1; if [ "$?" -ne "0" ]; then xdsh $$SN "mkdir -p /var/xcat/syncfiles";fi check:rc==0 cmd: xdsh $$SN "echo 'test' > /var/xcat/syncfiles/xdsh_c.tmp" @@ -34,6 +39,7 @@ check:output=~ end start:xdsh_c_cn +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN "ls -l /var/xcat/node/syncfiles" > /dev/null 2>&1; if [ "$?" -ne "0" ]; then xdsh $$CN "mkdir -p /var/xcat/node/syncfiles";fi check:rc==0 cmd: xdsh $$CN "echo 'test' > /var/xcat/node/syncfiles/xdsh_c.tmp" @@ -46,6 +52,7 @@ check:output=~ end start:xdsh_e_filename +label:cn_os_ready,parallel_cmds cmd:echo "echo 'xdsh_e_filename test' > /tmp/xdsh_e_filename.txt" > /tmp/xdsh_script.sh check:rc==0 cmd:chmod +x /tmp/xdsh_script.sh @@ -63,6 +70,7 @@ check:rc==0 end start:xdsh_E +label:cn_os_ready,parallel_cmds cmd:echo 'export DSH_FANOUT=8' > /tmp/xdsh.test check:rc==0 cmd:xdsh $$CN -E /tmp/xdsh.test "export |grep DSH_FANOUT" @@ -73,6 +81,7 @@ check:rc==0 end start:xdsh_i_linux +label:cn_os_ready,parallel_cmds cmd: copycds $$ISO check:rc==0 cmd: genimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute @@ -84,6 +93,7 @@ end start:xdsh_t +label:cn_os_ready,parallel_cmds cmd:date +%s > /tmp/start.txt check:rc==0 cmd:xdsh $$CN -t 5 "ssh 1.1.1.1" @@ -98,12 +108,14 @@ cmd:rm -f /tmp/start.txt /tmp/end.txt end start:xdsh_q +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN -q check:rc==0 check:output=~DSH:DSH_FANOUT= end start:xdsh_T +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN -T "hostname" check:rc==0 check:output=~TRACE:Default context is XCAT @@ -111,6 +123,7 @@ check:output=~$$CN: $$CN end start:xdsh_o +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN -o "-v" date check:rc==0 check:output=~$$CN: OpenSSH diff --git a/xCAT-test/autotest/testcase/xdsh/cases1 b/xCAT-test/autotest/testcase/xdsh/cases1 index 37286b5d3..f097cc54f 100644 --- a/xCAT-test/autotest/testcase/xdsh/cases1 +++ b/xCAT-test/autotest/testcase/xdsh/cases1 @@ -1,5 +1,6 @@ start:xdsh_permission_denied description: Test the exit code when command xdsh failed +label:cn_os_ready,parallel_cmds cmd:xdsh $$CN date check:rc==0 cmd:mv /root/.ssh/id_rsa /root/.ssh/id_rsa.backup From da8983a95e381cf9f07b4e9f4a85e3c236d8145d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Tue, 3 Jul 2018 16:11:42 +0800 Subject: [PATCH 70/93] Revert "Remove -no_ssl2 command line argument for openssl. Since new version of openssl do not support it any more (#5358)" (#5364) This reverts commit dc2ea9014d1d4e7932104159417f6335cea5fac7. --- xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk | 4 ++-- xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite | 2 +- .../xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat | 2 +- xCAT/postscripts/getcredentials.awk | 2 +- xCAT/postscripts/getpostscript.awk | 2 +- xCAT/postscripts/startsyncfiles | 2 +- xCAT/postscripts/startsyncfiles.awk | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk index d11230673..0e39ef125 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk @@ -68,9 +68,9 @@ xCATCmd () { # $2 is the command ARCH=`uname -m` if [ x$ARCH = x"ppc64" -a x$OS = x"rh" ]; then - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null else - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null fi } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite index b68358cec..6199919fd 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat index 53e530e53..2ea270de6 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT/postscripts/getcredentials.awk b/xCAT/postscripts/getcredentials.awk index 31b8028e0..a471631d7 100755 --- a/xCAT/postscripts/getcredentials.awk +++ b/xCAT/postscripts/getcredentials.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if ((ENVIRON["USEOPENSSLFORXCAT"]) || (ENVIRON["AIX"])) { - server = "openssl s_client -quiet -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -quiet -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } diff --git a/xCAT/postscripts/getpostscript.awk b/xCAT/postscripts/getpostscript.awk index 68ca3efc4..b4ae4e633 100755 --- a/xCAT/postscripts/getpostscript.awk +++ b/xCAT/postscripts/getpostscript.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } diff --git a/xCAT/postscripts/startsyncfiles b/xCAT/postscripts/startsyncfiles index 9f9b79d15..1f1be4fc2 100755 --- a/xCAT/postscripts/startsyncfiles +++ b/xCAT/postscripts/startsyncfiles @@ -42,7 +42,7 @@ while read LINE;do RET=${RET%<*} [ "$RET" != "0" ] && RETCODE=1 fi -done < <(openssl s_client -no_ssl3 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) +done < <(openssl s_client -no_ssl3 -no_ssl2 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) rm -rf $RESPFILE exit $RETCODE diff --git a/xCAT/postscripts/startsyncfiles.awk b/xCAT/postscripts/startsyncfiles.awk index 4855cee0f..88f5a9e4a 100755 --- a/xCAT/postscripts/startsyncfiles.awk +++ b/xCAT/postscripts/startsyncfiles.awk @@ -1,7 +1,7 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" + server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" } else { server = "/inet/tcp/0/127.0.0.1/400" } From 21cf3c56d255c2b60b01160f021270351b3b16a3 Mon Sep 17 00:00:00 2001 From: Yuan Bai Date: Tue, 3 Jul 2018 16:51:06 +0800 Subject: [PATCH 71/93] diskless support root options in addkcmdline (#5366) * add root options * polished * polished --- .../share/xcat/netboot/rh/dracut_033/xcatroot | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot b/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot index f6701aa78..12888ba79 100755 --- a/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot +++ b/xCAT-server/share/xcat/netboot/rh/dracut_033/xcatroot @@ -10,7 +10,7 @@ XCATMASTER=$XCAT STATEMNT="$(getarg STATEMNT=)" rootlimit="$(getarg rootlimit=)" xcatdebugmode="$(getarg xcatdebugmode=)" - +rflags="$(getarg rootflags=)" getarg nonodestatus NODESTATUS=$? @@ -77,10 +77,14 @@ if [ -r /rootimg.sfs ]; then elif [ -r /rootimg.cpio.gz ] || [ -r /rootimg.cpio.xz ]; then logger $SYSLOGHOST -t $log_label -p local4.info "Setting up RAM-root tmpfs on downloaded rootimg.cpio.[gz/xz]..." echo Setting up RAM-root tmpfs. - if [ -z $rootlimit ];then - mount -t tmpfs -o mode=755 rootfs $NEWROOT + rootopts="mode=755" + if [ -n "$rflags" ]; then + rootopts="$rootopts","$rflags" + fi + if [ -z "$rootlimit" ];then + mount -t tmpfs -o $rootopts rootfs $NEWROOT else - mount -t tmpfs -o mode=755,size=$rootlimit rootfs $NEWROOT + mount -t tmpfs -o "$rootopts",size=$rootlimit rootfs $NEWROOT fi cd $NEWROOT From e88d2e796e6743e19f1e624ad77002307464dfd4 Mon Sep 17 00:00:00 2001 From: huweihua Date: Tue, 3 Jul 2018 23:11:40 -0400 Subject: [PATCH 72/93] modify depending on comments --- xCAT-test/autotest/testcase/makedhcp/cases0 | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/xCAT-test/autotest/testcase/makedhcp/cases0 b/xCAT-test/autotest/testcase/makedhcp/cases0 index 52435959f..314a16d0e 100644 --- a/xCAT-test/autotest/testcase/makedhcp/cases0 +++ b/xCAT-test/autotest/testcase/makedhcp/cases0 @@ -1,5 +1,6 @@ start:makedhcp_n description:Create a new dhcp configuration file with a network statement for each network the dhcp daemon should listen on +os:Linux label:mn_only,dhcp cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak ; elif [ -f "/etc/dhcpd.conf" ]; then mv -f /etc/dhcpd.conf /etc/dhcpd.conf.bak; fi cmd:makedhcp -n @@ -33,6 +34,7 @@ end start:makedhcp_a_linux description:Define all nodes to the DHCP server. (Will only add nodes that can be reached, network-wise, by this DHCP server.) The dhcp daemon does not have to be restarted after this. +os:Linux label:mn_only,dhcp cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 cmd:chdef -t node -o testnode1 netboot=yaboot tftpserver=192.16.10.0 nfsserver=192.16.10.0 monserver=192.16.10.0 xcatmaster=192.16.10.0 installnic="mac" primarynic="mac" @@ -51,6 +53,7 @@ cmd:if [ -f "/etc/dhcp/dhcpd.conf" ];then mv -f /etc/dhcp/dhcpd.conf /etc/dhcp/d end start:makedhcp_a_d_linux +os:Linux label:mn_only,dhcp cmd:lsdef -t node -l -z > /tmp/all.nodes cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 @@ -75,6 +78,7 @@ end start:makedhcp_d_linux description:Delete all node entries, added by xCAT, in the noderange from the DHCP server configuration. +os:Linux label:mn_only,dhcp cmd:mkdef -t node -o testnode1 groups=compute mac=11:22:33:55:66:88 arch=ppc64 cmd:chdef -t node -o testnode1 netboot=yaboot tftpserver=192.16.10.0 nfsserver=192.16.10.0 monserver=192.16.10.0 xcatmaster=192.16.10.0 installnic="mac" primarynic="mac" @@ -98,6 +102,7 @@ end start:makedhcp_a os:Linux +label:cn_os_ready,dhcp cmd:lsdef -l $$CN -z > /tmp/$$CN.stanza cmd:chdef -t node -o $$CN mac=11:22:33:44:55:66 cmd:makedhcp -a @@ -111,7 +116,8 @@ cmd:cat /tmp/$$CN.stanza | chdef -z end start:makedhcp_a_ubuntu -os:Linux +os:ubuntu +label:cn_os_ready,dhcp cmd:lsdef -l $$CN -z > /tmp/$$CN.stanza cmd:chdef -t node -o $$CN mac=11:22:33:44:55:66 cmd:makedhcp -a @@ -125,6 +131,7 @@ end start:makedhcp_a_d os:Linux +label:cn_os_ready,dhcp cmd:makedhcp -a -d check:rc==0 cmd:service dhcpd restart @@ -133,8 +140,10 @@ check:rc==0 check:output!~$$CN cmd:makedhcp -a end + start:makedhcp_a_d_ubuntu -os:Linux +os:ubuntu +label:cn_os_ready,dhcp cmd:makedhcp -a -d check:rc==0 cmd:service isc-dhcp-server restart @@ -145,6 +154,7 @@ end start:makedhcp_d os:Linux +label:cn_os_ready,dhcp cmd:makedhcp -d $$CN check:rc==0 cmd:service dhcpd restart @@ -155,6 +165,8 @@ end start:makedhcp_remote_network descriptiion:This case is to test when there is mgtifname='!remote!', makedhcp could work correctly and create entrys in dhcp lease file. +os:linux +label:mn_only,dhcp cmd:mkdef -t network -o testnetwork net=100.100.100.0 mask=255.255.255.0 mgtifname='!remote!eth0' gateway=100.100.100.1 check:rc==0 cmd:lsdef -t network From e2a71b3dde8d3dc56b12c128b212e6b405496c4a Mon Sep 17 00:00:00 2001 From: "litingt@cn.ibm.com" Date: Tue, 3 Jul 2018 23:38:31 -0400 Subject: [PATCH 73/93] update labels --- xCAT-test/autotest/testcase/xcat-inventory/cases.environment | 2 +- xCAT-test/autotest/testcase/xcat-inventory/cases.include | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.environment b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment index b0cdf61bc..2e813af3c 100644 --- a/xCAT-test/autotest/testcase/xcat-inventory/cases.environment +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment @@ -1,7 +1,7 @@ start:import_osimage_with_environments_in_yaml description:this case is to verify if osimage import could support environment variables. os:Linux -label:xcat_install,xcat_inventory,provision +label:others,xcat_inventory,invoke_provison cmd:chdef -t node -o $$CN servicenode= monserver=$$MN nfsserver=$$MN tftpserver=$$MN xcatmaster=$$MN check:rc==0 diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.include b/xCAT-test/autotest/testcase/xcat-inventory/cases.include index 2f168d599..b38e40f49 100644 --- a/xCAT-test/autotest/testcase/xcat-inventory/cases.include +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.include @@ -1,6 +1,6 @@ start:export_import_osimage_with_INCLUDE_in_file description:This case is used to test xcat-inventory export and import one linux osimage definition which has INCLUDE in the attribute's specified files. The attributes are pkglist, otherpkglist,exlist,synclists,template,postinstall and partitionfile. -label:xcat-inventory +label:others,xcat_inventory cmd:dir="/tmp/imagedata/";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir check:rc==0 cmd:dir="/tmp/imagedata/export";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir From 037de89bd0f71abd8774f4c23f5340509b4bc91c Mon Sep 17 00:00:00 2001 From: huweihua Date: Wed, 4 Jul 2018 02:30:37 -0400 Subject: [PATCH 74/93] Sync up bundle list after combining xcatd test cases --- xCAT-test/autotest/bundle/sles12.2_ppc64le.bundle | 12 ++++++------ xCAT-test/autotest/bundle/sles12.2_x86_64.bundle | 12 ++++++------ .../autotest/bundle/ubuntu16.04.1_ppc64le.bundle | 12 ++++++------ .../autotest/bundle/ubuntu16.04.1_x86_64.bundle | 12 ++++++------ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/xCAT-test/autotest/bundle/sles12.2_ppc64le.bundle b/xCAT-test/autotest/bundle/sles12.2_ppc64le.bundle index 8d500bc10..96783dcb4 100644 --- a/xCAT-test/autotest/bundle/sles12.2_ppc64le.bundle +++ b/xCAT-test/autotest/bundle/sles12.2_ppc64le.bundle @@ -227,12 +227,12 @@ switchdiscover_range_r switchdiscover_range_x switchdiscover_range_z switchdiscover_range_z_V -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission xcatconfig_u_check_xcatsslversion_rhels_sles xcatconfig_c bmcdiscover_help diff --git a/xCAT-test/autotest/bundle/sles12.2_x86_64.bundle b/xCAT-test/autotest/bundle/sles12.2_x86_64.bundle index 0b7a4d19a..17d4379c4 100644 --- a/xCAT-test/autotest/bundle/sles12.2_x86_64.bundle +++ b/xCAT-test/autotest/bundle/sles12.2_x86_64.bundle @@ -225,12 +225,12 @@ switchdiscover_range_x switchdiscover_range_z switchdiscover_range_z_V nodeset_check_warninginfo -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission xcatconfig_u_check_xcatsslversion_rhels_sles xcatconfig_c bmcdiscover_help diff --git a/xCAT-test/autotest/bundle/ubuntu16.04.1_ppc64le.bundle b/xCAT-test/autotest/bundle/ubuntu16.04.1_ppc64le.bundle index 59b57f4ae..e48e451f9 100644 --- a/xCAT-test/autotest/bundle/ubuntu16.04.1_ppc64le.bundle +++ b/xCAT-test/autotest/bundle/ubuntu16.04.1_ppc64le.bundle @@ -258,12 +258,12 @@ switchdiscover_range_r switchdiscover_range_x switchdiscover_range_z switchdiscover_range_z_V -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission xcatconfig_u_check_xcatsslversion_ubuntu xcatconfig_c bmcdiscover_help diff --git a/xCAT-test/autotest/bundle/ubuntu16.04.1_x86_64.bundle b/xCAT-test/autotest/bundle/ubuntu16.04.1_x86_64.bundle index 9cb6f996c..14e69dc79 100644 --- a/xCAT-test/autotest/bundle/ubuntu16.04.1_x86_64.bundle +++ b/xCAT-test/autotest/bundle/ubuntu16.04.1_x86_64.bundle @@ -262,12 +262,12 @@ switchdiscover_range_r switchdiscover_range_x switchdiscover_range_z switchdiscover_range_z_V -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission nodeset_check_warninginfo xcatconfig_u_check_xcatsslversion_ubuntu xcatconfig_c From da35f335b11be6b22cc4722aae4c1607b0ddb6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Wed, 4 Jul 2018 14:48:33 +0800 Subject: [PATCH 75/93] Fix github issue #5365. Proper handle the -no_ssl2 argument of openssl s_client (#5369) --- .../share/xcat/netboot/add-on/statelite/rc.localdisk | 4 ++-- .../share/xcat/netboot/add-on/statelite/rc.statelite | 2 +- .../xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat | 2 +- xCAT/postscripts/getcredentials.awk | 5 ++++- xCAT/postscripts/getpostscript.awk | 7 +++++-- xCAT/postscripts/startsyncfiles | 2 +- xCAT/postscripts/startsyncfiles.awk | 5 ++++- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk index 0e39ef125..71cb96d5e 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk @@ -68,9 +68,9 @@ xCATCmd () { # $2 is the command ARCH=`uname -m` if [ x$ARCH = x"ppc64" -a x$OS = x"rh" ]; then - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null else - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null fi } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite index 6199919fd..d41376de9 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat index 2ea270de6..8507f8127 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 -no_ssl2 -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT/postscripts/getcredentials.awk b/xCAT/postscripts/getcredentials.awk index a471631d7..8e42c1da2 100755 --- a/xCAT/postscripts/getcredentials.awk +++ b/xCAT/postscripts/getcredentials.awk @@ -1,7 +1,10 @@ #!/usr/bin/awk -f BEGIN { if ((ENVIRON["USEOPENSSLFORXCAT"]) || (ENVIRON["AIX"])) { - server = "openssl s_client -quiet -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -quiet -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + server = "openssl s_client -quiet -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + } } else { server = "/inet/tcp/0/127.0.0.1/400" } diff --git a/xCAT/postscripts/getpostscript.awk b/xCAT/postscripts/getpostscript.awk index b4ae4e633..4afde78ec 100755 --- a/xCAT/postscripts/getpostscript.awk +++ b/xCAT/postscripts/getpostscript.awk @@ -1,11 +1,14 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + } } else { server = "/inet/tcp/0/127.0.0.1/400" } - + quit = "no" print "" |& server diff --git a/xCAT/postscripts/startsyncfiles b/xCAT/postscripts/startsyncfiles index 1f1be4fc2..9a15261a1 100755 --- a/xCAT/postscripts/startsyncfiles +++ b/xCAT/postscripts/startsyncfiles @@ -42,7 +42,7 @@ while read LINE;do RET=${RET%<*} [ "$RET" != "0" ] && RETCODE=1 fi -done < <(openssl s_client -no_ssl3 -no_ssl2 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) +done < <(openssl s_client -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) rm -rf $RESPFILE exit $RETCODE diff --git a/xCAT/postscripts/startsyncfiles.awk b/xCAT/postscripts/startsyncfiles.awk index 88f5a9e4a..f146f5d03 100755 --- a/xCAT/postscripts/startsyncfiles.awk +++ b/xCAT/postscripts/startsyncfiles.awk @@ -1,7 +1,10 @@ #!/usr/bin/awk -f BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { - server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" + server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" + if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" + } } else { server = "/inet/tcp/0/127.0.0.1/400" } From c8519de26de4900e3cd8e59f7f2ff2278c91ddda Mon Sep 17 00:00:00 2001 From: tingtli Date: Wed, 4 Jul 2018 15:32:24 +0800 Subject: [PATCH 76/93] update case for task 189,xcat-inventory osimage support environment variables(export part) (#5314) * update case for task 189,xcat-inventory osimage support environment variables(export part) * update case according to yaml file format change * update import file for json format * put stanza file and compare the stanza file --- .../testcase/xcat-inventory/cases.environment | 42 ++++++++++++++++ .../test.environments.osimage.stanza | 21 ++++++++ .../test.environments.osimage.update.json | 50 +++++++++++++++++++ .../test.environments.osimage.update.yaml | 35 +++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json create mode 100644 xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml diff --git a/xCAT-test/autotest/testcase/xcat-inventory/cases.environment b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment index 2e813af3c..f0c269173 100644 --- a/xCAT-test/autotest/testcase/xcat-inventory/cases.environment +++ b/xCAT-test/autotest/testcase/xcat-inventory/cases.environment @@ -78,3 +78,45 @@ check:rc==0 cmd:xdsh $$CN "rpm -qa |grep -w dhcp" check:rc==0 end + +start:export_osimage_with_environments +description:this case is to verify if osimage export could support environment variables. +os:Linux +label:others,xcat_inventory +cmd:lsdef -t osimage -o test.environments.osimage >/dev/null 2>&1;if [[ $? -eq 0 ]]; then lsdef -t osimage -o test.environments.osimage -z >/tmp/test.environments.osimage_image.stanza ;rmdef -t osimage -o test.environments.osimage;fi +check:rc==0 +cmd:dir="/tmp/export";if [ -e "${dir}" ];then mv ${dir} ${dir}".bak"; fi; mkdir -p $dir +cmd:export GITREPO="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo";export SWDIR="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir";xcat-inventory import -f /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml +check:output=~Importing object: test.environments.osimage +check:output=~Inventory import successfully! +check:rc==0 +cmd:lsdef -t osimage -o test.environments.osimage -z >> /tmp/export/test.environments.osimage.yaml.stanza +check:rc==0 +cmd:diff -y /tmp/export/test.environments.osimage.yaml.stanza /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza +check:rc==0 +cmd:xcat-inventory export -t osimage -o test.environments.osimage -f /tmp/export/test.environments.osimage.yaml --format yaml +check:rc==0 +check:output=~The inventory data has been dumped to /tmp/export/test.environments.osimage.yaml +cmd:diff -y /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml /tmp/export/test.environments.osimage.yaml --ignore-blank-lines -I "^#" +check:rc==0 +cmd:rmdef -t osimage -o test.environments.osimage +check:rc==0 +cmd:export GITREPO="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo";export SWDIR="/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir";xcat-inventory import -f /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json +check:output=~Importing object: test.environments.osimage +check:output=~Inventory import successfully! +check:rc==0 +cmd:lsdef -t osimage -o test.environments.osimage -z >> /tmp/export/test.environments.osimage.json.stanza +check:rc==0 +cmd:diff -y /tmp/export/test.environments.osimage.json.stanza /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza +check:rc==0 +cmd:xcat-inventory export -t osimage -o test.environments.osimage -f /tmp/export/test.environments.osimage.json +check:rc==0 +cmd:diff -y /opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json /tmp/export/test.environments.osimage.json --ignore-blank-lines -I "^#" +check:rc==0 +cmd:dir="/tmp/export"; rm -rf $dir; if [ -d ${dir}".bak" ];then mv ${dir}".bak" $dir; fi +cmd: rmdef -t osimage -o test.environments.osimage +check:rc==0 +cmd: if [ -e /tmp/test.environments.osimage.stanza ]; then cat /tmp/test.environments.osimage.stanza |mkdef -z;fi +end + + diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza new file mode 100644 index 000000000..903363536 --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.stanza @@ -0,0 +1,21 @@ +# + +test.environments.osimage: + objtype=osimage + environvar=GITREPO=/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo,SWDIR=/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir + imagetype=linux + osarch=ppc64le + osdistroname=rhels7.5-alternate-ppc64le + osname=Linux + osvers=rhels7.5-alternate + otherpkgdir=/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir/otherpkgdir/ + otherpkglist=/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test1.otherpkglist,/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/otherpkglist/test2.otherpkglist, + permission=755 + pkgdir=/install/rhels7.5-alternate/ppc64le,/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/swdir/pkgdir/ + pkglist=/opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.pkglist,/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test1.pkglist,/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/pkglist/test2.pkglist + postinstall=/opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.postinstall,/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/postinstall/test1.postinstall + profile=compute + provmethod=netboot + rootimgdir=/install/custom/test.environments.osimage + synclists=/opt/xcat/share/xcat/tools/autotest/testcase/xcat-inventory/templates/environment/gitrepo/syncfiles/synclist + usercomment=rhels7.5,test_environment_variables diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json new file mode 100644 index 000000000..68752808b --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.json @@ -0,0 +1,50 @@ +{ + "osimage": { + "test.environments.osimage": { + "basic_attributes": { + "arch": "ppc64le", + "distribution": "rhels7.5-alternate", + "osdistro": "rhels7.5-alternate-ppc64le", + "osname": "Linux" + }, + "deprecated": { + "comments": "rhels7.5,test_environment_variables" + }, + "filestosync": [ + "{{GITREPO}}/syncfiles/synclist" + ], + "genimgoptions": { + "permission": "755", + "postinstall": [ + "/opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.postinstall", + "{{GITREPO}}/postinstall/test1.postinstall" + ], + "rootimgdir": "/install/custom/test.environments.osimage" + }, + "imagetype": "linux", + "package_selection": { + "otherpkgdir": [ + "{{SWDIR}}/otherpkgdir/" + ], + "otherpkglist": [ + "{{GITREPO}}/otherpkglist/test1.otherpkglist", + "{{GITREPO}}/otherpkglist/test2.otherpkglist", + "" + ], + "pkgdir": [ + "/install/rhels7.5-alternate/ppc64le", + "{{SWDIR}}/pkgdir/" + ], + "pkglist": [ + "/opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.pkglist", + "{{GITREPO}}/pkglist/test1.pkglist", + "{{GITREPO}}/pkglist/test2.pkglist" + ] + }, + "provision_mode": "netboot", + "role": "compute" + } + }, + "schema_version": "1.0" +} +#Version 2.14.2 (git commit 09f0772835afdc0f962c9e7fe8cef862e9505ad7, built Tue Jun 19 01:58:56 EDT 2018) diff --git a/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml new file mode 100644 index 000000000..c4f10968e --- /dev/null +++ b/xCAT-test/autotest/testcase/xcat-inventory/templates/environment/test.environments.osimage.update.yaml @@ -0,0 +1,35 @@ +osimage: + test.environments.osimage: + basic_attributes: + arch: ppc64le + distribution: rhels7.5-alternate + osdistro: rhels7.5-alternate-ppc64le + osname: Linux + deprecated: + comments: rhels7.5,test_environment_variables + filestosync: + - '{{GITREPO}}/syncfiles/synclist' + genimgoptions: + permission: '755' + postinstall: + - /opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.postinstall + - '{{GITREPO}}/postinstall/test1.postinstall' + rootimgdir: /install/custom/test.environments.osimage + imagetype: linux + package_selection: + otherpkgdir: + - '{{SWDIR}}/otherpkgdir/' + otherpkglist: + - '{{GITREPO}}/otherpkglist/test1.otherpkglist' + - '{{GITREPO}}/otherpkglist/test2.otherpkglist' + - '' + pkgdir: + - /install/rhels7.5-alternate/ppc64le + - '{{SWDIR}}/pkgdir/' + pkglist: + - /opt/xcat/share/xcat/netboot/rh/compute.rhels7.ppc64le.pkglist + - '{{GITREPO}}/pkglist/test1.pkglist' + - '{{GITREPO}}/pkglist/test2.pkglist' + provision_mode: netboot + role: compute +schema_version: '1.0' From ca5cc198b3008659034174e2c0577fb0f230956e Mon Sep 17 00:00:00 2001 From: huweihua Date: Wed, 4 Jul 2018 03:40:44 -0400 Subject: [PATCH 77/93] sync up older files at same time --- xCAT-test/autotest/bundle/sles12.1_ppc64le.bundle | 12 ++++++------ xCAT-test/autotest/bundle/sles12.1_x86_64.bundle | 12 ++++++------ xCAT-test/autotest/bundle/sles12_ppc64le.bundle | 12 ++++++------ xCAT-test/autotest/bundle/sles12_x86_64.bundle | 12 ++++++------ xCAT-test/autotest/bundle/ubuntu16.04_ppc64le.bundle | 12 ++++++------ xCAT-test/autotest/bundle/ubuntu16.04_x86_64.bundle | 12 ++++++------ 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/xCAT-test/autotest/bundle/sles12.1_ppc64le.bundle b/xCAT-test/autotest/bundle/sles12.1_ppc64le.bundle index 34517a629..909d022ac 100644 --- a/xCAT-test/autotest/bundle/sles12.1_ppc64le.bundle +++ b/xCAT-test/autotest/bundle/sles12.1_ppc64le.bundle @@ -215,12 +215,12 @@ switchdiscover_range_z_V nodeset_shell nodeset_cmdline nodeset_runimg -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission xcatconfig_u_check_xcatsslversion_rhels_sles sles_migration1 sles_migration2 diff --git a/xCAT-test/autotest/bundle/sles12.1_x86_64.bundle b/xCAT-test/autotest/bundle/sles12.1_x86_64.bundle index 8d738fa2e..732813702 100644 --- a/xCAT-test/autotest/bundle/sles12.1_x86_64.bundle +++ b/xCAT-test/autotest/bundle/sles12.1_x86_64.bundle @@ -212,12 +212,12 @@ nodeset_shell nodeset_cmdline nodeset_runimg nodeset_check_warninginfo -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission xcatconfig_u_check_xcatsslversion_rhels_sles sles_migration1 sles_migration2 diff --git a/xCAT-test/autotest/bundle/sles12_ppc64le.bundle b/xCAT-test/autotest/bundle/sles12_ppc64le.bundle index 4189d2a14..90f286d24 100644 --- a/xCAT-test/autotest/bundle/sles12_ppc64le.bundle +++ b/xCAT-test/autotest/bundle/sles12_ppc64le.bundle @@ -198,12 +198,12 @@ switchdiscover_range_z_V nodeset_shell nodeset_cmdline nodeset_runimg -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission sles_migration1 sles_migration2 reg_linux_statelite_installation_flat diff --git a/xCAT-test/autotest/bundle/sles12_x86_64.bundle b/xCAT-test/autotest/bundle/sles12_x86_64.bundle index 91afe00d7..43c40e086 100644 --- a/xCAT-test/autotest/bundle/sles12_x86_64.bundle +++ b/xCAT-test/autotest/bundle/sles12_x86_64.bundle @@ -203,12 +203,12 @@ nodeset_shell nodeset_cmdline nodeset_runimg nodeset_check_warninginfo -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission reg_linux_diskless_installation_flat reg_linux_statelite_installation_flat SN_setup_case diff --git a/xCAT-test/autotest/bundle/ubuntu16.04_ppc64le.bundle b/xCAT-test/autotest/bundle/ubuntu16.04_ppc64le.bundle index fe8341451..5d8b1e49f 100644 --- a/xCAT-test/autotest/bundle/ubuntu16.04_ppc64le.bundle +++ b/xCAT-test/autotest/bundle/ubuntu16.04_ppc64le.bundle @@ -233,12 +233,12 @@ switchdiscover_range_r switchdiscover_range_x switchdiscover_range_z switchdiscover_range_z_V -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission nodeset_shell nodeset_cmdline nodeset_runimg diff --git a/xCAT-test/autotest/bundle/ubuntu16.04_x86_64.bundle b/xCAT-test/autotest/bundle/ubuntu16.04_x86_64.bundle index 3f79a8fc5..10eeb89e6 100644 --- a/xCAT-test/autotest/bundle/ubuntu16.04_x86_64.bundle +++ b/xCAT-test/autotest/bundle/ubuntu16.04_x86_64.bundle @@ -243,10 +243,10 @@ switchdiscover_range_z_V nodeset_shell nodeset_cmdline nodeset_runimg -xcatd_start_systemd -xcatd_stop_systemd -xcatd_restart_systemd -run_command_with_XCATBYPASS_systemd -disable_root_permission_in_policy_table_systemd -assign_certain_command_permission_systemd +xcatd_start +xcatd_stop +xcatd_restart +run_command_with_XCATBYPASS +disable_root_permission_in_policy_table +assign_certain_command_permission nodeset_check_warninginfo From a1482e074ccd943f7f59873d9b80fd2621177365 Mon Sep 17 00:00:00 2001 From: yangsbj Date: Wed, 4 Jul 2018 04:58:38 -0400 Subject: [PATCH 78/93] refine doc for mkdef --template --- .../common/deployment/create_img.rst | 15 +++++----- .../ppc64le/discovery/manually_define.rst | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/docs/source/guides/admin-guides/manage_clusters/common/deployment/create_img.rst b/docs/source/guides/admin-guides/manage_clusters/common/deployment/create_img.rst index a7dbc54ec..6de3688dd 100644 --- a/docs/source/guides/admin-guides/manage_clusters/common/deployment/create_img.rst +++ b/docs/source/guides/admin-guides/manage_clusters/common/deployment/create_img.rst @@ -3,7 +3,7 @@ Select or Create an osimage Definition Before creating an image on xCAT, the distro media should be prepared ahead. That can be ISOs or DVDs. -XCAT use 'copycds' command to create an image which will be available to install nodes. "copycds" will copy all contents of Distribution DVDs/ISOs or Service Pack DVDs/ISOs to a destination directory, and create several relevant osimage definitions by default. +XCAT use 'copycds' command to create an image which will be available to install nodes. ``copycds`` will copy all contents of Distribution DVDs/ISOs or Service Pack DVDs/ISOs to a destination directory, and create several relevant osimage definitions by default. If using an ISO, copy it to (or NFS mount it on) the management node, and then run: :: @@ -81,15 +81,16 @@ In this way, if you need to install some additional RPMs into your MN later, you **[Tips 2]** -You can create/modify an osimage definition easily based on the default osimage definition. The general steps are: +You can create/modify an osimage definition easily with any existing osimage definition, the command is :: + + mkdef -t osimage -o --template [=, ...] -* lsdef -t osimage -z --install-compute > .stanza -* modify .stanza according to your requirements -* cat .stanza| mkdef -z +Except the specified attributes **, the attributes of ** will inherit the values of template osimage **. -For example, if you need to change the osimage name to your favorite name, this command may be helpful: :: +As an example, the following command creates a new osimage "myosimage.rh7.compute.netboot" based on the existing osimage "rhels7.4-ppc64le-netboot-compute" with some customized attributes :: + + mkdef -t osimage -o myosimage.rh7.compute.netboot --template rhels7.4-ppc64le-netboot-compute synclists=/tmp/synclist otherpkgdir=/install/custom/osimage/myosimage.rh7.compute.netboot/3rdpkgs/ otherpkglist=/install/custom/osimage/myosimage.rh7.compute.netboot/3rd.pkglist - chdef -t osimage rhels6.2-x86_64-install-compute -n rhels6.2_myimage diff --git a/docs/source/guides/admin-guides/manage_clusters/ppc64le/discovery/manually_define.rst b/docs/source/guides/admin-guides/manage_clusters/ppc64le/discovery/manually_define.rst index 3d516d760..01150949d 100644 --- a/docs/source/guides/admin-guides/manage_clusters/ppc64le/discovery/manually_define.rst +++ b/docs/source/guides/admin-guides/manage_clusters/ppc64le/discovery/manually_define.rst @@ -29,3 +29,32 @@ The manually defined node will be like this:: postbootscripts=otherpkgs postscripts=syslog,remoteshell,syncfiles primarynic=mac + + +``mkdef --template`` can be used to create node definitions easily from the typical node definition templates or existing node definitions, some examples: + +* creating node definition "cn2" with an existing node definition "cn1" :: + + # mkdef -t node -o cn2 --template cn1 mac=66:55:44:33:22:11 ip=172.12.139.2 bmc=172.11.139.2 + 1 object definitions have been created or modified. + + except the attributes specified(``mac``, ``ip`` and ``bmc`` attribute here), other attibutes of the newly created node "cn2" inherit the values of template node "cn1" + +* creating a node definition "cn2" with the template "ppc64le-openbmc-template"(openbmc controlled ppc64le node) shipped by xCAT :: + + # mkdef -t node -o cn2 --template ppc64le-openbmc-template mac=66:55:44:33:22:11 ip=172.12.139.2 bmc=172.11.139.2 bmcpassword=USERID bmcusername=PASSW0RD + 1 object definitions have been created or modified. + + the unspecified attributes of newly created node "cn2" will be assigned with the default values in the template + + to list all the node definition templates available in xCAT, run :: + + # lsdef -t node --template + + to display the full definition of template "ppc64le-openbmc-template", run :: + + # lsdef -t node --template ppc64le-openbmc-template + + the mandatory attributes, which must be specified while creating definitions with templates, are denoted with the value ``MANDATORY:`` in template definition. + + the optional attributes, which can be specified optionally, are denoted with the value ``OPTIONAL:`` in template definition From 45a602bdf6b5cbd2453592c813dafaf6027019ca Mon Sep 17 00:00:00 2001 From: xuweibj Date: Wed, 4 Jul 2018 02:37:37 -0400 Subject: [PATCH 79/93] update hwinv table by updatenode -P geinv --- xCAT-server/lib/xcat/plugins/updatehwinv.pm | 68 +++++++++++++++++++++ xCAT-server/sbin/xcatconfig | 2 + xCAT/postscripts/getinv | 46 ++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 xCAT-server/lib/xcat/plugins/updatehwinv.pm create mode 100755 xCAT/postscripts/getinv diff --git a/xCAT-server/lib/xcat/plugins/updatehwinv.pm b/xCAT-server/lib/xcat/plugins/updatehwinv.pm new file mode 100644 index 000000000..552634a9b --- /dev/null +++ b/xCAT-server/lib/xcat/plugins/updatehwinv.pm @@ -0,0 +1,68 @@ +#!/usr/bin/perl +# IBM(c) 2018 EPL license http://www.eclipse.org/legal/epl-v10.html + +package xCAT_plugin::updatehwinv; + +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; +use strict; +use warnings "all"; +use xCAT::Table; +use xCAT::Utils; + +#------------------------------------------------------- + +=head3 handled_commands + + Return list of commands handled by this plugin + +=cut + +#------------------------------------------------------- +sub handled_commands { + return { + updatehwinv => 'updatehwinv', + }; +} + +sub process_request { + my $req = shift; + my $callback = shift; + + if ($req->{command}->[0] eq "updatehwinv") { + update_hw_inv($req); + } +} + +sub update_hw_inv { + my $request = shift; + my $node = $request->{'_xcat_clienthost'}->[0]; + + my @nodefs; + my $basicdata; + + my @hwinv_info = ("cpucount", "cputype", "memory", "disksize"); + + foreach my $hwinv_type (@hwinv_info) { + if (defined($request->{$hwinv_type}) and $request->{$hwinv_type}->[0]) { + $basicdata->{$hwinv_type} = $request->{$hwinv_type}->[0]; + } else { + push @nodefs, $hwinv_type; + } + } + + if ($basicdata) { + my $hwinv_tab = xCAT::Table->new("hwinv", -create => 1); + xCAT::MsgUtils->message("S", "xcat.hwinv: Update hwinv for $node"); + $hwinv_tab->setNodeAttribs($node, $basicdata); + } + if (@nodefs) { + my $nodef = join(",", @nodefs); + xCAT::MsgUtils->message("E", "xcat.hwinv: No valid hwinv info $nodef received from $node"); + } +} + +1; diff --git a/xCAT-server/sbin/xcatconfig b/xCAT-server/sbin/xcatconfig index be5e512ca..448dea05d 100755 --- a/xCAT-server/sbin/xcatconfig +++ b/xCAT-server/sbin/xcatconfig @@ -1360,6 +1360,8 @@ sub initDB "$::XCATROOT/sbin/chtab priority=4.8 policy.commands=litetree policy.rule=allow;"; $chtabcmds .= "$::XCATROOT/sbin/chtab priority=4.9 policy.commands=getadapter policy.rule=allow;"; + $chtabcmds .= +"$::XCATROOT/sbin/chtab priority=4.10 policy.commands=updatehwinv policy.rule=allow;"; } my $outref = xCAT::Utils->runcmd("$chtabcmds", 0); if ($::RUNCMD_RC != 0) diff --git a/xCAT/postscripts/getinv b/xCAT/postscripts/getinv new file mode 100755 index 000000000..55c95fff4 --- /dev/null +++ b/xCAT/postscripts/getinv @@ -0,0 +1,46 @@ +#!/bin/bash + +if [ -z "$XCATDEST" ]; then + XCATDEST=$1 +fi + +if [ -z "$XCATDEST" ]; then + XCATDEST=$MASTER_IP:$XCATDPORT +fi + +tmp_file=/tmp/invinfo.xml + +CPUCOUNT=`lscpu | grep "^CPU(s)" | awk -F':' '{print $2}' | sed 's/^[ \t]*//g'` +CPUTYPE=`lscpu | grep "Model name" | awk -F':' '{print $2}' | sed 's/^[ \t]*//g'` +MEMORY=`cat /proc/meminfo |grep MemTotal|awk '{printf "%.0fMB\n", $2/1024}'` +DISKSIZE="$(grep -v name /proc/partitions |sort -g -k 1,2 |awk 'BEGIN{sep=""} /[^0-9]$/{printf("%s%s:%.0fGB", sep, $4, $3/1024^2) ; sep=","}')" + +echo "" > $tmp_file +echo "updatehwinv" >> $tmp_file +echo "$CPUCOUNT" >> $tmp_file +echo "$CPUTYPE" >> $tmp_file +echo "$MEMORY" >> $tmp_file +echo "$DISKSIZE" >> $tmp_file +echo "" >> $tmp_file + +xml_file=/tmp/hwinv.xml +rm -f $xml_file + +while [ ! -f $xml_file ] || grep error $xml_file; do + if [ -f $xml_file ]; then + timer=60 + while [ $timer -gt 0 ]; do + sleep 1 + echo -en "Retrying in $timer seconds \r" + timer=$(($timer-1)); + done + fi + + if [ -f /etc/xcat/cert.pem -a -f /etc/xcat/certkey.pem ]; then + cat $tmp_file | openssl s_client -key /etc/xcat/certkey.pem -cert /etc/xcat/cert.pem -connect $XCATDEST -quiet 2> /dev/null > $xml_file + else + cat $tmp_file | openssl s_client -connect $XCATDEST -quiet 2> /dev/null > $xml_file + fi +done + +rm $tmp_file From 8b21219cbacbbfd26bf9d63e062906e52896d373 Mon Sep 17 00:00:00 2001 From: zet809 Date: Thu, 5 Jul 2018 15:53:37 +0800 Subject: [PATCH 80/93] fix issue 2306: Need to clean up the temporary xCAT node during discovery regarding rcons (#5373) * fix issue 2306: Need to clean up the temporary xCAT node during discovery regarding rcons, add "makegocons -C" to cleanup all undefined node * fix issue 2306: replace cleanup with delete entry for specified node --- xCAT-server/lib/xcat/plugins/nodediscover.pm | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/nodediscover.pm b/xCAT-server/lib/xcat/plugins/nodediscover.pm index d65bb9d8a..5b226da91 100644 --- a/xCAT-server/lib/xcat/plugins/nodediscover.pm +++ b/xCAT-server/lib/xcat/plugins/nodediscover.pm @@ -456,9 +456,25 @@ sub process_request { $callback->({ error => ["The node [$node] should have a correct IP address which belongs to the management network."], errorcode => ["1"] }); return; } + + my $bmc_node = undef; + if (defined($request->{bmc_node}) and defined($request->{bmc_node}->[0])) { + $bmc_node = $request->{bmc_node}->[0]; + } + + if (-x "/usr/bin/goconserver") { + xCAT::MsgUtils->message("S", "xcat.discovery.nodediscover: remove gocons session for $bmc_node"); + require xCAT::Goconserver; + if (xCAT::Goconserver::is_goconserver_running()) { + my $api_url = "https://localhost:". xCAT::Goconserver::get_api_port(); + xCAT::Goconserver::delete_nodes($api_url, {"$bmc_node" => 1}, 1, $callback); + } + } else { + xCAT::MsgUtils->message("S", "xcat.discovery.nodediscover: After discovery done, please use 'makeconservercf -C' to clean up undefined nodes from conserver"); + } + if (defined($request->{bmcinband})) { - if (defined($request->{bmc_node}) and defined($request->{bmc_node}->[0])) { - my $bmc_node = $request->{bmc_node}->[0]; + if (defined($bmc_node)) { xCAT::MsgUtils->message("S", "xcat.discovery.nodediscover: Removing discovered BMC nodes definition: $bmc_node..."); my $rmcmd = "rmdef $bmc_node"; xCAT::Utils->runcmd($rmcmd, 0); @@ -470,8 +486,7 @@ sub process_request { } } } else { - if (defined($request->{bmc_node}) and defined($request->{bmc_node}->[0])) { - my $bmc_node = $request->{bmc_node}->[0]; + if (defined($bmc_node)) { if ($bmc_node =~ /\,/) { xCAT::MsgUtils->message("W", "Multiple BMC nodes matched with no bmcinband specified, please remove manually"); } else { @@ -481,7 +496,7 @@ sub process_request { } } } - + my $restartstring = "restart"; if (scalar @forcenics > 0) { From 444ac00f4fed4c246294d3783fce234170d4e12b Mon Sep 17 00:00:00 2001 From: huweihua Date: Fri, 6 Jul 2018 01:36:53 -0400 Subject: [PATCH 81/93] Modify xcatd_stop test case to satisfy all rhel, sles and ubuntu os --- xCAT-test/autotest/testcase/xcatd/case0 | 2 -- 1 file changed, 2 deletions(-) diff --git a/xCAT-test/autotest/testcase/xcatd/case0 b/xCAT-test/autotest/testcase/xcatd/case0 index 83974ae52..8876f1f1b 100644 --- a/xCAT-test/autotest/testcase/xcatd/case0 +++ b/xCAT-test/autotest/testcase/xcatd/case0 @@ -55,8 +55,6 @@ check:output=~xcatd service|xcatd.service check:output=~xcatd service is running|active \(running\) cmd:service xcatd stop check:rc==0 -check:output=~Stopping x(cat|CAT)d -check:output=~[ OK ] cmd:sleep 3 cmd:service xcatd status check:output=~xcatd service|xcatd.service From 4c5a2bbd770cac12f4854cbe0e4bf471daa711b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Fri, 6 Jul 2018 15:22:59 +0800 Subject: [PATCH 82/93] Fix github issue #5365. Thinker for the openssl s_client -no_ssl2 command line argument (#5376) --- xCAT/postscripts/getcredentials.awk | 2 +- xCAT/postscripts/getpostscript.awk | 2 +- xCAT/postscripts/startsyncfiles.awk | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xCAT/postscripts/getcredentials.awk b/xCAT/postscripts/getcredentials.awk index 8e42c1da2..61bc91324 100755 --- a/xCAT/postscripts/getcredentials.awk +++ b/xCAT/postscripts/getcredentials.awk @@ -2,7 +2,7 @@ BEGIN { if ((ENVIRON["USEOPENSSLFORXCAT"]) || (ENVIRON["AIX"])) { server = "openssl s_client -quiet -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" - if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + if (!system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { server = "openssl s_client -quiet -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } } else { diff --git a/xCAT/postscripts/getpostscript.awk b/xCAT/postscripts/getpostscript.awk index 4afde78ec..985b34dcb 100755 --- a/xCAT/postscripts/getpostscript.awk +++ b/xCAT/postscripts/getpostscript.awk @@ -2,7 +2,7 @@ BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" - if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + if (!system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" } } else { diff --git a/xCAT/postscripts/startsyncfiles.awk b/xCAT/postscripts/startsyncfiles.awk index f146f5d03..3219f1c53 100755 --- a/xCAT/postscripts/startsyncfiles.awk +++ b/xCAT/postscripts/startsyncfiles.awk @@ -2,7 +2,7 @@ BEGIN { if (ENVIRON["USEOPENSSLFORXCAT"]) { server = "openssl s_client -no_ssl3 -connect " ENVIRON["XCATSERVER"] " -rand /bin/nice 2> /dev/null" - if (system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { + if (!system("openssl s_client -help 2>&1 | grep -m 1 -q -- -no_ssl2")) { server = "openssl s_client -no_ssl3 -no_ssl2 -connect " ENVIRON["XCATSERVER"] " 2> /dev/null" } } else { From 8209b449c61e0df3cc36975aa9dd785935218b87 Mon Sep 17 00:00:00 2001 From: xuweibj Date: Fri, 6 Jul 2018 04:00:56 -0400 Subject: [PATCH 83/93] delete change policy table by xcat --- xCAT-server/lib/xcat/plugins/updatehwinv.pm | 13 +++++++++++-- xCAT-server/sbin/xcatconfig | 2 -- xCAT/postscripts/getinv | 5 +++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/updatehwinv.pm b/xCAT-server/lib/xcat/plugins/updatehwinv.pm index 552634a9b..d91460804 100644 --- a/xCAT-server/lib/xcat/plugins/updatehwinv.pm +++ b/xCAT-server/lib/xcat/plugins/updatehwinv.pm @@ -12,6 +12,7 @@ use strict; use warnings "all"; use xCAT::Table; use xCAT::Utils; +use xCAT::NodeRange; #------------------------------------------------------- @@ -38,8 +39,16 @@ sub process_request { } sub update_hw_inv { - my $request = shift; - my $node = $request->{'_xcat_clienthost'}->[0]; + my $request = shift; + my $tmp_node = $request->{'_xcat_clienthost'}->[0]; + my @valid_node = xCAT::NodeRange::noderange($tmp_node); + + unless (@valid_node) { + xCAT::MsgUtils->message("S", "xcat.hwinv: Received invalid node $tmp_node hwinv info, ignore..."); + return; + } + + my $node = $valid_node[0]; my @nodefs; my $basicdata; diff --git a/xCAT-server/sbin/xcatconfig b/xCAT-server/sbin/xcatconfig index 448dea05d..be5e512ca 100755 --- a/xCAT-server/sbin/xcatconfig +++ b/xCAT-server/sbin/xcatconfig @@ -1360,8 +1360,6 @@ sub initDB "$::XCATROOT/sbin/chtab priority=4.8 policy.commands=litetree policy.rule=allow;"; $chtabcmds .= "$::XCATROOT/sbin/chtab priority=4.9 policy.commands=getadapter policy.rule=allow;"; - $chtabcmds .= -"$::XCATROOT/sbin/chtab priority=4.10 policy.commands=updatehwinv policy.rule=allow;"; } my $outref = xCAT::Utils->runcmd("$chtabcmds", 0); if ($::RUNCMD_RC != 0) diff --git a/xCAT/postscripts/getinv b/xCAT/postscripts/getinv index 55c95fff4..f452b7256 100755 --- a/xCAT/postscripts/getinv +++ b/xCAT/postscripts/getinv @@ -28,6 +28,11 @@ rm -f $xml_file while [ ! -f $xml_file ] || grep error $xml_file; do if [ -f $xml_file ]; then + if grep "Permission denied for request" $xml_file; then + echo -en "Please run 'chtab priority=4.10 policy.commands=updatehwinv policy.rule=allow' to allow 'updatehwinv' command \r"; + rm $tmp_file + exit 1 + fi timer=60 while [ $timer -gt 0 ]; do sleep 1 From f89470008714ff4c6a8dd02b6f04e538bcda1d8f Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Mon, 9 Jul 2018 13:25:00 +0800 Subject: [PATCH 84/93] Make xcattest can supprot multiple values for key words hcp and arch (#5379) --- xCAT-test/autotest/testcase/rpower/cases0 | 12 +++--- xCAT-test/xcattest | 49 +++++++++++++++-------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/xCAT-test/autotest/testcase/rpower/cases0 b/xCAT-test/autotest/testcase/rpower/cases0 index 243d8a6fb..399ab93a3 100644 --- a/xCAT-test/autotest/testcase/rpower/cases0 +++ b/xCAT-test/autotest/testcase/rpower/cases0 @@ -173,27 +173,27 @@ check:rc==0 end start:rpower_suspend_OpenpowerBmc -hcp:openbmc +hcp:openbmc,ipmi label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN suspend -check:output=~Error: (\[.*?\]: )?Unsupported command: rpower suspend +check:output=~Error: (\[.*?\]: )?[Uu]nsupported command[:]* rpower suspend check:rc==1 end start:rpower_wake_OpenpowerBmc -hcp:openbmc +hcp:openbmc,ipmi label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN wake -check:output=~Error: (\[.*?\]: )?Unsupported command: rpower wake +check:output=~Error: (\[.*?\]: )?[Uu]nsupported command[:]* rpower wake check:rc==1 end start:rpower_errorcommand_OpenpowerBmc -hcp:openbmc +hcp:openbmc,ipmi label:cn_bmc_ready,hctrl_openpower_ipmi,hctrl_openbmc cmd:rpower $$CN ddd -check:output=~Error: (\[.*?\]: )?Unsupported command: rpower ddd +check:output=~Error: (\[.*?\]: )?[Uu]nsupported command[:]* rpower ddd check:rc==1 end diff --git a/xCAT-test/xcattest b/xCAT-test/xcattest index 2e72eff2a..0a1ef119b 100755 --- a/xCAT-test/xcattest +++ b/xCAT-test/xcattest @@ -1052,15 +1052,21 @@ sub load_case { $case_ref->[$i]->{arch} = $1; if ($run_case_flag) { - + #To judge whether need to skip the current case - my $case_arch = $case_ref->[$i]->{arch}; - if ($case_arch =~ /ppc/i && $case_arch !~ /le|el/i) { - $case_arch = "ppc"; - } elsif ($case_arch =~ /ppc/i && $case_arch =~ /le|el/i) { - $case_arch = "ppc64le"; - } elsif ($case_arch =~ /x86/i) { - $case_arch = "x86"; + + my @vaild_archs_tmp = split(",", $case_ref->[$i]->{arch}); + my @vaild_archs=(); + foreach my $arch (@vaild_archs_tmp){ + my $tmp_str=""; + if ($arch =~ /ppc/i && $arch !~ /le|el/i) { + $tmp_str = "ppc"; + } elsif ($arch =~ /ppc/i && $arch =~ /le|el/i) { + $tmp_str = "ppc64le"; + } elsif ($arch =~ /x86/i) { + $tmp_str = "x86"; + } + push @vaild_archs, $tmp_str; } my $env_arch = ""; @@ -1079,10 +1085,13 @@ sub load_case { } my $valid = 0; - if ($case_arch eq $env_arch) { - $valid = 1; - if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { - delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); + foreach my $arch (@vaild_archs){ + if ($arch eq $env_arch) { + $valid = 1; + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { + delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); + } + last; } } unless ($valid) { @@ -1104,12 +1113,18 @@ sub load_case { #To judge whether need to skip the current case my $valid = 0; - if (exists($config{var}{HCP}) && ($case_ref->[$i]->{hcp} =~ /$config{var}{HCP}/i)) { - $valid = 1; - if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { - delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); + my @valid_hcps = split(",", $case_ref->[$i]->{hcp}); + + foreach my $hcp (@valid_hcps){ + $hcp =~ s/^\s+|\s+$//g; + if (exists($config{var}{HCP}) && ($hcp =~ /^$config{var}{HCP}$/i)) { + $valid = 1; + if (grep (/$case_ref->[$i]->{name}/, @{ $invalidcases{"noruncases"} })) { + delete_item_from_array($case_ref->[$i]->{name}, $invalidcases{"noruncases"}); + } + last; } - } + } unless ($valid) { if (exists($case_name_index_map_bak{ $case_ref->[$i]->{name} })) { $$case_name_index_map_ref{ $case_ref->[$i]->{name} } = $case_name_index_map_bak{ $case_ref->[$i]->{name} }; From de3e5da935762e143d89acc2c14b13693b40d943 Mon Sep 17 00:00:00 2001 From: GONG Jie Date: Mon, 9 Jul 2018 16:57:54 +0800 Subject: [PATCH 85/93] Fix github issue #5365. Tinker for the openssl -no_ssl2 command line argument --- xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk | 4 ++-- xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite | 2 +- .../xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk index 71cb96d5e..d83d4ffb1 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.localdisk @@ -68,9 +68,9 @@ xCATCmd () { # $2 is the command ARCH=`uname -m` if [ x$ARCH = x"ppc64" -a x$OS = x"rh" ]; then - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(/usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null else - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null fi } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite index d41376de9..56e39f60b 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -quiet -no_ssl3 $(LD_LIBRARY_PATH=${MNTDIR}/lib64:${MNTDIR}/usr/lib64 ${MNTDIR}/usr/bin/openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null } diff --git a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat index 8507f8127..fafd5ebaf 100755 --- a/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat +++ b/xCAT-server/share/xcat/netboot/add-on/statelite/rc.statelite.ppc.redhat @@ -128,7 +128,7 @@ GetSyncInfo () { xCATCmd () { # $1 is the xCAT server # $2 is the command - echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null + echo "\n${2}\n" | /usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -quiet -no_ssl3 $(/usr/sbin/chroot ${MNTDIR} /usr/bin/openssl s_client -help 2>&1 | grep -m 1 -o -- -no_ssl2) -connect ${1} -rand /bin/nice 2>/dev/null } From 49f02a8f205d11ab53756ec91caacb44bd36ed20 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Tue, 10 Jul 2018 04:31:33 -0400 Subject: [PATCH 86/93] release information for 2.14.2 --- docs/source/conf.py | 2 +- docs/source/overview/xcat2_release.rst | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index b51055b4e..834fc0065 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -59,7 +59,7 @@ author = u'IBM Corporation' # The short X.Y version. version = '2' # The full version, including alpha/beta/rc tags. -release = '2.14.1' +release = '2.14.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/overview/xcat2_release.rst b/docs/source/overview/xcat2_release.rst index ee7b62dfd..517a5433e 100644 --- a/docs/source/overview/xcat2_release.rst +++ b/docs/source/overview/xcat2_release.rst @@ -14,6 +14,12 @@ xCAT 2.14.x |xCAT |New OS |New |New Feature | |Version | |Hardware | | +=================================+===============+=============+==================================+ +|| xCAT 2.14.2 2018/7/13 |- ubuntu18.04 | | | +|| | | | | +| `2.14.2 Release Notes `_ | | | | ++---------------------------------+---------------+-------------+----------------------------------+ || xCAT 2.14.1 |- RHV4.2 + | |- OpenBMC in python enhance: | || 2018/6/1 | RHEL7.5 + p8 | | | || | | | rinv enhance,issue #5176 | From 5b884145200ede16f7d953a0b8db3897bffce800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Tue, 10 Jul 2018 16:37:15 +0800 Subject: [PATCH 87/93] Update for test case install_xCAT_on_ubuntu (#5387) --- .../autotest/testcase/go-xcat/bionic-ppc64el.sources.list | 3 +++ xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list create mode 100644 xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list diff --git a/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list b/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list new file mode 100644 index 000000000..8e1b779ec --- /dev/null +++ b/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list @@ -0,0 +1,3 @@ +deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted +deb http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted +deb http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted diff --git a/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list b/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list new file mode 100644 index 000000000..f61a6dcf0 --- /dev/null +++ b/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list @@ -0,0 +1,3 @@ +deb http://archive.ubuntu.com/ubuntu bionic main restricted +deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted +deb http://archive.ubuntu.com/ubuntu bionic-security main restricted From a75baf82154aa55c039205509f18cafdc17d747c Mon Sep 17 00:00:00 2001 From: Ryan Bowen Date: Tue, 10 Jul 2018 12:14:08 -0400 Subject: [PATCH 88/93] Add check for leading zeroes in ip address when running makedns This adds a check for the presence of leading zeroes in any octet of IPv4 addresses for which DNS entries will be created. --- xCAT-server/lib/xcat/plugins/ddns.pm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xCAT-server/lib/xcat/plugins/ddns.pm b/xCAT-server/lib/xcat/plugins/ddns.pm index 2b6a1b2e3..f7d575a38 100644 --- a/xCAT-server/lib/xcat/plugins/ddns.pm +++ b/xCAT-server/lib/xcat/plugins/ddns.pm @@ -437,6 +437,10 @@ sub process_request { xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, address seems malformed.", $callback); next; } + if ($addr =~ /(?:^|\.)0+(?=\d)/ and $addr !~ /^[abcdef0123456789:]+$/) { + xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, ip address octets can not contain leading zeroes.", $callback); + next; + } unless ($names =~ /^[a-z0-9\. \t\n-]+$/i) { xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, names $names contain invalid characters (valid characters include a through z, numbers and the '-', but not '_'", $callback); next; From d3e73fb4359ee3d1a42034ea0aefe316e934aeb9 Mon Sep 17 00:00:00 2001 From: bybai Date: Wed, 11 Jul 2018 01:43:23 -0400 Subject: [PATCH 89/93] fix check for leading zeroes in ip address when running makehosts --- perl-xCAT/xCAT/NetworkUtils.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl-xCAT/xCAT/NetworkUtils.pm b/perl-xCAT/xCAT/NetworkUtils.pm index e3871e3f4..514e39f8a 100755 --- a/perl-xCAT/xCAT/NetworkUtils.pm +++ b/perl-xCAT/xCAT/NetworkUtils.pm @@ -2156,7 +2156,7 @@ sub isIpaddr return 0; } - if ($1 > 255 || $1 == 0 || $2 > 255 || $3 > 255 || $4 > 255) + if ($1 > 255 || $1 =~ /^0/ || $2 > 255 || $2 =~ /^0+(\d)/ || $3 > 255 || $3 =~ /^0+(\d)/ || $4 > 255 || $4 =~ /^0+(\d)/) { return 0; } From cc7ad619ccbc5ce03eba605f7b69457ebcc80a04 Mon Sep 17 00:00:00 2001 From: bybai Date: Wed, 11 Jul 2018 01:58:31 -0400 Subject: [PATCH 90/93] add new UT and polished --- perl-xCAT/xCAT/NetworkUtils.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl-xCAT/xCAT/NetworkUtils.pm b/perl-xCAT/xCAT/NetworkUtils.pm index 514e39f8a..7dba4a965 100755 --- a/perl-xCAT/xCAT/NetworkUtils.pm +++ b/perl-xCAT/xCAT/NetworkUtils.pm @@ -2156,7 +2156,7 @@ sub isIpaddr return 0; } - if ($1 > 255 || $1 =~ /^0/ || $2 > 255 || $2 =~ /^0+(\d)/ || $3 > 255 || $3 =~ /^0+(\d)/ || $4 > 255 || $4 =~ /^0+(\d)/) + if ($1 > 255 || $1 =~ /^0/ || $2 > 255 || $2 =~ /^0\d/ || $3 > 255 || $3 =~ /^0\d/ || $4 > 255 || $4 =~ /^0\d/) { return 0; } From c4517075c39df877a266a75ce7633a0462c5c36d Mon Sep 17 00:00:00 2001 From: Weihua Hu Date: Wed, 11 Jul 2018 16:24:33 +0800 Subject: [PATCH 91/93] Modify xcattest cases for bug 5382 (#5392) --- xCAT-test/autotest/testcase/makeconservercf/cases0 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xCAT-test/autotest/testcase/makeconservercf/cases0 b/xCAT-test/autotest/testcase/makeconservercf/cases0 index 963dbb695..219778d81 100644 --- a/xCAT-test/autotest/testcase/makeconservercf/cases0 +++ b/xCAT-test/autotest/testcase/makeconservercf/cases0 @@ -3,9 +3,9 @@ cmd:chdef -t node -o testnodetmp cons=hmc groups=all cmd:makeconservercf testnodetmp check:rc==0 cmd:cat /etc/conserver.cf -check:output=~console testnodetmp { +check:output=~console testnodetmp \{ check:output=~ /opt/xcat/share/xcat/cons/hmc testnodetmp; -check:output=~} +check:output=~\} cmd:rmdef -t node testnodetmp end @@ -14,9 +14,9 @@ cmd:chdef -t node -o testnodetmp cons=hmc groups=all cmd:makeconservercf testnodetmp check:rc==0 cmd:cat /etc/conserver.cf -check:output=~console testnodetmp { +check:output=~console testnodetmp \{ check:output=~ /opt/xcat/share/xcat/cons/hmc testnodetmp; -check:output=~} +check:output=~\} cmd:rmdef -t node testnodetmp end From 677f5f0c1ec47cabe4678801acd8f4abd2384039 Mon Sep 17 00:00:00 2001 From: GONG Jie Date: Wed, 11 Jul 2018 16:23:58 +0800 Subject: [PATCH 92/93] Update Ubuntu 18.04 bionic repositories for test case install_xCAT_on_ubuntu --- .../autotest/testcase/go-xcat/bionic-ppc64el.sources.list | 6 +++--- .../autotest/testcase/go-xcat/bionic-x86_64.sources.list | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list b/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list index 8e1b779ec..e29184320 100644 --- a/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list +++ b/xCAT-test/autotest/testcase/go-xcat/bionic-ppc64el.sources.list @@ -1,3 +1,3 @@ -deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted -deb http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted -deb http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted +deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe +deb http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted universe +deb http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted universe diff --git a/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list b/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list index f61a6dcf0..1af261f7a 100644 --- a/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list +++ b/xCAT-test/autotest/testcase/go-xcat/bionic-x86_64.sources.list @@ -1,3 +1,3 @@ -deb http://archive.ubuntu.com/ubuntu bionic main restricted -deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted -deb http://archive.ubuntu.com/ubuntu bionic-security main restricted +deb http://archive.ubuntu.com/ubuntu bionic main restricted universe +deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe +deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe From a89b4b6fd4bf1db27964b4693d8bd1540ee757aa Mon Sep 17 00:00:00 2001 From: ertaozh Date: Wed, 11 Jul 2018 16:56:53 +0800 Subject: [PATCH 93/93] Small modification about rflash ipmi enhance in PR #5346 --- xCAT-server/lib/xcat/plugins/ipmi.pm | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index 9207bd4b4..cfba7e458 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -2111,26 +2111,24 @@ sub do_firmware_update { # The target machine is *NOT* IBM Power S822LC for Big Data (Supermicro) # Only .hpm files is supported for such machine, no directory option is supported - if (defined $directory_name) { - my ($part1, $part2) = split(/Chassis Part Number :/, $output); - my ($part3, $model) = split(/\s+/, $part2); + if (defined $directory_name and $output =~ /Chassis Part Number\s*:\s*(\S*)/) { + my $model = $1; $exit_with_error_func->($sessdata->{node}, $callback, "Flashing of $model is not supported with pUpdate, supported Model Types: $BIG_DATA_MACHINE_MODELS"); } } # If we fall through here, it is *NOT* IBM Power S822LC for Big Data (Supermicro) and we expact some data in hpm_data_hash. # Verify hpm_data_hash has some values - if ((defined $hpm_data_hash{deviceID}) || - (defined $hpm_data_hash{productID}) || - (defined $hpm_data_hash{manufactureID})) { - if (($hpm_data_hash{deviceID} ne $sessdata->{device_id}) || - ($hpm_data_hash{productID} ne $sessdata->{prod_id}) || - ($hpm_data_hash{manufactureID} ne $sessdata->{mfg_id})) { - $exit_with_error_func->($sessdata->{node}, $callback, "The image file doesn't match target machine: \n$output"); - } - } else { - $exit_with_error_func->($sessdata->{node}, $callback, "No data was extracted from .hpm update file"); + + if (!exists($hpm_data_hash{deviceID}) + || !exists($hpm_data_hash{manufactureID}) + || !exists($hpm_data_hash{productID})) { + $exit_with_error_func->($sessdata->{node}, $callback, "Extract data from .hpm update file failed, no deviceID, productID or manufactureID got"); + } elsif (($hpm_data_hash{deviceID} ne $sessdata->{device_id}) || + ($hpm_data_hash{productID} ne $sessdata->{prod_id}) || + ($hpm_data_hash{manufactureID} ne $sessdata->{mfg_id})) { + $exit_with_error_func->($sessdata->{node}, $callback, "The image file doesn't match target machine: \n$output"); } # check for 8335-GTB Firmware above 1610A release. If below, exit

qQyzLfj65nBbIC3x`Bf3s44SsTu( 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%0AAbRC z5PLuR0aLlIT4?6H_k?9mi=?cVYU{KG$LG`fSwIBG~I(G@kw8Wdv_w39EoPoyBv%T-u$b zL7oE5yGD%Y?yV+4{t0Aw!WyK<FdrU1|J}k3Fp%JidFJ&CL#Yt4M zla_{U&C)l3yxAH%5GRZKycEsxvl0n()zuPvAU9M0;Y5C-%z0(kp-UMy{an-0jx_sc z$J?V6S##6p)(O1an)7EB%>YR})ss`{f4lvXq?F?j=bQJDz?bLuDka$l1@ zXu)W>ln!d>fJvGEtr#R$Y4(C{cf>_44g&TcbVtto*x!8%abWW+irs$El9jbS!4vrF zs7VE(|AhNAYBtHUOz8zzOQ-SZYa;-`zPK`^Hi#V{tp?2^v1G`+{ZRrt_SW6x`VmT4 z@`Bxtisl6{^afy|o#zZioGOEqf=?`*c6ZoGqEsK*)y(Mij-`2N*JW{@#5sddEh^Y* ziWACsqQ<3m8+&r1?v-^^Pv*`d;U^mQ>@ZAP^&kjKcWSc#s44UvuEjs{D3wT7!rAtb z@3M_|9m^!GlCV%PnGS&)PQXH%wxDEm-nw!Rl(=4OlEnd(qwJ~0VdVmR+Y+n4x^@QT zjIp~x;gCOiq;m4|RTO`joI~g3@v_86HRXW2$D^?&5ZjLve@$0eN`>Jt42IPB8*jo1z6x$l zfB&`kb7l5u#J_pey9KFK;LOY{heeZ!Ch)-eC-lePkiuhrjrpgCAtzmxi0@&UrZQ~5 zyJz!BiSbzQHwv?L$CUgR{jIlCvCW1Gkd^u1&dJ8!eUgr~Y;|ytaXOUVULP(y!-F^C zHn8pL7_x@rdYy`VR3V`#?SRO3vZq=A%r(|S8LF?Q!K^~`$F5JStD>3N@?=Y|H=tTU z{+aUWq$MBtD~cy`G~jIdE2=ZX5l{~O$K{C}W2t86GC-;lC9@DfV-%(@c!UrVBo ze`D`YZ3A$;M@z7a_qo7T3n`~~Hf9mrDVA)IZ3(HW5S27L2=u#R-r_=k1OgT$b{_wn z6i8~Y_JnkEux*v(H51ZUOy+;Rj#_>8A&&^o0FEr)QjS1PZ24!LvEd&X;P$F*+A`Za zIWl_#r$LzOd81n?&@Gy2Q2Wc+@cYzajh*as!#IhBR>lA@)&_>(=TP{3NJA%TR>PL* zZW{QbY4oL-?o~AsRjv}CJ6$$i%ZyTj6e4+mNYADAI1(Jr$9#k~wwvPQo?TkM3i8*v zh1{BK2m^Y|vKB(65AY~cUn^fgO9<4CBWmQ@P^iwy%~?6|0IgX&Xojeo>a(53?o{lu zJnAC_2u~Jm(UTMUQTd1A$4LeXt3Tt@bQ zr3`BfR-)FZvk?f0df$Pt zT2{*-Du<$vg0-^v-`A43a1DW#l$oTFzY0S}6Dd|mqs-N$>jTkEYuJkTvy!o~Cl~>6 zK0bAA{Wo!dS!bkVO6#T0>zPP!BvjO zH9mx?+P!IZwjyKoj1-CePPTx5YrHQ{ivX@1&2~Yoi3=2nr{Fl9IsE8d|62ydXb&8u zx&^p)9NTh%&GP}w1^SFauAtYGTy2Da4XmknTO`NON1#5zRsxe2>pi)^?GP6{>Y~=o zqb(>3g=b;jO?T@TocC9 zHv&r$Lsr%-AbL_>96*{(pBS^vC3@{yGdLa<$wDNvihcObcYA7Qg#?yKkD9qJMB?g= zKwZN(3>7T$jLK{%JnzV3QFY$45k`zG&$r*0fEh{Ne*R3XCl82KV;n+~{f6WrE@{&X zv80fp+Py8JZiidU>x-?FU(CYRr_f;3A*QP(xm(3R(y-m5!yh#{aT}3og`uXdv9gqv z$tALhhA_i67l$TLCT@A?l}$MFhLM!Wo6iWcGY({aOo+5b5-ALa4=}vybSwBw?WKk3 zIQIWT0v2mr$6|zxuIqz{%r$uN2lu1)7RCU1huh_i@A)`v<_8>Dr5Y%8ON72?HA@1y z`?ZIwp33XomkoJIOwJ!85>g=VL3#I6z&+@9SWo^KWd~lpH|z>-XbXFH-*>*%qHn3w z$nDCU`qzX&pSP+zjThip%fauGdJES93d~k7EFJ{$$x z;KP*db%&YS>^6r;n(v#}Yr) zpET(sJ9DQ!|4K&m90zwnY$YpTk_RAoC zJ|EJljf+DW)tM#VI8mj>DeQ)xryVvQRhsYa_bW&p?EG2z=knoarP)f=^%jp_sLRX* zuDruRoiw*0&yliHT7b2Bpm0Z_cddXPywggL2S^g!yGssumDV3t&w%d0c6gl&qhi`2 zVKn9fck8|XP`6uNCI<0#2(AtUkg^#ewyB^X@Z6Bd(O&N)ddI2$(?3mao z6HXT^{{F|>()0Pdu^YzwVVgvAhrQ!m>){53s=tA=W}P}ol@i~!RS@;XsZMu)JXP=y zLc#b&DV=94d|bw1KCk>dn3*(w zu20m|xgf)=AS$-^%e96!e?lc4G{q%X72^l?P6Eu)^@Qpd($KN0UZ+^J5A7Zk+jCLF zyXz;(nm1e(q=|wAm~)-JHu39OcyeH3ecZFAUJnBzhA@;^wR3KWlx@`&heNm_w*$iV znPxTEkrlmb+;|L9BP2rfsh4?rm7Kp5IJKATXjkB~?sCUZrt*O$s=^WJEr3zG&%@&z z&qc|C`>l0Xa6~isUj6>sa)zj>ZK9jl^{SsYE`LQdM=~5lc^|~U ztWO5X(v%JQ@r@_7(Ib|J9vk0Rhx_<#HqW`*AU+|1Rz5r~YFM%yvu>4nDDkOqEaF(O zaZ4#T(*de0*<$l1=8wpi|I_X-ko5esoDBAq%=MXYY#kH~)Oo)E>*b|iq~4(*-YfrV zH6^04PDl>sx-wa3C2=QgX0%BSg!-#DKolFq=Ry9j2~C&?iGB$2VU~n99}TKYY`MHh z`+7D+w&}eM2m50spSU#}DLfW8Z3);Quxq21#~nWT5}qM_kzn{^%5sO|2v-_DxoE~K zLo{r=I28BUj0cjSy8KO0xnZp?mF()`(hax=yQr?MA}?6n!K2yUzOM}OZ2=fX^mD8oJ^*IE9|2kQv@Y5qfS z;JaUHT1{F}zeP3IG>&G2MWeCu*|7YRHCp(#K_$T}rG^eA-Md;{J~@o?U&tm61j zhHWIc7Ucup-KR^?>*ZhLg6D3<#^&JRiVL6UZm3jh_RJ%mbet`WO+D1kK{5uui7 ztipF_%0L?pbKv%hT1K2UIH7-HhkKOwtP#Dv%6AJUhby#7g{YEloI|&VUi3RO90=~i z3{iaN#N=ZckL_{?mp{1Dp@$6Hq{PjT5d=B&=w`Jw$D9`7DE^X`jU7E~G8RLA;e935 z;yQT*Pj%2MlP2tWIQ!`Wr1IUgSPpVi7J4W$1c#mwmp(EC!o~22L_HqTy+D|`_JE?e z4Q?-^rx_TWJzH*=C|q#pd@prD*NH;5-3#ebw8X03`g)`fTn^McNBZ7TmY1dCRyI&)Rwf9RYua&&3^a&W6tGWd30MetRvw^H z{!ZMo4hqo%PS6rqom==fD0tkVp>9%}+VBC}OXRu+&P}8(&@Da27KcbpbIXJtj$i)g z59+SA^pDiTAHpCh2T+qGMbzqe`&#TBQr897)Oy+3e5*2~CfLOQ^MIy$UYU{(XAXk| zMsRuU_VglpDxvtcl_**2#oT`AyI@9JAyL+l)GXV3_|aA)M`9Fh!KCB$zY^mfGrV z48{NB>^ftQlfFYV8bMVpxrg#9A~kPMu5v-w$fwVYVnbi%r(I0NR+uxp0gu{QMT#&q zzGeoRQ2ZMTFOhUfJI#1~{^B_0A>Fc|7YM-2mLY^8FQewAM6Z0Z->reyze;wW+TH?X zgLznII;(JLp`^<2u%9IXe|;AF0K^Y@ZJrWQrJJ7rV7CXJ?FnZ(VoIE0ZJF(Y{EoOx z;&K^6Dp*1n$g}3ce|NvyIK@r7=}LeNNL&V6mUf6;Wsiv$+Q{UNu-)Qz#E^nf4MX>=8qL76_$k4#cww|qlX?6)hk%_r zp|Bus5CsntR+i316!O_~Ufl-LJn6Rv=sRha4eID#L1i2h&Ep|XVcjRR&SZAh(V_+} z)VUxcbHbePsf`(%9FjEOfoB1|cgh%gWp>673jTW9auJ9L0_l>c*xtK;^-1G#Khc|} zju|)+ZSw3p@=%&OlI(6|#L9^vAkb4dM@en5o3!`VQrFga=$Fhnf0!bTlt`E8VQ=y zj+l?$3LoKv_&P#1n(pP-eHUY=CB7|1c9=UmqT=~Qojs@J7aMsE)qE%K!VB7ak1Kh4CP_bb06{dKRpT0Y0*HGk{%gNFqLhF63S9!SQOT34(Fth_)`5<-pt`U?X3`?acC zj&wJ%mKkV3%#?AdbC8vr?w}(ac0_&r2|704(PDXhUZ)!lL!(u9q)k+xL?V8Vw%=do z>c?T2^MxH|fl7L~0$XI?>$ja628cW8{|N)K$*xXh(NPtRx}qge*=O+!D;Z__^W$z)c*5$C92I2}V zjgB9gLa8=&m%?&~X}M#=78nFrSyiD*D96<0B^I>?T94$Oh0!-fiSlbN82_(c@TFvw zu)({x(B93IT*tgN$)_gW zy0iVZ&Gcxj+qfG_oRqPukTpYV%s-g71RS)cHQt&lK=)T&0xP2|vD?rc!-o z_{oAz!ErW{_^sR@FFr~BDm4-41rVcH-SVPH5?b@XIk7{1oZ4w`a@bUCq`i0fU`BPBP z63%`>-t{yWr81}V#*l@}3Q-ZL>O_sOb^TjD`Vxk?ZR4ASYv%#O5gQghUkuHdt0MnG zF6+=lWUFB3UU;XA{I|g%hd4S3B?E0*xw)XgKar268o zN#}@|xL^dcX|05ZRPw7dFXe{zyAua@Z?3NLn{fs`0y0)?*Yr_m$;DnpU583_m|956 zd{6dr;Yj0;v&X!Uu)!(lt%ol>5j(Higr{{>eA`wy7kZ^?BBH|FY7NIxR0T_q-~o~* zvsaD7ycu-IY5rVA-8V0k$9d$CE`8l|b3X_%=R?^l4%Wx1XE^8R$eNXWh)~t^pWbu7 ze$(Km!Z<{6@&g|%&4wB#VBtu^>=>?42emh(zedaw$u3ypti?#t;n@q;qfsPZ3+Cvg zLPPBwjN@^omR*w=|DP%9MoVNewYvW6^g*_!su+TqXHT|(w9l-^`efZbj1G}Ee-5DtRPPGY} zf@8EA`6i{nj)zK%E(ILExZDjqXV8y^KZxjUtLxND6yjKfR6kzdm(^jKnSnm+2i0E` zAAEqEb6@B^X}O@a&uk6%bGu00v?iHY+AC)DK~p}kW7*yw(Ft-Fbr4*|xp1jA^nyx4 zmd!fP8jNNZBjE(|AEX>D!?f%_!}vwInvgw|&$6jM5lXQNwZm8Ea0NQgdSBhwjpQ}Y zuLX-`1MzIN~b`Hb{vc`uaWko z6W$UWrFRMbUEO!sqR#Q!|MfodO9UL%9YSgUL4e_Z_c`8b)2~U>D?q6kPZG1sO`{hH z7NQN5aXRmK%YP56yH;jT{Rt68Z*7TKm-SY`NxHQYJoq}|3C}!9$vrk7!HEW)GiSvM z3HSF96zg5fgND`kqs&R=wvzgxN=L+auw&E{||EE@u zyjYbP^CrseRRKdY}rlJGM{YL?HS z(KJ6X*qi40ZB;wccf|9hO8=;2S=}ezqh+ReVu-<2BK4GUMxNo$mW+TOOG=(y8I0HK zdi6@zdTkLpYj)*V-5Kb_WLI`u8$F8cw9fejVUWvztQGkLUr>_>JvoaFZO!kJzqG+z zuXJXPQ1I1|Z2Q_5ODmcFyt~tL5*ODevy;a$O0)yhnu3C>VZ5M*iPQn@wCwU!}bkHy_( zzh4oLbO!jF0pgT|YzU(>^3=#z%F-)gAA=SqVX`ag2rsA_?w}TYKS=%f8f)XUEuTzy zE`+Hv)+Rum-xjPSUKe?jT?UIArY-|U&ZGT8F5_U(2sn5R zoG5HNYP7U`i`oA`T7lTnwct)qf8u0c@E2r`>oMLoo$#lzwXC_%_nsmCBQMaCI5{bU z>j6}Uo>Wb`Vwb1*tOzgO8`;HSP`PKyTLAD`nr2m4>9qkys7!cr6cQvm>5c(Tdk-GI zJoCBR7zm?1vB79ouEdYF5ZTwocLFhL!H8$F7;o>70bai>7l3^8l?sk7%Z&j%;p9_g zQO9f-oXRRZo1awhX5g+aBiOg&X{gzO`1UdiyiH*+V&7AuffnlA<>{1Nuy;MWAGKF_PhYK!F zei3nL1|3(Eqpy|w2Jq7IAY8|x#YuCE{>L8=XuA8KGWgw4X8SSy?HDJUnGH6i2eRrf z4KkI>#a7O`_q11r$sz7SOt>10ZUMtXvzR-+g$)o^;jHe>(>FRB;-9rQ1hS?Th;5&w zC37i2uET4kEsy7M{lL)P;ZqsU7X)}qMZxL}90ELOnwY8ci7Uez2^A@wzggq9HdG{) z5wPfK2bCybyitcg%zjmH0Ry!>UfUJYuuzR-@x8r)63MQltDRdxS<bcVa2@pM9oT8#VHQPvPrKSG({nO2Ku5F*5n6KoQN4;<| zRo!M11SE`7^2h{y^%)XF7i2Ohsesmlv%+2e5JuJcG7up7qG9U{m;BFfwc0f-E6le3 zE1vfT$lHMpCioL>hBjOFOc0@uB6#Gf$CDd}S2A(CqaSt|DC+RmzysDXlXe^Z6B`C8svu7Xc9P^jhob^&$NA|sy1ktx)XarGKY)1 zwR=ZoR}@jNUbPqTt*k`Ulw3A=Y}EVa=sEk~^3EbTU6?KrmWlpD;o42I6iT zm$3gqNJw1O$qp=Iv70Y7`iEdV0=54UlmUH8W2hPjq13lZ=^#cNy$(S!kE)^Z<(sb% zI|z#;dFH#V!oho+eS5c+U$|Du1X%gUO@0i`=560pe9(Tlz=(4}mZh1_8_fc<06*q8 z!IT7R%K7Qb6hdKjs=TPl$}k1ls%-ijA51Bo>#<8mDEH>jzR^>;FYdKONz`2G+4@aI zDR|ZhAqZ42lXMC$+6EsB3@DqyHmj_Y7Xh5p$>!?2;ovl;@^TWDmD+&dRKSVb9`+T% zX&8kMOgf1;{O)Gb%74iMO_{EN?ARqbCfPj0mdv0_8hdega#|Mx)dZ-$YvxfscB&#C z>uo0uLOe*nLTa2v)#lD+#@BfHQJPXOb;-#VRXS7zjw7;#Y zK%eLtYXghndptU!V1cwNx#jgDJDGX(lV=`DON&E#z;_$ZfusT`-ZRMAWXF0YuSy_i zrEqfd$68+kj*SJSAGf^5Z%Z!(evU#MLEmECkBB^~Qf+YngenkPoT1S1({I(KINM+? zO<@Kss%acR@CyJzK)%1pm9t|dbWFF28btEVSz(@`b3OqQDo7m#AL>*e;-I-`KOI#R zk}9ly%D8}I;`9x9&X zp^U^#`h{ir1j+V@sk>A(7AqSWaLOKlHO)P{5UJTRU`H$lwKxz+zh=1D2PHOG|7k_( zejnXJxh;RC5#BxiL?xw3S8ltLvAVc*gw@Wc^2iA`g#Fw;=$=J_JyLuKa^}lkVSL@< zN1-ZttJ2vRq>J=ybPPmGM~qF2_0%1TXM0Wy*W^HmG$>{uML^5ijI5`Sc@c#4F@gdx z%M{K{tt}jTl(y4#p#SdhM%scOlnLvY)fXeUm)m>rxStCHct?%dOu(eJ(@G+?%T2j} zLp1B~MIN8mpZavtS|=euuU0twH6Q-pU-K9g zmW-LNU#GDqb>H= zPu|z^E=||i1oFLLu(m-ZT(fZ;vJH)yv=9nSYXsQ6zKtU~ky>AVbf7?rC7U~r4QpkC zGRuJnj1mU;IEnQgWvyVSX~V!GE*B?Z1#F+g3!)1nqp3bvvs6?oX3iYuSE z5I!zIUgVH|&+Xi`fn_H25gM=|2qz8LuD;XTyN}C5(6+3M^3#`DG2ZX~-+_6t!9>vq zFET&QHv~671cAvm6P)D03K%rjOkayI*2E9(>;|m8vKRdCUOS_cQaK+N|3(;yF7kFfs9Wyu^p1%LtnW zKJ|DiI(*(SSzDJmw)FWm{VgX+fHLPTRiHwGE2t7Tn|G4!@9T;vm`<&R{Sn1<~>!NfK8s;@BI3FI6I(o+^+;GR8vG?X;W=W73$yqw24Wf zEsUv>k!J$(46c12x7V2w=sa!ewSoS)-NCJVL^{xiz#TA^{++n~InhiEmUR7h)q=25 z@5bKHiFJ-HQ+Ox?*5FzsZ92A-VYLra@ES8YCugA+hR0)b-y5<1ji|yX3bmSfiJYg* z)UhpikTaicw%*hszLI+k=I(e?UE=*%j*6Msjcom>$cHe>O199z3XgcCkQIHk1A0{1 zM~fY}Z7Zgr?eKIUrun3_3tj}3Mnw*B;u-T0D+eLRkI54paa`~WY>m`eu5v~$XSA+i)dfso zw9pmZK``?wm}Cvw8EFW91fQ$f_dBgZBtXU_TMJVG-rllx&nAqzyZ)iLV|10fNs1N6 zr)ptKRi%7CROZGm#$1>mQ~y^PiVQR5)JpWrIJD@#;z?-^jvu``uYk7N68eh!Hqwbk zz&7*tuiDq55>|ti;9u*i9k4yxw`3T0)h~dpcp5|5=}qyZhz?F)o~ZMOi7vtO{RpL6 zx);}^9;;s0nIt#Syjq+syj@>1rKvWqi;=f?IFCfd%pVI#?>l^Z>|P=3?O|8-DhL;+Ufif_jb?FzQ+Od!~ng=C_n>m zPag=GkFE6tN15^_U4rpL^`=A!LbK%bHWnO0lD8aj8T4jsV9j4$7AXV zlXnTZwLl`{PeqLbXf4~h5m@_jV{FVo;OX;4ngRlqZI-X&R!&Tjl)?gJP>&vg`Q}&? zQ89^&1L(%`C`VxcHbx7$U?U_Kfq*cYNh9sg+RsWMLX{LM-Sk4TPHw7NtD2489lu;q zQ4~QwqSPbP{U#Cs>aZ=SSXDrq^!&uT=>M_NOFWiN5gD+#@JSir4aUjFbYfPSHIKN- zvKg=TZ1V>sFLL;QJ)jXGJZuCO*xq?3uo9r=9|)EF*uJ>(Z_UC)D}AxO^S_#B0;&9E z*DWy&8=xJEuLE*F^6EF5 zWTE==S`cRHajsr3I#8|}t9CKB+1?9#<`&o%ss{*DYOzac%tyuJ1 zz9i2-IdhR||71hjuhU30xOC$FyVyjP)P~1yWO@*W)`Q*Mqf9lJ0eWaajKC)6n;0$l zk6K4~KLlRKb9Gm~uR{^1>g0eZ4QBzLmBm#YZ-dkPlZg z-%J)%{YwhK@DfDXH(lPlZGKfWu1+uXTz>ya_M^iDDWgXC+>OAx`88+o zWs0wYoHOaX_p?tiwc+XF{dP4bi9i!EkZGIB+7WKb)TMFU{~gY#RVsFR6Yi?ClPNno zdzO`9=2nsNa>=!od{PrVWKsyqmJX$ z7x*zS$OxSxQ{_oaFmh~!K z17c}I{irdrmcO|4i~OXfH)wNcKq3c(>#k5(s~gO7D#4e4Lo4SJz*6}l>w9*ma)}9^?tkr)aL06r%%r5D!#G4 z4?eBG0an10dY|@(>sHM-HX6alWTPShv*m+TIjuRx3aS>}x(}hDh86e~A;w}-vF?kG z=(NpE&ZU|1Xyi4A@Zr-727%s#KKsvxQiOJ9@xbAQG6g4)Yf@{4xoYp;YukeJ2Zu|~O zdtz-6zndih(%mbnP2@j4(mN|vnu}7;*vtrWi`Q6tSuyonrx+Qp<4dl}R(=KSCtn(f zm*e2QV5wm{sX%cDbb#y*KGz$C4@9%xNU?MT>kBcA9BW8~L;)Fab+ z?0TRz-5h`Ym&i3Cz@TZYSkZ}5-v53I!;Yvo!kb#ajo(&v6{%k5jmsX!zW83Crl+^A z>W;8u2qtH+$lgvL8FWKT)XL&=UCg*;pu%lYeUPwqvuBfelY4hy?mNEk<2MP+s@a;4 z$#CcAtO?;!(=tOC8#Y~4T@XolA#D;a!0ZN|9t?sq**DXwbWU6Gh@;SwA}?}2rr zOLS4$9p{`14HIJVD9bZMh9f}}scC0S4XDLC@q{wU?$l#;#TC>JuvIZZDr5&U>ZlYn1NL1yRP1KcOJb%YfgQ6PyT@K@ey0Am-aMxrV6 zMN%383<9CSRU|tH&CWxpuY_seXG;5b(Cl)kuyL=Ym>!FRa(sCy*jbOK<}4v@aSe%I zDqZ+`srYMKexcA3lIT=`L%971?dq$)i0!K_dT5_ix^Z-qMTnFhP|%*&6$sx%pB@ua z>GVS;L9IK5yTgk<3i|PWDCWm7&Bz2R`?-RT+@9w;l^yq_Vb%phf@ zf?-n$^?)gz_5JNYR1DnnLk=}H7MJzDp0qE13eyS>${t|t_TIPaAn=B~Q&k`n)cA0? zf8jW?UgL?gzesXcQujnyKROmg{g92m3NH!z_PV{=6<-23yX>Rg{#^i{Ph~Yw_J{>) z0`<8MB67;mpg>?j0$mHoaN}ZaIKVQh#|Vaow-bPE$iTij<%F2NT#Y8&*i)5=Yg)$C zvLn+DoFb5j4;AlDeRBpe&RIxhxW9QZ4SH7a2uw7kcT|C+3%mw5e|UZPt^ zDJp4Tqw09dDPwSZu^X z_SK+ToajKf#$Fm3&usST5F8s_2}=QD>(Al#A6uoB=*(F0xuEsmRx)Zt9f^@?*`LWe zdeBfWV!`KfNAz)ue@CQ*(ugoAi~tMHO+xlythet2$u zuwse=U13?{wCQ|TtTy3NZhtjMCp1jll@o|T!6E% zW|jx;f?P`kK>+8H1RcutG0RmBm=*_JPYbUxKOBBq-^{JXClq_s-=rx5{78Bnv)~#) zXrI@b5pytLECD9^q?s#J``RE-@3wFJ+q#7Pj(hQ%&OD*8{s&oI2l6LvZe|0Z1@9kl zoNw_BzzSx4RWG$ggk?dTfI5az7)-R^z;G0b?=gt6)cLK&PyhbAIIq^HT>VOf7a#MnC3|=QV8hX)T==j}Flq|KJktM93)4D6PL%IU@PoQv7HN{)-i4z%fAQPUw=G!N%xCE4000!FcUQ+H%vDhV@Ao5~ThOZI z*Put0@^q?0iOtHUQcdy{{jH6qao zbI$5kwcHb}`C_B*U!AO?zUSUoe%nUWxyeER|NHmb1^C7`VPt;jj7`9Q!AlCXF5R@d z-5TuRR2V`{ZsRk_14Ql$TzXR>|6@L`uAXCoZ-`=X#d(HH&R(bOM2;1dB1|RWp~m4Y zU~LQ5BCS=gYYyIMB^;Dmn@Jc(kjStvn50Rk7&9{vMYQj6M95@b>KE~&vW;Wy==<2& z8)8n}fR!qj$L)`nh6-54AH2sNvPtLcoLx(w@J^tG3lrE$KcC`msUNl?-36trkkoj*XsP2zIZaImNW z=DP`)6I1tTbp`TMiCoE1Xqd0pw^ymAoV%AtG$XJo-{qgXIHCSq{VKsi;ql{wqPO6Y z1u2CVQn|q)P~GYG|4Zad-SM@D69M-n&#k`avKnFF6)XalBtZ zWk;KP#DBl>Zlr7@Cu>!7$pc!`u&QN5(*9=ZerIA1;&f8pd>5r!N6L;kX!b<8;zy*n zHUl;gg?|>fV>=?TqO|Pu#XWOUen`a+O4S3<2|jly3ft|Y~i%N2<~6Y*B&WAgP_Lze`_5xR?!vIUFL^y_~xp zwf7>5UG>|4csI@|e_ZU%WrFz`S=hq+tgJsH&fC0GBFa)k85KC)Oj<1ZI(C(NJ8tI$-r5O*>w|_HuS!P zS<7|ug>6pWPiZTbY(KmoE{?ZsUnU;C#l?DOTPfpNJGEihg1*cswN?RFXzG=dLmGUT z@)t|c_u6x(BlT#F5LWW z#Bw)teZ*X$ODdv{ly(tBClAk0Y(t8lvpVZyOANi#O{=B7UlZa7-EN9LoH-QqvXErg zknAcb1R+EOk>>R(EF|g4OK3~rUdeV%wW^6;o>ZDKwZ@HfSK6;$Z>ZIF6M@YV`4g2k zL5|oA;R9O}Ic%mGD(T z1I&Ym;~Mtz|2%vw*$`D0ebyzBK^-LMR7ba7pw)(4p$}PJ{eMcTL*Z1 z|H(R`!Z}_!3YI;5XRjJEE7Oue(hWk7ouE_A19pGet~$jM$fAR6H!$s_)8SpJ6m@F? zuV$4+El>;16#GL+3;8vkG4s8Fve9jr8ee5MzQZW7CZ<{XxWwkw_t3N}f-@|f>?d}J zd!w@KaOj+DTze=7`*AWbQKGx=A*vuyx7@85S5wbQNlgUyx&*)DklF71KDCdh1`71Gv5*;x4Zy@ul9&2%s4_LN6u;R zT^GmvM2*IUTDi>Yfa}oe&44)HV30% zS_|u5Ol_hpmZX=Zgx`4nF7Uy>LSF#i@9rQkfn5hC8{$NKm=(`Kaa*AGqO`6;mFBoP zqUuOtf{x;z?ZiR<>s~)srd_`tXl8E;k&2aF_y4t3?}fDvkhRR}=qf`jNR8w2`+d*B zokuHoA_v11V~J9-{rg#yaDkor^o3Po|0MIsrMAeCVkRZFS_n~f5e71RjRCE0xHirw zJ#+c(MKwd5td={&%p_x99bV-w-#{Q&*U{&vOKbB$+NGk_omuO&NeUzvQk2#x2{#2x zIM|IZHPUY&byHEo;Nel+9ISkPoNMdUV@gT+h7CUq4OlMAW~bR{VID##As2)$nVdJW z;Vk{b%EvdcZ(a(lNp4(!qGS8^vYga*KSmT`W%zu`}_)McrvKSh5kgb~D9J z1n4c6n0P%SV*%Y20gIz;Ti5$BFsPY~reUAloS?G9&aYN(4r9Q55Lv<5Wp$ks5osTi zb~uCM#|wf$`Hq!^4p~oRCD9)w>VO||xb^~La=uYUM`%2+Wq|ky)GTl=N09|(!zI|ul~Xao1LSgm@K1GZ<;k3^mU^9X7yQhN4CLyp*W zgKqCcP`{vAJcs$AZ$Al+Kv+>{ zXe1@N&IGx+&Den7b2iwBAkxh6j@vSyuGUAXT51yvuT19*R4YXEK1;inYM!1(g;#EJ z@ct=&knBER%KpaRoc#wv#w~8eWn@m&G@VT?p=0P5)fa-qbnA~|X)8?HJc3f-D`ZcQ z^X;piaGQF+H2atEB|EQ%g=4bbQt&h@)gKu{l zANPcoup?JnE@h&X-S3G_#!(PLhqvwr(UwJGLvx$yr%@4Ds(t_573xAE`)aG4W7O#B z0z(lFu$}=)m6-xbg)O*jTQ@U_q3MCcVTI~^V;p=FqX+nQh7}VB29}JM$RH!(xdG?8 z2HooTjjwi*B3j+gt)MnyGQc2HPtBhw;u7`WO#AO)C!zX?e8SVis;^JEO_vN$b_<bYZjz_-%dwUJ81TDtT|P6%Ep!8}w)bUwus?&xrU;pID$CA4h()g)W<0I(6r6lcW0j#V&&DBh|7 zB7A}mypYd$LrZ)jW@#2mr}l3W+nfQH@vOgEcN>EvTu9A|kguE>29fSDw>zp%39%?m z610#}{BbLagQ%Kk5hX-B;HM7kgg$NpPzyQU5+c-YFteaA@)DwC%AVt`jKfq_h%vy- zNZ2A(R0o)(gL$&TT3={nln`ZNJ@7?@4x%o>@!1E|4Usj&5e~|DOE7o~4?cM!Arkuz zJ|c#RB@u$EJI+1xnb;d zXjR#7qvPwX(PzRzcQdg=1H|t3v-iel$7aYy)T;TQ%!mFHj7+0Da5pSevYyA^fXvYR+yEcEEv^1p}tU0)NQcazTiQof}-cF(Z@5TmD;rWgTc0 zu@U_h4`YoyEVoU3f;yLk@ting--`!+@R_T3Ryt^RXRb4jyuidux)`ziMPR({xYl^G(7AJ#2#4j znF~}1>`dMwnW&nkTCGe(^oetD@kaT+P2>tV>Lzo@C`HTIyz5Z`L_;j(R9&L8&=2Lx zsmZElQ2oi_2;hbx+*>^N{1_L*gV=Dt+d@UOh&=*KaDPYMEe*WcT3!$}5xHYJrX3OMvz-I`tjA)xu@s`1mKy)vxNfU(%Aval+vN6d#-&b1M|`||)4{*h^pQH1*2Ee` zyKj+|Ge=QCr{=Di2GFNzO(j|JM>uLOqkX; zoMp}=c{0s}+xlbt!6AQirMjX7v|DF5rV7%#MHrBhzD)$(-=TUkf*E=jA2osFMKC9U zU>vhFf1bd6&m8EOh~mKqcjU4?|4(C|$uc~|Rjv8zikIYR+@d0}I-9VaAH#l*a!f8} z2)MA^*h$%AHmq16Yim(sE7x32yXLRD$$!-z9BaAgJ(`3&OkX%oRNxw|4%5^*kErNv zWZx#xFu6Mcr@5ex4lW^2>N5GeGrxuAS~2~oY}d5R%P};UkTQBSV6!?0lP@# z+mHu{(0w^wNVc>+PUVFm#kI)Blq_MKCjlCYf|3zz=xKA)1dY>L=sqz6$AC!bLcWE?$96+>dr*_Pzguo*2v@EVXEA0xUo;u~7$);^+XJi#Pm&+>a0Lyt zt3jv<7ri(rUy}QdrEzv%x>@#u#UH`%610VdqeWVE|zfh03gVun1fMuF9$ADYm9%*RPXNV&vXC^H#nO&&agAOhz(E5PNn-2 zuk_d=IN^0M)-su^7J;<3rq`Heb}{9L239`ubfyY(Qg2>hyH>esFC8#;F-Ox%rwQO?=WfPX_|Y^0-xZ=%r7QJho0e#ie8JQtZ2gR}D$%37dWfwb@V4Q3;eNlru5 zyqt>1HVV-~`-byP^LU_qE&VPin=(|`c6!^f#~D@t2Kt~CaF8XR$_vTv$`6|}F*+jX#BzI(^?h^KyCXb6SKO}v;;_m-MiYCEqO9L6#?BRH#q0rAQV zN;@W>Bm>H9vWI3ln+#%*Sck^7pjv+;Iz#9=XTBDp{Z)o9 zMml#+8h5f|+kW=@V91u%*SR9CnSQDK2e?~;{`uryI%J%(A0-iE4D-4&(?xT9WlZ&% z1gkeI3Cw0FDp$cZxa=C$U{fjnOZ}4_k>OZY2nL|R~`Ih>wz!e{Z(t)9upat zmJU`hn`}oLLW~j)>RTu4WbL*$B6N^9x@g#Ja!B zOtFNHXV1J`Co@upJch@vw(#qWbxwOW)vny5FH3`?gayAw+6^)x|GHr4a~gc`*yIuR z4OdB0TJvlx_SBGF?0aG>X_w~+JP#olHBkzP2;bqNqsn{mC8 zB`zG7ItPSFO%D89rS1k z(#?UH0(2~5xUvYC1p87`*1mO_YmVMPDg9)FnUxvxG$kAAkZ(~a)`0>v4Ofb zY43+Nf4Kmm{LBEOljM^YMK>VgLXJ6ZQAK0`X;)ffK6f|rtDG6b_!WQ8IvA4N9VC{8 z4t;*2=;4Hq*J2i-$Tz3Fcz3|YYl}RgoFyE+7JKBPpk`g0#HN-HlP|Nvh?N6fadTS9 za_DdivS4_skJm(ZV9Uu7T+iXF*eC5DR6x#(_fq2=U9=-kJ3Xs&kqSQfJt&U~oy-tm zDy5Y;!YGvh-A$ZIO;K_BxV|juqRis1|H3m+zc2Y@Jr7fh(eEvZG@w}LA;lw4P(79T+kDaC^6`mR}u6$G1 zH6|s9DZ#wffpRTLdBuLGcmO+{u1YlFZ<6{74(D(*!qW$lzajxu(Ov0|eLQpe;Y9Zz zdJ%nOVmqX-yZ8w3fb}rwH|BM9mw{7aiGf5;mxetnYi1x~LbaW7?AtN$lGH&ss@q8@ zQb(AqtkhIj)uZ1)J5S@&WEzeAq!>MJy4s;w9a8{@fL&|ka>(uX%~IRaff)$R^3A`s zKy;ThxE9$vqzkC-raB83bPnEO$ZJ{3Pkcx;Q5zX5bB1MK6 zMD`B~<_q2Laf!X{fzZixWhKr?o&cf0QQJ=-qj!12@W-IXK6Bic9uvcRNm~}eUEIfi zQ!txm+-zUwy!E;)F!J%5HIJi0V z^L0gapR1diOqRV&t1pQcelS-jCR_`wSG1__j$Ws-G|^xvfv5y!;6o(8kwDT4Z4yh= zky}yWT%%*R9z4Y$x*{dHWy{;mMl!ANeLWakI2gvEePY>0%u;L~QK(bP5oG*3VN}}~ z2`zN+4|rAVR@nEW8e=949KKaYZecrR=?&nH8Rp9_Y<~vZY`+5=6IZ*qN9&xO*Ro@w zim$9xYj2Ls7Fchi*y4>!pz-G$I5rFSQP+kO57!1M&4)XO#Ag4EZZ4E zHzZVo5ZO^sk5q|Xo$gpz0eZsmL9oY`#R41l)<&l62!8u=)R9F(tZX`urQ}5d#y*^j zL+uurZJg)%6P2vW0pgg<@NdZ3bjL|ghCaLqk4atrO?*0%9xhPl3aAAk`Ux7#*Ov== z+`V7=x1>Ay_{+J^lVkayPM0My775*cCr~L{3C9 z3W!*Hit*VBLn4xwt{E+pat8$4)qKnrNk6>V&j`J@JO7?t`?0=zXA1FP3dM0209>b~ zyk4j356rR#QAvY7Oeo$n7agv;CpoG=Vlnh+(J{kj@PD%>k%iAMp9P|57-_CjCK@v1 zL!Yx?c3`pEmcHOC-2wg>!Mu(ZS78SA#y{`p z7@6#5mNxpIKME^JjyLW_VFOSJtWrIlCu)GI_Lax(V z(Zwlg$Z@Elf%&|!Npc;@vrHm_th3pKGg*|yb^BF@#x|i&uet`BSnB|b1}NzBh{f{I zN$zF?+-e*}GfWLrR-IR!s=tAN@76=e@88MO70Uj~hCRmMlqXmG)GD9+{Tgm~ck_U{ z#MykJTc)TkNt}vI7C%|C^hCoMfc5xs`8-H}92wheck{=Q3acA1YO<^uz&f#>D^LHl zF?uYvvX8VA8?Vu-lm~b#Rv};v|EJf4y^#bpf1(?74&{4lzZ5Ad+P&)0yiAawRiq4^ z5B40;Y-4G_p?88Ra(B9_JwU7HE1oGRdD$KECqgC(zD-XoSu{wMe*qwoBAnbGWaxtA z+z0|-KAr-Ae0%Kv;kgf!FHd7g&Owst6I_QfM~rA;Q$cWmHGLvm59xr zk-xPh@V7S1&B$11{oKw7O}hP5xD^c6WWjnD}ix6(S{)Y9@iTjM=@BBco` z>>dT~fSbN^qTn!NLkMUzY?%S7-Zvs@u>x^<@3CG5o%gT!8*C-`JOa8Q*?aBD$Qhc` z3GUa3wD_)9<+VDCMa3kjL_`(0%pqTZ($(b&03|?I7i4+Qk6%=PJRtl!@`?3RAa6z| z`27bh8Ya-dWnIaNgB=fBM6U6Sbwld*Yd{!mZH!LjDqHZLaN6pZru}l}4ame^`3l(V zu$b?~Py_ii93wi-rRG7T6%(>Lj@!}BT-snb`V=m_9@5Ky$0+Kgf6)>jgscWAP4{Oc z1V1or@EWB>D8GgHn1fDCzxmbZgivp78-IS|^b6`WsLAc!l^vZ$EA6Y6b%OF@=u@ija9n^>swfxmetxNn2#Kn-&1I^|4qd8pts zN4G8xXhGqk^fwWKqus1~0$HLSJ8)2lz5Kf3@~IH*;%Tg$>)lF)*{9*8HJ=lzfNZCE z$STa(mMhU&^8A z&BcwA8nQGo7w!%0lr?OgOMeKx2;__}I>3viwLCgPt{UhuGl$-xqXrTb>!+lpyigsZ ziHrr{?c=o?_Jg37aG@vNv>cfkXsM)2{C^aVGnBP>uKfz52JOs=O9A9Q&hR&to(UYQ z3cUryiT3O6gcYrGMoO(ALZ4eE|4zg@(|&#k4yjm{l;ha-^^E1mj5_RGb!tY zZpU-OkV$;|t=lpjm{l8xd+dfwK8*qpK9*$F4*ex8J+?mb&48TwQbs zJ9|Vj1KI0bQ}Z&Xr~y^6uxs|CL4le|CHBSNIrQHOy=MsQ%_@jC>R)q$6{{C5vOl+n zG-Y9WT~w5P`q)5VI|!Wu)lPWN5#GM&^aT#txtX}%!)kuP1CwyPu5Lfy%eh4wIpZ5XS!HTvIwEbuYik)^se%dlgi2%C_?pt=7s{nla-}kUI|Yb9D`@u9hgi!A9>c+0T*cAxig*SLqqoN7<9RJ zID{)!<1L$0UwnDcz%hkk$X(6@+~!r0x6_D}M)+oMn7gHk-#O6c@)L{X^pIcp1ilMm z^Q9O9J7=NC1F3zP@ck1T9 z%=AQO(3$;P{Cim&OwJ(``)^}z$sVV+(!Ei725gc%ZZ0#J9STSK`$9=dNE^`=GS&N( zT|2OU8tqB{-j{jLy1VHEVfks5cg-&NU&XRz9&gx1cQ+~cum%kmAJ1yG!@L&V4hAmf z07!)g4zBkxPB9_O8vQV8>u*H2VY8n>Ui>zME{ORqlG-)W7sXl3Gkd~YSLhoY+2UIe;`eo?*A zvKnI}_$pMf!?Eq9aEuECrKhzq;vvnWfrpU?@8pE3SDBxcK>qovid$NI9{s{Bn3QJppjpCb^ znkrNDec{DXKGewdyEJv+t%BG|u+?kB1cCHQ_-J`+nVEBODt0V~^gBX*&R4vO^tXfo zoWC8>2GI-Y#RAxGzmnkIRafYX$VZ8+w6-v^H;=bRC)>jVH(?N3N_|M2%s@dqr$q}1 z0~IKf(ryQDTUdH~+%s`35ogs^iYd;*X*S03lHXT^OlJ-nfsdqkLyKlWo-1Ek6Ym&B z8w>%q?md8qB+n=Q)&z)FOzJv}FFzB^xG?`n(n$%|%9MWy)9)or`*ud0PsdGZKz4D6 zgI!>rDhb^RZoY9DF%G71o~LAMK8E)B1a_X})@tgh&nMiNT9j$%Y0_-Xs)&>V76pZyF%xyuepLAyod?Fd%0H^}@ zG~9w_D~Dw!rY>d`#J&nK7c7l2xkOaoB_)!4zbIU(RN&&Ki6$m>>&u@RgoFubxd*4qTd$D?(-zJn z8x1}KZ4UI~Sm*buC`ptsRbDaqO)s&6sKlk9)n;{R@r+zp zEMbyDltuTu$J$fxK|Lh{n#PCulPLNNhd++iVkuI~DIGS&_VdPcv# zYd(3qUZlsncunP9{qULYtSu{tutu zDd8bfpdL*8dIart`zF1I#YGwhc{5op4b%!)pUZCTo`o=BZA$6Fi0d2@=CIK-F^GCF zq|<-hEpG~5T+_iX@AC*&D+HQ?wbJZVrQ^9QsVNYsv?sY+8Bb_sT`0_ZAYdAkjag9MocjzK>wqolvI=?veOY?07axsk%yfX9~I=s zY)@ku|J5e+&16;da3CqDayAEjN#i5?`mkRr#qNky6lg7HVQK(4^VP>(VH&jPSU=Vv zP}ovz4O}~5(8m~NtS20Urn-+&Tq&fW*B;rb*;YE=v9NxIuy&suff9gFUG#%nuy#lB zAtp>wS?i^2(dHZW!pDxW>EO2vKLIc#G`4g5yZ)1^J~xiI=m;^9a;%A@Jht^(oWsfq zeXxnuW8>Sjt@FkQ$ZlqOhCi{iukBcvckjWsb54SUaGouNP!a^8EAqnezV-5$SZ{~T z36k8p&Ba*)Gr12Y{;zOES!^b8q)1p67grRR#V!9pkehzyl{?OP$%6-lVMviGldE|n za?m0Ll&9+ZKl@`0Q$xqa=jt?r!ObA9d79d4SZEe&6(=TfL)hK$W3hTQ+1iYLtcxTi zeq=?foKT-S2~FM9Z3evumOkFNJpj&3M@&P~tNGIz(eLtyS7eg~np@=#ojO`&eQK;x{!|>RQ(&|y=iP{AiyyCim@ahdysVrT+zq^d+)oVPq&xiVboGBO z@@dxFDwZpst3!Y?Ce$u#0k`M^lYUz@g+HKViCIgZZALXpdsV zzmHwr>@d4HaAhqj^%nQjk!)Nu%7&=80P2^hclMT{FJ&Z%ZPqaw9VEn@(eay5dC(XD zY)RM>0tTyAc7@U2o=l2Gaf~hE9(Y<&k$Qn?kpchBt5k)Eerq^aUz=^t=U*=xuM=p= zV%~Q$nSnQm7a`thDn+N3bE-)P-e5` zG{|vaF2w&)4`-pQdEggCKax)4+3%i8`-Pt|iRoKe05(9$zo&`c82D^4TDeoOk63kl z>wgMnt%~fmere0%;4Mhyjg>6k`1=kqwy8L?P2+&Xk6x+(7CxBRc|SYAJ|Mh07ThsA z_D98Bp3HJaK+u=Hxwt>gtk`&1dA284%seY6%g)9rx0e&pAFdNxkJ9dQaJ<4+C2Ng` zdKm#;TD5vkJzJF$N_^%F@tVfMLg>sY1h(q&0+I!$)=l zw!)BlMT`bZU+g0%;Mq}0hQaojcD}WSgrnj%hsZT)(f#ol{A~yQ=_mJRnDDl4i3Q}8~wV}<+ES|!afG!RpA7uN^uS{D2xCE@X>3|{)3oYxw}!}E zhSiSuYZ1-YqUnt-_>TBiZozDN%(LW@d9mC#MjI^th_(hUg@EDJFsU|%3b*}E?Wr~O zTp1y8JO9%hjOi6xWU==t+>DemDZ}~)>gz%7maf{dkP`fyClvT{Sx9tWQ(^)_K1 z*LY$jH8d+a@k7k)yF;p3Ak2R^uKliV#Q9Lj{_8G=m~#O8c>ud*wPGSWhBKPNnt8Tt0@7ACGNdyh`xS7K}`ON~8 z%VLr8Km?f+UKO4Fk9|PWcn$Zih3YLx{E+Z>ZN8JuxPuJ^`dcimEMsMQK0e9a23HfX>Xc8X(D& zNEUbqt-2lho);%U`Q3!5-d(av8FtQYaI7Rd!=M0Ymim5VY`BZ*uq9=+{|nraWsb!e zZqi{Ab*%Uy>qs#*YOxY`=S?r2X4{}sz*E9dKn`gaAOhUU&bCl2Z$xNGminAW095rI zWw?LIbx*z)`_dG|exU#Zw>t|uZZUJ$7v44?FY^^#(Ad$W)1a7PIdM2@aG^qAHAnj1 zYI&tU=N?zi3^_A=D*LZ%ymm~NI~0XtZLK6q7g<@|YH=V2F3tq(L#|W$#DZQ%`oFh* zOpiXRt7x-Dy@mB~LJ2_gYpChx)0y8+Zq1TsZ6A4VN4*N1W~f$Z$(zOZ+01tV{1k>g zp~amfuNvm7yai+3P7?E)6pq;&Xl$pgUcoiH6lCV&`19&UWOVBk0O_9BV0BJJp(4oD z=Non~je=5Ge|6;hDeXQI$<#dl0Pe5lpVnSXE$1AX@iUPS1ZvlLYY79``a$FE)#Cmp zP7>ujB=|Ue9M&_2Ypm#@g+5Nr!wd4iopFCWlxQZ8h{AqgN$l4wYu>`+oCEtpl#hSi z)>S4$w&e_0kZAF!-G0TRP|xtgg)g!!V80E==z2qIz489!zdgsxTl>YgWrbBIl7#J$2A*No+niU7O9GMgG1myO5PUo zvPb5fib&oGdXd7ka?a7;b;d#QgUvhbpJ8a*86x0-@7*Y|R{+ zV)$uf02R+H515)Xg$D`rlZxDc zvkrlRyDZ3$hK1QLA*AggC6N_xPr(@3>og5Hxj;T+nBNfzt}hpm)VD76vC*Gb8?E!U zEREmWKK8qZi56qZ4$$_;)1V`LGEPcCEx=|Dd)uDP08M51H{j ztVF!a_S*^*DI3sW$LF#H><$qrL|dCR5ao09Fz6hNtjg>ahEL8*w$a&nQPe4BP+1YQ zS1fV>U4n_xRacagVQ(s@ITYJ4z#4Oqtpf65FZ+#5`CTfC0g(jYTVYwaC2pdbA|D|O ze1K)Un)W&|JQJs5M2L|%t~f&5n~36m;k1i3l`pECZ<3qC{jjw_T&3K0ZPTU!E(8ft5jPmm7Zdvs;v?tdHJ?v>;7!wb z+XHohypuT*#}jhJdG1&(Z3BFgw>n-jbiNsAX`gOvHu?<|6l4-$*n5&GQ%m}^vA}Ym z|3RG;YuCc68MXn1ljusK^C!-ewCQEr&5sj=9%RB84QB!YBTPGEQfCOC*|t#AoD>RK zE`!K`h@M=J=}PHz_r%xWOxrRmQvG00y7!Kwlj~7HR7LhP$LHDA{>+~xp#|&nM=^EF z2wRz!hGnRZa$Ln>y3cV16Kgk6gMCc7Lm4Fc+G`j5TXU^k*O$E!ysN;nsK$~+SCtEXFY=5 z*yG;4*1%ULY(<-O%miF;H@~nmAu^T6#w0DNU7yuPlXa?=EVdX*l(;zA0LQn5HPadT zjd?8L$SAZb7`;#d=^-(Cp{e3I)Ve~UgDv9@pH-8i;_T^^Xs?8S)>}9;I`k&2(@IGk z5~?q5u+*{&nxap0ZGPtSDXAIhx^ zp!GawYG3lx(RI1UCsqdJ#I5&#g}u0HgBrx8MnYCjrgae+3%e$6M)cK~b* zOf4D|+jDayM7is9KK`4f4Am!c1CjuQN}4IlNZU7`(dNiJZ^w5qB+~VqtggmC~pp|tz7h15Wr-C!sK_4KiMsVKg!MHP4=)U8a>7Z^^U z0WIQ&VP>vYtf4wvBhe!nP*Lu+omQ~4Z3Z4-I*RfD7TY%%ntC$*xrx=Mx+ojpr%EYi z;-od321Qve?xg zUT?pMJ!)y9^NC8I3Bi6S3QA*b;O!(*Sh$P3$TB~tc~+{|*unQy@Fh1I@(`% zIi#1h3ukVohXYAVPLOsVDoSMW18qFbE$wNS&f3bN+jy;)xJ#i=!Z*`%;_XjPN819# zE$r!X961I)aX|MsP$9qpxw<^ z5rV@5zMPkv6_HW`wMB!RssYcKy?_fwSJY}0^Z+QtBtAVfZRGeX3=E=?X>rD3Ay1oJ z;wXFGhHnbI6SD5Ul=#(-kw}YNx-l$cKa4D9U@(PG9gWWfGW^=UY5w;KuSs8jSEsY0 znJQ3PwE7cA2@{oPx5OBU`l5Xcbe^S{Hu0o%TlB0vpQ4a@!=f!S$BR7%R@~HVse79K zICnY()`?mUgtyLjR4b8dyJKy4g0j=52-utp)Iw{02pGLxn%;|ST{(_|P07e@jChs{eh{2nj3Zb!{$02p0}Yg6us8(xGF64MmTL zI{P@l2z;o%SrIzU@ivy(MDC z-xzu;TkCU?Me3;!qR0y55IDFh{Vjru+~ z`E4T?CRz+toJM^EV8s&44q!nh%*xW{MtIHLeo&d^y(?l53t3b7ei_lu0<*WW7~AI)?E@QX>b9daHC6hm^-Ixd0dMwv-qm+fh7Nn? zN`U=wM<|sY@Y=CZLJCkb#`3y_A4Q1v)o3+9)97;(S*SNYjiAn6eQw6xn6))n7ct34 z?X@rsNc!bgcL!>}f!{e4AK;X^+4~jZ=YzjUd$LCWR%$?(4k~!f7AJV=G)ZVXEP;X%`IS^va~LJnIM+ z@hniYiYG>YMuu)$eOLbp}PjM_btX5+x5*V?=xjQ7VgScA%$0Z)oZAK7;&r%X< z5&erlVnH!6JD)z06`mhqMmCZbRU-~piN9xxzyrlh3&me2KQGsoM?%VTc{Xb3EJKv+ z@4N%`A^L%z*BezQt7J&mc*qJZ++=YW?v=C3Yo)O#a9YXU?0u_cnK+O=ntuVR&PiBf zXm{!jE^5Dbdfv6gPvUzVzYb?nu8L1I1WCu!0yvkylY%60TXthg4h+_jOB29t>C^~E z@^f(|(I5+SRkE>S2b^}<&n&JaHtaV`FHFiYn*n!$|@hw37~6q<}_vv5S!Abca_Nd^C4DP{Tk8j*m=>8*!Jq zwd``>+Hlf@lH1#CiG8K9tf;3P`nSPv0#d$7lqYwC=y5^4+I%bzPgJ#&`OdB8K>GJG z7LANZ)8q|qqqZ*3C#5L%+R-@}~N z%A9`m*Lr3E2fS(o=j0RQaW!njn{^u}^%!gfK;oxE!1(!cImO=zSF;ch`YB}|kiUBr zq+Gi4C$XV&bOl4QvOf(u{jf6O74j5GAUpbSv>t?<@ULFIMTR>G1??^(k_l~IW%(u} z*^=@afb4YKQNC{PlOC7ibu!+G@H>VQRwkq!$j5YRcicLU>p)8_cC%W|SWFD)Y=X8>8xl+n!{-mJX)G4_=15b)4=Sx_lne2U_tUy2=5Rrg;b~fk zP08?T(!(V;j8^_{Amq&4y#!+>k+l_3p&Z@gE53kr=kVjY5~y7R&jF< z`^pKfS`qy-Bl9&}-+>a$(s~ewonkX71cup6NbxP2G$RuYBd7gzJjBQTxRgr7K?U4k z@=S+Bpw#9{gNPpG9+oOG`DmVOp0IwBo#_h0V}ogk;f{NOk&r|KGY{`rmTemVK`Ed4 zu)!EnMYYrC9Edy(ggMR_AKNDvHUO(SF8aaOa#YBDEl7L_i@o7$g*$^DtDRFvE_BSU z`Hzhx2;sdYJ0MmrX@!d>{2}9$iyoDkQ_)dsL)mE#y2XVL3NsIU{0>#$Ok{6E6Aqz! z@aWU9cn1~?e2&RewBwMt-XDIoX=LNC>O6A1d=3X^lf|i+(VyrIxA8!UT|3=C|6Rh2 zv+SrV{p<=`r$5%77uOc0heUp%3vIU_Sk*EY-Q&u>i&z=dw$((Kbkg=v*`IdA`%d#Q zdfgfe)nzeI%5d&Vhi7VxwE&v~|Mv#{Sp=Rp#;dWsMn?4;Z5$e$Q-Jo^}knyCivqj_Vk~(eksd~>hbRw!u?b`AhdE^(EMh~~ALp%@O z3;5Hs9Eu(&_40tYloeoryEnzT*WZfJHLeKfQPZH%2smDxa&g!L88SMxpI!sSUXO7> z{v(jl6I*9C%6ZK{fxaVlxG$e~PLij*Ny?1*b{*~dqgkh zKh$Wcx8@j#^0FT$Ug*eAA{2l2^f?eiAzY4{g)C)|IEaRhmX$yr%ZgX)P*Ruqr?=`+ zCqL`7*|B4qMj-(|_e@jOB|AEbCKB`eMuRSCWLO=9+`s8>%HdNzTe_=7b@&&h`;(2n z04;p|(wfR!!rs`eS&q%poSi=1Ni8REP^_ER?96hw#fd18iB}bJ8?SyB@x)|DGQlbpnCbjU<|=GevYS2u;HOL9(}P0U;nr7eqt@DKIwmy>fam zytSe$|DZa+%>8W?i$Etb2J(Qd9eQ(BI8)rz z^LD1Nr@9k!ah++CltW(`L(it;3kk^ie#B~aw0VGJ;qbX^%pRmZc+!w1u5sG zSaoU&-TS$qCEp;fvZvb8%D$$(1LL==2WMw1n=*XSODX9p%+{c+Z+jqL9fkKd^yjS} zxgMbk;Z5SzvtAxjG{r5(5W3OM@)f~%n0gxWV04v6KPxHC`18b|WA+3uO`P!XKLIA) z4!6;XZ|<$JkHNh6wredML*65Y>U}O)gb`*5S8!cz*%UJGl)r_P`+J=VM#a*=+Lymu zu(j?%Jh78xyO7PA$Hx`5KuM47A9p@YQd#wkZs|VT%PA!1O3l-b|+t=UO$4f9yEMA|ByPoL!o5W+PKGg?!)_ zok1>IwNcIa^if*%>T!RA>OA2OXPBW-736Sbxg&<8e;Q~xnOE^cM$QpYd9rIxj$o<_ zN13VHQZC6_cg|0viV9RA?zkA6w~v~>B4yFDSywXgb87Aqk6MEXYm6ERoE?o4j@w|N z`#dH3oBIK7Xzt}_|8MBaES<~A3}HZJ@7J|lQLK!+HbJ@34czq# zCeH=;bBXu=qkcp>msm>1T`DG=mpJr)s?aKU?#4$))Xt@ERaep+5cYZ+Ka98}5@{|G zO|PKlY%1A6|NYI6Ja_U_w&{JEqbdoXZmg};A#p8m9%UwtPh|%6Wdqs7zzAV(ec26W ztx9=PDBkuBcH}ZDD2v#k$MLIEY;E2dQ0d&tNJqr8H0??}#;CJ6$xSZ$xnAjMNFhFT zKSPdS))<1*;8e_`|K4rGDBrlLwrOR?4mopp``$XgzRJzyfPEVYoZIdVHJcik&P2mm z$}Q0Q_WzjAE{6%FH2RjP$P{qel0t$ChCEID%Pft)H=^8F*ptDIZW&5D^Bf5!orzb2 z{L2CeQS1C1^Fd=7y7G)Kn2RD|LyUHW#4bUzf2x)bL{}11eCHXynp!HKhlko#u#cRS zn`WlY7A}j74c|c^_|aOWJ0x} zt4CH4PqCpeW+*VN`Ct-Y`uq6zLv3EZz_;e0-~YR* z6Xm(M7*B!{>Gh30AKG}qjSbPQtu zRn73AKtj#%(!O#A$Nn$PT>P-^3nGVL0J`7*(RM2`jgP-8qwef<&Wv+Q?UXp6m0Ajf zEX%Pn&#fNap)9CoeQ-HP=Baa_E|!ojgif2*<5R4-Of|54?FortXGbzk@qK3yJgC`R z%>~{$yE={c$Ub4d9@akw2R)0B!WH#pS6W1#C-WJ`wVje@`yhrheeq`MT{kCc{vdVV zd@vVgPhBJ>03U3QJUA#__IR`DJ+k1}Mga0QSSZOT^W+3%ikj-zBo1G2Al<+^6D%(w z1i;!on9GR}6`?UDC{>ez0z-1t*tBn-qkN|>>0`LC--242N zyu#oeGBN$tAzm+yD!&JVH6-ai?tovCydJih8zwFZs7Hv`MUT1yFu_-RXLr zEL)drkTv`NZN6z+lP0WYCoE&Zv~%$97r<}oyjp7);b?4 zF?u0m>abqa;(il54`B0@N)@7SVa+_RrGUX|yOcWcbh^f~6FD7%>CE$*7`+!T%*1w@ zz*#WztkvejN)PfqsBy)nN*Ot4#4l^}RO0@_&2_$z2q2NJJ*9XOx3={f%jXA-)Ig?Su0 z%Vm2ww8N{_vB>|bb}vLjPwgh8A4l%nYvEhi7=Gqxt&)1F4dn77kOZ(vvXgdKS!J8% zTC*nrF>w8U`H{fJk?G5UXv)fA(%f0fsnTzc&f1S3sr9VIOfX{6Aap1fQk5I0U5_4h z`xJDeFm0_XXU-82$`qped3VDlYPX)-v1Hc=|S-)_slGB-+_G)Y>tP&l? zh)5|u+gZ*N{6}@D{lrsTKkh=@#tq`BGuM0^W95xhMs}GQ3Xbyc4jxO@zWu$f zF>$*GOMOGbSP;e%d+Xn(0UL|Kkew6lE!TZt){OzPLO`UL>;V=8Yo9$Mw_!MwG_*h8N`!Y!c#2q(c=WS5 zQmJblCjWE%8fuDAda2--8bhu(S8jj;+GBC0{`1@w?(Nx50g$An`EWa~{Wx4hv6p%M zIgFNHZf5&Z84R9(eY5RxE3BFh_y4zgN0Dl0d{`@0%T{sLIGX8FE0_p+KYE>2_q&Zp zSeFizHv*%5V9p+W5!K%dYw6bgWDsETrUb)S<(Q6snB+zGg;z2e`{s7*sLE5&ta(JNvlCf0aUkY$n zq`*oI+!P%7@XTk0dSlf(t@i>X?;@NOe^LmVKHLsPgMBXL(gX*?6;Un?`<_ny%`LIy z%6wt&!qt`Ye+8hsw;YkvRnXICthtB>(cr?3eV4lyTK#)9!;eVU=e&N#RNs0t@2epM zK|q6=ONFPoA%|G^G{tG}B7+DNMOe0H%mdWOQ z1Bhfw5Q>83kbUX2)HyNnxOWrp1}xPE?VkvY<^$}ZR;{ZoE|L?emSdtzV;|dv&^TCZ zy5;`aEog^PJB3+NzT0yu=nr8*z1OBuMxkkqC4vda)VazVORGo(c;a@xu84&xTVAb7 zd*+h;34)iCA?C=3-P=QUeeLTNm7Zhs&f(P71)^>XtmE^5s*i?;2#YckeJymr+pP?k z-;XA>0ri*CH&AdCylg7Vas@H_x*hLHOc`x?d5>b z>O2RVADgQSJERGnhwhafIDPyGtUq47CX%el_nN3R#Ze15)9VU(8ncF4EiL{cyd3@o z#p?$a)0s0)2t*CJ3r=dg0pNKy7#h3$aj0f!`APQd<8EGfMGB|TK?sW{Y#y)HAy1RK z(%s(AEBwp>?fcY?=jGe4N*?E*uq+5gfcHQyIV9OxDrLvw57~=^Hc^CP^ot=1k>rxG znq&C8AJ@af1GbCx8ode7n{(re?`;LCMl+}-q%z78oW=S8oOGc0>}g`4E1njNzB)%_ zlTRQOOVj$E@45lEIp2AZ-Y71M?TXb^=>0y5(eFVmh`aq?S0XPvI%H!k!n7Luyhqi6 z00~4-${^rCm?wou_-?8WD(6fmKKJ``Uy%`boOW<9@5G_U%b&a8j@FA>%$bx2o93C^ z3rnN||96q(+i%O-i1>$IwcJf#;uU@aL z+VJ>}UilK#Kpy@jo*ZlYSSutJu4PS<$*Kvot&Poz_fvOg3$nU#Q$O3szrpgUat$(@ zK{%nbJoop{c=tMLEkmF0bLN=sn@tw#%R`4NiN5CJQM*eAgy7|+nBVdPj&Av`9L^6x zSWf3ku0E6WOkH3I<3?P`15`OgDu9RZ|FAQ7lB&tAeBVBq&D~;4|`o#$zNa6K44`;~_NHud!cRDHA`Qa*5M?IL= z=_Kl{&|c;}vKyPKVdU*cPVncQP$g#KFy{K;(?kxx@~@biiJR+y-2N?-(FkWjnHE;Y z|8eV9-sG>T(R=Js#eV2Ftpjrw`7--3m+E!_lV#PFsg=HucXUzliI4%nucmA0l@Wq8 z9QN{1vq<4D=1Vjw$9C{9PS@*NgKi)P!*zsSm4SZT*2zrdVfxjtVof`ZDCMG#BHzru zw*d(savAYGcDoO1G78>po0@2GBq&Gfp}`Tq$fmP9gV9+X%@bC+PN#@)^eKBhf*21} zGu}ao(OIB~rLw3f{qLgufpEpvCD(>Ud61Rx2;F_F5|#&tcLBU{w%%?Q<|!deYpLbj zd$oWk^a^zjKrYuYw7hv6YPaeak?~hoBpt}PTI1Br=vg~@4W;#NTT19L3;+7|(O2sN z!l$+l`a1e-AMqS5iK;ZkR}YYa+)>zMTR-^kE!78N2u?!h8MS?l2~g1n~Uh)LWZaFo^Q-yZke{og<%d(Iu` z+is;#pM$%&kYRQsMe63OTV1b1yr+}elRi2;S&XQ^mncToj88NETophIsxpSLKu3*- zDB&-9X!Dh1aes$C-5ndKz2K^)!PNY+u~e z9kT=%a8wR3k>auS#(aJQ{2;FNQk)yGbE(?V+;)Kt7fXgkmtWU9;i3?%wwufsp$sgH zpq0>FXc;K*Dc)QaBem9+B4jX^&Gk2=+x{jI#|*ePF|U(u&%RqSC|9%r;1UN~S|2ZD= zum*+18#q?PdoTQJ3-?&z9f4^g_BW{^ow#^JRr_?2*Ql()aB-#dB~AGr4{a?WdG?RZ zN?R!x-t*9Tk6q}7g8Gzc(Pd4Dd~PrfrsO7E?MW`XTFH)D&F6$J){x|8!Z$sT4Z-%{O#`sJ6 zeRc-_$QLu1zRxM{zHrNkdgj89)wfKl(sFT@0})k$!6*jaoeXDHV{)7a3G}rBlRi2U z%K2{0hi1ag{197^Ic<8hWD%|W5!gOqvC1nOCnT+gJ!`^xZhwJ&0_RK}%2tpg%R8~) zKcx&B@PH%yBsbN$K36Dz7eW9l%q<)4Tb+@U_rQ9m@1MQhHoBt2-#u=;O^}03?m6Ae zwd1dzKXU~e`em#H?Kwol__6w8S6)r-Q2SXkLa@L~`5HC+Z*VlV3fUx8svr zf?I`BB?qi@OQkmaNO>H!k&iS1A?)94+wyfk7Siaj*)NBUP(8)bz^XfvHLUi52sUS~ z4^!we9rfM4u4G!&iA}L{FsEujTHb?sUo-mm4^Eabs$^@@b3uZLjLs;br6C|A7o zZxiM}!f-^lROuy;p49pR^NB`EQZQISO4Xc9L5Ndx0{~1XRyup*d;bbAJc05p?Gv>C z6bdY9!Muq9b=HrnOv`u{Zq}ukj6A@idksUV^yi=X_LJ@B@xzFsDA-g3Y|kST(Wvjp?7cJYbv46rF|-+@ zQn*^Z*SNz^@B&U+rej_XBZbAiHH#mjtizU4Dbs8N zH7G-&l8!c~fz|Bb*E5J+-$A|B1HjcONGX(k^b`k0X(lblU}tA@haO7q_fD79&Q8K| z+y-hQ(RwAaf})w?j@S;X|Gt#214-wX*@tGd7~7zpFd~Zemi$QeXzCcWpU1MVV&ftc zE(X9g)qd3<3XL5Ue1 zFAoO{zxo7yrlm19l*aSY;WQsB!dwjB7zWeQoAzA*=AIF6dmKSktuc)9VI#tk51Pt~ zVabBvD~nHO69Pbb6nV#uprbh%Zg)9CHdwZK0ZyF&4!xAVCM}rZ(@G%&$I)+eOt;Z9 z?ruTsDyouLbgnqU?&_x5%@v1)P}rcgaXE>-GIg1@LhJSov0KeW*UNt?ffExKzldc_ z^_g3?d5p_xC@$LFs1c}5y1HJo_*Gy+d)j58VuIr`cG%YH`A1TS!@zxUEg7z>z-`=nT z8B|tOB(wG7$YfvIfaALHyBOWlzYEX)Y7c}&{?P(l__WeU5b)fLzkuwaG!8L z1C1@QCFF^ZaL@$vk43ZCMa!o4veLog4>Z2-5?zD&)6&`WH1n%3<;j71%gPu@E}8;F zS=Sat;sG-KO=~w@aM$A=usCX+6A)=2;PwR-9npDGg23}m^tFqS zgO=g@Pq?arjkC=D{2e7AB0ZL(W@#N{*g2B4cX{u!&yG12=0+=r$@r+A25F_q4o-h( z@ITd2oh(x&2&S;&bEOv=?V(q_qXK!}Z@Bc?VLxDEq<|~KTR_O0Q!nnrQ(n9GmZwTX z%i8iRu_NSl#tS*aA$i7WxxblziRcB->PN}~11drKe=(rV1{!5c^m{_4=gQlkAzOC$ z$|cL{_B=6?T|OrJ_%6!^Sid)1I-)jS3xo3&=1fm8otw>$KCMOlD0a1^op}I;kN_PT zAh3Mujuj8R<1qVlcd-KMlesB5vYQ&G2{W7N_>7SV%%nSKOAN~LcyS@SJd@TdnTC(= zV3?td=~S{l`rX^k9ts*%*BpP>A;&Qn4v3bDK_ zFv7yo(sK3&;8VV3nByT**tPX1j4Z{x+0=lgp2BB?Yq%nyS`T-$HjWr{M)`)(@g-J^ ze1^{?!hU$2^#N9N+-vK;Nqpdp7qB3BnraOSz@@Ps)@53hpdlUqbXlADcfFK5m z1pI~6`WY~x1_hM1A#Gl^EB2AlnAK(1sdqIgWhQak`5V|&M7Le(mHm#fFi|c~rt(x6 z#^=8~W~ZmETVd!_UXyN?NPj5B6U*%S%2Kk~9=eM3ODBilyY5`$kAE8yj*u2)lNyaS zxZn>!6bc38kXJXqi3N%LPQA#D(*(~)>nizCOFZ#Rt}!d@N;LnDX!vx31_D(!H$zDj zIXe!F{G*iFsmfT#^Sasaa2k96ge94}#N#jf`J9oD%cywp>GFRSnwvT}I-etD!-i&n zvsgQu3e!sQ-d@ud$T~_RR=x)pVNolG|M;R}1-KG-VkJd$;F`h1Tcyp$lslDI09~Xz zm7sPPV(HLZF);7ek%WazoSX4GrN(ZY6$t`NhejPNGB(hvow5MAOcrHUyGop?mA$|Q zzn{;_`+2~oS6&+brh$amkO+ke9Q9ct<~jRkBKcHygzlA-(Wm)=I$56%fQJ=T&8xN0 zsaDNhHiFoWd<`dQI)7pslJms4>mVOO@YiiY;9b+li=JsskvwipHpJ;#WHU?~w2gIq zK@of3-u3lwp;$-%l7m@;8cynvyonkK`yC6Pkj)W9y$o)<-6}@Hn|vX6VEey=TJ9kw z%WrUmd8A(|OfCy_kXRBMVRm-tl$UXsLs2oWyzDtCLi2Y11kT-|QhmXCS($8XPY9>g zDJ*>*!jB?*K5V62{wq$jTu+!YT}r&M#)5*-c_Q!Qp=n`GNug1pmH^szjY!Q_1MlvC z**r<0tD_-px?M3?*D*qU?XIyI5syw~8Nxez;^6*1KfVbYJDHby(|L`DX@G*CTN{* zxs7qJJ_bdP-qR@h-v&iwi zN!2R}dP4OSZdh+3(3xt@Si&6!Y1}kuhwHR+du;UVB3YwiNlH`5>GJ^>BGhPz)>uk2 zPp_R)X69+uF(UfVEBMvHyXQKsC>H5RjDr}5>u?t*a*k0|Z!KFNk;%X{aT6<8+ABnS zH0`9?ZG|G73izV%06|at7UW>ucYh^eRrwPn#i=(3pQUF|*}(Wr`@qUyGmvqOh_r^V zkS__i+Wd^BZ-CaS^VlAD<>>1Zg85j3PuP49JmbWo;WQi67d+|pa2>UG%26xE9wLx| zWFqcE6J^5?zBEE`^p(c2%&c#n!(8zUc@N0uI+Crhuj3}20s#6f*6IYHMLkZ~Oh)#w zP3MuF3YP)dNTP{_k$(yd;vo)p);}ZOL(Ko)WK|sYC5IvU+bOPOw&l*&xZL?9JVkPa z@U_PPdL!Gr(+7P*u%kN%`vfoAAd+?k6wTfFCqIH2X_KIxp~F`b{+&+rW~T;cvE(Ub z%u?wW=f~Z%7|LnpgattFfcXm5zCyYbPu4=7G!3iEQig*iH5yIGj>K0GRr|IcYfIk zz{pj8(vHEOsgaUYxzIBsVYXq%K+IktoB@H!JV!;cruY;;y%0WNYU}4i`igNAz7sO6 zurWlswVIABq2<~YEZdPLbOuOqGjVWC`Uyb5OR%Zme46ioneZ@lp^tUm$Nb1Wo;#BR zq8t$jFdkCglj2X@wNOd)jJI{SWf}XoLO8UU#AnJ(iyA91aNEO?3g$Q~-zT{1P?3gv z5KJ=xgMRNnWEj@B#vb zL3)DSMhBVfb~EaUQqq~m;EL>o+W!sG`F;QhcDpeiKIXfDN7#X*rSCHwcD%heGMeIK~EBtd{v^Sm-3>ug%7ecbP zjY?+Mit`~`oAPnl0ZA{x~RJw8E03G-LX(ytbVUl-A3Qs-7oKD69Q8$V4QKdHZDs;Z6>}@%EpT8Eo zu{1X|cYNYG`?wsBIpvpZH>8}NK9EFdDt9mlTc$=>)!`8RUrr}ARAE*VIFLKVV<5&7 z*BIPTWq~(;Hc`L=C+Yg_{@%q-pyG8&3lkF*&zniF$PZ(44jV`Tx@zDXMp>aXQs?27 zITY&$u1`=6OU>N|D)ByNVM|5w=6n3okc0DA>8iH?Dn|i=o(9!12BV3M@m!&;Y zT4q;_49j#s)Ofkx`_A{M!gMUkEKY(%HlQwCov*$jQF)k9*3yZ8U5=}y@fXHqrPx+1~Xl)@7zSWn-5(Nw61h%2RZDgPuRy=5#*ZtQ>b?5WwCl?)`esM zMPfxOu@7*5d^4XJx8EZo`~V9?3MAYjDSb7vLnvIRCj>hWuV*l#>Y?JnA*{2ps(Ql{zW2B)y8}9I+tMH_LLs=4J-Dgn%6^M3)s@Y z=O{E@nuKy@7(~wUizOkOf_sF>z^}ra0Kuom(B_>PAJ=?y`>p-GcqMGRTV_2>+jm`( zHR2`^#4lMhybI4)X4aFup{h@Td2yeFFf#JiiO#hs9YcBAbe1QA8@+nI>zLRxUHRva zlnkz!P=fYIGJFDlh{S_eJolNf_~kvzAbAiXS%}hW##J!ef>D6A)j-v$IO!!nqF~E2 z^Blcm#N{o(d9ocsz%7>ixb1(m#ugx_RvmK5CkrJW%1q@VrBPQ0~Zi{ zf`+2T;dLM4k`CCy~gvpqD9uWv;LMZ=b^JyoK>`9AoeM3drc#FUk$6u$x`8vlxB&R zwTnAt<1PC9W{p_$)Dj!)FOSPjyV?ODYds8}+?gd&0$g?wGBYPq9Vrvr-V}M=f^FAv zv}s9mPD_J4PafnrFJBAD4RRb1)58 z>^-QetjC_cWV6cxABS+%CC58hhM%MBZ~74ige)&J;*-M^&N9QQ8xvD}&p}kWl3z#a z`feyIDEokt$j4hI|IPtv?uiyR3?lu;0OH*Fk5w$>^3SROpb+Gm|EE&Oh`FU@Fl2Dr zTGq0VkyHsTVOS{B>^hTNUeBc)((-92O!WKQ8+20@WzJ_D2*|==VG9?qsO@|TRKFWZ z&t@{VF#k+T4S7)kIqI(1*C}yULFoJBWZdUA(pxjfjCrU+Lf1m^m_g&fwM1;6{`%vw zj_#0();m1VIdeK0H);g1jfChmST5czY%~zG(@`;o;{mB#(zFlf zPx*w^t$Ftx+Oa%J)h+88VG6fUB=Bo(_8)x_o+?cDUDRBs7V+J7u_p zFl6dZn)ao&l#9hrwJyyzA|hJo>jYxE0S9GNoZy{HF1{g|8D&~X2(YYJCco+Gk(VLw z#0+rEYARc7uIE4l^CZfnTQXrO#&qbg0IH}XV5p#0%S^KtL`v|7m>x=LAV`8mLNV4^ zcRx2IubQevSA-Gc$=jF8RZu*Y@g5@o4oc>cgG36^s%fuIFVh9I1!tSmk@}Q|JcshY z!JG6;XpACTg-k3cxwHWnJ_148G+yC1d6v|ygBu$czap*~&Hy3uGKR8qOo?UQnzskP ztoNx59n&Ud0^_Vmn`W6!g&XPdE6huYVLo+sq9Z8TYzOsBi^a4S6dFLcmw*|Y2*M)129 z97_*{TTtBH1RLqXa&!0>5L8We9!E`|ByzE$I-y)#Zo;r>~o*G!esJP)Zf-m#Ed08 zwGT%vaFv)TZS@Nl!oya&RSaP7)xrHCk{KeS!W$pg@_m65j6$^oQ+KvBf)U}76kC;% zF^0h^9BHQCZYxA`rGxKCMEUax8XX#LZXQ{WM8_6|sZ^D=z+T+HC`NGLz99LYBF^0L zAh6dqARrzkezGulg=!f5M+OoE73DF7Qjb>}dskyEE8i5HE^EZDnsc)U^E1G&z+fc>ygCGR?1gJ07jq|_B^WL4A;$DhA z0e`&iE>>ahg36<^Bh7x_jzjr>=7C%Fg`qyJY(4F}+$|ybh6n4oOhWvr)h%RAd+!wU z)AV6tkiTc1`c4f|XVBk`XFxA9&G$>i6GN*~Pp|0xJw(z8o$S_tlo4DJzvz!ULT1t- zNiF*hjWAsROZT&%=&#b1X&)=78BSBE!0Kf>0aRI=2tJC8aEIV$Y@!n@c^qBYI~UY2 zo=O&jF?VG7nN<&pS)Upx>z^68$;$6#p!aenAH2@0&z+%h!>RVnVPIJeG;osS7BJ%JIJ)S2_EiF1xzGc8hORiV%p>AEOt)GX0U){wWR#;W2XsL67ugEZJ z=ug4%E^qPGyv6x+bNg+0RL`O8{k2w=aa^D@Tt2)!(3sV2MiT#|`kqGC7o+nU#Zg2G zX0fvVbYjFZ(lH?TS+Nm?EDq&~kWF^)QLOk2NQo@_X0KVJ?Tr8% z{*$8WN9D`l#rP}>C@`0K7LA>Dx<-cWml8Vk%m=3*2WM+14F*A|zL|1}Xaj`3DnDgK zx9J7T82d^O{=$P*S8CahDwMRW^eo@uFrX=pXRnw~@2HM=AZG!`wmo{uNts_0)x zmtscNva1jt@RQ;9AuJ0;;#&I{Dhk?gAoq8R&Af9@yP`Bl6N9dRh8>?-8C$*6u-yR% zS&8vR)kr7v9);pzfy1&N-O02oa!%JR zIAqA#e0%^>1c#vcj2@xM!BkfHNsESm7dQi5W8Y#x+>oVbWA6R=g7FvWvIb zl_qNnN}PNUlzDH$gC;JwU_r!VDc8qET7#rluucKRE|+t*B@S%T3jYqpDgLpVDgP09a$LiiwcdL@nKh)6JC0syJiZd0`d? zWw2xo;x(FjFbVk=&z)iKBug*fcrJxsL^^2;tS?HICH2Qs z$ETopGQm+hzr(JMjTq>oNT1R_KaK(G53bc;X(Rr^4aLN3+AMsj>6%oa+)dQq*&*!8 zB9k!T)dCz!*pzy^c%~k0H6WxVx8;4vY-k5VxQH;`O!`W z>^@Roi08%unY}TGotuRuF!~)XsuWlvZKwlK2{hZzRCC?bogl8UPa-rEc!A)rDxyz*fp%y!7)j?vvZcikp20LDpgV1@YQC z7v=VNKnfT#p(ncCDi%2G|FE@GF88S#V7r5lw&n62lnitsx1;YY>&+NUxDn$D&KGno z=Cdnn=GND_?*F|YvZMfL3!Cg;ZJL@k)zT<)rIF=3XJImF+q)I&+xq+fV$Dt2vx#kh zR?&bbt~#mFL1ADhS%Qfp7Ivj+6vH4?JG7dn6|a)%c#Pkta33E6K7PVM$p9gXzM#3X zNo+)YqWVx<)-HNdl<2{ZQ7MxuBhEA%F_H{zX=GN+t4*$phQS9%NTrie781q2xm|@P zt>2v*`B^Hem+8Y*IAl3tJA()1?aU13iiSTPa{&Ih-_jNF^=#831{i%Y&H5WgcHm=4 zC*|e-UBo}$Z!R_Li@$jGTrSycNz*M}g1B7`mln*iGoLwn^mZ8eVfbaY{YIb1Vw>up zCI^l}ip-gtt6{_436h<>qWV@SswScviYQx720*2%^ilj~EK4+BwJsYz2!hXKWUSr5 z@3r1AS9lL*Bv5Nrst&@6?D`)3*gn@^A1wwFuw;Q&1G_Xn?=#y*hHMOANn=|bm_SfLJKb-R)s z{p1u1eay`;Jz#&9q8pGqQFcur#xNoOLU^BwB z`VLpSHZaPIaRB{7vaA=EsjMl1yG5W~9q{oG2P4M7vExljR*U<0(V=I!Gj@mwOAjXv zf_~<)4)Q(>SOl(}a)zA~rlC{Ntt? zRbC2uOb#7cNQy3JA3W_af*Sd~)dmaPOj;9Iq>$Xe&f6q3Eso-qscrAf@+2k&Ct35E zFETLS-g!68!!|6;5KXzMJ*ya;@OyKUOACez5?V*`OTNN3oLqNo0Xh8azC@2FXj2HH zk?6{HlE#048ADIy*Uw@mZ8(E^HHI&!6(8ejuq|?vC;9BwC`L)O&Vogn#X#CX5fGUk zz7v-Crk+Y!Ih`;lih-nBpFE({Ix*Fkk)$sPYOi3xPq3N(1?7~9?xqybG6|l-Z_c)@ zEuQ{FGWsr1V7t<4!GWjlJv#J3q*$PQynJ5|e*OH^_3mA?=UE+R+VmQfNaK^odaveK z?~6+Wp{{-R1h2fatK4P+&Gqjck1SaC0tH=4=+JRQFxLQvvld{?TwpQbH8l?NJ*T#E z-4C-~{u(n-B$x&?U8;-Mrt~M1d@`5uN!yzi7Zo<=hxdUqgAlwqIy%Fmamz}g7iRu? zqe;@#tdOfeK!p1@-AZLTfeNjR0ogc_*0_|&bP1SRkH;0WcX>@Sp61WMRR-Us2OsF_ zVoqJS)T@U{^43vcrL}%|=DvsSQEJcqV1VDkBYHkCzz6@-= zB*pO}LgJ{m1%)V{pz-z~`wYJl^T?4<+c@GeuykKzPyx7Yk*cqBZ9#) z*;mb+sQa3EqdMjH7yc7g6dclZ748{Z|G;t8f6vJcS4aRoi$10IzNku8g!?69)Oenx zhyNxWa3wtE|0{B=*f|QwL3Qvq*B3$(wgn_Z&z7(^y24tn*~_Gl21Na7e)g>aNMfM8 z4D%;h5`}*;29@i!Dsh{&9X;yyq&LDXkB-ddP$!lhuvig*KxT3l~G{g0_QJ)p?8iSSpO+?{Bj!!X1!|0%X&gSPCSzF4*17iM)HlFGX zt<4I0dx z&Fzb*B~I!{N}um8Q_lr1Gbz25J<(892AXmpk6#+B?RcE+rP}{DiG>}|j~M(Ib6&oo zX10asUPf6=hhW?QKvEp{;$~tl{v}M3IqwH_b0ML-@N=oCR6}uJ;M6*DiCZ2|x$7y= zv>B=u7E9R2cf?~#hXD+PA_f5Zay8mB*~f+%6aLSq_OJo)f*HGn63JKgevTAY-G$h2 z3GO9;*v*2=sVd{3YYCi!8M%ho4TVt^bdW7a5`j^lJ=KJp@ z$GH%?YLjVOL~)pxkTtOc&wO)WanD!A(pf5;#*a8D)lYb6aO}d}@h#G!Hsq}e0aPH( zG9blNxN$4LMchv(zHP$7IPE)JY71ma|HnE;C@l8rx&9-dcjq2EV~Q31=$o9yC) zcQ8Fs9yM)CctRXYJnGWw@`h$I`DidSU~Q~H=#@_5uf)`e0?rO(c2t;>u3HMx*ZRaKTRsH2z8QHz^0uokCvh4a+%oKY(b)Vs1m z?xbkH->iCZ6Y_<6*^JajK8cQWp9r}>eZ7IXWFE9{#vRmTG)Hr0(1BSXqfw5z z?z8c!o1(SJKm!irHQDeISKU?@9Adp^ncl3zGuBS$ashqeJy#8;RPvKM3%boTKU+v< zTlT*;u?0J12g-H1kAd2|3oF_-d0y08Zh-o~zFV9@9#OU@g#LmKSq%c~(qfoUV1Sqv ziPAu*2Tgs7t4BnrSW=&1%t^cB9fcCYfiKD6R?dG~UvFRk9L|ij$LZ$j?c8qEsHtCP z<+U3H(cWndoRyVCVllmScng2+rqyj`v<}1^tE3>rriM$UZLmMXj8csHWp&A8LxSrC z5;%BgfXTqz3v}Fb$Z4Bu$Y9~_cDiACC^=Gvh+IQs?C^xf0@id>o4g_%uaa3hY+zc} z80zzfqt*hy)fW6E#>rh8(E^ZEv6ti}HoiU*_2NO1`wl`TC*JS_c+z&3ikpASoBY1{ z#M8*llSb59-UL86380(_Q>nKG9{o`f2$$qN&%080SZue$H%;Xmds81dkGN<5fy9cd z_bs*|F5|0*HkgS4&pz&!ATM%SO~gDINcI}=2vR+BFCi)KIMy?7eX4I|`B~}-ZC?ln zZww6m?s{hbfIt`B5lPqs!>JR1siKva9mmEikXvO^)tOccBb#7Qs>s8r-ELbd2iW25 zI!Z_HmH287i>Mz&a%mYA#&viFJ~1=n8R@AqX>5tj)+*Ps(D`#Gn7s2lJ1<2N{k;Wu zZM(y(hDS}Eaj5gh+ly~eZmid1{Yp;|Oa7Z$FwE7I^ph z%|3b_1eqOm$`zJYZsWRlGo)mUyZF{r)X8We(q)?)zj<4yT{u{_S_cMaCTO?8Sxs2TQ$fd?fPi*W8w*{zc zm5zOK1*#8jP_<;UQ6-t2D@FKI_<{{ZmNHf!$&)n7GGcdX^)kw#>67*D#)kSr)zllCx)?<2#iel8j1pGv zGy}5u2X``@n~J&D?O?|QT(#d;Y^k%ZkfPZR4O011YVOgI)`8!K;jhYy7I5Fnh*gG2 z>08M-35#OGpnLG30Ym6BRlVQ$^WcYGl} z5=81u^e@PBsXduyx8e|>g#TLDYV64>S7(pB4hB)lrgG(UXKV_DlbWXco1m`Kep5pY zcUU>2@~)6t6?lxGFm<$SSA0Po zanch{w}2BgEOv>NM;ZB5lo1K{Si*DrC&eqbB#91<&cTV>DM@(@S{DeLE#!&;amgc`|alS>9pRh|hS zfMg^!2ks{))Hz%oq!Yk&x1Skalv88nn9}Zt>mx-tFHvZIAUB_}8 znA_x^Ck^kcxlfQ6AgrydQky>{0iWgQgMuq88L{>eX*FUDyvDf*_U`EAer5pBZgaA^ z%AkBH`MTnBVwJ^G+qxQ%teIRzug%)jc5Y{2D`cF8tl5ctrz>(k$S8i zmf(EmqXW)5TvJvjB5tNm58u!cIypoa@k)nQgi7I5QWN|o+B06P2*8n~}L4A@~o z+u}umUKBBW11wnhNoPj5D^gr&5_7+HF_fCSty1<4u<;mJ5E{sv<3<=AT#2t&wM}qR zL}MW+MTTg4PHSHdH2mN6&Cc$pOcm|k#rRFu*w<~bjeF-C-P)kxM%$Z+A>c`XiVb)a zZM@w|n6ZdhS2gnD>pw<}nuZ&F^ICf=QDREN(USkdc3Dx$T1Db3$aHo5u6N|S?rp|V zM?qH6@KGvOO<<06SO?B+Z#W!^tPMo`dMUnm#*pxEc-Ym3+Uy(}K+mN+HJrxW?ggj? zZU8!;Gmj^+^vEqYhv|AopGB=bW&8y@ISm1}fczH?oLUOKv``;UeuwX!^HWC~xo}53 zpJ4e}3hyx4$Wc9R1$P!GF^lr5N`2P{M{|rYC-L3Z+x?5Gm?TK!T@erqF9O(23aTJt z-)WqP8%QW(0BygIA-(*`rVZqN!3zf`pt1#Cu_yYAA0Mz|KSg7&VR zqkoZ{n(PyOS49928%F~~*-nG9;vDX2*~KpPl=Ove=z!u*R}HxHB(Vbz;0fq|La+ph zCVTO$F1%(2O=a?udsY)RbZ66g4PVsoG(Lw8=PS6PY4rjV>Mig0-`UcgD}3h>lcnS8 zx){1fM#p$wWXpF`X_S1Wo}a96=)eF+V4EAud1*S8rI>G*3`=n}@v)=Ky<~bV>;EFq ztHR&0#hdA*M$2sPg&=fnsMOMH5LNk}(yZ&QFJx#G1^(=+MTCMy?3`$}F+6%HAZ*~o zX^9<qfq_`|28{$}WO# zD39eux@F$F7|}g^D>K26IRym!yLQ+uL)oBWx5#G@xzx=;_0+uj4t;C=HUY@lFH!&U zX;}dlt(MUgNy6&7B{~ zA2=6w?pf>VV%!7~D+!dcH`A@{&H3C)K;I*l}bj*V=Ha+0(b z`KN3R?q+98pby^xGs8!JFT?Ah0EiLCtwe_bBdSK(zq`iu_tz)G!5wp4waTAT5DZ`E zWDGG|`?mL@g1ef+nHn7|-f~ZS$eCh=UlthPu+NgvAOZX6@$=eJV+H1@Vvx(-3Vp8Q zvy&oH<4D3%Vrtu{mXAr8nAOu?jvTr=xZ##H#Ats`=IH6C`dW+heOShVj&>5js~1=N zY<35WYF@_!2lwjYy+3acWkUaQ6etc z+3=)(qEPB>V9=8~6%1*b02?Es9_4mh;{k8uOEU*>j|XH{W_mKbQeu}=v{0N*?vL(I zcq08r%fND1ynP}AhlVG=3L!k#KEj0Y-wh0i##+K3DlV+}9JE5DeMfa`;aWmO@ z45p)EgjXS`Fmce`u^MQ?{R@M3M$tEC66DskUb7YA}0N$QA?N6 z{jX}>;yx!3-kXuCsJu7VQ!i-n=h@0WOJl_?e}5y3()w@Hae+s{Xj-jMhiz61Oe)$Q zpDq_b5znlZV_b#uQA>V%d>1m?UR7*dIc>hi%PUJV|1&DH7o_&y&9oS32^TmX9*_?} zDTp5dRHtCBauEj$GKoZd7k(M-jKXhw3*E09Ydk3Ihr9^uXw!by{%|Y;MY&_+sJ2$7 zdcy)o0GI`2Au44=HB@u;NXstY{Pg@EcxzPmh-i*Q1HkVBuw;pd*QQVPMmj0&6hKvZ z*0?VeW@C%_jRp3I4D9`hxt`jBqPWWFNlDyZv-~ zOmNg#f+JrDiRyxe(c-Ox|N59bF>saBHj!ZsTCm~VCky-SN;yQZy)E{OO@7GT@k9&x zq5}e_>N1^p6OvCTv(~%8+E{CF&(k2Z#isGWGQu4obtjs-rGdKKf-BR5{R<@;DOyl3t*ibLPbr}cb#;;v<9c#}51 zad!1nTTrTCowl$H<3{r(D(}zV9$tWnTh42wxiY2c^oEweOt2h7hmm@g34yD~u#;Ij zKsQTLLs2E;N{dpIRJxsaN~vP3#8fP~++4QC@pwhTUobAK$v32^s7T*FZNZ4fv;${e zrH)+U^Pt)us3I0}A0F8TywWQ^v+OAsEKsBY&8#h;wyI$I9i5}a{KNkx8(BLd6Y8iI zQ8Hi2iQlFiBmVkL^I?mqzQbyD9&Vq@M00aCFtOgrmWHQ!Mi%~r6FT#=tV*$BuM7@XfY z>(f<=+&>o$-FSbwNKt7YgQxUW!DI+56cY?(A-9~9DV$9hr`Y@);k3>ROA*^S$h#!k#n2-mcTXn*!<`0OG6+%Uo# zWpbc!IfNFb=$8cqpkH`X8`Nmkw7N>m^LC1(7Fw}6L7}~^ufb6n{iop3B8b@uq=?{*A=A?4dinbAsnk3pk(UHhlEUCpaRwHinS5n0FV z>jX(5#Zh``SkWD%@Q(okp%UskAXOL3oE zUjGAqV}z0?-_traY7_-|6zM~YTgHr8VVD!w<@PguRDb;c@tED)6rwF>xuMP9X7Y@s zFN~9>sW7>?5K03^FK?&I0N2#=u6BAQ#=7@rOsHbb^|FXOjtka4P;eTgj!nd|6}NVD z>bJtuD_?5C%{|i_>|M`iTF8eNx-URQ*9E%T#$w~8`-2&g0c2R3FL8jKKd*^SuDV3f z1>?bYSkajilYv*P?X{1m=AG;B$%9EGQIn}e*=V60QJN>5++Ax`?~#J5p;_CPky^jC z^RbqQxweWLIua~4!sq^r`tBPB{c=X1a~m-ye^BP?ln<)>FyASrziv1&D93w}k$pQd z(=LXmgKgKPj+iEnPrBkb|OAK#oE?xC?}Ou+FLZd zkQOXy9|h|!iJSSjBOssTSXlVc6FwrnYeKSQ>SPG_Q7zrO6R>RTB1tzQ-{4rm5G+%Y zkqCttF;~zE1)s{3@y{GLZ)B|x;4|yG!knH0`D%9L_91Ke{oHsKkA18f)R1IAmgO%& zA{{2oiO+S8ihma!B6M+l`4ub|7_`NusP~a7+^aV6caZSbY2+`>>q`BA0I;O8WG)ss zRqi4>zkiDoFXHYt#{aeWw`isHLu1ep=Qvq!r3)^|gA_iu`w%%WfEhN{-*(Auz@0?- zw3PG^1j>|h{NYS<++cGoOy}`n+2aSjATx5IsF>*nXbs;D2P7bOjh*X+O(xm}cgx=^ zBzR&5U%*e_vbLFS9TL`mG`_h~(H6E&yHz@-3;5(3UV1o9;P;Ow`+xe?faBQ+)x~#FoPiXtMq(2DMS`T8V4w z0uJ55mM@h(^ZJ5RZ)ky?HC+vPOw&Zk53(MwsrVpgpw)SNnwh8q0k zI<{CAd&f$uO>Ty5v7;Q{vP|^+tig!`bUiKenq&-2&BST|1X-uD*tOZu>P#nYbu|vLGk=VU#VYLL2&LdQ?Ou)Lnq83WJ|pTaWvJs5JyjV&Njcc)e39a5LEbGb_H(8PbT zEfcR&rUhyK1IBAyQT1TG@VFNM7i}_UpOpl(!8_HgKiVg^Ko%ylM6JukP$wBX{VB|e zAl8N=q|CA!bC}yj1o!pLGqfq~4pp$x>D_nFu(`E8? zb>$+MG1CUF{8H$u&!A^{UaK-^38l_7HBt@gyMUn&>72nj%w7m!n!t6}rU+o^Rt9p& zr7lanwn{rDvn*Xkg%G98+QGK5Z*2Hi@u~U;u#Y*yFI-JjfF#ZHd6TAn|5wmq^P(S*24R+Xt zcZH=ji=Y{lL_LY~4CnT{iX50B}1RA|)mwxw-(>J@4A!IQjV z50nu5bkPB=UwSv6$7$Y70mps(1&!KPvWM8jq6B4eIZpmcPPIW># zG!rU|gFmnY%VEq6?JyJe-Qa3DMmPgduEUTr*Thd*vXmGKam6M_qS8ZA3ZS;L{&srY z68LiM!5eK(7(9Rhg4OV~QFjfeWYh;y-N+>QLl?qM)>OKrXdRqTR26+zsO_kt``v4{ z#N4qIkW+L1>UU)#TJDT_z?UF<~tQ&I9R5!>fUC&&5RMN4~&awOpeV0h%_5obw!`2GeWA;9qd z-}I?-cn5qeU31jUAj$Y8oT>RypKBCrOmtD`T1s+m5d=DMyW-s_w|Oy6zO@3BHt0|< zv}==g6j3uIrOrlU`v@=UDDa!zHV={#@kz665gy7l-YhWoo4!L5-+LEQWS0b9B*#({6;n# z-?BmV06NQAwgta-&t0sxc5Yq-td4`X9Is6c2sfSv0Fg2S3!HP({(5h+VNg>#%2b>D z`ra>M0joH1YxH21paU_lnlJQj@uCjp16zik-&^1R7Dp3nJVP=K`Y$TNYbtA(9)cJ? zc-wcHuJ3#^bljIHed25ArM0WOlF9a`2AWz2$T1ZJjtejHSnNDSM6m?KW{PFj$oBb; z^ks+j(A9jbv{5Jdc#HK6oPduKlP#DU1>_-i{nf$9fRbz9n`~4O3?#~8L)6e=m02Sq zclV}{`?h`WcF<7#uyxOXQ7K7C6YSV0> zwPaS%7W?^BB12SG65DEPH-tzU!$A1O{M>Q}rZ(c|1AE3r)D=gZi#^Y31!dWy+j^~O zJ%n%S%R+j7c}0GJ>Noj0Sq)q}r+nY@ZoV+Db-F^u>JY6U%RQ@h9@;}#;aL1wd`*tD zd*RTLgg!)^DuCXvSOZN~Ws}4APqrnY-1L90i?x=t<%XXnWJ}buSbt4jIBn4M!Z2IdrM9K1W8AOm-3~& zT2m95<&4Am?kJ|=Sa5a_oU^Ai9|<(+92_RB-pksUMnc&&dgWqzE1mcfrXxH&T-1IQ zCYOk0X4`0tLsSP{A|9YybWf*Hjd7eGK1sOe%g2EVUm9)ajwaqu5c%jU+{5C}4&#ix zDWlXUXxz5@Ug&*KA(RaL1-~DY2TdjW&pmYM>oeOC(hn-F`D2_jl|DCtWU_EkEWPGp zUA_jSqy528U#ux~daY*iz$nb5Jrqe6`H{J7WPf~^QC1A15U%6VAFf~M%F5TKpdE&X z$MLgz z3uku=OQ6FICPa;qQ0P{sKr5)lZj%8LAq~1lC8pqS?obWcry=E%fZ+lwAH$t4o*x4n z5(@$FEO4!RqtZnh_8F#4@Ud}7IDM`|Ct)UgdV=Mv%oxVy$p%C>5)?zjorHY1^Xm)!oVI5ZB72o}R+_fuo_x=P^%d$vG*?C2!hFmy~8%yOT?zRES7Mq;4aqFDPGhNGj?^*k2>Vu1$@LIY&)yM7#O|yvQ*Ch;cFVx$}kA` zBHL_>U^3j83_^3xb&!dtoi;u|=$ZCO=-Wtz^$b!5`VVH!!)=7+wvIa%(Q=U3#DV8| z>?+u!9P>iNz=EN^Sw6J)?D25U{Vy3963wX z<`}&w56yFPR3EQkvPEvFT)^TRf-;8oE<5PMe;0GG{?xc~xlJ_3j^iF_X4akgRjK3u za%f;OBIU=(UdvxO1JemgnaMm>DkYnl#Xw#uMFv>=xDF=}b%9={l${sf1KyeN#2U$( z3N%u3=J8K7g_vFJ<@Euy{v(1!>^_?#Q0r1BOVqk2hdS+p<4z}hti_t5cvMhQkU6EO zy44xFd5>dXe-es&v&n^wR#&!UnsXgfd;U+Gyez4CdKW^W>Z~pTX&5jNf(LmZaj(_q zJhcY~W$tb0Crvc~$xDz%-a8PG!7A#>^Hxm|mz!m0U)ca=KTQrI0NSelmX+Z{q&ZF4 zNcxQ-Ie+&Wx-Gb9p|fl%Z_T(~)_uxLJiH<%i-%~;V}ztxX#EeJFjT;no#9ZhsKzd8 zv&)~(P?=SoOj_KSMIQ&{pF_z-WbWU|GLyj!Oy_NGA^G=bw3^QBbjdG|e2y55x$-?m z;&4_wTb~U$WEvfHw07sX%yDs+bpk%Tz=|@y0v)JrQeO~zCxYiYcfi}7C9ihRNwgz` z4&?FoRCI6UGQb5cKzDIt~rra`nbl!VUMJyj?)1aGrHx+hjRy*9K5>dMWSUKGK zi8d7N<<&i0%I0UzneU@3MFDVc4PLF!#|Wq^fr96La@|8}NX1K4|+4sO7c(##ti3OQ-Q zz?rk-+@%5!GDREbsz`2azIF6=Si^CltISqo`}xTr3-aMS@$cMcpaE7(@|f!>)TQ4K z#yaB&pwA4ITf0&x(|AC8wf9>#x9T%=mZy7WC{I>>t&uhgu-Xv*+z6Lzni(=Mv+g!{ z{t9=|hGN9QNW(@-5AZa@Z}PPQSK&36UN31Dg!kFiWcIP1TsXS0H3GwIjuKT9Ma$Vn zpvHQp0x)9s1%8Zm^^&=A;_g)A*8x_X_bzv{(kIQnBjH%hU&~CW~Qu`$p_YNH)oy#W6 zf+kD!)Fp+#moNt{rCQsJb*;#aX!;6I70m+E_K;-U>bxKB=OCGG$W#_%#PN>+&mmlC z2n$aeQV-}**R;(-9j(x_%1Lp*XHL5XGX+oq-tL_CEM;PBDpj9Z;nNQ<>w-_Wu4%abuP;E7^jLiH_sRvkzF13E?$WMzVi;sYIK*xfIYM>EdX(*eE3pP7x-ukTXo~(11VG+t170&a|Ee#k0(5+JO`jcp(ioPC2JtX z45k+$Z_aSKlD}tqYR(U$&>w*2MK(PGS;I<76nOFE!#(*0cHcok7S$@Y#82aR_|6_i zYdC6brXs%sRv_5%+Wx9z;6Yc*Kah+vgdhS(gxro9UJ`dWPB(5kV&N_^MCzg&sYSk) zDvc3T4X~O0PHJkW+2vj+F2hq&at7{wlVi(Wm#j`ahvs5WAQagji5O{R=;00E(jHle zH?Tt=v=4Vgog}V$3CTpx`ilLG$hdn^m z3OH_~?HTLR$3SID8}vUSM^!nDkZ@strW}8wg3*&qWinu}dvFj~88zqIny2xY*}b2~ z8{4iqNuUoID9T1?*HHkr>$Vb$9kq10(4gb#4V)9a!+xK`n?x1677n|J3a%EuTdty`A?op1nZg*qs%SSUU6#%Q^}EUn{UM9F zeq+$OTfXEtNZrmA!VO{ZI+EX;uC@T)jfCTnhMduTT>LCGUxyQXiHAEWw6jX`M#P;MqLF@54;}1wC6{lg&+<80_J_*D_1Y#x(vcI-Jpz2Rl~t zn0{s-dzU%vZTS22&bdv>nvnMjYzs`Z=CxWI01MrJR0ZX93&o~q4AQu~t%&{Uxbqra zIMfW-oD0j%s|n<>F`U8d!a*LW@Ar69k?>g)y0yp?<+;+s%Tv-)NV@^s4V5s*#fhot zF9vA%Ejr)*y$t;Y2XS54Fx0`puS+=&9h%E+vT5e85cwM#KMnWA;8|@py=TX>Xr`yd znqW8;=l>eXC-#GX=8s9qg{^a=j3<2#mkPrXz0SxH!FX#Jnz=1VzKH;Cc)Tl$<`W;^ zq@FNfH+pUAQ~{tO>1jEoI0lN1P~~D=uNYQ+G5>Ou1}pBOTRXK~IgKY*oZtyS>pEe}s`o$-XQ25I z$!#4W1Fa_jH$ce0z4fk8ZYIAZI@s%z!h-NP?p|(CRPLN3i0uRxCbB3LV{%}4SHMmf z{-M&G2KgO5;q982Ru?A7zj4#vBF?C!kvQiTlQe)Aw&<&&-me{xz#=b*S;mTn-^?U- z8DQ~+2C<_%^FJelQq}a+^eE$WVN2}M>pbCNp_$5liwml~EXJIaQZpQb_HS9annB25Mh#Agat}8&4(R@(x(vPqAmB;y zNkAUx*H&1UM0uuxCv%(2^C~kkdCvSYHtb10o4suSu#`HyKzCHJ%6WEmp9kJ+$bN*| zLH@^T`(OGT+4zkNC=i;rdGB&&6SG@j^}4Vp4#4CbvPtV!SDAy04(!1jE4ymTO*d&5 z+yrXO;S=px(LmQ^F=lyG067o?Y7DiOf|9H_d;N6t>k`^-7n2B7$asK&ZtY-P&@6&v zYQfeLh@2$K&~9n@o^3+Ub2BeEZ(}C8?0j3ha51oFP!s|SfY3Q%o&7%c-aMN%(9`(A zE+KvyWpO3Mn6xrBDXlpO-&>fug@}9m0I4T`9n*`zN{xyX2-@M5Kw=-uf8`-Mw}*!A zrVBJIuz`%>fIP#4*!-t$Rlc|1RUL+xewO8(k_|_1w}xgl*)L}DSs2<240+B6F$&$d zF2~1O=qWeJw0b>;#Hc_9J(OP(|D`B*;93n#nIgKZp`2}$(-!-eD8qJ(2w zhVOW|21#3=lb?1U975e5j7tSljJv^ot|H(&Nko@eSBbK&UvBJ{V8MakjzY~)*2N@c z5Y6ad0Yfr6r768GH1ffLWC$l7yy0f^Al`|P?9(8{K;TpFP(BZ2T#EkGCX;ZRHt@^V z##*aM!08MuF`F_RH(R4RDK!-ogrkuYphcMtAu@=(CIcz^)IIq2UO#;xEAE{OI^{=L z`?5Gl1l&#AHVI)ZqdnI~bOYr<9({Vp0u3m1Y z3INi9-sXL8<1=-L`_OFFi9T;*mW$ZsY-TTQy$x#bh%md$xBpTjg{DO;RCJimnF?7W z;(m>Yzb-X6%xV!f#(^1ASw>p~huE$4l>e{>TX!=}XUVNwVTruo5{_mO_7DhDqY98` zbtOh=HZ!cvKb1AmVfG-!i7pnOR*!@^q3Uftv)dt$lNg1;#I`C_BU_Z-9Q9qQmGaJ} zZeRZW%?aE9cOx>=Y=gt~fYQvKjTnviYr*7*aH)UCa(Iwg|0n0=11Xn|WsFsG>jhhHH20%RBAbuB5 z#{b}g1Z#PcRg)%tVP(_g15hhcT+PKVR!-i#e$)@YgU3b5|KVD$X?giV(s<;ZaV1mE z83fLBLQO?9u^s58p3^T63CCPu;!96nNlS9G=VG+;og#Z(gntgx;M0pM3N_w8N38U3 zjAoM6RL)1u7fz;yZG^sP%_q18`)237`_ru-Ypm>RFAySRVAW3i!p(_p>CBj4D>Rg` z-@5Q}YR3Ka1qTQ?+yWcgBFxIfVs(T&VXf`RaK{OPmBKRBTd3STB(?_mM-bRxLp;1m zgn3`9;t*FU`ywh2qI#~+pf%FOf>D0mF3z^FR^ieeWehN+arFMpy0~R^{D448t6{!p zc3G?Ng9w2hOIVu)q2ivpua2lr9oRR4Vr&b!n(l+6D{bXePHkUxH&I}ytlv*rH~+ph zMl=1Fdxyx+XGp>%vmU|8i9<$27|?$69Prk)FDeQ>hYJ%l!9YHv){7EjrBNKiUM%#w zL|0AL61B%saGhIZ?KGbskVt^OT&8FulTPUx|%@4}o#*igiZ7B`FF*kW>9u#hyn zP>4-GU|>BF2gJWplD3v*+yw+#PKAO%D|;F(nD=|67}{QczS`&rol1{?U4|`~6KvhK z%=DJX;xc)}G4)#)Qac|9bI8XDNvk|+{W(QhhvN`){`6EZLNtpl6%d+k>!3I~>M9?_ zji&##GvsCN2ufijs!Ehe@}Wm{iE`o}!yf8B29vfU{Ll>Ejpq_VA7LcRvThhaL|%@C zYOWeO=1Ycsr#!=Eg+K?7f22>%2t1E=$P5x+sh+E2vZc|5FN!ViH*TeZuSmOf6|bWTuBxlt`FNi(B^C$4F#?i0{&B+#nUeJxGtG^2{|9s_-%Ekn~$ zR3JbCa1^n}#Z9dNh_cn9B&z5A-`-7TG_g(mS4>BRWt$5oae2&7hT?Fxh%<8t2eS8> ztgzjRz>gp>w(B|+OvBtXPhPWE>-gUkHyOPk0QPe0k8A|IR4thoYtg(S44np;?cS=0 zG6q*Z3x%86yVXl5?PL1Pa4S)!!@v%7ISWg@!Pat^!{=0#7I7-&3!OgnP50(v`PTB2 z69lc>)*|mG0d9uZh>EAjKNx4GOWUw>f)(Vf38vnU@+0HNfdx2ov4EIgQ1&ZP66eAnHLqHI)s*$z0}aroCti>JpSC=w z4M(g!6|W71G0w708RKtjiHBGn1SYXG)jih}|SgAH;M@BWaUzPCRV zY8%`_u9QMt4KY(C(|L+;hX9I6DB}WDDWUY}E#N)kQl_GRN1nrcr4hJaOB~P;7$=M| zizW?c`H`YrVzBeN@Sj-`4Q+eJ5xP^@iZc9q+)_WxhdGLLe2Bui&V1!5f(cr*rSud7 zZ-w!N8E4$4#(B0~=kdYznUzu!OaApVsD+i4>%xA>L?^wQh&$Pk&wJ@)_2 zPL)8~ip<4)kZ-{Pr@e9|c4^1;?<9roXo*!>Q49`uSC^>)ZuYp=3vr2%#l`iTfDSJ| zZ_#Jp=GJ;MOOD&$FGqGAL(7qc^r{WmPLv^YXWLO&+8JCQU8#C6yz~_b*k_(nLnkX9 zrvby{*q!jAMehxRN6a(_V7aF;SFU6joctJ=8y2$iHR{W_qC^ExxLd7@u~<_a54JZ2 z=OA0&OCwk&();bX``ZfFp1SVH!?W1rZxTzuoS!HYJ^*r&5|3c(~b{_ySNac)B_FXr|_AX}zXOR)XfNz^YkB;PU` zwE>n79!xK08r`FKZF^8tJ~0i>P%y&cy{87t8w>AUV|CL`nF>~z%~mcDay?1qx#+`# zfD)W2f1gvau+b;6M|A)+q_*`a#EyLuQ)_5=1DwO0&Zn@iP_d0b6Z5uKY9a{s4xuQu zd@1kOh!*r2sELMz<0nX5sES(iYCUt{QUe=%L)wMm#jfAQtd?@G==G-bF^?tV5qg?2 z#RmnHN>b1Ri&N0Gw)9p9HhG()(yl5qGrZMw;nCyTzH)UThaIS!(E3u<8y6InD_nce zg{s~l+?eB81;IbVphNa??0bl1?jd!VyhzDX^B~ z2a9q_)v|(j4M%T?F`+01z#mDmke|TV67hfBO0?v!!5p`hEecX49+GPk+;!o} z4fw=8eeiAhGL?43vJ&v&iUJg zr)acsnY`;Ehe**v^VmTGU7>uzJae|uefM$Ix!O<~c}7o<^tLsC>6#T{9r{|Wy#fy4 z-skr|j_hl(Yt`xcTQv<-^bAnnq0aRLar{3#_G{wd(!Be~2N>?yHp5Me7n~s>#gWGlO27HklI$LQ9FLMFQ#B)=fF3 z{0#E9O^{d6;|(&ysr&}Y-~SS^6a#a|If~N=zHo_WT^7iTWn>F|__GMTn$#T4phk?c zn~0^*Ndo8H=Yu5pjkVyZh=+m5xmkJzsdKP$Hu&3rW$Y-iW&4ZdC$pSMg_knvcoemB ziv38~91N}rVR2aPZ?8GztzurQ=H#V9%o3w1IV-)r^O{)0KKOy`!R=!Tbb9z&lMb5MA z?%u{A6KbQZub7E+MyYbQs)|t*q;KVp32HrXz}8V-Vc%vdB&0%*#cynsHge_+1dBzZ zl_X7adJ5%N9I6n)9W{86aIVb;T$*hcn-c)0$?+Eo9gNT#gmAAgoFhW;d zDBb$~trQ=0R`%Lx7p!mX4|L*Pq3i)VOQ|*b;buaQWYL!DvX#4G{&J>vsYuZh$**r z8TIi*e5Qk>#G)lucN-zE?Q#uokC*BAXR@BDxvQ9ZZra#@WNChd*?hU6OcHW^y0$+O znK)K@dAU&mY-x_r$L51xf#)(wWg~C_-fbHN*Xs}j`y*9y{g%i>fVj9s2-ms@Ew^&u zL-=h(%9@gu0u06~ibjQ(O_7n6M{*~|oR`m~B+m?!b+^y&u2?&l`gih< zT@;0;rigsQA6-5SylYKY1fDn>PIZZzrqKz>_5W_CaoDCdKoHLL^A6a(`_JV8!+qem zjeX=QzvSNqz<%qM;s9`HV>Tpp&N%<3F;y06bV1hHNWZ6^Vjry8gB#c^i334|fiaD+ zTH&;d2d&M>?mdv&NAbN~I&VL<0Oej3;QqOaSH8V#9$ttr2*6o|w_0c+`*%S@7XiC1 zi}gUuG2UQHUEl|?KAW^NceVnNtjmOk?|kb;Z_5=TM+JST+b&?d7SVx>=LlytD|;ry z&){>SL3P(sO@;W0xwLFvl8}aGMoU1=21 zM8mj~1l5duM3zxU3;}Q^xDk2t&^U}y$AEZOIN4A*k; z;UR~|e~#} z5Z@7{xZN1y{9F^7abQxr*t2%qFnZU$FkKpYpxDCGW5- zgTAvP3X4zrw$suQ|1ScxWvco$DG*5d%5i$vKTdYqhTQwO7VRrFm`Qp?|7T;p@eIoP z*(ga&>l<)!(0`}imgNCoWcpelLkhsfk_JvUP0;f(wS*WIV_F{76n@=&sUG2EM>67+ zWyzd%jFx<6sK4DQY`a?$aKf?}t3{e}7_bRh-g$nKL-Gjr0jLehbB`#+oNm{I)H_`m z9vv1)0UwnVl^yN=B;4@KOVb@K>h$a+iq(T$itU&)8QDW*?ASBVY|Jg7FAOh|i!fq@ z6qVInwzx)DEGDFEpJ7`o#s#*P;{xvrKMt2-r2QwwqC7aY<{nueRV3nSap4>JwR2fQ zw`eemw^Chadb2^3#@(#<9UXogynKwhj{t85??5FTvSN_W?~O`91JVcv;ADf!#cj5n z@LfEm3^^B(UmnRw-}kXtU!*VB%hM2Cu49uG6p@Y;KkwQ)fZo^^+)>-S=(W6iHp1C< zo2ULpd}u;c(UHnD=HS;{OD-Jm5au=4Pic}f?9^9Vb+N=AH`x1ZY)<%fr)C-%m_CX@ zm&Ss%(XLI|#Ry9bR75{{4at`v4PA$I^l8nrF5WK~J6IcK8Lg(qv4JSuS|=XdRvD*o zN($~oWkm7{-32)hsC?T;@1N(3GUD0#MO*_1!XDURHa^nTyQw2rF?D{LEz9)Bf7Thiu_mW5rp%bfU>VGYj>Ov-lz@s$`oflLf!hkwcBwhE%l=Gkzihw zK4&P8%u=1xFkK)VaHfgjiU7=0 z`Y}+<1NENN!JNRs2H5J)RBO3w9$oK$UgD}xGu_pgiIATO#U$g`qz)=9*<>q6hLR3U ze#;w-c5?zYU*i0JC~?!1#yk<$#W2n5LQvE~oTTjr-4xA;o7LrWg$9LOx=&Jv9qY8$ zq_3LB1CBeVn2-5IDve_3a47he^+qfAhbZlXP<8XSFa?TK%5N~2#1bPcw$2^k=w4I*X1DPLaMD{iD7gg`3$>+{S zfEha3SH+w8twLw_J(bl0xcxuqi^CA@h89$ojDta*-`?;UuN1(o@6)wA0;r1+Rt5r5 zC(Pt;2L+{2#IKNX77mPy{^&aNNx4CV+rS!T@;QMkC=G12SFa=_VF!hy%raapmCN?@w=`l<@`1u_OQf~)y;x{)C=@CNk7)G{~mRB0cACz zFuA=M3=kPz!$}IRxszQ0ieC*$CP@YcNbz3=G8$|c;okd;Xb1(uG&!0<&0NfW{eaZV z)tP_Q!KS(AEua2HAbSt49&;K8RzGczCu>6w4Ho>+2*e?hv%8~;-dR(f96!1XfQp#` zODHVFSo&Q@XFYL~>*boVu{YLL#MrB6kq7LnAkv}ss^u;pTHts#qGK?Pt>p=@m^(pS zAkIL(ZW2Ljawvzu%cVKl%D_5^s#_^GWzO9GpS47T?t)lXS}z4)YHk;ts+EPJmB)kV z-rl?#@5~3_qdO;a{8H<4MD|wD>K!UHp}bK?l=tE$SX|V0zX}@gGJ`}E?b{3ZZgmWd zL9{o^H*ix?6Geuhm}!6lZTDY;3= z`;!SjLw?3LMKEHZ`0hi*hSIjY&7sE5&L(P=_A)$wYBW^L6K76PA-)lo=ChlRMSM={ zJzf}{@Yx6*Q$Cf3V-3PXQDA`n#WG!pZuuM^*I(>(kuC3L8vvpG-W{HLd9QU$IL8eWmb|;m?Cy_l)ek zK^5=bm zwyrS^Ago}&ph8A5;AQi zeyPGN{S#vE#kV#uykJrbG@{Z6VT5;3t^e8Y$l?0$`eP{>>*STEvX3@XM@1bY=^uVO zs-4 z=e?;!tsR@cuYGTwt}V6*Bojz&|JN3L1rdu^s9YKV9yB@livxqB01qlz9!;qNKK^(3 zIgZGvhRB7D5jGj-QZ{Lnn0SuFrM+5CgOrH-Iffl!FE~&Z6Bz>*(s<#SyXL+P5pJAw zYCA2MEnLHL?9b4p8xHV$0X7skgSSVptG-^-0wh}|gXe(Ij0TG?8r@F~=sZmmY-*AM zEzPSeI1aG^M5X0strT9}>;=1F3!rW-{3GSWrJ<(%4S&wnwe^MrQE7hI6{HW8?9_Rr zCeNYB%PZ8Tt#fhGGOjX?aFVv_teP_i^GhwN1KKFZ670%9gRf+)Y=24V!cJX*lMsQAUFBxbsCU?9&=VT7dEv69} zog!crJK+)ZFZ`6j@qm8uup>6HJ&GKKPaMy#d1#}U<3Nt0;t^dV36b@hjL-KRMM&Bo z+ADND+NVWoV6j|DRX^2&+S1cpDnBP5QgTCeP{&PU~+l0|5{-YE`R;kzi(rt5!10|(W(_8>31{tD`xv;sW8c&(n zx;Wk-hxDS{2)&zW!s!;tyioy!sHV$&Dq~!7ZF@!d-0%o6T0E?`PVK9^mm28OUOJTt z!o-8o0xOyC^nvo!B!^biM}u48FGY)*0l`swbnbJ0Yfj?K8YhcFD^|3+qg}OJllbl4 z=|FzKaCd-djfN-9J}$L^u3p2w|Gj0qW4=n2d~3&y;2QpjUNR-6hYx9m7~gj-OjL5%$|q{VER(5wDCNl9oNwG#@bt`-wVMKUec|};!EJ^UV5acLT!GPPOg6a zl7j=?!k)9PO!+0Z5`^a(MZpqbLyARea~q01|*8Gq#b{O2jp z^inIKkH6P3KZ?Wf;~N|i0zEMdYvMRW;5qXn{prt-ff`B>?(Z59>Q{rn|IIr~74m#D zm?M1ArDe|Z;vfwh1MP{!xJT+`8Sf?3S%x3>FA8pzuJwl-#irWZ9}1+Bqjn)4RfGpv zM9s1Rcg4xW2}uD0ACEpl?%4}J=`WxV0O#|Z=pld1-i}9I#lOegCO2&L3lUD-`H1X} zER{RPL+}NxnUhkvai8~E0Iv3aJ}>GhzNgy!C357TtE^cQw<{5pTpPl6(rsd3q*JC= zlDA85AKq}mzK%OQk!xpdBbQVVf7v`c9IHL|zAjLzp$1)urte133XW*VKs5IPn`PcggG zblP)~yHi_q^eJ9(A00P^mfNsH(yJDR^l4_e-YN*4?p_} z45xRT=Ut%!FIyt?hs~mP z&hf##l^>L~GTp_)WAvS7>C8oNI*tbf0!V#!4%uN`M;}y4<+a9955IN?qUNwN>TRNm zwOTZsUBx49?FO=#JYm{VF3y1Xn0y1t&Fok#?Cbc*s*KRNpB{Hh3sZJ&A(NcClMW2D z`Wx?HHKjFI%#1Yf4E+I@W6UTT^vCW$T>n2R9D~tSD|2-lG;~2F&6g#r{$kx zF+%7YKd3H`UGoz5F`PJl&CiiMh^$`F{$s55E! zRcCa5js`VoWtf!V;nnz{i7U7-P>YdQN(@W;qfa&$CqLykpyl&tE=q&@gifT9LcZ>7{u`w#7VH-~xdcaivtR^JJj|N}_;BeeIg(3y>xOL~**4j8vfqlCK6Sh914N zcimx%e@=y>N*0(f=86VdchaIz#y|pC`&1Q1tB1CrP0>PLrt;{Ed%Ze3R?Cc?$^Ow((zN3WMCK7yQd5(pUxW6G#P4yahoPz= z49nnXdnjTw8K;&~N;7>F@^7OBuD(wg*i-NP-QqVNf&17Lk*R!>#xq1%fqRhEK}>2t zJ-1&mID)#$E$=UjZWH>Cr%vb~ADA=Gh1vsv*bOIo>nz`Z_sAc2HhdYZI5#Ii0&|rg z=wR|Xhm^>p4i%(oH`{~`-zIBplpJ(_UbuDWV%EZsDj#6hX40#~pwgX+2^Xz}4TCor&Aj4t8UjA_fF_iMAy&(?yaV7s_^NfRc?jR9H6reD0hnR7}uQghh7^( zIxx(5mr*kK1l@!vdChL?{8wTpNdF1VfJn{4(yDh^aQLU}JvMO|+!~SiieJKqD6iW+ zo_=ZIAn4b~Rih;q3*(SX=8f5BYuCL>`Cy&Uo%9K?#@@66UwVsiMRwxGlHBy&wDw0- zsbaJzMxi`SzHwFcnH<(51eHy@4$6hTkyMO9A@(O7Q)?Uc3o0?obAvCkhuEttg)9jk zsN%pKeU6V#=$-hxMOQn8ir6y(BU5CJmOo00uITcX4*EzELPS$x=SLdmSN%AR$QT@T z0YC9c{GLxk3X0EE^ZH$dR<>on9n_7N&2)@LN`PLR1cr87`Qx{12!dQ!Iko#8f#}?< zxr10PYfS2sn@CP>>lr_C$7?seL{_J)*d$*3zs^c> z>-Vtfk1Y<^sz(o5YS|{bc`nxhYr%*&N2q}~+G#EplcyoOI89y|ssB&DvS9NO*{fqVl%uw6#d{lF|AbFr(!I2ERnvn7;;FTa5 zr17_`qi$gzE z5_=vV!Ns@doPS0v`~<~;>7g&nYer2e<;Pf=D5HUrgN`an{#H=Pl?t+PvDQEM!Nd9o z4aiIpm%4wagXGC~dNmJjf0qr(+2FY6(^qrZr3gi-o2c6`dw|RSxJzcv-s63*9pr@8 zBJxI3!+|p0sGxX}bU5}g0j_+%DE96rjPlkx)NP2y_aSw%szcSvZ!UI~tg<(Px?$wZ zK2|cvzL+BkR4eiO;JQWW;$}Fa-QQc(6!U3mAJK-Ux3tvg?APl$sv{@I!F*9jmc}#i zEq^((2jeWkVUK-?RIfQc?dN$e=5{?{E7|JZLmRu}1)@gB&|3%-vP0i~L!)|_*J_-4 zQMQ^Lk}`B^M)6651Kkgxi_{oY@iJ`+*AD9BffliHgZrTfWw_At3!z zZDe9Ey>IP+f&S0+1$b*bo*G+%N)`Cy4Kpzx>7iw{*GEd+*TFjw%x@Nn*l!B$v-_yF z_!%xeF*>T?B8H+O^ri_KX!^M$Ud%FCqqVrs7tq~<&m6EEsD-@u*oVOI@$Rd#FwjuZ zOU$%4ZqXybx|1h=pXos7H7CNO2iVq#b~TZ=5H3`eYpq*rRW3JPqG3-8u%HwB8_#?I#x!T;4HT3 zFrnB>jFRm$PKUfF*wLPpk*4_T_OS{b!=Y?*`cEZ>-(kqW=hRujf&e~ma?=S2uzTC^ zg;jBq{_PIhI(t+VE=PmrhqM8@R2Z01aIsrtV^%Aa`C4E^Xsk+|&kU(Y7Lw&y`(F24 zIKLyJvj-agx2~@{esx6b3|0V>8|GiNZ5jL|9TfM0@cYl@O!}RXQ(E}W`$M-?tGP?t z|NcXD4o**if%;dY{pdv+m{Nh540B<0bu9`9$DUT`^M(wVF;&hS9ij}9QOsQd^o^?Y zZR=+Ow6ylOu6kVg`-Q(bnv*x3`1w}Hqj;;q{s*LmE=Zf0)A&usf41DDs_7-vu8=8d_Y<~q!z+_-nH zgFj{o+XFBg4)M^UsAm;LW^5Us%9dNcQbbj>y`io|Isq}Uxt7t5*e3-TGI%R*ak_Fw z{H*-pn+%+v?nR7S2PPMvuA4dco?qrtuMCv1lx`a?D?Ep!_fb`q;S%pO#CG-`0@QkB z37S5-nn;}A##%?~FkE$8(x5=B{Ck}lUL0i`TMn(h|8;7jc3R!3#Y$?r! z<%$!e{!r$G@5!0Da&n$|mghj_%J*U$PLt>TT&P?`USV82?tnSq&^}b&+3pvdj)~sQ z2lQZ+O~<^|#;Zn|#|{-2GR#dke8cjM(7AJ7nU~l5}gxZ{oik#@S z@x(283`gSL{ymOGEFsO06V(Wn*$gk%1NYHP@@GHY0Wf#~ZEGIqs!7v6Jd%yhY=FJGl2ZBI;4NIZI}3u(eE$XUY!W7b<(Q24LN*FshAshwF zkoe9?kg`9rA~-7ZT&?S8iW#WV*}VhC7RV4YubSnGTD!Q|K47$APcx~!owiD zwKmKt?S`)ePj#KOobJ=KzOnTrZy{MI3+)!Q2a*xU-?>p-n# zBDX?~+PU;aQB^z@IMqNcSmhHI#bgqsqq0dDiTJ~z6~ce9B0K~%i>f{k~nF6s`omzZ; zJ!6F5oNdzsHxodb8rfQN_EFRU&?oG)p>sNA z4Xpf=BHD;Uurx0~Z^qZq;;Rk4I4E<5CAh`s{l~=M9lyR`6ISO*Y>}|zZ z$x`M^2Aac>aRrYV$I&}nR-JlL)$ zh;U&}szTFM$2N3=F?8j513?l+IK0$q!F;NLxjr_D5YFw>rZAVdS){VF9{j7_)sQj_ z&qiqdj5Q>Y?hsHaa?U(^CZQYdU8hnlY^Cf>f6r!2rg8mWNAk_uoA5Zm9I0$6*_qAL z*rjy}Q&e(ick3B8_w3y-n%z(&E3xA#thho(uAa)ce85TF#5|seX=vj`q6v@TLgl<&iFUxh}4Nfg!*7ZCK|5}g??tXp3C(OFjUhFHxE55>+EB@lHhuRxY8q zYTVo;V-7WN+{Pq>S|n`vbUfwMs%iNcw{1qVsUXbW*$C(8owC9$mT4-%yBs3RN5ic2 zCbo8zTYqBf4R{n#d9gvQ>CI$F{K1b1VcHPW)k_sKT@VEM9TJl_PB{H?$;P^t3y333 zLVIE&g&khsSF~O|A0D!8&mE#W0$q6tL{sHt#urz*%tpb4ogbz+z#T;u$;FuyQ2;w- zvB%&;EUI5qXfFlwWmHGW^o{?cKoDsu6_+O3+Ep9UPaHjKgFY)vIYm3;a5;VYOVo?N zR&|lol5?U)i*zBue91t;nG-_I-W)2N=*`p((h+rCBzSU*DX56)`igM6O+#qX4-cqJ z7ktHRLv$5sD_&EWiZ&{^A?nkTq0VM^ZwNeyd*$_Pj?KKaG5@mkUihv zItS9)$NEF&eZ`9P;0z-|xy&uSIcyQ5_-FSYxcE>1v3Fl5+)n2WPVYQtXlj%?`5_Xwc*K^+C!xH4gizU=hWAG(tA4`8FRoJ!sFAVhXpl>inj?1E6L2Ss*0K z|C8~3q2f%o3^f;&q}WO6fXM8znzy;REvAdhXdO!SWgS=7lN&uP5pSX~PNiil-XeaZ z@Tw?zbU&x2Cc#`#sQq?vn42n*08mnpFvFRYJE!jW5r=2n@2isPH;rrpxMp;L-8Zf{ z;qVPzjplIZ>EjET)_=T#qB&Qpgm>Vm(0I3rV_1RfoL8Hm4pBYRdXiKS?OU=IbVqVF#p~QSo^(6BKKY!gt1wKn*DRB+p=`_c!69A@ zuHiDu4({cK!6%1SYu4OI7I%(cH{17*_2~qR7PF-sn?L1sDW;6dQa&sdl>`sq3#Ymy9H*oQlMeY zlsvTx%KiX$hjB=9_B4%=iXN)J{-lALWD!wbvaF?S0ALvSTJ&J zSdDb&1+7iBuOuj+M;H@8c8J_7+0B(NoZ*fDBYU&Vx^E#{0u23vOyN4;Ejd{8xk*^$ zCN5!*Re#%`SsfZ01Q_iU=<20uCWmGR72AW3#BIH|18g~90G{eO*r*!tRSY)=R~i4#&*pIlxpWlsNzy| z84Bn#7nDn^418DYcw`O!1cH%%ZW=7Mg+LSBDvHkuaZq4_D1E;V8l>=x(}060&i?y$ z4#}o`zl>rCqtK(=&=vNrU_ii7ym4ElB+)zdF2R1+Bb2(OU8k_Hypvtpy-HxA57`9{ zr07;OTRc09H)dVPLx;ky^V4r5aU*{XC<(kjgH{0_Tf`Ipy-D4kC zXH}ATo2y~`oOQm4BB-U3Tgeg>=7xFGhqge;l=_-xhGgVem|(s$87b%ec<@^3hdap0 zM8A58#&kmwkNyb#lZ45yN$2@9JyN?7nCvRRW)AYrYyXX|*(q2zvcl+emXx$>tuOcB zHTE`*Dxad7gvwLMpmT$jaMQKGOr^tkIv5`p{i#ixtM=+AFvEq%UWNMFlA`G-fw;c5 zz;rF+*A6Uj7T|Qfj|X-wh(U_%P{|aOR!T2dTShbU-UXYgXuJw(u%d z`TOVzC1HiumJ=va=jpSQ6is;;@m?FpiMrq?J+VWtnCGH{3CHLq|J>V#|=L%H)okW-SSjoJgd>4F@`!QukPtH+_NYSGvZ#$0)tPrxWS{n>V8+0Dam%VjMm zsZ2AA$n=4->Xd4eBdW>NqP;5`xzRQ;8DUw0v%k_>{Ss9Qoo#oc1G)Dt?%lsrz|zb0 z%ZVwCD|*k9G6d>)g+?sxW2$d;2$OWq{{6CZ=^&xML=apMe|I9-?>)$xze~2pE{c8c zcdVe6!$}=+k`iJqtAl-$qIw3mOn$M(V`^%IUlEOlewi|6})4SP4Vt7744i~W_hq__SP zfS0?S7?^k>7RT66w(Jc(D=F0k3*`f0H>MQ@o4lr1LXaA_6@X`3IE%Gdh#miQJji0M zHz5~O@Dl@HAM%CaPaZwj$H*Sks#deAVKEa22-1G|MU@}d286e_Iy1}}g0Js26T(7KUWeg4%CAwi7+7{kHXQPJ{W7Jy{JJokKzITwzyk zKgo_JG>xu0fl|BsN*Is&QCU$cw_f7oF?ZXj2cx0%#37&8XyBd0z)k_(7S<0Gu- zMlT&ZMgj1LKp6J3K{}4l#BuaGIml4_czM9Zp?dQtq?#N%wrXS{V*My(5A; z*0N{?h>G}#Hs1IJUpUE_EZ%Zj+hcM_H=j~TL^~Efgh%!YoRE@E1zjpPclV66Rkg_( z1y8X6gir&R`?rg5gMu*esa&9@5&E+E0mCGHanSr9HWfWWIkXDXO`8H^oUJw3$5K1J zlH}+bv&Nio2Qg$2KAN7CE?+15BMoYLGIahBMm=?jCKTb4mQUsYFSyRs_WL)jKzMO% zQPv-LHGcKoBMtXoj%CCziw3MVulV7rmpga0qlyHH_M-xKNEMf^7bPd?TYI(7+GbOV z&dy~sK{nN$m1-qE>%%8MdPl}~ed{tD%w11LNhrVuhfO2S^SGANnHW(LUy?_kEpE=5 zic^f^nr<)rve0>l|~22}mKsd9LbB>AmVnmA|RSr^GeQP(7vi}6+Op^?uTPZJt2 z7HT^<&T5dzQ*$^gCL1iz`3&Re2}mx8`=oL!=)GE#T|w$}4{l<-s5M3;0B)M$E~lPg z2-4_9=>0O4g!)+`S3WF>%ShQK`#(&wSz$n`cUK+F%3rOkq6&GP(EZxc<_1a~a*X@h zp#qSToJXX79xE(b{Rmw;jf9XokNGOM`Nae!#lQ;UiY-URw=^|-sMN3T-b;86u|L*BMxBwrmy2i+*oK*59JGS zLB*S{0aNZ@$wxs?&p&z9eRngUQshGaUj%HKP$x|mSF)ES>_8@E(VlG6zj?7~PWga= zbh;{PN1sT`|1(O7gS3}#P!(I2;qYX%npX>7Z9rZ>f0{yA+_u1knPzzUC%t#w<3VZR z)Bv@X;=!Y@^Q6MOvPF2WY&q`$EkM%0`4sq7%Myx#f^z2`eV0>O-zkX^$^!mRbPja< z1P){W7)#t}vxm5FhL(`0xD=T{^68`@Yx!Ta>O`tZb=jGf@=@fPOkk9|5rj3rXAHvJ zPBMOB)V+Vs%xBV&m~odq$=IEB%&tm2KH2AOM~zTj{iT1fnPEekfPgDW-C`Mc5c_u&`!7OX9WsK1x(-7JY11)| z)7_329ZQ&yM4Wj402qk|8_xe-3^@0UQhN2@>(j&@Fn6c+B^P9bD#&eLFkqx6v`w`= ztn)zHS=m`1bAxeg!ASDp`R`9t=&waJ9Xrg!%-|IhP-a;Of2knw?0AgKl38=UEG?=yIQT?u|299a;zoo^ z#x0?K*8YlpEUR)zSVJ}qeX7(_G95OMcoRAgT9N$g@Ze~mbvTW(W zh2=*GL4ScZ67o$o9tbT=*nhc_ywjJU5Hp!eq?&5WQVxuJC0njX^lQdjMgQJ4X9nPsQPp-H-LT6g~Rxi=;qBh`;WPw=9E~Fo)Rc$x8I+ zMSK-w^qs6SSQaRr+2OIoVH^U+#>^6#8bw41y(!r!-P%LG*v7yF5&`e{S^D$kY3jfR z8Tq40#E|LKOR?a;4B~Bg0}by&Le-^u5%LfO?Q%DK!kL5X@AK}1agZks-uI*#he2^HOWgu!nj7tA^bG5fz zNJEeopSPz1SRK)_eJfUn*FXjRTkl&2iAyXVl9)kPmA{&wTN;s-TIt(RyMfyOjI7_| zr#!GdJRf;E8_wpCVK?+BSX2}_f+26d0NYnomF6fWP$jiQ2l;8JwThdh8SRgj@DSCD z8t_#xQ6bp9oHCz97xkMCwXKV!=~6h^ij6$3n{)WTNa?LJH5;Tu!pytOEV{YW^nwm0 z*u4%=%*Am+JAPpbSv2urgYdFK`n7MFyBqPx(y%vaHRsU9(a~PUnj2Ki4QO#+I;B*N z{P_kB;Ms=203zBcXLu_{Pxq9j)5zWoT`SZ1_igtZeZGph9tWiZO1H4*w|IF5aNVaR z`-5A&|D}QXVG$bf`rG%wH1)8Ap}(@N4MLY1nRYt1T~ku=yX(LAKO|6_G0l6gUvNfv==~1#o(hH67mv}HHC6F=^lT# zlgO`F&~!UxEO17FJnbHgXPYH+Q+Vc%nd|A?V*j9suN&F%JY8kOhyp^{FS91x1&)sX z!NrW>1xUP;?ed#)GQ=~AG^_kz`Q(iQCBfL8YI+2;;NsF8`}fy(!%_M zxG(ae2z?C3#TJkNzWZNJuheoue5Ed!H}9;L!LrNDszsFg3baiTU*KOem8`+x-0KYV zA8QB>m4Pbg384So!ybm^vkg(Peq#U?&kY40PBg#;bB}O2;^|iJHylB`IDf7`qvjy1 z*oMpHBlwxlylfmpY{}p5HRX6?i3-E)qsegMZ@f7wJ``lTRzye`Lbj_ z>pCdbO8d5rVIRBSj~5`8bE)aPm86%8FoN4Nr07S&-GmGFl^{S8rT!5S^!T595VWWW z`yo=JbzSyF&MgT3Z^oS0lPrC~ph;=2 z&Y>><%`8I<;+q8yPeGH#q$?j}65w4&&DVQ{j&pr@JQJc{5b$M&EU)T|YJ}u! zRI~i2QZP1Jn-7jyVLl)XcHR>}*jpb$Nvu2fe)saphw0}g(Y5D+*(d`CU-7~imz&Hd zx0+oy2A`U&Zad4)yuT1y?IFGNKQj?AE8%<*aGo1$n>J75Qdh40A>&{&qjcgWiDl;Y&x_6ERtkOH6pjO%C1O^xZqf|6(jmJ zFB`hYvYiZ@&Hu|S_X3zB_4q%oV?zjO%~9A`3)J_pNnBIkaA<;#D&H;uNqlYvV*w`t zJ0!W-e`P|PgEg1T>v&P68UV&;rzBxgs(tNfg$u)|n`oZ*R9=DZP!fB0o0`R9TjE+9 zW7S&WIsF^+iXmTKdGyYP?PnlGh^jRPS>38pj2XiWdn2qIIbe3^viY;we%oJ4YaK)o zwX=fB0Sfe}qKr-;QRJb-p9 z>O%I9=Yp?(>(tXQv!-ftp`JSiTLZniL*i`!7H7j*nt&C#jL*gmc}PWCeexIQXqx_` zFkTyzXyBF0Y_X6Shs8l{Hx*ALscInGwj^?4L$Wh~xi6-Fd|_ zIMFJn_2?-P&Dzfd5JE7n>{;J-Z;|lx>Lth9m(LnBiL(QcM%NM}rZ7g-3nyU#^c}`H zPVU;KgQv5#vtWRE0z%n5&mZ4;?F1)XDKL&aagc3zG%eoDZ`{CKNTkSs6iX>PRDdbv zv%0Hl`ORn`VD%-QUwc^f)cAyP2P*RPiSOlHBr+;?;2>VsB-+pHy`P5G^)pQOLMH>& z@-~45i7P<)7dTtk>y+Ey>sJ-5mvfmHw4DKPc1bDo5vs{|9w-NR#T|(?Kje`<_C5N$ zndXijY3T}>hSsctFYB>#qaEC48@yukl+2)S9G@K)7lCJwRb zxr2NfPbzK~N5+#+<_R2u=%|-4-@&a58b(PZE|D=rhU*6DqaT1h6T}9fi*Z1gb%!W} zRau&brTT~Zbw9ObtDhsjVjb?l(*$6d-`W2513{3ihw*~nMJ9kI0A>JYH2bkC2pFo$ zUC`(?)f-5%7@)M!9K8M)Z$Kx!AIKMmb*!ydyiGMO&*{cB9zVPkMi;dyDptL7TS8sh(=MI5T1AG#zBU!&pB7~Im?sI*m;kOh((f>g#u%v#s z*iTs5vaRFEy9D`V%wn646v%pOC+2buQZ;T4!hL zi>`>)`S4JOvp(Av->OAa!&GqE`%&v|7*ROcF6D-W{5S8xc{{=Nu_2yE3q&Y8WaBLG zqfnXkp;ODI?kG*65`wIFqlw7_j^eVv4u=uZc0o>SdzGS5TLO)IWa1`H;rm}oVuKKF zuKkqf<61&lyzp>~%1`o)TR+2YLBd+*k1AYsg0^LpIddT{q^!{IV1iGEhrFuLK{wh1 zg;30PLGk@YOA}k|?=!FGwIj$1B6@`C8mt6p_>dm^ix)(0-fjZKU1AQ&IWmr%Aaoeg zamN&kb-636mQOx-!Sm66k9mf_G_G2zjNF(-lP%&^TxaXXql3&F#Cy#ud<2QZRQMTG zWE4h#7~JNkWH}fcgyWzw0rp|gI(ao=)1uPHgfL1G5+=5FYiv{C4!$}@sJkuWH43-! zv>d<7$gNmXM4ArB^OL$p{t9KH6f;Sv$=bLkV`pbRziJS_l73f8eVgI~&8=^V_CymC zoz=A7Yfp9@7|GAGvb*D{HRM)b&VW=k1c#&&n}MnN9OOIwX1}{5C7U?vo`l*0SlCI@ zSliQ&iSGBu?=Cv@Ww;lK36mz$5@mhE#uBaGJh#Nku}UX3w+0L5XQ5dmQ8v_{^`g}y zj@$Gn#b00Ku*{*#YdLaI+UX&#P`i2Z;#)4Bdn>0)!Qq+CHZe&4X?^@*(qZh2SN+tH z6&NCk_kN4lCx0^MlaMG zIa~9{d=XI|QpL{@>BYwhEJfXLX6TYoBtd16$u5hsIl}!;KXE7jb)$ox&1n>D)=VOI zQ@CUkj^*_>^2PKcoNiuhJ=_&S*BGn_MJ zW~}eFMCUPsXh{vSkR4UNu6ci0fs^gn5=E0<$QWXiu^3?a&q){gpoBbl3ft;^{BcLE zKYFs@8*%*-MG|-5G>>t#LCCGv9(U_81*JZPz17r68@LC@^;v(0wM(B}C3JtJE^k;Z?^>hXie}PNEnBN-goBJ=bRdUHY zINBYNze7p>!MILa#@r^Civ&5Ea(N`{3vrB%d!?`24tN;KL?riXoGB-h>6$`2yZ|)J z&C2-*Jb5Wm7B(vfJ0@LTGp6Hazu7iqnwESi^!_pKEwu8B7K{kYW$JIIt;R9H2TBVL zZa6LC5@2@(3xLGKE(3*RbBV&c)hXd_U5thS2OuZd#GfSP&WUwQVFcQFKw#Up>=a{0 zm*Q7_fj!le6EmmW>RTz7iG{0qsOyAZ0TsX@Bd{~5!7KhLM` zT$s?tP|Qwrxj&M@%LA>MRWW_&BF9Vhzb))-GO{6;77xw&t;xADnxkc1V!D3N;d*R5 zHQ$8Hs}yb{MEZmflO`x6!!2Xs!DB%rAFmmo=Kt8E_zT;eAc@gkCfR5@XziIZ4s!)_ zXIh-P{VP8v!-0O?aSr~d^X;`YjAdwy@WEZE)5u7Hm0TH&Yc*8;KsiW9mG6G|>%A^#Fljse*s^J+ z24U)khfOC9MXQS0kR9ZB5+#lzECx}L?tHvNRnJVuMla^+nA5T{oOfO&j&j&hYms%u zjUKKK{d{HVB0p6)WKpydc|4}Uapi;*%URX_>P|=QEO!ws^fC-C@;A)PWiQ(zZIfwZu-E zK7Uj^$M`!J4wx`6V+E6S$5v+)6w1(kO;vI4?`cs)6Tv|+Qy2ne>fAFRt;Q|s>8D!k zDN)MWyr%bodwDsZsX4s?#RNj!T^ytBw=cyg7bWUGYf{B^s}(}?rGwc>QAJJ2fUYsxce0)ab+;bt<)uDORRojP< z+5&?M;wDSMt5czk=$kgmFJuesy32iq5sfDXPQuF#>H+RuAN?a*Ro>s6aygH78fhh> zbL-ELwlFQcmjWXjd!C2lzUS;+1C(Qr5k-o6ery2bcqv8_p?D4J19x=4P=54tQIacn z>X}&--KwxNpuf;}@~*b~9SiKV=l>?Tw7|_VqaqM}|A7xU(av0xI_YA|qzeN%@W()C zu)v(~A01LtO1CL}$vQ!ls}RU_G7F6b8pY$s$4N`M-~^;a0z!q$b=_+CiX2LU^Y%*e7 zY`GrsjgLcLQ$53=J5&g#-g6$=X=Ots9)K3d7luIRxZr~aILl(Qs}kIl zzYbh;ol(hN0@F^II;g)(VxWV9R9|2usW-S-gML zM4b1>-By*~Z}S6#h-^``QNv?s?13M_RFno8bWJ_=ko9aj|<>l1)%vD!@#R1Mdh%M>Z!H;l%BeH;a|v zsC^7%{qjc8bQ|Q^oZv~193sZarzX&*2>b44uX$I=t}w)H1lKmfK46QDVs$Uh;*k>!o|7SmKMdAc z(ql5ry_VOqg$^gcX_H9Q+%+N>Pl^Q%e%MnNHFk-pT7;avB!3-(SjgW%C* zhV(iDsOZR3T=`qo$I?97BYb^!1$R1l5ehaAY`VI~|#v9GFKODydcHP7_hrS4?C4%gZVaIGh|7QOIsmW%)q z+ZdBl$>z6GoBajn#w$q23HSp!b>F=Z;wW>o)5oG+z>vpH&VObqX?l1YIK~*%rsFyE z6VL@yLa$QKcX-VF)N7D^60EHTa3j#zXyrnTtPnt%jnI_%6C~QU!-i<4DgAP|`;R!subbAhS~{#bD1 z$2yBWAW%KjDI20y9-l)+Ii+?znYIqXolcv}_ssdEs=f z0YF{2{@Kt*&vZrr`p|rogV@Nnn*r`(@wO#5STUC6*>eNtZ)3@6Et+lV)LNgu)gwPn zw3A@#S*@FQBau)12Rpw)CwLaRv<7-Gp}Uh6lo%8o2|sIE;L8mlc{1;k>-$m0bxMst z2d#0h*gfdF(K`KrtcT#Dle91yuPBfz$cU$w+L!df>qD=$P?YdwW@l2pQf?rJtMD8T89BAE4m7Wdc`l5 z1stiew2#Mzg-)<654npH8Xz{K&~G4ZqC~Q|!^m*xMsAM2OTj#2^N02_4~Sw$SDmr| zBZbVM4kh#{_f-3g!ZPB_n)}hhseoa#<8Dek43>QF(ZzTx(UNY{3t_5%jHBh^nOI&q z9q(!)4f9vsbhul(m?btV7&Oku?U`7r^#rAeOSO(TGsP-p7+$G!29ke}webw1%(!NK zBU8BO)1p5igBw+oSNrX$IdDN-7PR15`m)y^SDBEC3MVG@X;HbjZ_pBPN6wLHDXm-% z?~sC)ZX#_p)xzwX#E@6K=T{a0XdFn|DAyfriF$9=)_t%81Ir9L2Bngh&X_e zqMrhZ?<GisOMNK>2 zUJ0W(ng@~+t5}DbNM%G)3`Pc#R`Ob*&N@0eM8>I<(j(p&^Zmx3XNa}EeYsQ%Bf1e1 zqcuQiXmUy1m8G-D*RP*Aj=LpjLDr-Hq>%t?iXynCKL#T(!+ptZANh*}^=RO(+Q<$h ztACB^0QTXB2p@s0Hv;o#v?-e^q}7ZS^S>PdFh>4TQHbaD(6*lM{orH%4oLC8ty!>0 z=*qrCQ-Vy0)2idaJ3*jyTIBmaS*WjTCcvZy*Dgoett4s8N4B=pD4TM!<(5Jjf4ov* zr7&8E%9C6kRCC>5 zB6@=`5#a5r_;b|SI9nkk??=-0Zob37-EnTQMOm6r*P_|Z7z_iPxe}5HIto?7l6tqA%Z`fOJI7x7 zqC(xPChXE<^YL^t^QUdn@d>BeaqMSZ1z;K*I6$CT+&s{#(yN`>1m$*zW@F}xybI{7 z>2Fd6W2V5DZc!q2aNY_3u=LTojlajbr!=N_jA1+eA|qlryVF0P7Nh)j(=4zSqX3s519$q8_6g>PT!H#_h-R@k~GyG%rxPwSd#XFQrd zA4&L`W9PV626upWt2=S5s>zBg(+vbGVC7&{tPcU3OH_-5iG9yLO@)Q4kx1BJt>tJo zC>MOh{oC!p#1RBc#e-r2x&KGn&Sz-=E3 zidwO}6%1{Kw;kOC@g@8pJp)#K$@90wk1 zg6y64{}nLnEv|VM-6n17;gEmI@^7ePEg!(TUOW#xCywJbK{ zQo7^%dW%GEMm&51CM#y{7xvL%zS8}(V)x%QHAXb$gTDT%y&DM(0DE8fLtl>pw+5NFzm%3$Q+v@ zYYfLDtTTW;hWkI41WwcyTou7%X-~~FOron)PZrfYEiP~STaB?>w$T&fDy8i8uc)^Z zC$*BZ?G%EmUwf7uO;w1K4FcAdh(zjIe^gp@EAO@RyK7y0@b*X8LUeX* zr=Xj0-`awfjj`9?lSqsAqOIJq)Xksb`=)-yDhb!`*l|}ZhA^8aVDH&ym$aigm%|O} zOKLEtWX1L^uK=$lag&~1E7G_;o-1dh5q}cb_9xJL%&BIks$7@l%%5yz@lTnk%Q_-_sHLm$RnBN&tN32Roqc+`*8V#qpO@$-;3D7Yqt z^T@BjQF?1$H(q)1?`uGDzU-NGydch$^L9ap@?#E-B^pwFlu-uxnh9#=E)#r2b<^Ob zH}`rpzhmt}K#B_GH#)OIT#h5_+0dvjX#YEu$g?drcOSA1vw_eWRnIWoYh*bHi&NqD2Gtd?(M8xfmd&Nrlzjg#)Lp5g;jEXIWR(9ryJ3TkC`RY{zm;0Gaw2pImq zSL4CqeCiECI@;k)Yfwz(mD;H&7=WNRrl%0?K+g=vQ;HKKAcp|DARx{IifFGkT~IfD zVj#*3$(VJE<@7&QCc03Y!Y`xc2BHj`w*{$+@eSTpYswh3Axxyv*%D!F*cH%=!Wj`{ zGtzvrrmpY=gSzbAo96t0^B6zYopdq9HJfN6uhD7!JAGd5PZJ_)RLVrYz0~+0!mdTk zr*x>JBH86&xXZ}%+NbE2$rSre8xv4j@&{CE#IL+PUc92z0}wIzoX+>voEM0HjkJTe z^owxYiCTI$poOZbZ8RQ7w^tS8C&1KBXQcscnuhEDKMfRhyphOM=5i>+UF*=sT z=)_xT%Ne~^f2e8?XzV3YX`@~aOF68tQM>^S-sVdTb%qJaY12y_3jANFFDM3$Va-m;g$&AB{|YxsygImpj>%cnfF zt@m-K%KDXX_YVpjgBsN~qWnn^9dklxu_P6w4&#%}W1ieDFwS51{hZ9A&er@)wCpJ0 z0{i;sEkr^MMlsmU;(7kax7^7mElB|Yj)3N)QCr^QRnF~7rv-{c9S9AiekIzcawf@m zZ9;Z>5IwfweI57ZmQjyKrSu9br$;=`{u3pe!(p_N@nw8k3~snHyd=s1A;3t#9Es|! zYq!sfdkVrTnnfP1x1|Mu#H%jc1eqKBdW2QGJuyW z`U}bm0W>wsc|2b?h9e2Oar03ez=raa%Ej*ax0bm52xw%d)?cAhuR^fy3G%&HcWx86`C2o1rpnQ;_5jpO#o$Z zRI~yJoj>?_RxC(BDK8NVdW+HRvKoW@kZJ2|R~G628Vb_X4XlKsxjN0jPaJwVr=4}v zujB+F2ogPIXnQH(h#&@$ZCy{f)3$xU{9s-z6~DJ}c*g1rW-p6OB?$#F| zWo+2`1GfU5hO&b5xZ6Y5TBpEAJuYo{^a_jnJ!7$9dbb9W_>^(`7+(Q&wv+QbZ}uLR zg@^*p>mLed_Zk)89lj}%;sE8XiO|Gg!K`G)rQ^&~P;Nj%ZA3OW!SYOJ%oha01(t4Z z_+&U!v~{Bgwp&njm{5GjTz2BoPKk}!?fW7r61vEB$p5tutpxg{;uN}e3jJ7 zIp9Pa?H=)# zK4TCEgLb8(E}6GbK-PKz3A=f~E!% zz+(Vx>hU*cZ=5NT5JVy8IY}+4&q{!kdpH%;o9U50gu_4{-|3SK6t&rOwmkDZ1sSX! zt7(ivb#Hy%>9ZO%vz_ftxfOEV3xcpxd633>r&YCtp(eZr%USr@C`iR4yjc$4lc>bs zUTs?1KpEL05g1t;*9Ygl5E4vBJ4jnEqK1jCjI86pE%fkLPyJ&42HJ(VZSrj9RBVgF z^1GX<$=aK-JKs)igquaqZ0}UhfP>4ZG0Q8tfJ-o%1dsMa*d$~SC2+ESlWd+w4J0NvQz~;e;*aWJ%n;iWs&la$w~_l#InPkHvO)IcdwdacOmTd7QX77`P@Q;>TA*ds zU1`z!dhbO;v^IcR94j1t87~&7pp*n@Jwemm{L4i`sxtRqLOFNIX{=I}_{>GwNPo$6 z5<*6*Oz>t2tOCVYLbhaIla~ zP~H*xm|on2crYr5it@qWiw=QayW|1+G?re$VK#n=XI^%>xTb@2X00Dqfb}$ zKY(_X=hJs>NsTMo`AEwn@v72+qE`(iCf|2qF7(sfYm|_!*rd{*L{sFN0jk{Ag}2C1 zV2TJ`T2M8+&y8NsqBRP7Et8~S4lU+I$+=q#nwnW#pk&f^M;qDA7DyO~HJezkey-`? zIGD5h>}#)cfXQOBe^v2JUz&KPn)4LmmZu1ldX*q4H*QT!#SWy6cD1ome3<#Lx-_d@ zJp;%y4{4-3j4E^qz))84Y(K;Uzc)BF&x17Qkhv@_+3QB;7iy6aUxf3GNBYZ1el~F2 zGB1Y4*3K;cqHGWh4@$qo_&1jyFiDDC2uy4W8A={F3$LuS_EZoj_JWN-XAJf4)UC(O z_URcJ)G=p5Uvq$P0!hm6J-Qg4dvHzN6ScuJzb!f^h!ND~;7-s$VU6Px^LXyJG6$YN z$wLE(sy61jA+_=q@`6G8^R zi*FrXsG*OP&Qs&KVA!^pUU~?GK1rG7yt$nG4Vn>NBxB`R@|T&AO2Ad$uW#V{(ovP` z+5qNjD=U!Lvu=T6SFAfsV)_6z(Mw<#%DN?A&>z=o>ymrQY2y`})^Z*7ulJD4Ul;0d zPTTmG%D{NgelJRt<~QDDnjfF+YOY<{JpqAgk*MLRHm=gx0W= zoRW37pL~6I0yfE-lJ|Sm4x{aq4Gtw}7O;v{tymAYQt85q%cR3j+=aS0`td!v30*h_ zW5nFZv%{8fEz{U;R}{&R49wHvq;+aZf1q-{i#yDvWq|z~?}Kc0p@NG{ZF2#M08H&U z^L~N*w(H*7CHNY_v$^jX*9CsqUF=vZ?EtvA2&)#CLxq)3bK6&H}t=BUykh!yQ*x880&3XBYGl|;QQOs?oQ$V z!U_QB2RkC$si6eDk0+jX65qcxe~K{L)X*JnD0 z5SFFbi@ZH*ArL;kTL}}Smw#jI8`;3CHc70r>-OLDn~C)>h_OO!OtwL014bVArw8I= z116iQBvy}J%0bx8QaT$Tj%)Uo(VzL)nbg%h5$3^LG^&rz6%*XkL%oIv;gxH0%ezJZ zhU?=ppABRFWRDDZo4&kMo?`NnBG6`1)k3E6xTSLh#3w;B4_YIGH+t<;M_&n1<#GD~8gOFTriTEEZl!Q{PRI0Eytf(E1WWB6s6mlT z(GH7q9!C;gI%XJheLw1K=oY%{if@Rk+m}d$Qd>-+svPE2`v8&j(6lyi6UI@FzG6KA z$B962tVs#qQb^*)c<$)-KWxg$mam$CpiI>F(7iGI?H(TT5>=YZXn9L3+$eNA< zM$%0UY1=5vs3xt`0R-Fy=rEj%O4bb*u<2shrk*WEzk^n)rumuC(k z#C~mxQtudmig-0Tv_-W$a?>Hz=}M%1KJmr@O!m7zhp3}(YP2^kG6a%Yf9UN5N|DA= z@iASJN4yxhVU0DiR&?Np*qnzU_57X6C*r=X9KDUl0d=h8sq36GWHotYQtGch=4Fg8 z@fSw?hES+kNSDmkABt@Zgwlvji>i@*dsi9&*j|NE}kC?xG(JT_ala;`>qB zdO8+l-P!Uv2Y>7MEk&!{H7_FpP5&WSFU_G!!O)9P<*k|Dyk_-m z;-4qns{>}!<@3g)3%6oDC1CkFTFPk^OfQQK$X1T&G2e6IeQWaxc#yboq%KsilOXJ@ zrsk}_z3VNGi?q_g!M|0-(%GFXqP#_hLcOh0KFr_Qlvrc1gMQSIN z>+Ts@hc^*c9Dzj;>k~t_qv^83d42{h3bnQkANWusFFz6{{s)+(P$h%h%|oOszm&|X z|9;cx^1_7W6lBvrhAYm?D}V>|bI#x|1OD~DNRn0&$LQ@_sVbm{mDHo6G~M&JxF>zb zv5K018$lTQYwG7ae*iG_MaX209J}#dR@H8I^jP)9*{MrMGdAA06ExH8 zLI{{_$&i$bhs1X;ZQCtVdVuSk0@gjYf=}&0t#i9;jMY|1#{o`uwtE!jJ?fzYOVt^w zd=K8AD85xJ=2oSWIZ#qDPNTT?Wnkg2RW#c*#3XO`nRUz+Y5hJgk1+EG-%#Hz07LR7 z*{jKSDKSYA{W4vJISRjv>QY*5j374&`I#EI3^Tv9XsTL$>H%?y!_%NeEl34UodCE| z^GB8r6M@rTQEWQZb!)*@wdT=qO>ItelA>PY|aCFaM_b;0LyPc7GGDr^0oz*U#_e>csQA}2)4 zysPF7>z{hpITk1e9-1>d8;LHhsX|wTQfMW1^3zPmOgyuGF{rh2T9iJO#|0Jc2Mi$Y zPf*6`>~_;QE6d(dOk*Z^_fyoc=!%6T4H@GH%txdX;`&Fi@2c)qnFA+w^m3s@!5aA| zNwuoKpDTyw&c~&x$0=q7()O2Hs5Ti>d%9p8PUdo+5eH?=%$UsYLdXdGBvX;a-y5Z8 zCflO|*?ROg1W!4UXan-p#w<0Nxn`|VQ(ws22-8%m6_*8g*K#rFoB*EY1*t(Ze|qVf z+(=t}Bfq`;yatsUl-3sHnUhZQGG$-)9}fN>zaBI)8uv*^AJR*o+nxQne#g6$FR~Qb z0~uf8R^$M)6vfWIs+-W`eFy1fM0s*rYR?@*tQaN$rnk zz;G%bQ*E$lX1u%)?6mw-<&*-m(Pbyw_mvtzw@+UOn1)^W6v9;Ed z!^s4Oq(j65Lh|h4>a5Z|RwehrM5t-1BX4Y}A<;i*Rdubj8mSwwexEK22rx{B5^AJc zh9};ZmIJ6+X;ALdW-W1l$quMwIv9AZDD;sT^hq|qsRvP23nXeCRFRZ1^Mp7h8B9t1 zq9CL&X>LgsWutV^$ukVBIn{i_b!d{r)}DliBLxCzw}s@#^aOfS(&-NJ2KSY zwwRasgY!*1T}zdjLK0J!uLn*SuU0Y zw3pCGu=m*)AStxdXlBE&tPsBM`QR0UdLw)lM%P_#Urcs`O1xvXh_0nSP`3w5cw9wC zYqNbX$<~EVFI9n2tq)Tx+1$pbzwb&w`LpcrNKsK<-r~6P?g|z?9VEk2!$fRUMBhDR zyrS-l-v#|hzQ3?L^wiqr^|q5-l8hGAbv@7)`l`AGWf)P8sH|-%GP8i(WvmTkN3+Y# zxuwDGOgb6*$1fwiheW(mRD}hzpzqMPVtAp@;nO$zdSw%HFAgB?MnOk?e@xApAP;*0 z^fSy%OKcA)r$x^Ry#|bGLpEAkIN(WCof>_@i^eNjql5p3XR3E;D;BDKar+onY7^-L zNw$Y~Y6?9xdBzHGdWhXYopk`Y2EmELnF7G27gg-Nv>O=!b?qb=|EfEqO33jBR)3F% z6buF7B@1Pw{^5Qeiai=YW+n*pApED3G9fuSpq{mXW1z1?+)S)A zFhL&Pr@@K*^Hh`0hd_ToVY&ntS|H^cTdWGtvlm;zIaSyOUkYwZ1sf3bvD zucg$Ekxr}(@@D-@zIgH5+Z?MR<)m}A^I60nYJi;;Ef1B=AQ87=!JL^|TYl%cbRf`I zGI1{?fq%dDAurUTT6w;znL0N~vWt*)n=F8??top^*~#y4M*C}2bS1Go?>Q5@b`TY1 zQ=K$%;`}QgrnlQmfykDr$6LLMC9V~gQxXdP|3u5M{)I5I4BPu!XHpuMN#`0k_%j8? zB|l`2JH<@Gq!u4qa>&r%ZL8-sL-#bQsLiDNFy`kHTm@VtnL*H~R)}pY+oNI6p{L?p~F*EDi|n;xT9DxXkmIuH}_U z49`CFb(=C`Ad|Jn`nL%#T(`$0zkzBIbmkfRNP9@mu{m-j zyY%uw82J##$%FLFFq|=hQyuusyncR8(JQ$pxj4!?c^!gQ82YohjC9aIEw=S zAj(4%d1@+kbc#dCIIG7}nNzoGf1Y0b!O zAb1h>HbKDIi#!M?&gE|larF%o1m3$Fo5Z*?L>Fe}-nQhM*r90@<^LY|0P*&DuTq!ck7-Ib#$1?05o(TgT z1UDlyXr(A8v|})us2|w~$0?vALc$iisL#gjEK&YX@8T5#a2dW zC=}*D(ibJd^{PX1>m|ZEf7F&T_FD9_TP0zG=?=F_5H)0x81MQ;ppm50_?J>MWIAtg z^%rqp(XtCzF6XCa##;Jd^c}K-yv+e2pS2n7fHSBS$sNshA$wK-Dr^NOmJMe`BCORG z0rcEX-nn1K+NAaVQ}4=>2Cp<+U^uOAbeN&#d$r6iVT5cF@b68DCkMN!y)Z&!LP&0< zvpLIky+wl4NkG4gD8e?;HE;}-B#$hDEV}Wf<27?34M8`X1`%H%0c!{rP+(Fb$47s7 zV11tp=Q6XinBcvVH`Q96Fk59~+dS%gsgicVhOvYVDrahb%Dh+ar(-Mfqftpo*Db|K z4CoTxodZrzwHZJ3uH6o`=r7B0M_yG*Ka0|Gdfz{9IoOt0VIp9fYjW}e90%s zOHGH`oM;dZ!3VeC6fipw1i*XWNEZSy58|~G=pzH!CKJhuhpVS$Ve(*l^IESCt*x$H z>$*Nr!F4$+I&Ihx*MW9wvGl72g*!8t_fO-%85VA2h%$dy&6k=A->3QH#8M&VqrhLl zMIDP8tj!2vP}jTDz|jJ*<0wE|zxS*gmP#hj;m_dMkaKfM3FIc#mIC+Ei@Q%h=geabuZbU%Z{Th|U;%#t zFg%V!mF7!5sGC`#tLm<%ldWak=)ReL4TlTrA|(*}4c8i0c0nb$en-7p)Z|A9*i0a! zN6raRnCr!1hYGyq_HGz(sC)s73^1`7(2H2>?`QHX0MGl85%bq-B^_)Gw{I85$&YXt zdB%~&*E7UjP~jmaAbW>jzg`mf`eNaU+Rxo#fhKQuxAd;R;haV~%oPl!1Zs~r)Fbk)!Au5E!iV|j^*uFL;{Ex>0ZCdLO z**#IAH$VDZy9;aCya#ypX7SZ#YS{6QD<*;xQ$@ ztZU}2#MLD^7t7I3lviK9XqtlwrXFO=ZL;gQ|L}F;9y_dm&J%x}4c+0iETfreLQ*60 zHb5wrE7=OBry2w!f%WQ4l>$o%%m6Py(7%SN1D6#;@%4PGZQs3QK`A7kdJZjYiQZ&t z#D@9-sCF+?7ZP!Xt4FiQLnSfqhtGY2PpDQCH;Uh_R-6{s>0mg9`Hi)reduKQt#~b` z+)skD%)^Evto3`Z=?nmzMv7_#xlNIHy>@0zwJfVIlzPiMCiv2~PX((_xp;_qSRirl1p(v7e+6WfN(Z z!0?={EvJ*(;` zl-(9vAN!?z#l_p}GLRA8;Jnz;Yy?ggx`fqi60$Lruwwf7F6AA3g z2@uA#{l0kOdWhXO-uZ=h^@FSGNsx?!gmbobH#4r# zU3y#w5*1}_RTgh;9Y41GbD)*yI``ioc4d5hS&|SyV!{+FWhSS@T>am%CL!%%cGQT4<}16WtKINR zO2oO;obiM`M)!ZsVeUdtA}K zQ zj^A19{N=csn?=9@kL^qJP{PA>%+ zU+uuB-t{rDad*{FGjst!&Vn3mBEqx-76C!!9r~NCi05bWnq<%nLhs|v+tAj--u{C* z6_OO}qaXY3p2$DS#e<}}tvpK&XOm8%wHWay=o8Mu48Qp_HA5mQMoL9sK4al|Jp0+_ zo9yE+6Ut{cOm}aw3cdMKVWTRu6?^t{jr7Bt;$4@*xhu|FR1Qw0|63qpLB?gICWdEZ zC^bhe<@`7!S%lk8f-D7nORRU4^b98vgh?k70V}e0$j<;=H_ofoycVaZn}N0Z1|j^? zm+dTkB`L^%qW19ux7af$aops95Y-93qqhMdmzT1cl~EDiR-9%r+0YJ4MYTjOe{+b{ zR+#6q33aqHUIhf;5Nh#c%}u90t`u@OU9q|<*Ln>8!_;!dzIS~-;}9ib1?*zNS%{5} zg@F?#>$e|`mFePmbCce;Th2^X`N1QkR}vU7A6qD&?AeFj|LEj&m|AS@9QMk95}nc5 z-%R@ou;+bmEFV(8hcZ|9lpa#%)nol#^qGIKeaUy*X%!f&q(5_;eQ{x}ec%*kdE<}% z9>37&^Fso1#x1_lbj!RT!XaYW3siT?6@X?=jFjqrY}&!|cdQDK2jYS(CI~E3p=! zTF&pEznAax{khxJyesk>dlh_iHtyaTNZYn#D4sVXL2TPmrxI@is5=HZXIyg8JSe{T ztC2s|g4U;xF4P3rsk&ZxyGv*Q;DiUG1^+cUhdjXrWAszPHL;xz)))h6(c}qaYuAou36Yp7uGLj&W)fNAsG5jq1x-SJAL zB`-*G)mxu+4Jw0BqZ`&#`KruH))GW(6h6Khvp4T0Xp3z3udBZ#u#Ug8mmyp#p|hb8 zz+gwQ2}=%RKx!fSfS6i%zrh9UBK>rC;yg6C!Dplp{0#GKQ%CGTT5p@|`v`ID9Rq_v z#5{rYGK4kyop;j*fnXOTqeP>+rk7%C0PfxP*&Ea{3AEcN!sEdsMqDXWtwVg7v`?@G z+u+6%LnbwkBJRQU2YKwZ+2r8!(v8lS^jYOY)}*5U1CAt)vyq?vQ#FR(Ne!wC)2w?F z;Pm6Wukc3ows&%aA+tsX8~oKu>!pP80^B=_Mx~%Jp@#!l(1CJB609V`}GskP7HD0h1t^|pAdxOx`E@ay-{$Td)M2F@`7piHz5*NTOvS7Y2aSwKJ-6N20fiP zzYJoF(6FgnEE(_(6q@7j;7f@hJLQ7VU}A*+MB|4YleU4Fog-Nu{E&LCW@{#8h>bWX zaK`^(h*?m&{$0-}ONZb%y5|8$-JdGju$f{Cf&Qblle1f-Bk3DSu9c7>ZuFFu=KKp( zH<@W#Fk$Nut$5*?)$8diucaTa0J%gY)a$b(3l8y*bb38?TMz^RTNqxidi<9MZl(MxuvE4b_x3QwXMzPICHRvAIh25_+;UW1VBZzvxTeCk&ao#14fs}%3- zM#79|AfpgfoDWyny3J9lE%;dTa$q_(a>HRBS9g@G9MM?KVQp$%lbF{?H7^YIEJ|hM|Af`SxQUX0@rA=QaPsM4CSsAuE{!5 z0^(!)>FDhHL4APHwYBcLgy-$oo5&ikzM@3vyB98P6E64GSNYcubxxZZ+Ucf) zA4L^SMN%?KjfwHqac9o6dNf{#BrGw5YO!hfWZJHeH+^w!)fQTK0 zS&Q%f?=m@QM)l2UKs0yD&)R;toqR&waLn#$0T8>jT!WOo?JxXrD93j_&bjM0CrU9( zC}lmNI$t9tW&|u43%N`%89kp~!$Br# z%p%|`74`?iUasmzmHDT_PI-K(up(iY(|^P=ghoDgL(0lZgJrYhBsH;?oqq?*Ane%t zj&5*lLVTU&woCkDS9aR4K`iC{ub!T5xBcCp6G8;t5Q?CD)-vxF==#96N?gc-uU)_d z%KisDXY#?4*!6@P3fy0m=ow4>O%XY@r}HQ~+cdILrfxV1m|l@>ex$S&2SI;DO8c_8 z7r$%10*Iib-OzWf&o!5st%Q#EU7*8bPQ+}@93Kb9v#~r!y=S;Nr?gDJt7uLIP>t=y+3!?AEp4l7<-Ia!%o<&r3*WVHNb!e$VZ= z2zuI9E)L#D18Z!7gQll1A_aa!B9ZS$G$z{!w$qx}Dz0fUAXpPY$lu~5yU>*129n53 zn}76F%^Gn4mAq04;6?!(S%(zdwnFQhk3bZA7)=Zfj2n^tp6 zkPOamicY(G7(u!Z7liv9+J>V5 z4NBwY!E!}2tvX0yR_&#hZpN*8Xxp^vQ+8+_#ebhg=H($~&3O4gwVurR`l^xXc zdi99(D^iZBBW{3$wJdv|qDe@utm(h!LZX)AkN0H^kk*=Mcidb&eck%@XW8nd#>XWo zRRCV2Z;}=)p%1h-E%N?1A0_ukkRtt?L2hw>m2O}`>~`TBTvHAqLm3YJ+re5+ zkP-Wn15&r;#&%CETuaZl42(fvA69Xe`2DozhGL59+N+R5(S1JKX+I z@tE!&OT0_nx&i3Af1Tw;Sx+J6ogvid!eIbjG=nuwX@QViP)rFg36&Paer72&)2EVl zl}%%y1c-Fq%)dSOfE{?RaP$1x4oNguSD$4|VmDCRM9{9OZM&N^iE;f~u{LeNOP63U z2{I`i8i$&xPvX1FlC_fKWPp|51y9GdzjzHmn(7Jl?%jNY?5VVx8bU?ANV+{~4cjmf zQOptMwiyJ#F-epS4zhp+o`Et;GSu)lL^HQzmmQk`;3=KsDw3biManY-KVoB^Y*At0 zl;{cpG+k%#lD(J0JeG|eJl?ccR~jIV#Uc$>q?oh=sm|B!-q8b)ho4FE95}>0C#mS2 zyK1SDThDlyMU2DWfOJ~->(2R!wcuxTK7Zz#M1Pg4gT@M2YH=oqWB|3+C~oBKreszG z3!=0U)OVrEVBFytI}o4=P<+#eGFd@j;Y_`rXW5gP&(EfK=dFE{=#|GHSy(#e6hOSW z@t$zZ%rsVjQG(`T)|RpvQ!da&bX*!vcwMH5BuxwL0T1-8+%2Vkk3+HB7Z5zv^R`fz zWf<=jOI_fZ&o}Z1dBpu!xj5Cy1=mqj9&yF7z#1;Us{Cw_j0t^@wmU=n6!DqP=&z zK_L&Vf7`P`HJP$orxvrHG#|;IlPc1~l-j64_wYb=_=-|(Xrmyff;Y_=tjRQS4Tx~X zGHO(Kud^gkeu~KRJsYF>(R?iYy08}Qi^@}51u5$Nm1eH?@*J+2N+rlzGuw?8EPK)l z8KQ$*XZ>sxP&!JsEiPy9=#mUlOD}LA2~Vv``Ly%H5EEbTKC^PSW%^P>{zn$P1bU|y z6YD~?Sjbm2HBS1tgi~}WzXx-b_fS=y-E*%OROL&fLuQvbLv>l_A{8O+7Vf2iQEh8S zgUsT;H1_WeQVh**Bcufm1}4IfB-9<(d1UNt)Kf_&mQ*;$KqRF^d_nt?R85-*@PdFm zk0&sr0sc0YXgNNTm;5Ey6*vP>Ac+Xl&W!X5m_)Qtr2DubaCLr>D|;`_n2cBw))5Zn zVXMB9>lG?9fN093g7bnff<$V~j%rWk#Ofi8ygv22XxL?#m3|A(t`*KExN%igeFhE! zw0+)UdECp!^B=JpM|sjI$drQzhBki*c*z-LAU_}QvC#FUAFVa@^NY^uE%$CY7t{q` zkS9P8<(@G?{nNay#IH!*D$R|txST?)+Y05dg^pcMh}vMgJ=dK)4`rVxO7Ha&UQ+Z` zXJ)eczE9nQIGdj{N7xD*Ro_Lfg0*|CV>A+*47c+hrLy0xdeIMd>LIspg<9< zcKR*VUjdGe7hH$il5!?F?dq-UzLr`6E}=Kg@$+Sz;kWYum78UPP`@y|>n0`DN+|4D z@(Qx0N0c#TvY9iUxcOj97IWjVkiQA<_7&uim${5{T9IJYp~*dJF70? z!?`hXl_%0^25-o7CE|-ZQO~Fgd-r0V_k{Z^gX3c3!7SJC4{zv+4&~$ z3@6!-#EF?gYVtJgah;rb46X9+*8|fuu`Omr?F%UAdMuF;OB@_Rd8InUg`_gp z0pkRQLtyU!gm?mIorJZzUzcb`G(95uIYmBxvRrTt_m@jGsT4fXD`XPoM*&3U$55?c zj$Y-zweI>DsZk>;Kx{F5WWrTpB;=`PTmOnGROnIa94JD*zIAT*IX@r z1)_4lNc#wF)5_gfI-khGPf})qKIdwOj}AF^-)N#E&kakeDx`_gw}OZacb-V(8gGI} z^7{8p@s+WyTs$bOE`d*ICTW+k5<=9vC9i84_^WWj7%`<4HjUO=E9 zF%;%5!HKhOhV{R?bIFO77JwLp7Gty>O2u05osa zW1**s;gENMmcX*BgXYV#4OOMK|Gc)O`5S+lh-`5PxKF?8Of(f{x23Q;DW9ZUh2OI3 zdmz>u`^oX9LK8spK;)7^tzWb+Xm-=sdGMogotB-Go_xWg5h=r)(5fuA!k0t7F6d)< zX?8J`P9X3|g>&E^1jMRct+V;kc4c#5{ZMek$oSOIPS6Xw;4}9LozYai>j}L+jgZLE z%e{1*X*&q=%eeJ~s*r9&bloi|T?Q9&)7Y>w0|Us$Mv*8XV8mS}7S#XC9!5SNmo(V{&}X$T8Usu|D}%I08MZH-kOo26}i|1)D{f zY^{cSB$#7klGO%U;&d;dNK^CM`!-UrlE(rE-!iFsj@lb!uQenoR5_nged?R(hmOBF z0ga@=yQ&=UUOg#oOXZ*7z(0(!=^`ucsVDO_d0^Hkw0MlRGK17`N^6S{&M=y;bpM8^oJgH;7Nwt_aN3Wt ze`+0NxBl)M4Jq{572Wz4{xA+ju+K4~%XCs`wZMkq$kK3$`k_Qc` zEnm<=epn0$k?Sc=UaZoiVUEA~j zl?b6LiEI@~-@90`??a3aEn7Gg3`cgBXPP`snGu>(dC~3a;zN49|~6|m7_EqKzQmN zpZILgQ9$sV!VeE*Ukes9!b%%hIFovjagvR)E9_r2t;W?1J^cdY#vmdqQU)K)D02ot_bK1 z1f2Z`*Z4R|2XyZ=GRz-R%T1!m`T=6vOLdM??f4=!7~-s_gyEma^{H36AA8w3lM)sS z+W>@GB%T*R4ktH((xkRp)ku#Muocq3?x+kuN#-np4S^y8O>p$ZiX{zt{P}zH6-GN- z1plH3ILG+y2}Js*MBXR5omd%rlxdYULk=x&N&wRiXI~-{cerk{1=Sd&-2C9rk+BI-4>@ zqG&{b5E_yiYH2y!WsOa~lbSDX+4T|#Y)EH6PW%bH2iSMuRi^q~?S@lbnn`>?^g`LV za*f%XAQ3ahUY&0E%XT9BnLg5k6tswKxR&BDoW_BThCb+dxNpd14f3$c6xH?JYO&IL z2Z94K(@KM^#w1Pu6W_!0unR_&i^SfG5q*tFLXe*W%9ADWX@B0|=K2rtW7Y@#e*8&$ z_@h(^@{jnlpX_4aZHFEXye5fmvxj&V{BSbxmDOr*Oqi%1!=p1Tls!qvE|4B5qVViG z--(woEpg)I*q2-s`PZ`RVe&X0c+M@`7BUxJligzw@--kB!CDRQztcEZLas1}QKQ(w zWiM`rqupLfneiOP%3cxbk5pWojFxECO{<)!VGUwFdy=d9F)u|0BWMj-)jEIB!@>h9 zf(t)=D0B@Rqfp`JtAM7549jtaG3CJmA5Mn;BqzR!H@T6yI8;ARAL(M^)39H9^K1|1A>PCdSp@pMCZp!DFo?iwBkKo2-6uc?4gG%NbnxZ8 ztv}Z>O$Nu7vGfk|?n~?yauNAo#2cXE6VxUTW*pShRuQ0Gx6e%4=6!$nNVZ8bMjCo$ z>dUMsiG?}*3_qo&D&|bJD6Z5v6^KJ7`kCW6`Rt}(chG{QvH%QS8$eEW;IRH^zZkAA zH`hpLye+t;qbN~wz0dh$@ae6A>U|Q@&Yu28=R_ZS;?Xt5D}Qzvk=fEeWXX_5ZB<4i zl{1m66ht*SkZZ$98?I+MLWA?(mibz;fC)GG({y=4nMEPW78yO2`(t`eLKk@ih;ZMS zTxC>ud+-_As zQBZLOmP#8%4nicG99il90SOiG3Xk+3%K=yCURYWRtGjgGD)%d$77h;^$b6?c`vI3( z6z>eup9c`cWZ>go?hM%rh-7&6vw>-dg`ai6o}kT3#>CZXzQ%R^i}QzUXc`zZw2+}3 z$li1X(itpHXfcoqi13Rl_V@&3ktNFV$f854w?S|CotY9HrGJO+zXB^tpR!ct>dv*~ z1C-kx81hxbqOP`7|McRBZ3ViHBE^mw9pAB@1>CJI7l`l-swnWE5Z*B?LDxkLCy6bn zQ$DOxe+YW7b3eng_gEM)jqv;DR~UtU4wdz280mzePqFWIlxG5bhA;D~>L^_Sq>oc5 zgR#?_nSaHP7RMG~`Lc@mwlf;RaFm89nNPQux(x~>rFmet>Pz;4wT*QKIbtKnZYl5} z=e|Vb>$ITIJ5+wEi}}DL@9hUS7v0wJ{IzXk(JKNx^gD}Oa@J{-Pl#Acde!N7j~;;r z3XIPBU|5H~Qyyq3m%B@vG?U@b9fLSs)RT>2YskV?$!AG)g7I0xbc5OWa3{um?iUCn|2s?{Ep|1{L8Jk}jT_rtE^(lu<{%VAHyW|h)VyGGE0xU@nT ze`~7+P{2R%kT2?li#H-uV@uEOu7q3CT^@bG;<`Aif~4YwiLNS;250f_;nW-E`Y%MkLSlg0Z7az2%wu*k-;Ael`X{DnT(yENg zvOkdT^G~D-!v)l+1Au9q1FnFe6vANl08HpUCIH2VVQk&Ot=>mUAA}a>geVL)!8RaL z<|!Poo(~wz6P$sJ5EHfpT*Z7K?vBQK3YwV&3oG_1$>l4Fbpua&)kdQD$`?N?p2Qyc zca}MS0(L{NdbqyTs~hTmFU=JTSY8Z-VvOQkkQ8y^(ua%pH1eHg#ieo$o>RJ0h%7e3hZ4u#mEWAl13dT6N43GXY;q9D~G zwBMR#+9Zxae|AQ{a1aZasu!-p9T8=8_L>LHOQX6~Y+#l=iqa<;9j^CxQM@B~!i_bT zp0v6na-D*vX# z$B=0D?$O$0g#WQ*H*!F|b;tbPCZTJM2o6oIT7hk5J4(dZeraZnyHJd>8J;#i<54uk zdMvy@AW((Sf|tGQUe49clAVOhA1w??BPv;!-19$PT!% zl(g;@=s+<0mmKhLmyNenQF?Z5(++;cUm{A!iZ_No@qT|5kuQ#cuqVlz_;hcNpWBEC zYy-WDT1n;!=_gF2gY14S!`H`#>wXS9mXmH)+sYler>xSnS|3GTwxW{$;tF^(gmD+E zViaK75SyiiA9J`oF#gxQ)2k*o?na`O4E3S3ay$aX~3e0L(S&7Fl$rYt7zT zbF8DC$k4y0AbFnklC-#BGP@c;xt3On6t+Um+qBQ%u5S>cZ^jTeHtc&aVH*(wAp(7aWYQrI*i^4R`^@g`wJ=r<&dYIKL=XirKW(Fc* z^Ce{j>tIi!+UkGTI!0Xg)Ec!rMZO`q-;MNQA{+ne)~xh+MLn&`Hd>0cd!)--AgtdT z9`Wsg7h-6=JydeWx_%p9{{q2W8i{i-iM$RgJ2nao>37$;+A7RCxdJTdx`v&mdP%g6lCK+_#i&}RSN;EXM328DN(^St8mF;bOGItZ#H^^ zetDqY%&~SSJG_QW+ZiH_555O#%^0{W{PnpSZZGEeBb7m*Tw}zVFF!E1iRK=AfX;f) ztZdY9D)4iznyDAyi+Y<0&*>}o8B+$8SyWOy;a6pI2PRio;`c-ku}eO?P!#Du{9XdC zV$rswoNa{f(v{r9N`2|;(0>yt&go(@W_;O|O$tN*vD~1{R1~)i?BFV3S55lQp}xkd zC(E{eoYx^VB0iqj!K;H4t((@0p{ul4voV?5MWaSy^`}e~7MzFG?P%}l75?WGew^dP zY%1XX$D&9}ujoz-qc&7}wK8CRIBa9Y8dJj8oiLS&cerc{g5_2HeiGY3RH#p0>>fy) zlLK7=@OwFCr3!^+y>p*i3Fwewj?oG*6u3_nN_`J-|6bY)+8$$<^X9*{UM~dTiBbgelmzcOuQvkTYt7p z=4H%;pkz=lTgQL@X}UPt(#T3;sHZm@T^Jgd?p*tx;M(OG6h^sc{MuqVDIgpvfVic( zrVE#)T{z58E9Te-hVu?K*Z@D`b9xy|z2^7wt?t)4gqQo#YE-yPis)S=ouTC9e;8uFuLxvT37wm_! z36$<);BF!9O=TRkz@d(Jw3wo5C2NX!Zo0h`3!X={0QRkapIA1)o!;xdgs7H*kbo7+ z{s}-TXo33&n3FZHUF4ln`mxUi`lI-uUeg{r5i(d6ZE@%1&-RzCoyCZ}FNSaggGHCq z;x=T0O<%S<+L76#L6we*>wrJHw*6^moI?ABNKw=XdQ(r0*ZLo7A^qL+d)@nf z!}36a5OMpC0jJvaA}nTgwO%rLp0-tbz=Pkce_l96kp>VuD^}QrD@PUud4xri8V5i~ z(X(w!-99Y!Ir21UwwAY(ZYS|A$bKodAN{kU#t2Gzm;@^)EXeD@VkQFY{Y+Q;-YD}4 zp1!-AMs`NA)E`XdKk}y|_yf^2JL&GN-{{5d;o`sTB_ei=7X;M!ObDEMlFtG)2?;wb zC<{||JM>(G+~p)cJTS{vFcdJI zwsq^~H#um9z?i=;Jw@Q_Bi2}QJV9kZu z&$;Px8JCxf0I0)~grF}a5HFP?LM*Dn$yWR9J3@vhQzNK82%P6|GuF|L7ZNE4CS0ad z8>wvq98~VVyG@<9mguk_qnRjq%^|m-p5EgdjOiL!j4m>aVnA*X=3_-i$L8!eWCKDz zK+NOlL%E8mo_3QB4N2WNNy9ua1UW9mG+At{nE0JMmYBWL z=Bviv#6yI-6DjLUO+jy|c1o3t#UgUIa4Mlt0fg5XA^z$%+Kx2oSHiwVji&Fr7*9E~ zmrqnLn@pzU$nR&Oe34K*P@^BENmIrdOr7}Z#wdP%O`=UhCBr~usZTyMjEeFXz_+*E zxWrS%j^X7MPL>2ClbJMW(4Po&)Y<)e$ zwP2fW0&w+*Px-Y$7ml;^$X+gK15rZAKLGY-2NKBz19W2!;n7-6(Ti z;~OpkeO;xdm{{gfxvr_Lc6?-G#fv%jpI0B@GpZb69OxATV@lNeR@ae#?8VF1gyaZz z+-zov;i_+tQ1ripm_ict`h@`Pm&zP=mOUATLM_WZ_K$lp)R8y6P;Cc&L{wBPlcmls zCW$e2IBr6AJ>_fj$ww{c)Aud&^8TbZ|D6Nxe83guslT>;?wxm48fU^jeJ?~(VlV-X zQf@6m5)7<>v^m3-qF^x%Vl*;3be7iSiF)>Dp=}@xdgLAH#MDWOXy!!!iERl~vO4#@ z9_oKU%(_@wN`aPs)5U>*usasD9!8B9jeUrhE|{wCxAZ`fQkw3lzCD4wJwe7HhUgv@ zLEOd)EHJ5rJ}9!c<`ao@$N76GYzIT}UV(O&Av!Ni6zH!1(RXb2tO@--BK-I|kI>x3 z{xC+Xn@m)x`rw3;jkTFU@DQVD>ym@+CPI#h@`3Pt`+$uO6}^?N7OyBM;}8xmugOw6 zkFego4_6;ir*Sh+1-M|l#nz+XF|37{Kj&@T%wMkmiojMPCw%ycAgQ_;r-Ht zdU8Jw!8#WkO^kUHN_7AZx$p%?L#Stx^3q`+VB)OHQ?QTDo(pb3fFQFA5vpGsVuWe} zaqSPDR~vWAwH}I@f-MRqrVS3JmUlaNsk9!29yY0q87`DT zfd*N(D1668I}&{3m+aH|$fC#@J(b^8?_>PZi0|&WLbi2TM2bRab`rTlFmBp*>RKOWigsavWvHL@fdn7P@{n|6jLdlM>1wHib}?OAePPHf3u)et_ZLA;PJ0|w!%mA6AK6;KNrz3 z2Z1!_Nr~zD_vD|=krx5)D1_O6om6uRieU@phAKkl-MmngFPAT`Vh-Wqg0%}hrX7!!!pls^;w@Emu(x6_;8gj2B#+pdBUd<_Epix{XJp zFHX!DjXkmD-3_m%x`=oy{9(_m?DUFN7qp2{L}dhz_ie$2iFx$!{&4@&Oo>(T3SN^k*^2SpLz)1I4E zLYIF~hs7Ugz{s0R{l-m5Jq5?9N0s9{|3%v@sQAn;d_!xN7KY!$cq%6+jJA<$g_xGb zDed9|ep67qJU2TZad|^3)SxDUI~x3-BjVMx9h}3@!5NjSB{hA|9I$2Z7SIyAyW`4v%wQK=b zZj((K5ck{@OOTEmY@-q13T=jv_MWKrgnRC%@-2^bu;x#}ii>*+)y3)|%PZw|CseP#DuPcf43xKNx}#}QKiPEuhmpAA{@xoLA34s z7xfQy!Lr8iis~9`^5&QD$QmOu@TaFzs z3bLh08zQDmTN3ydAs6a>7*tGr3KgBAiWKsEH$rQvL?O>G>dr}hgsor?-X7E#Eyvc} zA~V?o`j|`;ZGHb2_`F>}9B`t&Uihq1^J9HMZ4&z@Hdn-pN>oCM5$$mTE+=AlM{>6~ryp`Jvff3xK++JwTpb*5e{JoRiW}v*y)N=?UrUG*BZdI1+&yt+Y z?u8p-O*vE$CY8o$kUrAg-WZ$_!2uied6qz&%r13AptW#LK5g7jBq=H$p{9oMOG1aG zZXEO3xuiTQyT@nGGvM@oJ?D-}`#awF&VPwViyXK)XW$o5!V}RxIqCYtdL$+kSE}|k zt)>@H!{e{`%_Rz}scs!J3et)y#cG9dHz#Dn#JrIupdj+jta;Tzj^#h1>s)gm{g#nF z#9!&6vL=h9zbP9L+1|jLTZW?2{1ouyG?=Y841ev1x=Tg??&vk5X)5qT4V)VRMlbQ4 zi+%aRO0UY5n6p`3nj8YOlxoS|KL33hGk1r_^?<^}iB%NIitamVRZ+Co_l-FqS*snH z#)2Mo4rLJtS37W=W=0qAD5mf)Yp+()kWG%Ps{HGi^sc%dR3YB0%Cx~~E1H!55>?y5 zu_iV-O3WHY0RLj%{yGrKEsjLk+rIOH?E(}1UiaON7%>)AD|hnmly-!rE->Y$|N!qRa?^EygpA z-_qItY%DZ=^T2pD@V1p#$F9rvPlp*%Dm)x_;~$6Wwrez)n%9-3&_@5-W$0DJFY>G5 zq^?37Q`G+`@=mZ{976U%)nQt9JfC5$fDbFOHarb-i#QKIyLEuxnWy8&VmArQBz?%2 z-;zDL;kHa7roQV~Jz9RD#qDo$%rw}C5)LeteD#B8?hD~z`H;Ascx0_K?BWZ|O8bdi zZRFE)N*m+cncaN=M0!xec1RaysHF6ea2w{f5pk+mXxv;b-6z~f%pC1baU^zH>cITA zx=m*urLTVv{p`e;UZ9!9IZ~-@8CSpQS+yDJq$1$UDnKN2p`&eX2wt`+S9jtGxnF(8 ztUyiuk~PF{&unI*p~|AhxS%zb>7H>AJIcj);1dz{nh8LI1SdWbsXCPh zU#}tec%nenmy!G4s3V^6kQWBL8c|x*bM{c`4kcz=AZz5I5;5Ziy_W8(THfnF@F{WiK)3vztBR zOKV}Za4w;5bfcL1D<><^f$*B+6xca4YO>%z?&^N_)vK9ccnfPqLEU0j?ZEGb3wUoV zNpB?{F4V{|ch8%MByhO1Pj^A&P>#$lXUBEzoDM^oC{d2X(RFM*WNctFFR*)_Un-68 z!(A@*G>!&qdI(0XpvdNCZWH$3dEr9dJgeUFWR)n9kM3%|Ww(5LsKs}F@&v|IZiZPU z?TMlRbm6Nb05ZxEfkv3`62HS@O8ekUAQr?_E_;r;Mm^Gv)r7Sc;jxJrCP&Yk|(@DEc{h z6l&cu&Dd}`w4@I;8>*;9iMCujsP{<2M|@cm>`uqH&v zYrvT`IE5D1n5n+RQd(rxPz*ZL@7FW0bV9`QTL^#fJNgo5#N0MOy|frGC5p%pgBATz zH*5VM1}SN9OGgvr@3Wz5p7~Ol35k{fl4~FD+_>j91WO|bIw(b%1~Ol$Gda<2=WOi6 zC*l$BlBM~L(^V%Mw`e1gw$zhFadqw|!r!Xeqomd}58j9HFOUpnspsE z5AtV2>FlAc6RFCIr~iV!#bXOeo5;JUjUc$Y4LV^a(XD5@G2ud!lFED<`PHP_f`8pK zPv#32Q5nDurxMX-!ADUY2=xL^d+8q1Q~*IhzQ4FD0TO_dSp9EqcYzGm8`AlZFsjzD z5rX9snTFJsC$wYc0~+g@P+iOVx!NCeQJ0&c0B@M%NUSW`9P>TNI9gb*AuoY-fd&n< z+C~X%vY8^=uJG*r{T;M5?wD*KyD`>PF`h`~IeC6O*ME8xyDddyc`6!kSrGzN!$tj? z7lz*ua#}++f;YvF7t_1K{v!4r8cGcgL$2-#ENGBPsMZ!AFt5Zl2pbMF<-2CIS(iDB zYh$2Q7q{rhLw->`hdoj>+~&>92LExk9`6YsC*$qcvDp@zRUl!wZ2GmuJ1TH3Knejs zDR6#_L5#lqJzLd@&3~_d3?EO>K31HrfZ(4)D^>PL@}8EnkU>V0w?t>EVPR1Yd$au( zJ1l&aNV)QOJ!+0pql3j>Ezz}&CNkatAprqpP)4MTI;ZRZpC%KWIo?2yoadYn0 zY6{F_T3K^sweoQz81PFbJwW6*ZFF=~{>{NUHn!C2_&KqJGt!$W_b$wuf=~;D;IuA8 zha{vHUt~OAz&(@@M_p=|8o1Gqmm+j}ejZ$CNG;10P;!~8Dhi=z)%D_io%~qjxK0Q- zdiy><_M1FqQq(;$0!d(4_1v#S^PHTxcr9uLabPj2_>QCy;lm9|0ht+>u(SaKoy1f^ zd07l}=;?-OJit#&CF#u2tcI$Vss>+^kBmZO9LGFdDGZG@Xz^g<;jmWlUes_hhWaOP zp6rt64ZcuYgi$)Xoh?Z~V<+6k{%&z=^C|L)tye#a)yBJ18(HLV!5XqcRC;n}v=g~5 z!X`E+(>G4&gM*_ImphwRaXWWf;(eFhDZ(2z4Q9F56zR>w3 z(Gtmyl&yc4CFoGC`D0n)m>{$n7&EnOQFX*;`e%}2RgO0UrOXP1^$mgJp&>)+@b||g zTE(c3a0n+zU?0nrS}aX}^TRcu|B6naDK4<;FsDMDIxogp%@D=h{~+Q{3!WMJ;3R(y zAoz7jq4Vj>jO>P)i%RtcOx|!MG`1efWc4B_mho*`!af`B3Gt=l%?;x2Nro9?#cQcI zJ=>7-lw%d%Z6O&y$ibWy{J_V&tCpzt2hEmfGll4a$~j%7KprY=Ov&@`{c;7u-6a@B z3O;fX+NBnWDiBNhH`4Mmp^2C?**4d4O{V!&J(f1FrsSGyF2&$v8U~x-qE>SUkK+Iq zO1#p_XLO|0E(L^$t64i-tmg9j8bLu8iNLc$vx9-ciCHZ{9tnLieAyE+ESQotkKl6oMO9mC6C=) zF2Dt^oeMQ*1kHUQ+0kKYV9Y0_ma*ZZ)*NNC96LlSu6kJTC9|{AD%D}U&17BDh1z_E zdtjQ8VokYOv5r*ehr$Mm47OPvT|g<^cm$;;!hCVL{kMBU@}#Wq;6fAgm%Gu2!AXEP z`&N&O9BjdiIabIH0BVT8k|INoWW(TkL?nl>15eAq$%Yqy5KwK-QO*`~U9Ey)jraT~ zqpwPRXl02wG5d!56V~e55UgQ=U(V21>%sgDIy}Wh}~5o)OZq- zu!k7RbFoye6BqY4R5`!55=)TP`)3(L411Kjt1|~GcI;sJ1`?_#{s}Wu9V4itIAQ!F zChP`rgym`^!O$l+uh}ex+Ejq?PCc%l_*z<#>0xwyNbE^RGraPtkpPx|iLPNaP859O z7ic;-=CYw{k?EY{eoIhj=p#V`(W)>X{o!n~T@J^HjOz7d)Jq{4FDB)oc%X|ud2kLio zb?XKa;30DF*iKN^xCFa)$QtDR^kSY0+@+Qe*TYX&?;wHe=zhvvSBpXAV8Jr^5R`0< zZvb+NDKPK0>}b~n;c%pmHS|PHRJ~t2O1EDw>J;5gacbcYz0R07=2*LGbiQHd{%aD1 zIgnR1zu3Z1bwutI?@S&F+n>p}y4Dhy?sY0?pb-6i9~DSspMyFB8F~V+6~ZV%Q<!7zIREbwEW*;5rw_jnpR<$x>=q&^psJQC)sLvpX!-tOqu(c&*LQZWa5?vzY* z(M`m`<4BQ*RsOTPx@c8wf*v8kHZ7!SPBNlp0s5=VN?-zgi#HdJ*u?`2 z%f{PS{EN1L(;yZAXhT@?K)xlzj(xIAjXdifeK?XUH6TX4soE*BSMHcuZMv$+mGB{8 z$tOlxDqWSiXf(`Yf?vsLmgm9` z>7nm%GTFtto;xlXI;AFc5!FGQWQif^F=a5Nnbn;M9wEN@Y2(uC>hU-eM`$MOH&>I~ z(Zd{tPNpH=N8Y5d)yDHOixv}gY9Wz~!AIJM^~?)e(XxMiG~UtxT;JtZ;>wM{lm>)F zoz)ug3A%k8mspKKm+nPA05(s-6}izJLa$}?+jAPPOHDhi)-;F$^?FnLvk{1h$MeN3 zzNqv#AR5U{M{zvy5~7c$AB3f_6P**0af-t5?`5@`LS1^3K|iOWsB#=pPPUYK+w@Ih z$zIvipHx=T*uz2u0ztG`r45?ZNUj~ogTxY{s^)C~yd|_~UHRfXO(*1$Es;&H3Lxk# z8!oG-U&Z9R_=R&_wy?VAkaUczy$Kx`b>LPk#d}HFYAxdoFYX5gA{1|%?VK@_-ThA- zdX+y!7PkwlA(CLF=@?Le9sK+v$g#q$8TFez4`g`~X{U577E?0^RK6mVk0Cf25^1#O zu85P~pq)1=0x(y3Z%U+1nhwq)l7r-$v1llZ_i*^N-#b2anT&P3Xty)aN&7($VfqCa z#;>=raUSLC?i0W)8^3{egw}Dwp{`mXZAJw7<>4zmJ+-*C^^s-;E+cF@%4SG^>n$ny z6RodX)UWN`eIgjr-||#Ny-z=wybuE7A=_81oCYhyTltv-tqM8+ij66Yy_%E?sTDFY zKoo~0iGrAMrcNWf(3OI_2%(E<_*(UjG5v=NHLSDLVH((}P8Df5Hy1bnFOqJzg`98xAxjC( z+ce%|)WFrGKdsQibqr)-`@VaKl9S$4{=F8oybP-&?507eHK@_IB~~T6FXQp?k;1Jh ze(rk4);G0|Pg%TyzC~TKr0`yGX@V5PZo4*H`jPEw)`8_I*tg=97UeE>6raP&@F^`m zty*5KA2aB!~`exC^Dz+Ly2h=Q517zLX zw7mUX?vUCZW!D7W`OrMj)^PQ@Y z0%3(>Ew&Sv>QPclco&6e#^?aWdlJcez>JaDh=Y|CqX48=0nHeTn~g zm!tFU@myw;33iN3yCliSZJr6D`|)Pt)>Jh>yKbi85{}qi+G7>H*}}6BW9zbl)B? zoiYdKQ5_PEN0+S=bW+{ssSxf=Rii8Us2h*%iDQWshi$g1TpJp<<_AQ*b0XVuyJVmbCo334IS=R}E(; zj4z0ADIX5|SsT5!Zp(8jxT+#@cFUA;`?tlG-jbtbc?!?*;vT>79&?)QH z)?@^R2A)QUC%Pl~;4IgB=dyS`SF*cil;3lC)wn|vJiZ0opb$%7JTM3^0Z)~}RjZwe ziRnQW=gus%B{+p5)rMa|9D5Ff54@`V6L)}!&PcfUuFcjtj#Bz?kPd)N%33ZmbZbY_ zCSD#P5fXECE=~{K!dz7fD#gwN)L@(&mj>U>W6}U`+o|vc0mA}KpUwlrV|JBg1%QHF z^l6#Uia*stmCp712~QdEc5YcO{dHCOjR>R?Y$Oz&b*-SBg|HDl42-o#lSj4_vh2kH z)4G#T%u&q4#;E;f343ZoYM^zMy!Y9bG_Cz2=gre~;or`O-)U(=k=z;HciC~=$OyB2 z$krL|3|ICpoA^2eKG83hV)V=<_r_JT*ww(~NiwZd)TnTbn$cC}9o?BnbFTtQ9Hi0b zId8s9$9xlca7un;YkjwgK*5IyOKCn`k#Vn!?Dq`W}>AIUIosJO~DV99JN$i^M*K@UX|}7w1ny&1VgjXRUz~OU={M+xoKfK%hl^r?UEg|4L z#T^N(u@11MFfzf36Z{YY;b>O|5phe)t~8oO24(!gG0El1T)-sRle+(nQZ6Ty|B3eR zq%4J9Z`Rs==)BTzLcP$Mbt4OKk<(R}B?95(_9a{~T}-;Zp376ZHy{acbudZh3jWC& zgYUX36Ynt>`!n6Z7K*mfx;~>QXCA_UKqE<{lSP&vd^#-H4Ok;u;0KRfjDnX~3IDhZ ztS_2EHC6D!S=FQ65w*Ljj%uTDH#Rf}z{kZ%uRhMOkW1VTjh*`*U~wi!;5ls7kJOTm zaCF`6aA?<4>1u0{A5*!Ej5Gdwe%qFilHFb@Y*f zkWT?7k#Z(<;9)*wG{#h^~`~!Jv{l@Hd-{v z!sLv7RL@tKx5XOA@jos*6@^}fGb3JNTXy*{=r~2TB=vX}?) z>qkM2?!X#^7yA>SZEZDT(5A>~uwhy$Rs)9)-?AJCZg5XdufkT5dCp+OH(~7TFM(XS zvbPntby+pzbcm#99ZqjSoaj+Mq|L?+dVlA7WUT5MncP;9jCP9vd)t^MmXrOv$`mj% z0-(JLRtXEm#XcmM^hk0At^rjMLZHPX@d?jJ$YUhGJ-fEJE9bQ@Z=Z>cFSZCtatOd& z*x~gmM!HFM-v12`Lc-#Z_h7AL)Ys_4@S142{x0JLE78Qa)kd{FFiH`YiqV+m^_Zx;2svTId z_ENQKx=9luwO{E=YhS?eSj-MAS&Tzj`|G?>yvmoUr*%HS-W2P|b#^}Tb`6OPKD!pi zkm94R6WOIKDXDCH4jL6S42h2i%zg(Zo+hH|N`A9grRZ$kVf5&Y{=xjn;Aw%d+m|v7 znd|{jlNt2w6`hzU+15h43!6z-Ybt?w^Y$ z9nOe$eYZIHuCu0$QDK^zk)u?=8(?a)m8Or&xlvPGSaw;@bC@rsEv+W7ta1*^u5e0G z<`2-PcPYAIUF}dSGL+czzcsj0=kBs&BW8^ohq3z(^ zJgDKM6zDqJ&mwA$(#JyN1tP!vVU9l$cQMFKQg}`OwWMR(6$~7xBb%cf3(~=bM14S+ zL&NHdyGzg=d7yAVsqP|PU2If_d!1?xCiIZ(PGIV=T3h@1cGg;%2?HZnrD`|e$i@&( zMBlPjr}O;BI8i;elCHK5we%Jo+d?)BLlOBXOmlFq3RSVmAp3E>+Qul8h(;4YddHDf(aG(7tq6(nGnJajorM2sZK&_MXFO#vbMqD#MGV* zSus*LW*?J|sj`|!Mo#b{*J3^zazQn>`ZCxJDQ%2=T04PobSyn`Gr%zqix>xm53dIK z3soQs8tSo{SQor*p6ptp6g1C`{X@A9NX~$3OyqS;_71(3%&Cz|z@SvC^2i33+M|-N zIhrWhrXV6$q5RgUQBv*rxKQo#{%Zg7EGvpsoO*Oe2`&KKx{}PZC-_qXNiWw%0^iu7 zO1=)_(+O0qTEE!C9@LLUy&0T9MfXiZ=mcNsb+4QbuUx9?ns|H}N%htz^>YB+A^m`H zcxLz>VBB-hKH4{^!Df~KU4Qb0FN8|&{;TuW5fjQcrk#?Q2ay|#AkpjmF-Pt3nJdTJ zE~Qa^<6}e*-NGVy8@mMkvsunt(iHIS%A@8U7~h5!&KI-a?-A9#o;9u@tf2kxX!nHo(R!4 z(7ZSPe4>Yg zuTq?)H@oz%#_gLq@S4a{tPhxKAY*dEW9hQB0A_*bR^-qP_OU%PQBKCEh@nCLIFnF=)OKWW zEoJa}yo7@_r=5LES?p$lnAvdtQAuW*Sx8;JNo{Kn4LACe^N%0j9waLZ5upB7)AOb0 zJ=Sn|px;Lb{qtH}_(5xXT;I2gTsRawTWG*vBQC~@tnF0uw2kKOW&bgr6=^>1r#MjH z+36YEC|?)Fq3x2gm4$LwJc|h&9*h?_#ElVIx}mdK3qSH_(XMsWaCod*%ZYzQM0^mq zi@_h>BGX`K1|n~E_j1>2J~^P1hAiP%A9fR5xO)RMb<0`$OB8l#A}sNoeC5r%rutLu$&1%;-z+W%fga_dj7GS)XXm>u9c z(rjirebAc<(6ePJsuS-C9C;J{=nK78)()r*uy_c-j*AP!Q-IL$0lf~Lyb=cF{xNJm zzQFtJ42kO1D<_Esv>kuWP>KgP8?iNES`(*_h{*`0+m3tVKs&CyWoGFujP418wbkKA z-mRYl1$SU44!w-WXg`1+&A98Qlw55jXnNhEQZlsi6GUXI0>{whnO#Xk7N)`gopel( zsSzhaJgZ2TwN+Bl{Yb}nQU@qGRUbdt}eOYo|xpqSBe0w?73Y^cH`S^$*ZvJsRm^Ud;E&f z6Q!n^=DiD}T=#gHo;*$Eo1K0z?(;!s2kgiJT)p@Gg9Fm(i_A<(UNC`Q|1Tgy#fjDw z&Y+gn7AJn1Q#&KakCpfO&_)bNgh5V6xUM!!xnTz1$N03hJT%e-mvJu{_Z-px<*ZIiN1uwdP?-gU-toA3 z0xgP@%3UNFa=_ZU4~jY`?z_IB9OL+XZ#jQsX{mb#yF{BI~KotA2}7(+){eOiZZmPWJ#hLe^^R7y;P z@TX327fz|qwyUUsc7Fl_qvrW3v~P2iA|PqpM?>q(j_lQp6$Kw+93Vs8wQojjDgFkL zB-eb6{g6&iShJsPE-rKjNtrr>VEgz3J^6gM8eN%p!HtMQ+OE?HF7@WvORSe?2@>uq z#+_c^*B4vv_=i^`4kTU4B~`gC6HcGFb?Z6q;q^Du%YV~&8m>_@BShu>>H+ec`-dR( zXwyYI8uAh9Eyn9#WW<0ggihckNIJdWHHG^iEVWr&0@qB~EFaL-^iFe; zZi`fj9>MA9#bNxOGNkA=3PS!F-(}5aoPT!uh6XH&d`^xa?Z_K#3$1F#J8ht|F0C!{ zt_?d1tl+^$UhPQmQw80Br_o#M8sy5LlC;%nTR&R>FNUdPuHtSs7_Y*#lkx=O*0OWF zWfG~YK+NwqmI=O+t?>BlKF`~sy~`nxi=8xb4n?qKN_wiV-s0;?7jX$GOzXfZ_Sp2q zZ<=I|wTY{*YG(*;i;K?0&?Xnn%*=c0t@ld}z9n#wa)Jq$*t6Dj{3+`8^>MbeC2`d6 zCL%Ah%FpVck4nPDk6SiS4sgr^>P=>jISer>%7s99jAvU1@Cxr65NM zw6<6|`5Y~w<~OX_wVS^28@#w8zZ9mSH%tPQqst_jo48E%!i}88lRbh(J7NG}>!)fM zJ)HS%CMU=wU#c#>aaBRkpVG<{yC*gLvGSW5fIsF!ZqNbPB%{U6?f?0s7u-|)gj zxHPL0JbeVe_Y>X1Jj2FkZ54yFFV8tg94JA7q=j898Q!lSJQWU|Qg{r%j#lr6n6PE- zkEA-3To4aPWm?RM7ao94*|15lu_OF#dpwzrPmeJ;`HJoSBU;kB&ZvBMh8ZyC#Y3Iy zIu!4@frsB?=cO-c2Ky}dDw#T+_e2w8w`d}8)cW)}%G)}z_~-jMH-lBCwJj0Mz$#0Q z@`SwlPi*FZtcvWm?ztee54);L)7s`F?Blu`w`M2-;`IOi!_7o*aQPwPZ=1Zr4Y>RN zFRPcjBjU*SZCwoNB-MUl4;tyx;R8=pq6R0}pRzD+hNwGi z(82-%9q>hCsV)}@%gxjBkF^Nw>S%_zYJ8F2hzaVP7v)gAzcngvufB*6w6)yHrPYzMGCf@-jqat(uu%jHw6sw60_tvj>6bY?& zPhNeK!US&MX}wP8ysvsq#p3M5kp2^$a3M0FW}^% zJ$&Lf)lR9qFfH58TieMLi38U;OsG zV~%SsAtVJvG_?2Z_VZw+$6iaJ6>PNXYTD+9BMb-f-76^kKv`>XlXfbU* z1vhDGd$&_!KhQ0L_jOu!;yeSgA!rp#IP-A%^bg( zI;gw7#1EO%J{rD=+(_HPSa9TA50X%UM5YPJ<^@S$17wCU^&Ob;hb^8mjjs+Gc}c(x&6i$Z3X z)}Z2);+lG)df)`@Yn?AOygH@6Ils3jY8-8!Xe3Z^!sI6EGZn}JIo=(_$&4NE+#N1` zEeVDL=8&th?TOUj!DGJ|TeWP*i-!_A7yV z6Y&r9qOJ7~t8KFlH{fu0{)1~C_B}0{Py~Ir?#>a?8f`b#ShKPK%1CtpcvPb;3Slc2 z;P^sl$5Qe|wXmn6#Z8O!lFpR3pU!6WE-U+>Of45I(`dW3^3p%h@suVbtJZ~V)QC^C z=cnVh@cHK}2^Wi3?akB0#D}&jxj;j)hKprVV_x7kDv|%dvqqf95JqZH#c>*9rj7z3 z7mE!RR^>nEUsQ3~8ceAs9FUxHGmONO`-Vz_dzgJ)v%~r@vudnQICkIePOFbuaL86r zA##&VurpBLI^*HRnAm&64L(C6Gk=x(c(yJ%CL1qGrsryaJESWIW6n`ViAgwvniu&gy9ShJJvG@P9!{uJztrUz*! z&Cc^Pi!aimOVHN}lsrxDI$A2E@bCKiT99H*o!8)!u3kpYJnHwsr$#5!j^cvBzvtA` zH>ayx`Cr`Hk%T73=PXM15q(2e9>+#dt_Vdr46o{lKgV^xS+MOJVkREPj6wrHj3IV! zc&tJk{~({(;`~(0&=)`boF@cdd332ZEOc9KCk+zOl7mD2{Q;VT2=XsqlNz<+pdVCW zt%ti&>7kaZ%J3O^i$BAUI#!no4to#M1sTWx&>L`PEF|AQ1v;X0j*%Rtl!GxVsO}2{--j-r`Tr{OokBIsO?uTe zT0^Y&wB*@Z`+;W8IA(L)&&#x?@vRF(=C=LCA1n+jsaz| zVl(p`dY?+v`aa+U=!38l%cp(4v{bc!dznch3j^GIHTm<FtLpU`)c&#gM5;#=aFr{Y6^Pb289~feHh) zF&c4Cq^72-gWwPbH**NlqT}vCmeTj*?MnZ9kA6|Z!|h^v{B8&WgcU3usd{pm zpstf`j%V~qOfwp`0v?k$aTIEUQbbwKKtmn%EZp2(81F3kaBiHu!*aL0RuPsr)v#EVly_8O|>{y~zxOR&x2AgWPMP%m)XbN#;8nQA#QwHSyUK zm2)2<0se!0;9ctE?LtCB52pMHrO-uao#8PLOsEicyg3QNVAWt;(676$bvO-@yjV$O z+&zjvQuI+{969yb+WA*giP|K&WR&XFp}bvzs^2OQiv?0o6#zx60aQVhP=2(?Sl;d< z)%3j}7e_}mQ@umZ6?$r$RK~f<_`h8X5eGv2_~tC!D_cHE+|fydl<2U@Yg!V04WZ|z z)bwpDbVzDuwcLz25N~x(^4gL8K4j?lb<8KF_q|~GEq+|>($ksZ?zIuyxhgX@8DwQd3d!Vtm|ZPJZ-w>$@&_hv@7u`md?hf3apa8czpTYGeO;s zpBL!!-8X!(DaGmwUTWHs3H994IO*<$0>OvsM9Ny?@-s`|$=hn6xVdN7kV zclQHdl-2v9JoCTt-^q=7lez-%k4Oaf1y0OQagMO&OeVoz^zkZ$SN__+r~AlUA0uYs z=Y!6hY5kY?D=m7Y^vyJv^n`=~cGtU9#ZMR&ttl3@c1#=p)#3$ly9Tj=@lc|Xzz_Uf zz+_ot?u^~nBVcnYLS7~9mmWLUfCaKKUs4f!0;8nNwvdK*>0QQZHr!}#F;ksM79Yv-ypr?5WRJ;PH6NMM@)}s zGb%s-*|S5%cBR<-SWjQBzyt_hu2jtF322p?{z>B_;hEkAl>NrjX&5g+r#%adU{UuN z6P_B9Cx-xxzrVRV-CRstqog2hRbZ;3-du7SktdumgeHQm$^;D`~JCYzFPseLldD`Sxj-oC3K8G+&WL? z);q2ei|5<1_#Zf1YH*dAz6R9)3|Dk8O~khsIr_55R7>(psmmUX?Gp~ejIDjkevLLX zJTA}_{Tes_X2B1ZXEV|P@)$2#n=F-h{N%{s@A;)*NGy4{q_OCXYI&~UG{E`GxB);q{% z8(RV=^i9Qv7xXRkIQ~K#_!8IQtc?*#zd?toYG#3oF8#`kaHi?~8YeF9OycwL{+$=r zJKrED8b02v#;5b!9TssNDO&{3FCA{@kunv!I(ILwMc`fAH?+8aLAr?kOdN`sE)*sy z*RI#2sjrjtrzDHqtnkS=?f)??*kMUP8Trdn<@)zxcGdjyvQcQq9s zlD-bM2u2Q#=`g*gElldJyhEka^SgjCnT9!7w6d-I@jx~g zeKdtp_PO*~D3X|u$t*k{M1k@nQf*Y^Cf%U#n=o$>dki@ANdg6`zrf%Fq=9XF9R9p? zz7YhDrn!)~CLmi#r7YsYRP!bwbYj1p#AQ=CWzVK0Vh6WET9Vhh&_RnjjQiv{OAV*@ zRFux6LIZ)1m`9M%8AxYMQXg3IuG%ud6 z0`fzgI5}dCQPP&A)aD4ltrt1cJX~_eRR{S2y43!3d<2tUv1J*LD2$<;uKYJ6(qVCU zjx!IIGl3K0=}%w`MvaqZG02~EK1?q5tk`-l9nF3|JEeKV4-GE_wY>n=WnQDd*yFEo zYa2ZWYseGx`P>$$bKu^OrwUk{JAC#B4b~D<5%*@RIv6Zo>S48~Rt^T}Ll1++%t{dQ z5qaOAz=;2ah))S2(iwgDm$iD4t7t|*!5LAON@XHX)=H4zj8V@ViH_@-aVY2jw8$~aBSQzPsg&}OHJJ`}s zG@cdTdP?^`X;%;7#V&eLhTN?+#rQsPotvnO*Gs)Gnu^bn$XkSRyN|!D@1@U94JeX* z7G5(dORii8?F(X4NbY0uOqxW!cWVUiloI5?G=Fa3ZP^~@T?*M@R+Z@lTDj?8JPp&t zXNUH5UMitsV-CX}t+#Kk=?Z_LGt*;lrI=)tNJO3aiHv zM(`4I?o%EwIFH)bih5wq!-7B9KpPgKk7++m(6^kLvW;e#R+1Rd81dZrJ3#>wwb&h? zZoXknB8ZvvuF=Q|f8p~1l6tf<%X;Gsk>1EMB8jBAZCw+fcj)usf#m+zyNeZv zCX?)_yle+CU3Y3^!<8pT?_w>w0ximW>v}hF8;HV}7z!>njvyV!YF&r-$2M%*+V7ZS zRZn~>u*n%7(^i9o{E#68a>(_b8lMDWyukxFd|xK90<-&K&4*aeLAD!4jE;Tt0YISn zNwFwa)Y~rG&uP^uPRYL1ogckQ`DyHrZTggE4X`Izk^laxGL>%B= z#pFp-g;Hhg`U`(v1-Et&L`*XJb^d7*efyZ7lT)<4DsgN>Ev2@TTGQovby{X8 zy(l%V0sqIx4HOJv1jmZJfYB(7iSh1BPHCUryP|4%{$9`7a;1-2nEcfh6%KVy*0hP} zXBMtL3y1^vm=t$PAy8PZI!2duhRCssHmP?opm56z=O20L(>%*TLAM1(EejpV4((`- zuU8M{Y~y~9S$w|0quYHun3^mEL%0SobXHzKH>fgg&;Q+i@~MNXZ*hmy)5=IRV4-}~n$xgbCq$f?E@IN#t)G6WZl21U)> zJbWg&HQ*cKR;BXFWHO;DbKUmg}&6Ti>|H9&J8J<)8Fl-2N$O?CSUjbJw(|j?O$&$~jg?ar<&H zA?I+Sor2smI@cO}a=Ff^u+oh4KF^3#GK>YPT1jIfLSY<|XAO9+(M^HKH4f13!p)%$ z;XsHTF&f}o=R3vL(g2@|@Ss>wBk3i>In*GiowJ0d-(AN0XL0;{Axu{#N~M`%#^L8t zDdvBsi3hsDH3bFNThL$l%`xu|M|Uv2(o_%4kK88&H^(MX*}d)aEiw8lVY{h51ak*j zi19HH%}KIiBY5G*S3x!%({`}BGTG$<|6^X*^*IG4;eTs%1Nownt#SoX+i8ZGYM)EY zAxNTS|9;g?0!EKoKV7El)IET~lD2!X0SJ%v6KlqU0F3|u{ykyzz_eF!`i+M(XOgQnk!@!2!3Nw z+XANgS0abj2@jGPalsT8Nl#{p3Xw3szaB@g(+8ez)Z~h6D;j=(U)DDbW`WJV|2!##7c4xuu7_dkp zBaLmw#qr*!wCo5Cuiv(Be-`!I#xA=flh2F-vEUE(fR#h6r-yf~{CcXICn=&AU~1Oj z(Ae%BJubPC6%hXj`myj#q{D1UZA}r!h1L}xY2oMTZf7@+ti821>*rCNbd+IuL2MMU zjF~~$N4@`e3IUinOH53maATo`EB|Fn#C>(dR|F#$63BE3UU5!o`}Mf5m!3KLwT*fN zZ8uy*4V>znLGdHKQs@xKf2&`SZ%*_BFOd=cqPMLh9xWjVyA%$0ju@m|zNpULM@{S0 zuccoxE#Gn?CcenxBFIQRSd@1yZ9k}9pV7uYw=9rjCELu^J1n`XT+X*fqq$=@ic&4A z?(AaAW*JYkzf(yK{S|?_6R~<>R8>9%b~vg|xL@VQd>Bd{9P9o%(?H}k2ykj1rP|A? z43&M&mp}-guvfK5;xw^`j@H*8+6l7z0=}Z26y8RdT-qFU@kq?)OL(`?PR>3KjBD3e z^RIukXh6I4CmU|wL^$DPYM*uTPOFW&ygp95IMyi^pqC<@_^~A4;^asDolv@NeERt{ zK*|4>sUYecqRcH)Kz5-VTsRpou*@rM$*wzjRGh{8|AW~iDn-SvnA$`GCmvhz-!8WP zB*oGMZn>893-v!7L^5ZoEK8@&Qf`t4* z{OG9bl-*X2(sZojmee_mbQ3WGJP{8lFR0@B5m0T(!x^gQ*3vca11@5Vhw|Cv4AaWQ zib&8@B_>q90efU`Iz0J1kf!-oeaVq3rmrvtqAs7s7`#R0JcYg1&3g)6u~QI|$w@h4 z6s2H@hlfCVlO*mbK}I&;T^nw$wn@)#Eef3*I~p?H49I=j^s!2L#5Ab8J(LQ`{{r#J zLfG&Si+#%#Shr&ggZugyZ#9A0#Vz?VMtILGl`vloz>weC*n&#{t@8P>usT^zV5+UQ zoHQw8O@05fEe6Y`A363fgx|oKZ}bs~uTVax?a%_F#Fh8v7jur_Y(hIpfl-J2hv`K7 zY*#$PM*<}-eF@HW@!CAwM)wp);W_t6+v^_op6%pPiX2lGEEk*JMo)C&O%;VNlU=ie%spA3Pu7hQ;N1;eZg@g- zr7d@a4`eVqR_H}~HKs@qev7e1E^N1ytKsJDMOQ7B?|K;je8VH-8_#nV@x(PLCtr{= z9R!@AQyHJ+?!jA2)ZlmjBYlYR9Hb%~4Vw`Z0)0d$$m*QT6v6Nf*xWdq zI)k4=VjJi;e&2feo!MJeB3xoBc&zD@g#^)#Dh2r&TgB;I_B1)R2$AHni%I#bMcOMe zFtB3QpY-xK0$fmbebUXWHb&c0q-{V95MUQ?f44oueQ{{cYugFVGm*|qxtIC;m3b%> z&&q^1%`eaLriNp~T0 zNS-rVp1SZRK#pf%DVf7HSJF$-wrkk)ZLKrV+xU!hEY5mxj2e9Ei__qOFHr-mN-*_r zu^a&K(D0Tr^t^^+1znLNRGO68?;`C2M_l|+HH?hQX)?Re?aUc3Tw07cHMe%B# z9X8VNmqVmdgp5})A?}s!ej5I#Q)$2#(qTFCyLz-ywPkc4%d=JjY%B&wLD|g8%K1f~ zdcJ=KxPdUrH=@*9dhdO4(KV&u*(28gTlh35$9EN%o4DTkz3~$D*QNd;;eW2EAt)b% z_tRt8&V#Y{!++gBS;5oy|X2fE=cx|;`IKOm7Q#Q4tdZ*7$V z4K_pMg!kkG~)c9 zk+-y2r~-XN8N2_$$D=1C;3z+?vu42c4fT*G2skNS!LNkF#0 zyCm4F)*%lW+{ezM8~E_R0z$Bh>g+mPi?OKR?Occbr zegS~r<3*XZH4=o=fPBd&G_%1sDLbmB64L5MqMpxO8vEO7;s%ce%t#|E#JnDE$Nm2?qOun7PtzHbsM))`43Jo+1J_z#-!j8u?$!9#ZDODmJl~MDog5!K=GDd1 zXUwncTgLf-)Kw=t5id*3wD?CSHGxRo$jmFU5F?5k*4dWRvE4Wmydr$I8TdSpZ>v)f@lXXLp$?DwrY7 zgQqlZ!QnoLf33~UN<+)%;AJnr!x?p;uQ8F&bGC~2JR2-ASM2x+(3$Qb*XmXTaUE<) zU832t#`|qMfN(rTblW75H`Mt5WHDo(>1>Psz^mY-$hU`$ZUioWh6|h(4b(1_jA_5; z`dWDFehXAtyz%oz7~`ykebTluuWSy4we@}z3--$ejDp1iuDUxH^g??A9m5J!jnSFJ z@+3P{lX5~qw0_%~^HL^DdnM*YLCl82u>2ZYkEOBo^uv{s=1GV$wheki1}H%6&UqcD6MxrZe}+!mfa16^zsf! zEzh-f-}OIBp0qEoHW3kqQd=OiK$^ydFq&q~R9oM4VVxmxc9>o99|%GiEvvDBKhL8M zD72{aMrY1<)Q~3-d#=m7o?*g$RU`1=CI}*_+0H5DafNR)bf0E(()p|DX2JJ4lp6GS zfSu0}%fOcvk<%}Y+Ig)Mk8b*#ghC^ndBit!{@GXvf@u?Fecoh_ic3a{ir3&h?rEd{ z8gRo+jum-tc%Pj9bY8UFb{^>o3Bk>^+h>eP z-CQ*?f-(aI-x>Vhy|5ETt(B#G?L7(hilG^+tq#unr`luE68{|ClUE%~=$OyFX0}tB^0teUYH)kR)*JL`^c`it zFZLd;jG7BizU&|2GDE%fbouE4de+K0#%)gXFP$wxq+D0VCv(x)V7#MjF){2m1W5HzWsEoLksk8$xnpRrKP}_(o&YWJbglj&lD|+6F6Qx(??*?_ z&>lTN;|;<~;z_Zi&yMhzRnfP~qD|m?a{}@e?;YpAr?3+t5p`P%1mc|cQJ-*R=SZe*+>?x^O) zl&9`5e>Jo>caX8)Y@AJe%*nEB79skmqcQsgc)2my!#XGGW8~FWrie%_(OF$g6XNwK zhfBQ+;LPGX=m{?sVBSZCkWGU(w)tG-vPsoYp4(DvQ2f}+L>bhutdE)K!Vg>Aq{R8d z9Hk=O=>JV{5i>s$+Q{crSR$lh%Cvz`l7>A`)wDMEXM0L9hnR_mwDmaEa=AfO;Z@-& z5&=Q}>%AuCRS|X5<%abnYNo^a6o}Ug3UFg`2CFF~0{NOpOdIhJJAm;^44qJ);y6k+7 z9r?|=+GNx8{pAnqiTVPVq}jjC)8+NQ^!5_BvyTB&r6Soe>~ei3{Rtaw?ncHC#vr3& z_xqiQqwU#D!OgT|b`VSrs(Cm|q1`@9l4Jn@$6&=Rod8EM2P~a6Z~`e+;*jqdALqDG zIEk~q7$v%J7`67mq;8{`QF;l-vM5?svFuX}#K@IP_yioyv!}#9!n(lJqX)iFUrJ!k zrbZd`$ddV?!RA_p&3#3T*|Hi_Z)eDRn^V}<^W}g8{8bdmapc-Pyv70bn#d?^hZ4S+ zm1Q4tA~F;5Y@?)DJGh;+v`;IZa-2wWKVX13;7MVrmfThZGPGl&;wzdD;I}0V znMqe33O_!7U~2EF^yVyzbMW#mz1W$lE-JFLA(#k@VkK5<_Y~QgStId;G7XGkpfhXt zqQ+<(IuI?_N%OZK=)PqEq?#z|x!^x^c~((Q--$k_QK|;&@ zR?8krKa+aL+%&__W=n@s2*Ggapir?EuKAq#aJP|q%`;=aVNs+FimxHhp0^S6bHMTw*yWY zs|+7nR{V+!^MnN;B@y!W-sr#u9U~q!Vp4mp3Sf}qM}wx8|X7iEwYaH zzvUlm+4$(X)j3bZK#8&R?_9@q%RRQ)l zN(QKT8X2BhO#OSwfL>H*?0E_vm_l&?l$W>+LWlFDV^!cmVsD=Oe9~-}$?$E-5uI?1 z|9FmEd4?a`FiT$-3EREcGj$Y7VCOvQNR1{o8D(A0;OIyY9oRZ@!P}j!ul}Xja*!1S z`4a?JuObAUT-Zx)K_-&7VCskf`NTR$SyW@^bqqI8t zVXxNf&y%LenCDI4`@afvV}t;e?j-~1C0cl0@os&KEq=xnb?$gF%eeRML5;}~CkofE zEQDT7ctsUdqI=oVl@rn8=+KUSE&}{BAYLk^CCQgs^yP+R~vWUW=5 zlbGYsFMqU5%_*f-Yhk{gyoehD8w96nI?!f&ux@lxq_^lL0-ViL^G<;%_WCz}M2r5K zW8j3SZ%_jU;a74qDaXUaPY(*pKD;2eW#46QIM&7^P0aY0XL9C}Q3B;+F++(?F@l33 zNhq5;G0WLee>w3;H^Y=^QDhzUV6G8yUuymQ70puXYiI2;td1eV2i(|)LVb&$G>o9u$m02`RJ)Fmb#K&-ddO2bUE5ipiN~<5N3^g-Tj?LOrO;C#v(5FGS_=T=Vxc%VzpJ*^8 z%V_2)`44wk!pKq;3%!iv7w_8z6I!gmS_JzKd&`4L=0-5DoG$l=IIpL47Gl7^Hv*qCu*fL~L+-cc<8N|?u5oPFvrixx zzKKi$L1G)0PiG0{UX@~LtKsY$D9N&@KUu_5#3YDHMDtw>iZ%0sfRIyPf+~kwQ#b?d z>cdDl0sCFWj-nayVA-&?PC3;8oQxvwC|DV`0?1p;2!~}+uoGwvC2s1)Gt6)-J(`kt zzaDRR_^{|8M6(zxQM_)Fh@qhY)dPp7HY$@a8QdKrz_8B6tO$0R) zL^2#Ye<-?IgM8U**7Qnrzj@CEQvfC+Fll$m4MB!tqJtF&qP;OCwePs6X7bot`0ZOx z;7{FPir;0RY902NnTQVCw@_mKb#ck@qQ+-COT#o|1*JEklngYKB4x^8?_>vzuRo)( z5(b*u=0=wSjMF+XI%hH~F7DzdB-l7GHxnCvn>U$M2Sm1r0aPouDuq~wD`Z7Wq*0RM zy0r3~FP(FAhcZ>xd=5By4#y+zx3KIMma<;Ff`_NsG5+u*IfTi!cS^AUpsvT1iG~`_ z<6_T466gHpo-rcYFv0L#|EL0Yr&LLruo!*KP)XHNiKr-~GF6VHeex)A0okfpmO-C6 zUZQo;CuSyOAQ{ZWx}Y=H>1#woj$eRGQgDS;iLz^=hM$UTS_(CPPJsMJI_H~ zXoG9(qKrvli^A3vQVp_%)||wvRV#eCRRX^~ZujQu8ojIsb{`N zc|oC{*BQ7tu^a(dEc%(J9_5aqhZ(rUYPR)GE@YZRo5dm@|$* z-=x5RB9$?&Vxzm$!c049u^cqIXO=XBQ8mR!^}hc6joD3l{5e?sELs>eX=r⪚bK? zebnYscR{CaQ1#ZH_oO1cs+n#(`8BlH(_Gu zpG1FI4BV1+ZOM?RQpLL{*I(jllwcOdRzkQYE2DqO9!;;GJn)}n@J|iCk`+F8nR3PY zT1c!#plF3f4Ruc3+9#S;2QH^j-YhQ+NMG<89Pf_jr4a;)CdgF2z6~(xKf*>z5{Qf}(paG+KaR`*4FShqtAh$6Of# zr-bhS)mMyEr`5vL!r3(eY)fklusUW>8O%Ld#uFcDiK82)SkFUR!uJZ++N?yx?_>!; znvr3fYt>Jr@OA!`NhB*5jx)(#2Y7uC1(=b~HhgCni))~LI)C`Wsm5mi@3g-$f z^-P^HN#f*qgKvbtNMxU}hsr!@JPySA8=q7j)TK`b(0uiVrLg<)_q*vsxhkzMbn&FR z7Y_a3)&)0m@+{&KuCM&5Wj@wnT^ICD<$!dg%N&~V!YNxOyZTPsYy(D#O-kwp#hMC6 z{noo$N9MWX3j74ghl$M?0AR)|=4 zW+g{9NbB*An<9oN+QQT>$;Uuk4Zh-cxg1iZ#R@WdvLOD?2aNwb!OOdX-Z#ICoHIHU2v+p+mvjWgn|@8G{8 zJBpN^a(Y0Pni4R}e0C@j4u z)^e;!BT(VWl;FuYs5oOH#q)rOr_kjyTfmxBw!t3>*-WC7wd?fTNGCp}v3;&PtakwG z-|%h~*R#(k!MVc4gb?07iNK~C=dM`KaXKSto^VW`fB?Le4tcOYNlbdNcWAre(+?@m zCgo{vpM1_H5{7dXa8hY-dWlNSfJF30Uv+dHz19E#fVkd$)o_@TYE25<3-Y7SuV-Ez zhL4it<%>+YtPe?qiU5=HMOo0%gXiKi%-Aai1dMAeteOHzz$ZY;^LylSuphD0)^roW z8s{@CkG~1+(s`r4)<>OWYpu>Egv6KSBe+`deuG+V4~zAyH8#WAvFLpk<1=m)ZQBxe z_}o6yyU8Lv&l3242pZhbY?@PH6X36N?t}To8`0rx$|1Q04k>cDE_gJ+8?ikiZ%a4N z{J%nd2Pli#rrmw6z$QcD-y9)YuF=5!5=kn#cQP04`gyrg_2#Q-F!-NSYd_6c}<*pj*V+HRnA-dfFk2vb@lzUMi_VZgf*2NIcYI!gY{y@ ziR>k?U{Gvp@v%hx*MPz4%8(XU7$Psme?=ur0RLMc^&cRCpYULqw5`q_Hi=i7!=Hrr zsGbf;GtskqFn!YG&2$iNR%*8w4G3qP)gZV z#q-vU6)1Qfr%e3_tJlDBus3w+87(cyz8>S~Fxy6XyVz$b{Eq}HVq12I)X5xvKYWdR zn_utb&n7~YR-sTIT#PdI9rZN zmo83Ins3M(QrLxK$A8<~++N7)`AFXK-b z3-9(2&xOE01!MGTpFliNSYf>aU3c*$a**uZiGDv9>xVln(b!^?1UPLQgNG zKN~KN7w&N9Wk4xZeM>r(#-Tc2g-->o4#(jK4ywMa$x*~@zzYG5HAxFnS#Vb1^#F8e?x@hYNL5RD>N0kM~9@2vVgo;XAU|~p-UTJ&=`_gk|@)7 z1xKK7nckskC!B=bF~=7t_|EQCiA`lBp-n}||01Ur7{^DfI*|;4c9JtGL9l$(SM5z4w$C$h{~Pyb>4cbpAsh0+cj(;hUTu+# zvVY@qPAmY}Rond+(~gku8B?e!g%6((1v=c5EN@W;*>y+7W+(~E%R}|R{!{ox90)li zyXJm`qPKNgN!^sf&4;U-qV=^?8L@KxtxT$700?qnKv^i+dHjO|bR~3z zcl9dX|(iA7hJ|_I3Kf zktkNvu6Pg1ud&h%>Rqn6=ugv{j~;4^2xoYLX}cYqm{O&VA)zbDI8?w7OJ!ojTRp_C z+^js$c0qYjG2L>Y@N!z&;1>ocCh9BniQa& z{$SL5N4Mj2#20*Va#%ot zyE??2f>BxVYQja47c|N$Ush>)r$1$Uld`+W?|$J^m1MFXF#|F z2gtYkUGTNUIQJ+IZ)pN9aNx095`k$XM5K!4)9KQD=iInd`aHc{In&*-3`ico5*r>JYKV%H9^YDMx_Y4VBs}Q3%+k2 zEjo{Q%QAgN=|~F8DHh6^bk06x{aL|ceihWPL_M6~a6wbXfy=~t=BSzNd#8O*4+Y-O z0!E^Vi&_|GZI(8+dcHbh&{PvdjuRTv1y>on)ZjlvnS2oCZ|rUcm%zAaJQN4rncWU< zag%^ZbTfQGvUp_Ej%Z-1J|kS8cf|+!=aa(PN}Q{gCblFDUd79?K|_7#TRsbhe6wz3 zBi>Y(K31nEG1Q|iZmcj?r>R6583;gXDX4^ZZp~uj}C_dOV7?`=G2&kWBjHX-+ ze|uzajGe!H8R8sde7dpf6^gx;P-lAmCRSbS#z7fU0dCmel|D(D>~%@IP!uP4igLAq zFbM;dC-kd=X6!Nv1gs>}LqYVBHNCc25FnkD??k_YhcaxXuqxJBx8Wqy0sfFBk_x@u z!A7D9z)K`CM|eOgncd46hR15OsAk1FWqo{D7_@C^0v&b*aqoUGN4krB93qU?&>gJ+ zx&S>Ust&XqVq9&>2}NX7eUptx2!h{){)r6A!c1A94-wuCEcOYb{#t(n9Z0yE`ANhPps zS^RiG;49#@TH0))eWpwBita|&NWfnC9TDBP76Axd#EjEg9f#KE!Y1Io%QpO>_BSBl z#Gc9+aWzPInX+I%my4y1A&>CJwbt%Ve-6hzY|37>m$|1_1d{-T@qs-3HF|=b5wq2ick5cZt1<96m*e;iK~KBt*?ZtjjPxhfK!8 z;7Xt+spp@FU$DQj8REa@T69=81acuG%CyuJ>xp+WX1t^h|0#*wHu~#>no7IhtI`2K zK@DwqP*W zkN!rf40NwT1)kZ>0~k0(TX4?pS9tJRHuMn^8HTV|6_yBPP76|F?v{9hu2DcOtFq4N z%ExRtf-ujN;7jbiEG9Do0*gGAmW_*Jgsl~OS(re)&nVYwF*tvQ)GJuY#P-wX9QeoU zjlsC9j34F2QT7r_9!N7_$D43mpC??$oUaZC(Sx!X7N*)4jSGjsrry0n0g6KwIOIrU zIl-Z(8=eGH_%6U?MIGSg{>n(bp;K>~5!3vSHl5LuZzJUvHvX*E0dvl1TI2VIDzue8 zPmbye4N`)sHVec{n|9=~^-#L5!Xvk?vG6_qh#2UCX&!_{L`rVSgXGxcNMacc-oGte zdwnc|=PkHKE+qYcjHP0amWmIQuR2<%AB})mn}a;)W&nk<3kwnit#aQHmaG0~coLPp z(hGq30k31XW;K;jGl>~|_&;5E#W$R>e<>KU)Wz##w{Dt>D>x%7+-YCNoFn*!gj0M7m4$Pi~6tq>W215QOT^)Cb z6oWPar;LAZ3g^`-xlQpLz4O)fb&BR5l}1A zEI$&1oPmYvS-JJ;q=mFULL5&^0rJ zlfp{@+<5sIeT{g^Wmxc5v^Vtc;zJxglQS@?;j!O0*PgxP0qpb_rGE2f1IDM$xYIC*X8^dKS)hpfnR)z3e zB_P3)c;b!dsVE&D8;ka69KA071DF6TEB|L&$LD!>^x7j}4V2dBFG+gxrxK0R+)bdh zK|>uFGRsL|rbG>Y#<8sz12kyO(D+U&sJ`fmN-E~mkxQ$ZZ9bx&WkI;4y&-6y&%?ls z(z3Bc0XVJBx@XBQgochDrKaADpI(xoRUvrF^`PdZFxN?Vl61jHF}+mu?K@#pd$N1P zE@gJEqfV|POF5=3kYpj02_5|<+qqiWKAk;I9oY)+pV7M>XQeYHD-bo3H_^sC1vk4s+iWyeZh_?2> z?TrNcXy3|YebWJeC2W89d~k7L)Msc)4^9f?XvU5m^-!-*7Z@%vH=6o*Ju|#)M00JB zYi1poGheA4u^Y(%F@5Ae{2X|Clnz7jO=~g)cqABa=;l@a7(s-xwRF`q`b7{E2!F8`5uaOC8te*Q)Kwy8<3o6`c3OXJn;IG*VR8) zTD17(wUGq8*}%vb-hj@?VYl992obG*Ej!b z^cYlG<)N8|%K{f%7-?xRHM!{vNzBlwTj+m9z-r>XP-gfEGTcEfy3eOEJR6XyU(<7i zDlyb@pUmZ|lNu@#v`@7nlxO~|c)SK;3hAaEzHn8^^K}f>&45+vl0a#5VtI74Dv2-( z>*H0rx+)QY8wnPzNE;ZM!d~%daYoS6H#}>o*&f5sbXP~cfgaH{O)e|8%A5NdZb+?g zi_K{_aW=BZqjI>Y6b-CrM2P);!YBt0SfSWSLUX%#FX&b{kwVNjPF^86cWeY@C71=a zWGAK1&snqXun zN!0J|LJ*4*L3n&Cd+Q#j=&PE{OHA%*TA@Xfw4tQgB`6$HGOr>VpsGAGc>g8H<>u#5 zND9916e4q{R8fW{{q(TqL8!p|aL%A1ZIMA!e8rJ7;=e^6t~mHzYo{SL&9FYuZ6s}a zqVjA(?JRQvEAZs#f}GswBED?FVyPGw{9H&FoO)Cp48$YPSZe=+1=YvkKabsR8*sFo zqIGmzHRq8Vb!imRQ#hWu08fkDW(vQDUOkr@?Vczc69xHP#Vtc{z0kmQb^6G5;-{E& zP*PD!()I^w8x_g*X2AbQFs&u&Y?ETxV7~q5wgVhd34v;1xfU$gV8fd0s9tA+&`}1^ z^49_lAq2vfOF+(Yip!mX_D$qaaZhbx)NB562CxTRZ$gR`gm36#WgABgjv0Mr->nT8 zSo=e&F;oNV_1gy0ukVhA{wE>1u>&3Pr2X|>s1!OJFabApdxS~-yKWa7%Mm=P)wpnI zlgFJs%1eR?uk1~SfN)V*>!sAyPx-N1{(-CHNX4h*MR(=uO_NRQCnCfR2|);b@hCmZ z*)TlZx$#Gyn16md4whW7>*5vaTlcYaf}|6#qe%gXKA1kL z;_dl_IpOLiigm}~?9fHkX|CF>5+E%PPs2$WNxMqp>12}idkeA@Zu=s&OLFh)YRq!z+h2d+Tj!~ZLWHLCShVz zp6ahf8Pr@)!9qFU)%S8irFc{-gg7oX=wf#2*T!A6Q_xXbH}YCU`EA`u8GTbTzx)bF z8&y+W-ufr)Q|3cEM7c&`LLz4_fRlOdBdRXt#G$Dmey)qTT4GsvndGw28ih)vT0xp4 zn^GsKl@=QdkLJ78_=fgJP2;WD=Tq)|-sQ7s9fG9_R+M!#v8YFrDW-sl;8Z74Thbb& zi&J1B6@%ndO`%$vq}RG5*QxDPAnTQzDbj_3R}a z9fm@LMCbsVaN}w9vG;h-W$*XgxRE#!YXsR%XmddhgN4lD8&w!qE>0!zLw;+t(dhXa ze_SonaTW+yRje)V_NqUF<|8=Aqd2W!&q?_X9J`MQ*t{Ts2IMP~wkT;Q-mMGj6OMMD z;2t3f{JINoF`py)Xi8KOQQ*Ok!~n*Wlk0;6KeE;y4@q~OYXR}zGUS#|^3K?tr?Vd- z8V-2jVf)uO?gr>f+sq^3X$RL|;e|tOyW=@w{IfBuJP)<1=V>RfY*^y{V!HCrIQeXR(!y)lBpz(ToSH^h?X19o7p_{7yv`l3wv9?&TBcH`^heZo+lQp**^iD*-mbQ)57!? zh7CfUg;}q&V;g|*O+ZNqGC8&M9Dd@#iRi=|4;LpbjEZ-RKyfG{I$mlerxfcy@?O%1^$Qzo|g zN4CynCIbp9zAQW+U;hbCfu)#Pr{3fxi`&!CniIO^+&{9*@!WCw5~5~H71C+dD42+e z75E|jX-;9IOKkx$QH(T=%cD0ddjKl@{7ygTg|(Z;9EXq*rAd*()0j*pPgrUy*Plye z=DWSsaND_`=rKkX^1$BL29Z^LwAtgXq5(Qg;93E19q?U;mh<-iQ>-V4s*l_%9v;@x zEdl*zy*YBnLHIaU-g2!7-}9prn_OkLrP7EmqQzELWz9@ee8W+Ezl*SmyS9-_-i)Wg zOtyYWeUP>>5s1mBIl0rbV%nlAxndjutr&@t$%e*)s89_4v?X&_+65>JtP|HlCUZvk z_=iN=*g0aPA!^sQ zxa85dOzD9Nmhlgc4eEdt6wrdGC0OOXU!T4O%PnTV*Zhea+`*#&kBY4NF> zj185yrN*7D({YO@aH=bXNq+ zB&2q8jir1aNV%d1u{->bVf$j(fc}vL$-f|HX1ek=Su36|(RYGif`b*Q-VjrA-g0E` zQgob&$Fw{1rETtOY$2mK5Ydpsz!(UM6p6D! zZlTykG><3ZaY585R$>h0a5DE-Ivs8V_(1;%HYfi<73KZVQZ58h>MdmH*y`6U^n_un z7g2~unU2)b_k4fNoO)uXf^3{hG%_fpP|2%8k0J9(0+e&-ET4=u> zvXD|jicKCrifyF)fkEJ;gV2?<)q3nX2iX;WbZ`nr_T)w(t%?pruo?Ob91Fe|SI(f6 z40!_({?G$Ymqq|mxEJRm7L=*oN2_PFiro7vyOaZ@SlEF-4^>m zS)Jx*ql7P#GVGM$8qA35yU;g_uH3fd`(U1L_$AZA`mLzM2>23*FgbLysMIwviyMZ` zmD}Shu2VOHkaE!B<4jeYECOEaK$x1L-s~-`MFGgB^LbC#*GmB$i`qu&_vE>ma_$on z@l$39?GWC!(%fyp#-3$eUU4#OLbuRzk_TBuW-vpwxSK2w{2S(vhS)7;O;ESJ z#J%h0=5(`vs?T`up8GHcO_9-TWzu>tFP^}C%Kk|b_u4&JpI@89Z5yH8t}8ytWH#Kd zi41TkR3s}mq=7jPmC4v3yPDHpT$$C?vxu5u2zL-pN+U!;Zs&Fq`+Z^vFNVtE8&g~m zu^0Z?rbDv+@Iy&cZRa(!7xh=RGBvzg6gy%PSh{cB20J~!fruzHT4wX}>)XR7a%f=O z8+%oY#12ZL5!FxImT8xdeK`m{6VghT@<-C-oNf2)@#7Y%BOZ}*Ke4%mb{OV(C}Z4% z=0R#*^P&r^whL4J&^LgvI#uX%>V)qj)*Ha*8^KJkZ=dG29EE33H{G7n33wYu7f|5y zu}q^<>Uu#LoGj+)oN66b+&u2(?ppwVl1Ue7zVs18B;d;xTngWD5Bjstkg>yGpK~Lw zZU!sFAl7`qh~PUt|;@Pg`Fp9dxXz;$`E&%f~h&^hIEn_{>&I zy5&6eE74HxVyQy``FlLMWR0$5gYOedJ73ypb(G)YnoYB44TQ^`FT)!pAzvNHU84(| z)Fe2{qX&z)Cy6QtbrfN`DeZ=kCnC+`THLXuU@XTE=Xftj8&l-dlYhf{l;4D^yD$(H z^ujdg9mtQvcbOkTkVOLkt^9d=3E4}Xr@TLhIHF^1MX9!5hWzFZ1W0Ez!!=JF$mRGVEqsRZM6$_k$i!@)%IS+2AxV0NcdYQ{PLS zz{=?`E`6C1q0A3-cs~mXLJTpPRt@$bDE&OSCwMaP2q)|m&rR(9ojf^Th-hH0S z#qL*|*@{io)khDc(0cvMo}7IaciDAVec%cfMATyMW)_%wcbrKN*Tff4E0`dcIb8B zs!hTJJg9Hgn=hdh2>PMW?;ae0pjGA;e1e^$rHgL34QUqkWw$HuFJye(#X{O6;U8*3 z>O0^YVz;q;^(zRkYCAU*fTjWYX3zW?9dZhC6+f9_*m}D2yZ&o|-qhoYR-!15xHXzw zlF`t1v;=rOCs5`UT-)bA?CTU(a-wM}% zl6EVW^qhDu{iD;u*9ttazw6~?4xkr74@PGHqYaz*YaW)y=&(pmK5KkPA3~mGSNGQ1 z(AmzrT`R1HW_%69OB9QeDeg&8t_Q2oQ{MSeZQz)ovFWq9HVX55%C7c}uRj?Ly71hu zhQBFdG!rjLpcV0_p1?fA^amLIzlceJ)Z7ksBnWZ9E#7%h879RY>z672@Q*Xj8(b$h zMhbJIy4uroRSPKa9r3REv+@c2;bw?C!zPA!Zs-#?%iiLTc90{VF0vE>V)Tj7p2jE? z$;es3sr-d>T7+N{THNqis9w*==brZZ+$UM5No&AlP&QM_UJ|GZ%j^gq||5nG9=V6-5?9 zuQxaeRTS