9292import com .cloud .vm .VmDetailConstants ;
9393import com .cloud .vm .dao .UserVmDao ;
9494import com .cloud .vm .dao .VMInstanceDao ;
95+ import com .google .gson .JsonObject ;
96+ import com .google .gson .JsonParser ;
9597
9698public class ExternalPathPayloadProvisioner extends ManagerBase implements ExternalProvisioner , PluggableService {
9799
@@ -623,6 +625,38 @@ public Pair<Boolean, String> runCustomActionOnExternalSystem(String extensionNam
623625 String .format ("Failed to execute custom action '%s' on external system" , actionName ), filename );
624626 }
625627
628+ protected VirtualMachine .PowerState getPowerStateFromString (String powerStateStr ) {
629+ if (StringUtils .isBlank (powerStateStr )) {
630+ return VirtualMachine .PowerState .PowerUnknown ;
631+ }
632+ if (powerStateStr .equalsIgnoreCase (VirtualMachine .PowerState .PowerOn .toString ())) {
633+ return VirtualMachine .PowerState .PowerOn ;
634+ } else if (powerStateStr .equalsIgnoreCase (VirtualMachine .PowerState .PowerOff .toString ())) {
635+ return VirtualMachine .PowerState .PowerOff ;
636+ }
637+ return VirtualMachine .PowerState .PowerUnknown ;
638+ }
639+
640+ protected VirtualMachine .PowerState parsePowerStateFromResponse (UserVmVO userVmVO , String response ) {
641+ logger .debug ("Power status response from the external system for {} : {}" , userVmVO , response );
642+ if (StringUtils .isBlank (response )) {
643+ logger .warn ("Empty response while trying to fetch the power status of the {}" , userVmVO );
644+ return VirtualMachine .PowerState .PowerUnknown ;
645+ }
646+ if (!response .trim ().startsWith ("{" )) {
647+ return getPowerStateFromString (response );
648+ }
649+ try {
650+ JsonObject jsonObj = new JsonParser ().parse (response ).getAsJsonObject ();
651+ String powerState = jsonObj .has ("power_state" ) ? jsonObj .get ("power_state" ).getAsString () : null ;
652+ return getPowerStateFromString (powerState );
653+ } catch (Exception e ) {
654+ logger .warn ("Failed to parse power status response: {} for {} as JSON: {}" ,
655+ response , userVmVO , e .getMessage ());
656+ return VirtualMachine .PowerState .PowerUnknown ;
657+ }
658+ }
659+
626660 private VirtualMachine .PowerState getVmPowerState (UserVmVO userVmVO , Map <String , Map <String , String >> accessDetails ,
627661 String extensionName , String extensionPath ) {
628662 final HypervisorGuru hvGuru = hypervisorGuruManager .getGuru (Hypervisor .HypervisorType .External );
@@ -631,23 +665,16 @@ private VirtualMachine.PowerState getVmPowerState(UserVmVO userVmVO, Map<String,
631665 accessDetails .put (ApiConstants .VIRTUAL_MACHINE , virtualMachineTO .getExternalDetails ());
632666 Map <String , Object > modifiedDetails = loadAccessDetails (accessDetails , virtualMachineTO );
633667 String vmUUID = userVmVO .getUuid ();
634- logger .debug ("Trying to get VM power status from the external system for the VM {}" , vmUUID );
668+ logger .debug ("Trying to get VM power status from the external system for {}" , userVmVO );
635669 Pair <Boolean , String > result = getInstanceStatusOnExternalSystem (extensionName , extensionPath , vmUUID ,
636670 modifiedDetails , AgentManager .Wait .value ());
637- if (result .first ()) {
638- if (result .second ().equalsIgnoreCase (VirtualMachine .PowerState .PowerOn .toString ())) {
639- return VirtualMachine .PowerState .PowerOn ;
640- } else if (result .second ().equalsIgnoreCase (VirtualMachine .PowerState .PowerOff .toString ())) {
641- return VirtualMachine .PowerState .PowerOff ;
642- } else {
643- return VirtualMachine .PowerState .PowerUnknown ;
644- }
645- } else {
646- logger .debug ("Exception occurred while trying to fetch the power status of the {} : {}" , userVmVO , result .second ());
671+ if (!result .first ()) {
672+ logger .warn ("Failure response received while trying to fetch the power status of the {} : {}" ,
673+ userVmVO , result .second ());
647674 return VirtualMachine .PowerState .PowerUnknown ;
648675 }
676+ return parsePowerStateFromResponse (userVmVO , result .second ());
649677 }
650-
651678 public Pair <Boolean , String > prepareExternalProvisioningInternal (String extensionName , String filename ,
652679 String vmUUID , Map <String , Object > accessDetails , int wait ) {
653680 return executeExternalCommand (extensionName , "prepare" , accessDetails , wait ,
0 commit comments