Add the functions: delete SD, chvm, rpower suspend
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13609 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -225,7 +225,7 @@ sub preprocess_request { | ||||
|     # The dispatch depends on the rhevm. Since the operation is in serial, so no need to use the service node. | ||||
|     my @requests; | ||||
|     my @rhevms=keys(%rhevm_hash); | ||||
|     my $sn = xCAT::ServiceNodeUtils->get_ServiceNode(\@rhevms, 'xcat', "MN"); | ||||
|     my $sn = xCAT::Utils->get_ServiceNode(\@rhevms, 'xcat', "MN"); | ||||
|     foreach my $snkey (keys %$sn){ | ||||
|         my $reqcopy = {%$request}; | ||||
|         $reqcopy->{'_xcatdest'} = $snkey; | ||||
| @@ -340,6 +340,8 @@ sub process_request { | ||||
|  | ||||
|     if($command eq 'mkinstall'){ | ||||
|         mkinstall($request, $callback, \%rhevm_hash); | ||||
|     } elsif ($command eq "rsetboot") { | ||||
|         rsetboot($callback, \%rhevm_hash, $args); | ||||
|     } elsif ($command eq "addhost") { | ||||
|         addhost($callback, \%rhevm_hash); | ||||
|     } elsif ($command eq "cfghost") { | ||||
| @@ -352,7 +354,9 @@ sub process_request { | ||||
|         rmhost(); | ||||
|     } elsif ($command eq "lsvm") { | ||||
|         lsvm($callback, \%rhevm_hash, $args); | ||||
|     } elsif ($command eq "mkvm") { | ||||
|     } elsif ($command eq "chvm") { | ||||
|         chvm($callback, \%rhevm_hash, $nodes, $args); | ||||
|     }elsif ($command eq "mkvm") { | ||||
|         mkvm($callback, \%rhevm_hash, $nodes, $args); | ||||
|     } elsif ($command eq "rmvm") { | ||||
|         rmvm($callback, \%rhevm_hash, $args); | ||||
| @@ -835,6 +839,7 @@ my $display = { | ||||
|         'used' => ["used"], | ||||
|         'committed' => ["committed"], | ||||
|         'storage_format' => ["storage_format"], | ||||
|         'status' => ["status/state"], | ||||
|     }, | ||||
|     'networks' => { | ||||
|         'description' => ["description"], | ||||
| @@ -922,6 +927,7 @@ sub displaysrc { | ||||
|     my $type = shift; | ||||
|     my $prelead = shift; | ||||
|     my $criteria = shift; | ||||
|     my $individual = shift; | ||||
|  | ||||
|     my @output; | ||||
|     my @displayed; | ||||
| @@ -932,7 +938,11 @@ sub displaysrc { | ||||
|     } elsif ($type eq "clusters") { | ||||
|         $prefix = "/clusters/cluster"; | ||||
|     } elsif ($type eq "storagedomains") { | ||||
|         $prefix = "/storage_domains/storage_domain"; | ||||
|         if ($individual) { | ||||
|             $prefix = "/storage_domain"; | ||||
|         } else { | ||||
|             $prefix = "/storage_domains/storage_domain"; | ||||
|         } | ||||
|     } elsif ($type eq "networks") { | ||||
|         $prefix = "/networks/network"; | ||||
|     } elsif ($type eq "hosts") { | ||||
| @@ -1071,7 +1081,8 @@ sub lsve { | ||||
|                 unless ($rc) { | ||||
|                     displaysrc($callback, $ref_rhevm, $response, "clusters", "    "); | ||||
|                 } | ||||
|                 ($rc, $id, $stat, $response) = search_src($ref_rhevm, "storagedomains", "datacenter%3D$obj"); | ||||
|                 #($rc, $id, $stat, $response) = search_src($ref_rhevm, "storagedomains", "datacenter%3D$obj"); | ||||
|                 ($rc, $id, $stat, $response) = search_src($ref_rhevm, "datacenters/$dcid/storagedomains:storagedomains"); | ||||
|                 unless ($rc) { | ||||
|                     displaysrc($callback, $ref_rhevm, $response, "storagedomains", "    "); | ||||
|                 } | ||||
| @@ -1136,7 +1147,7 @@ sub cfgve { | ||||
|     my $args = shift; | ||||
|     my $nodes = shift; | ||||
|  | ||||
|     my ($type, $objlist, $mgr, $datacenter, $create, $update, $remove, $activate, $deactivate, $attach, $detach); | ||||
|     my ($type, $objlist, $mgr, $datacenter, $create, $update, $remove, $activate, $deactivate, $attach, $detach, $force); | ||||
|     if ($args) { | ||||
|         @ARGV=@{$args}; | ||||
|         GetOptions('t=s' => \$type, | ||||
| @@ -1149,7 +1160,8 @@ sub cfgve { | ||||
|                         's' => \$deactivate, | ||||
|                         'a' => \$attach, | ||||
|                         'b' => \$detach, | ||||
|                         'r' => \$remove); | ||||
|                         'r' => \$remove, | ||||
|                         'f' => \$force); | ||||
|     } | ||||
|  | ||||
|     my $rhevm = (keys %{$rhevm_hash})[0]; | ||||
| @@ -1170,7 +1182,7 @@ sub cfgve { | ||||
|                     xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                     return; | ||||
|                 } | ||||
|             } elsif ($activate || $deactivate || $attach || $detach) { | ||||
|             } elsif ($activate || $deactivate || $attach || $detach || $remove) { | ||||
|                 # get the name of datacenter | ||||
|                 my $vsdtab = xCAT::Table->new('virtsd',-create=>0); | ||||
|                 my $vsdent = $vsdtab->getAttribs({'node'=>$obj}, ['datacenter']); | ||||
| @@ -1211,8 +1223,23 @@ sub cfgve { | ||||
|                         push @{$rsp->{data}}, "$obj: succeeded."; | ||||
|                         xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                     } | ||||
|                 } elsif ($remove) { | ||||
|                     if ($force) { | ||||
|                         # deactivate the storage domain | ||||
|                         activate($callback, $ref_rhevm,"/api/datacenters/$dcid/storagedomains/$sdid", $obj, 1); | ||||
|                      | ||||
|                         # detach the storage domain to the datacenter | ||||
|                         attach($callback, $ref_rhevm,"/api/datacenters/$dcid/storagedomains", "storage_domain", $sdid, 1); | ||||
|                     } | ||||
|      | ||||
|                     if (!deleteSD($callback, $ref_rhevm, "/api/storagedomains/$sdid", $obj)) { | ||||
|                         my $rsp; | ||||
|                         push @{$rsp->{data}}, "$obj: delete storage domain succeeded."; | ||||
|                         xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                         return; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             }  | ||||
|         } elsif ($type eq "tpl") { | ||||
|             if ($remove) { | ||||
|                 my ($rc, $tplid, $stat, $response) = search_src($ref_rhevm, "templates", "$obj"); | ||||
| @@ -1255,6 +1282,15 @@ sub cfgve { | ||||
|                     xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                     next; | ||||
|                 } | ||||
|             } elsif ($remove) { | ||||
|                 my ($rc, $nwid, $stat) = search_src($ref_rhevm, "networks", $obj); | ||||
|                 if ($rc) { | ||||
|                     my $rsp; | ||||
|                     push @{$rsp->{data}}, "$obj: failed to get networks: $obj."; | ||||
|                     xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                     next; | ||||
|                 } | ||||
|                 generalaction($callback, $ref_rhevm, "/api/networks/$nwid", "DELETE", 1); | ||||
|             } | ||||
|         } else { | ||||
|             my $rsp; | ||||
| @@ -2121,6 +2157,177 @@ sub rmvm { | ||||
|  | ||||
| # Change virtual machine | ||||
| sub chvm { | ||||
|     my $callback = shift; | ||||
|     my $rhevm_hash = shift; | ||||
|     my $nodes = shift; | ||||
|  | ||||
|     # Get the mac address for the nodes from the mac table | ||||
|     my $mactab = new xCAT::Table('mac',-create=>1); | ||||
|  | ||||
|     # Get the attributes for the nodes from the vm table | ||||
|     my $vmtab = xCAT::Table->new('vm',-create=>0); | ||||
|     my $vment = $vmtab->getNodesAttribs($nodes,['template', 'host', 'cluster', 'virtflags', 'storage', 'storagemodel', 'memory', 'cpus', 'nics', 'nicmodel', 'bootorder', 'vidproto']); | ||||
|  | ||||
|     foreach my $rhevm (keys %{$rhevm_hash}) { | ||||
|         my %node_hyp; | ||||
|         my %hostid; | ||||
|         my $success = 0; | ||||
|         # generate the hash of rhevm which will be used for the action functions | ||||
|         my $ref_rhevm = {'name' => $rhevm,  | ||||
|                                  'user' => $rhevm_hash->{$rhevm}->{user},  | ||||
|                                  'pw' => $rhevm_hash->{$rhevm}->{pw}}; | ||||
|      | ||||
|         # generate the node that will be handled | ||||
|         if (defined $rhevm_hash->{$rhevm}->{host}) { | ||||
|             foreach my $rhevh (keys %{$rhevm_hash->{$rhevm}->{host}}) { | ||||
|                 if (defined $rhevm_hash->{$rhevm}->{host}->{$rhevh}->{node}) { | ||||
|                     foreach (@{$rhevm_hash->{$rhevm}->{host}->{$rhevh}->{node}}) { | ||||
|                         $node_hyp{$_}{hyp} = $rhevh; | ||||
|                         $hostid{$rhevh} = 1; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } elsif (defined $rhevm_hash->{$rhevm}->{node}) { | ||||
|             foreach (@{$rhevm_hash->{$rhevm}->{node}}) { | ||||
|                 $node_hyp{$_}{hyp} = ""; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # get the host id | ||||
|         # this is used for the case that needs locate vm to a spcific host | ||||
|         foreach my $host (keys %hostid) { | ||||
|             my ($rc, $id, $stat) = search_src($ref_rhevm, "hosts", $host); | ||||
|             if ($rc) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "Cannot find $host in the rhevm."; | ||||
|                 xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                 return; | ||||
|             } | ||||
|             $hostid{$host} = $id; | ||||
|         } | ||||
|         my @nodes = (keys %node_hyp); | ||||
|         my $macmac = $mactab->getNodesAttribs(\@nodes, ['mac']); | ||||
|     | ||||
|         foreach my $node (@nodes) { | ||||
|             my $myvment = $vment->{$node}->[0]; | ||||
|             unless ($myvment) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: has NOT entry in vm table."; | ||||
|                 xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                 next; | ||||
|             } | ||||
|              | ||||
|             # Check the existence of the node | ||||
|             my ($rc, $vmid, $stat) = search_src($ref_rhevm, "vms", $node); | ||||
|             if ($rc) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: virtual machine was not created."; | ||||
|                 xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                 next; | ||||
|             } | ||||
|              | ||||
|             # generate the content | ||||
|             my $tplele; | ||||
|             if ($myvment->{template}) { | ||||
|                 $tplele = "<template><name>$myvment->{template}</name></template>"; | ||||
|             } | ||||
|              | ||||
|             # configure memory | ||||
|             my $memele; | ||||
|             if ($myvment->{memory}) { | ||||
|                 my $memsize = $myvment->{memory}; | ||||
|                 $memsize =~ s/g/000000000/i; | ||||
|                 $memsize =~ s/m/000000/i; | ||||
|                 $memele = "<memory>$memsize</memory>"; | ||||
|             } | ||||
|              | ||||
|             # set the cpu | ||||
|             my $cpuele; | ||||
|             if ($myvment->{cpus}) { | ||||
|                 my ($socketnum, $corenum) = split(':', $myvment->{cpus}); | ||||
|                 unless ($corenum) {$corenum = 1;} | ||||
|                 $cpuele = "<cpu><topology cores=\"$socketnum\" sockets=\"$corenum\"/></cpu>"; | ||||
|             } | ||||
|              | ||||
|             # configure bootorder | ||||
|             # there's a bug that sequence is not correct to set two order, so currently just set one | ||||
|             my $boele; | ||||
|             if ($myvment->{bootorder}) { | ||||
|                 my ($firstbr, $secbr) = split (',', $myvment->{bootorder}); | ||||
|                 if ($secbr) { | ||||
|                     $boele = "<os><boot dev=\"$firstbr\"/><boot dev=\"$secbr\"/><boot/></os>"; | ||||
|                 } else { | ||||
|                     $boele = "<os><boot dev=\"$firstbr\"/><boot/></os>"; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             my $disele; | ||||
|             if ($myvment->{vidproto}) { | ||||
|                 $disele = "<display><type>$myvment->{vidproto}</type></display>"; | ||||
|             } | ||||
|  | ||||
|             my $affinity; | ||||
|             if ($myvment->{virtflags}) { | ||||
|                 # parse the specific parameters from vm.virtflags | ||||
|                 my @pairs = split (':', $myvment->{virtflags}); | ||||
|                 foreach my $pair (@pairs) { | ||||
|                     my ($name, $value) = split('=', $pair); | ||||
|                     if ($name eq "placement_affinity") { | ||||
|                         # set the affinity for placement_policy | ||||
|                         $affinity = "<affinity>$value</affinity>" | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             my $hostele; | ||||
|             if ($myvment->{host}) { | ||||
|                 $hostele = "<host id=\"$hostid{$myvment->{host}}\"/>"; | ||||
|             } | ||||
|  | ||||
|             my $placement_policy; | ||||
|             if ($affinity) { | ||||
|                 $placement_policy = "<placement_policy>$hostele$affinity</placement_policy>"; | ||||
|             } elsif ($hostele) { | ||||
|                 $affinity = "<affinity>migratable</affinity>"; | ||||
|                 $placement_policy = "<placement_policy>$hostele$affinity</placement_policy>"; | ||||
|             } | ||||
|  | ||||
|             # set the cluster for the vm | ||||
|             my $clusterele; | ||||
|             if ($myvment->{cluster}) { | ||||
|                 $clusterele = "<cluster><name>$myvment->{cluster}</name></cluster>"; | ||||
|             } | ||||
|  | ||||
|             my $api = "/api/vms/$vmid"; | ||||
|             my $method = "PUT"; | ||||
|              | ||||
|             my $content = "<vm><type>server</type><name>$node</name>$clusterele$tplele$memele$cpuele$boele$placement_policy$disele</vm>"; | ||||
|             my $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|             my $response; | ||||
|             ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|             if ($rc) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: $response"; | ||||
|                 xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                 next; | ||||
|             } else { | ||||
|                 my $parser = XML::LibXML->new(); | ||||
|                 my $doc = $parser->parse_string($response); | ||||
|                 my $state; | ||||
|                 if ($node eq getAttr($doc, "/vm/name")) { | ||||
|                     my $rsp; | ||||
|                     push @{$rsp->{data}}, "$node: change vm completed."; | ||||
|                     xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                     next; | ||||
|                 } else { | ||||
|                     my $rsp; | ||||
|                     push @{$rsp->{data}}, "$node: change vm failed."; | ||||
|                     xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                     next; | ||||
|                 } | ||||
|             }  | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| # Clone the virtual machine | ||||
| @@ -2204,6 +2411,103 @@ sub clonevm { | ||||
|  | ||||
| } | ||||
|  | ||||
| # Set the boot sequence for the vm | ||||
| sub rsetboot { | ||||
|     my $callback = shift; | ||||
|     my $rhevm_hash = shift; | ||||
|     my $args = shift; | ||||
|  | ||||
|     my ($showstat, $bootdev); | ||||
|     if ($args) { | ||||
|         my $arg = $args->[0]; | ||||
|         if ($arg =~ /^stat/) { | ||||
|             $showstat = 1; | ||||
|         } else { | ||||
|             $bootdev = $arg; | ||||
|         } | ||||
|     } else { | ||||
|         $showstat = 1; | ||||
|     } | ||||
|  | ||||
|     my ($firstbr, $secbr); | ||||
|     if ($bootdev) { | ||||
|         ($firstbr, $secbr) = split (',', $bootdev); | ||||
|         if (($firstbr && $firstbr !~ /^(network|hd)$/) || ($secbr && $secbr !~ /^(network|hd)$/)) { | ||||
|             my $rsp; | ||||
|             push @{$rsp->{data}}, "Supported boot device: network, hd"; | ||||
|             xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     foreach my $rhevm (keys %{$rhevm_hash}) { | ||||
|         my @nodes; | ||||
|         # generate the hash of rhevm which will be used for the action functions | ||||
|         my $ref_rhevm = {'name' => $rhevm,  | ||||
|                                  'user' => $rhevm_hash->{$rhevm}->{user},  | ||||
|                                  'pw' => $rhevm_hash->{$rhevm}->{pw}}; | ||||
|  | ||||
|         # generate the node that will be handled | ||||
|         if (defined $rhevm_hash->{$rhevm}->{host}) { | ||||
|             foreach my $rhevh (keys %{$rhevm_hash->{$rhevm}->{host}}) { | ||||
|                 if (defined $rhevm_hash->{$rhevm}->{host}->{$rhevh}->{node}) { | ||||
|                     push @nodes, @{$rhevm_hash->{$rhevm}->{host}->{$rhevh}->{node}}; | ||||
|                 } | ||||
|             } | ||||
|         } elsif (defined $rhevm_hash->{$rhevm}->{node}) { | ||||
|              push @nodes, @{$rhevm_hash->{$rhevm}->{node}}; | ||||
|         } | ||||
|  | ||||
|         foreach my $node (@nodes) { | ||||
|             # Get the ID of vm | ||||
|             my ($rc, $vmid, $state, $response) = search_src($ref_rhevm, "vms", $node); | ||||
|             if ($rc) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: node was not defined in the rhevm."; | ||||
|                 xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                 next; | ||||
|             } | ||||
|  | ||||
|             if ($showstat) { | ||||
|                 my $parser = XML::LibXML->new(); | ||||
|                 my $doc = $parser->parse_string($response); | ||||
|                 my @bootdevs = getAttr($doc, "/vms/vm/os/boot", "dev"); | ||||
|                 my $bootlist = join(',', @bootdevs); | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: $bootlist"; | ||||
|                 xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                 next; | ||||
|             } | ||||
|  | ||||
|             # configure bootorder | ||||
|             my $boele; | ||||
|             if ($secbr) { | ||||
|                 $boele = "<os><boot dev=\"$firstbr\"/><boot dev=\"$secbr\"/><boot/></os>"; | ||||
|             } else { | ||||
|                 $boele = "<os><boot dev=\"$firstbr\"/><boot/></os>"; | ||||
|             } | ||||
|  | ||||
|             my $api = "/api/vms/$vmid"; | ||||
|             my $method = "PUT"; | ||||
|              | ||||
|             my $content = "<vm>$boele</vm>"; | ||||
|             my $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|             ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|             if ($rc) { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: $response"; | ||||
|                 xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                 next; | ||||
|             } else { | ||||
|                 my $rsp; | ||||
|                 push @{$rsp->{data}}, "$node: set boot order completed."; | ||||
|                 xCAT::MsgUtils->message("I", $rsp, $callback); | ||||
|                 next; | ||||
|             }  | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #Migrate the virtual machine | ||||
| sub rmigrate { | ||||
|     my $callback = shift; | ||||
| @@ -2350,9 +2654,15 @@ sub power { | ||||
|                 if ($state eq "up" || $state eq "powering_up") { | ||||
|                     my ($rc, $msg) = power_action($ref_rhevm, $id, 'stop'); | ||||
|                     if (!$rc) { | ||||
|                         if (waitforcomplete($ref_rhevm, "/api/vms/$id", "/vm/status/state=down", 30)) { | ||||
|                             my $rsp; | ||||
|                             push @{$rsp->{data}}, "$node: failed to waiting the vm gets to \"down\" state."; | ||||
|                             xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                             next; | ||||
|                         } | ||||
|                         ($rc, $msg) = power_action($ref_rhevm, $id, 'start'); | ||||
|                         if (!$rc) { | ||||
|                             $output = "$node: reset"; | ||||
|                             $output = "$node: $args->[0]"; | ||||
|                         } else { | ||||
|                             $output = "$node: $msg"; | ||||
|                         } | ||||
| @@ -2362,7 +2672,7 @@ sub power { | ||||
|                 } else { | ||||
|                     my ($rc, $msg) = power_action($ref_rhevm, $id, 'start'); | ||||
|                     if (!$rc) { | ||||
|                         $output = "$node: reset"; | ||||
|                         $output = "$node: $args->[0]"; | ||||
|                     } else { | ||||
|                         $output = "$node: $msg"; | ||||
|                     } | ||||
| @@ -2378,13 +2688,24 @@ sub power { | ||||
|                         $output = "$node: $msg"; | ||||
|                     } | ||||
|                 } | ||||
|             } elsif ($args->[0] eq 'suspend') { | ||||
|                 if ($state eq "suspended") { | ||||
|                     $output = "$node: suspended"; | ||||
|                 } else { | ||||
|                     my ($rc, $msg) = power_action($ref_rhevm, $id, 'suspend'); | ||||
|                     if (!$rc) { | ||||
|                         $output = "$node: suspended"; | ||||
|                     } else { | ||||
|                         $output = "$node: $msg"; | ||||
|                     } | ||||
|                 } | ||||
|             } elsif ($args->[0] =~ /^stat/) { | ||||
|                 if ($state eq "down" || $state eq "powering_down" || $state eq "powered_down") { | ||||
|                 if ($state eq "down") { | ||||
|                     $output = "$node: off"; | ||||
|                 } elsif ($state eq "up" || $state eq "powering_up") { | ||||
|                 } elsif ($state eq "up") { | ||||
|                     $output = "$node: on"; | ||||
|                 } else { | ||||
|                     $output = "$node: unknow"; | ||||
|                     $output = "$node: $state"; | ||||
|                 } | ||||
|             } | ||||
|             my $rsp; | ||||
| @@ -2911,27 +3232,19 @@ sub mkSD { | ||||
|                     xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                     return 0; | ||||
|                 } | ||||
|                 $api = "/api/datacenters/$dcid/storagedomains"; | ||||
|                 $method = "POST"; | ||||
|                 my $content = "<storage_domain id=\"$sdid\"/>"; | ||||
|                 $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|                 ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|                 if ($rc) { | ||||
|  | ||||
|                 # attach the storage domain to the datacenter | ||||
|                 if (attach($callback, $ref_rhevm,"/api/datacenters/$dcid/storagedomains", "storage_domain", $sdid)) { | ||||
|                     my $rsp; | ||||
|                     push @{$rsp->{data}}, "$sd: $response"; | ||||
|                     push @{$rsp->{data}}, "$sd: failed to attach to datacenter:$dc."; | ||||
|                     xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                     return 0; | ||||
|                 } | ||||
|  | ||||
|                 # active the storage domain | ||||
|                 $api = "/api/datacenters/$dcid/storagedomains/$sdid/activate"; | ||||
|                 $method = "POST"; | ||||
|                 $content = "<action/>"; | ||||
|                 $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|                 ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|                 if ($rc) { | ||||
|                 if (activate($callback, $ref_rhevm,"/api/datacenters/$dcid/storagedomains/$sdid", $sd)) { | ||||
|                     my $rsp; | ||||
|                     push @{$rsp->{data}}, "$sd: $response"; | ||||
|                     push @{$rsp->{data}}, "$sd: failed to activate the storage domain."; | ||||
|                     xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|                     return 0; | ||||
|                 } | ||||
| @@ -3001,11 +3314,18 @@ sub attach { | ||||
|     my $id = shift; | ||||
|     my $detach = shift; | ||||
|  | ||||
|     my $method = "POST"; | ||||
|     my $api; | ||||
|     my $content; | ||||
|     if ($type eq "storage_domain") { | ||||
|         $api = $path; | ||||
|         $content = "<$type id=\"$id\"/>"; | ||||
|         if ($detach) { | ||||
|             $api = "$path/$id"; | ||||
|             $method = "DELETE"; | ||||
|             $content = ""; | ||||
|         } else { | ||||
|             $api = $path; | ||||
|             $content = "<$type id=\"$id\"/>"; | ||||
|         } | ||||
|     } else { | ||||
|         if ($detach) { | ||||
|             $api = $path."/detach"; | ||||
| @@ -3015,33 +3335,35 @@ sub attach { | ||||
|         $content = "<action><$type id=\"$id\"/></action>"; | ||||
|     } | ||||
|      | ||||
|     my $method = "POST"; | ||||
|      | ||||
|     my $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|  | ||||
|     my ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|     if ($rc) { | ||||
|             my $rsp; | ||||
|             push @{$rsp->{data}}, "$response"; | ||||
|             xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|             return 1; | ||||
|         # no output for detaching sd from datacenter | ||||
|         if ($rc == 2 && $type eq "storage_domain" && $detach) { | ||||
|             return 0; | ||||
|         } | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$response:$rc"; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } else { | ||||
|         my $parser = XML::LibXML->new(); | ||||
|         my $doc = $parser->parse_string($response); | ||||
|         if ($doc ) { | ||||
|             my $attr; | ||||
|             if ($attr = getAttr($doc, "/action/status/state")) { | ||||
|                 if ($type eq "storage_domain") { | ||||
|                   if ($attr eq "inactive") { | ||||
|             if ($type eq "storage_domain") { | ||||
|                  if ("inactive" eq getAttr($doc, "/storage_domain/status/state")) { | ||||
|                      return 0; | ||||
|                  } else { | ||||
|                      return 1; | ||||
|                  } | ||||
|             } else { | ||||
|                 if ("complete" eq getAttr($doc, "/action/status/state")) { | ||||
|                     return 0; | ||||
|                   } else { | ||||
|                  } else { | ||||
|                     return 1; | ||||
|                   } | ||||
|                 } else { | ||||
|                 if ($attr eq "complete") { | ||||
|                     return 0; | ||||
|                   } else { | ||||
|                     return 1; | ||||
|                   } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @@ -3071,10 +3393,66 @@ sub generalaction { | ||||
|     } | ||||
|      | ||||
|     if ($rc) { | ||||
|             my $rsp; | ||||
|             push @{$rsp->{data}}, "$response"; | ||||
|             xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|             return 1; | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$response"; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| # delete storage domain | ||||
| sub deleteSD { | ||||
|     my $callback = shift; | ||||
|     my $ref_rhevm = shift; | ||||
|     my $path = shift; | ||||
|     my $sd = shift; | ||||
|  | ||||
|     # get the attributes for the SD | ||||
|     my $vsdtab = xCAT::Table->new('virtsd',-create=>0); | ||||
|     my $vsdent = $vsdtab->getAttribs({'node'=>$sd}, ['host']); | ||||
|     unless ($vsdent) { | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$sd: cannot find the definition for $sd in the virtsd table."; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     unless ($vsdent->{host}) { | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$sd: a SPM host needs to be specified."; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     # get the id of host | ||||
|     my ($rc, $hostid, $stat) = search_src($ref_rhevm, "hosts", $vsdent->{host}); | ||||
|     if ($rc) { | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$sd: Cannot find the host: $vsdent->{host} for the storag domain."; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } | ||||
|      | ||||
|     my $method = "DELETE"; | ||||
|     my $api = $path; | ||||
|     my $content; | ||||
|  | ||||
|     $content = "<storage_domain><host id=\"$hostid\"/><format>true</format></storage_domain>"; | ||||
|  | ||||
|     my $request = genreq($ref_rhevm, $method, $api, $content); | ||||
|     my $response; | ||||
|     ($rc, $response) = send_req($ref_rhevm, $request->as_string()); | ||||
|  | ||||
|     # no need to handle response for DELETE | ||||
|     if ($rc) { | ||||
|         # no output for detaching sd from datacenter | ||||
|         if ($rc == 2) { | ||||
|             return 0; | ||||
|         } | ||||
|         my $rsp; | ||||
|         push @{$rsp->{data}}, "$response"; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $callback); | ||||
|         return 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user