2017-01-16 20:59:50 +01:00
/ * Copyright ( c ) Citrix Systems , Inc .
2013-06-24 13:41:48 +02:00
* All rights reserved .
*
* Redistribution and use in source and binary forms ,
* with or without modification , are permitted provided
* that the following conditions are met :
*
* * Redistributions of source code must retain the above
* copyright notice , this list of conditions and the
* following disclaimer .
* * Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the
* following disclaimer in the documentation and / or other
* materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES ,
* INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING ,
* BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY ,
* WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING
* NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE .
* /
2016-08-26 16:37:57 +02:00
using System.Collections.Generic ;
using XenAdmin.Core ;
2013-06-24 13:41:48 +02:00
using XenAPI ;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
2016-08-26 16:37:57 +02:00
public class EvacuateHostPlanAction : PlanActionWithSession , IAvoidRestartHostsAware
2013-06-24 13:41:48 +02:00
{
private readonly XenRef < Host > _host ;
private readonly Host currentHost ;
2016-08-26 17:04:28 +02:00
public List < string > AvoidRestartHosts { private get ; set ; }
2016-08-26 16:37:57 +02:00
2013-06-24 13:41:48 +02:00
public EvacuateHostPlanAction ( Host host )
2017-09-03 04:33:29 +02:00
: base ( host . Connection , string . Format ( Messages . PLANACTION_VMS_MIGRATING , host . Name ( ) ) )
2013-06-24 13:41:48 +02:00
{
2017-09-03 04:33:29 +02:00
base . TitlePlan = string . Format ( Messages . MIGRATE_VMS_OFF_SERVER , host . Name ( ) ) ;
2013-06-24 13:41:48 +02:00
this . _host = new XenRef < Host > ( host ) ;
currentHost = host ;
2016-08-26 17:41:12 +02:00
visible = false ;
2013-06-24 13:41:48 +02:00
}
2013-12-21 13:52:28 +01:00
protected override Host CurrentHost
2013-06-24 13:41:48 +02:00
{
2013-12-21 13:52:28 +01:00
get { return currentHost ; }
2013-06-24 13:41:48 +02:00
}
protected override void RunWithSession ( ref Session session )
{
Host hostObject = TryResolveWithTimeout ( _host ) ;
2016-09-29 11:07:00 +02:00
// If there are no patches that require reboot, we skip the evacuate-reboot-bringbabiesback sequence
// But we only do this if we indicated that host restart should be avoided (by initializing the AvoidRestartHosts property)
if ( Helpers . ElyOrGreater ( hostObject ) & & AvoidRestartHosts ! = null )
2016-08-26 16:37:57 +02:00
{
log . DebugFormat ( "Checking host.patches_requiring_reboot now on '{0}'..." , hostObject ) ;
2016-10-12 15:48:17 +02:00
if ( hostObject . updates_requiring_reboot . Count > 0 )
2016-08-26 16:37:57 +02:00
{
2016-09-29 11:07:00 +02:00
AvoidRestartHosts . Remove ( hostObject . uuid ) ;
2016-08-26 16:37:57 +02:00
2016-10-12 15:48:17 +02:00
log . DebugFormat ( "Restart is needed now (hostObject.updates_requiring_reboot has {0} items in it). Evacuating now. Will restart after." , hostObject . updates_requiring_reboot . Count ) ;
2016-08-26 16:37:57 +02:00
}
else
{
2016-09-29 11:07:00 +02:00
if ( ! AvoidRestartHosts . Contains ( hostObject . uuid ) )
2016-08-26 16:37:57 +02:00
AvoidRestartHosts . Add ( hostObject . uuid ) ;
log . Debug ( "Will skip scheduled restart (livepatching succeeded), because hostObject.patches_requiring_reboot is empty." ) ;
return ;
}
}
2016-08-26 17:41:12 +02:00
visible = true ;
2013-06-24 13:41:48 +02:00
PBD . CheckAndPlugPBDsFor ( Connection . ResolveAll ( hostObject . resident_VMs ) ) ;
2017-09-03 04:33:29 +02:00
log . DebugFormat ( "Disabling host {0}" , hostObject . Name ( ) ) ;
2013-06-24 13:41:48 +02:00
Host . disable ( session , _host . opaque_ref ) ;
Status = Messages . PLAN_ACTION_STATUS_MIGRATING_VMS_FROM_HOST ;
2017-09-03 04:33:29 +02:00
log . DebugFormat ( "Migrating VMs from host {0}" , hostObject . Name ( ) ) ;
2013-06-24 13:41:48 +02:00
XenRef < Task > task = Host . async_evacuate ( session , _host . opaque_ref ) ;
PollTaskForResultAndDestroy ( Connection , ref session , task ) ;
}
}
2013-12-12 12:59:00 +01:00
}