mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	zone hierarchical support for xdsh -K
This commit is contained in:
		| @@ -111,8 +111,11 @@ sub preprocess_request | ||||
|       $req = &parse_xdcp_cmd($req); | ||||
|     } | ||||
|     # if xdsh need to make sure request has full path to input files  | ||||
|     # also process -K flag and use of zones | ||||
|     # will set $::UPDATESNZONEDATA=1, if zones are defined, there are service nodes  and using -K | ||||
|     $::UPDATESNZONEDATA=0;  | ||||
|     if ($command eq "xdsh") { | ||||
|      $req = &parse_xdsh_cmd($req); | ||||
|      $req = &parse_xdsh_cmd($req,$cb); | ||||
|     } | ||||
|  | ||||
|     # there are nodes in the xdsh command, not xdsh  to an image | ||||
| @@ -149,6 +152,12 @@ sub preprocess_request | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         # if servicenodes and xdsh -K and using zones, then we need to sync | ||||
|         # /etc/xcat/sshkeys to the service nodes | ||||
|         if ((@snodes)  && ($::UPDATESNZONEDATA==1)) {    | ||||
|               $rc = | ||||
|                &syncSNZoneKeys($req, $cb, $sub_req, \@snodes); | ||||
|         } | ||||
|  | ||||
|         # if servicenodes and (if xdcp and not pull function or xdsh -e) | ||||
|         # send command to service nodes first and process errors | ||||
| @@ -421,7 +430,9 @@ sub parse_xdcp_cmd | ||||
| sub parse_xdsh_cmd  | ||||
| { | ||||
|    my $req=shift; | ||||
|    my $cb=shift; | ||||
|    my $args=$req->{arg};   # argument | ||||
|    my $nodes   = $req->{node}; | ||||
|    my $currpath=$req->{cwd}->[0]; # current path when command was executed | ||||
|    my $orgargarraySize = @{$args};  # get the size of the arg array | ||||
|    @ARGV = @{$args};    # get arguments | ||||
| @@ -498,6 +509,41 @@ sub parse_xdsh_cmd | ||||
|       | ||||
|       | ||||
|    } # end -e option | ||||
|     | ||||
|    # if -k options and there are zones and service nodes, we cannot allow | ||||
|    #  servicenodes and compute nodes in the noderange.  The /etc/xcat/sshkeys directory must be sync'd  | ||||
|    # to the service nodes first.  So they must run xdsh -K to the service nodes and then to the compute | ||||
|    #  nodes.  | ||||
|     | ||||
|    if (defined($options{'ssh-setup'})) { | ||||
|       my $tab = xCAT::Table->new("zone");  # check for zones | ||||
|       if ($tab){ | ||||
|           my @zones = $tab->getAllAttribs('zonename','defaultzone'); | ||||
|           if (@zones) {  # there are zones | ||||
|               # check to see if service nodes and compute nodes in node range | ||||
|                my @SN; | ||||
|                my @CN; | ||||
|                xCAT::ServiceNodeUtils->getSNandCPnodes(\@$nodes, \@SN, \@CN); | ||||
|                if ((@SN > 0) && (@CN >0 )) { # there are both SN and CN | ||||
|                  my $rsp; | ||||
|                  $rsp->{data}->[0] = | ||||
|                  "xdsh -K was run with a noderange containing both service nodes and compute nodes. This is not valid if using zones.  You must run xdsh -K to the service nodes first to setup the service node to be able to run xdsh -K to the compute nodes.  \n"; | ||||
|                  xCAT::MsgUtils->message("E", $rsp, $cb); | ||||
|                  exit 1; | ||||
|  | ||||
|                } else{   # if servicenodes for the node range this will  force the update of | ||||
|                          # the servicenode with /etc/xcat/sshkeys dir first | ||||
|                    $::UPDATESNZONEDATA=1; | ||||
|                } | ||||
|   | ||||
|         } | ||||
|       } else { | ||||
|          my $rsp = {}; | ||||
|          $rsp->{error}->[0] = | ||||
|          "Error reading the zone table. "; | ||||
|           xCAT::MsgUtils->message("E", $rsp, $cb); | ||||
|       } | ||||
|    } | ||||
|  | ||||
|    return $req; | ||||
| } | ||||
| @@ -992,6 +1038,105 @@ sub process_nodes | ||||
|  | ||||
|     return $newSNreq; | ||||
| } | ||||
| #------------------------------------------------------- | ||||
|  | ||||
| =head3 syncSNZoneKeys | ||||
|   Build the xdcp command to send the zone keys to the service nodes  | ||||
|   Return an array of servicenodes that do not have errors  | ||||
|   Returns error code: | ||||
|   if  = 0,  good return continue to process the | ||||
| 	  nodes. | ||||
|   if  = 1,  global error need to quit | ||||
|  | ||||
| =cut | ||||
|  | ||||
| #------------------------------------------------------- | ||||
| sub syncSNZoneKeys | ||||
| { | ||||
|  | ||||
|     my $req        = shift; | ||||
|     my $callback   = shift; | ||||
|     my $sub_req    = shift; | ||||
|     my $sn         = shift; | ||||
|     my @snodes     = @$sn; | ||||
|     $::RUNCMD_RC = 0; | ||||
|     my $file="/tmp/xcatzonesynclist"; | ||||
|     # Run xdcp <servicenodes> -F /tmp/xcatzonesynclist  | ||||
|     # can leave it , never changes and is built each time | ||||
|     my $content= "\"/etc/xcat/sshkeys/* -> /etc/xcat/sshkeys/\""; | ||||
|     `echo $content  > $file`; | ||||
|  | ||||
|     # xdcp rsync the file  | ||||
|  | ||||
|     my @sn = (); | ||||
|     #build the array of all service nodes  | ||||
|     foreach my $node (@snodes) | ||||
|     { | ||||
|  | ||||
|             # handle multiple servicenodes for one node | ||||
|             my @sn_list = split ',', $node; | ||||
|             foreach my $snode (@sn_list) { | ||||
|              push @sn, $snode; | ||||
|             } | ||||
|     } | ||||
|  | ||||
|     @::good_SN = @sn;  # initialize all good | ||||
|  | ||||
|     # run the command to the servicenodes | ||||
|     # xdcp <sn>  -F <syncfile> | ||||
|     my $addreq; | ||||
|     $addreq->{'_xcatdest'}  = $::mnname; | ||||
|     $addreq->{node}         = \@sn; | ||||
|     $addreq->{noderange}    = \@sn; | ||||
|     # check input request for --nodestatus | ||||
|     my $args=$req->{arg};   # argument | ||||
|     if (grep(/^--nodestatus$/, @$args)) { | ||||
|        push (@{$addreq->{arg}},"--nodestatus"); # return nodestatus | ||||
|     } | ||||
|     push (@{$addreq->{arg}},"-v");  | ||||
|     push (@{$addreq->{arg}},"-F");  | ||||
|     push (@{$addreq->{arg}},$file);  | ||||
|     $addreq->{command}->[0] = "xdcp";  # input command is xdsh, but we need to run xdcp -F | ||||
|     $addreq->{cwd}->[0]     = $req->{cwd}->[0]; | ||||
|     $addreq->{env}          = $req->{env}; | ||||
|     &process_request($addreq, $callback, $sub_req); | ||||
|  | ||||
|     if ($::FAILED_NODES == 0) | ||||
|     { | ||||
|             @::good_SN = @sn;   # all servicenodes were sucessful | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|           @::bad_SN = @::DCP_NODES_FAILED;  | ||||
|           # remove all failing nodes from the good list | ||||
|           my @tmpgoodnodes; | ||||
|           foreach my $gnode (@::good_SN) { | ||||
|             if (!grep(/$gnode/,@::bad_SN ))  # if not a bad node | ||||
|             {    | ||||
|                push @tmpgoodnodes, $gnode; | ||||
|             } | ||||
|           } | ||||
|           @::good_SN = @tmpgoodnodes; | ||||
|     } | ||||
|  | ||||
|     # report bad service nodes | ||||
|     if (@::bad_SN) | ||||
|     { | ||||
|         my $rsp = {}; | ||||
|         my $badnodes; | ||||
|         foreach my $badnode (@::bad_SN) | ||||
|         { | ||||
|             $badnodes .= $badnode; | ||||
|             $badnodes .= ", "; | ||||
|         } | ||||
|         chop $badnodes; | ||||
|         my $msg = | ||||
|           "\nThe following servicenodes: $badnodes have errors and cannot be updated\n Until the error is fixed, xdcp will not work to nodes serviced by these service nodes."; | ||||
|         $rsp->{data}->[0] = $msg; | ||||
|         xCAT::MsgUtils->message("D", $rsp, $callback); | ||||
|     } | ||||
|     return (0); | ||||
| } | ||||
|  | ||||
| #------------------------------------------------------- | ||||
|  | ||||
|   | ||||
| @@ -183,20 +183,6 @@ sub process_request | ||||
|             xCAT::MsgUtils->message("E", $rsp, $callback, 1); | ||||
|             exit 1;  | ||||
|         } | ||||
|        # now check for service nodes in noderange.  It they exist that is an error also. | ||||
|         my @SN; | ||||
|         my @CN; | ||||
|         xCAT::ServiceNodeUtils->getSNandCPnodes(\@nodes, \@SN, \@CN); | ||||
|         if (scalar(@SN))        | ||||
|         {    # SN in the nodelist | ||||
|             my $nodes=join(',', @SN); | ||||
|             my $rsp = {}; | ||||
|             $rsp->{error}->[0] = | ||||
|               "You must not run $command and include any service nodes: $nodes."; | ||||
|             xCAT::MsgUtils->message("E", $rsp, $callback, 1); | ||||
|             exit 1;  | ||||
|         } | ||||
|        # now check for service nodes in noderange.  It they exist that is an error also. | ||||
|   | ||||
|   | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user