xenadmin/XenModel/WLB/WlbScheduledTask.cs
Danilo Del Busso 4b0b83245f
CP-34231: Remove language with negative connotations (#2860)
* CA-34231: Replace negative language with `block list` in code and references

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `stop` in code and references

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `freezing` in code

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run/ran` in code comments

Some paramater mentions have been renamed, as they will be renamed in future commits.
Excluded mentions in XenAPI/Host.cs and XenAPI/VM.cs since code is autogenerated.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	CFUValidator/CommandLineOptions/CFUCommandLineOptionManager.cs
#	XenAdmin/Controls/Wlb/WlbOptModeScheduler.cs
#	XenAdmin/Dialogs/Wlb/WorkloadReports.cs

* CA-34231: Replace negative language with `run` in Command.cs Run method

Used Resharper renaming utility
Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/TabPages/GeneralTabPage.cs

* CA-34231: Replace negative language with `run` in Command.cs CanRun method

Used Resharper rename utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in Command.cs CanRunCore method

Used ReSharper rename utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/DRConfigureCommand.cs
#	XenAdmin/Commands/DRDryrunCommand.cs
#	XenAdmin/Commands/DRFailbackCommand.cs
#	XenAdmin/Commands/DRFailoverCommand.cs
#	XenAdmin/Commands/DisasterRecoveryCommand.cs
#	XenAdmin/Commands/VMGroupCommand.cs

* CA-34231: Replace negative language with `run` in Command.cs RunCore method

Used ReSharper rename utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in Command.cs GetCantExecuteReasonCore method

Used ReSharper rename utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in Command.cs GetCantRunReasons method

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative language with `run` in Command.cs

Also applied to related symbols. Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in methods named CanRun

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in methods in CrossPoolMigrateCommand.cs

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/CrossPoolMigrateCommand.cs

* CA-34231: Replace negative language with `run` in remaining Run methods

Also updated negative language in `DeleteVMCommand`
Also updated in comment in `CrossPoolMigrateCommand`
Also renamed missed instances of `CanRun`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `run` in `CanRunCore` and `RunCore`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative language with `run` in Commands folder

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative language with `run` in XenAdmin/Controls folder

Used ReSharper renaming utility. Had to rename `WlbReportView.xs:RunReport()` to `WlbReportView.xs:StartRunReport()` to resolve conflict with change from `WlbReportView:ExecuteReport()` to `WlbReportView:RunReport()`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Controls/Wlb/WlbOptModeScheduler.cs
#	XenAdmin/Dialogs/Wlb/WorkloadReports.cs
#	XenAdminTests/UnitTests/WlbTests/WlbScheduledTaskTests.cs

* CA-34231: Replace all remaining negative language with `run` in code

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/Controls/WlbRecommendations.cs
#	XenAdminTests/UnitTests/WlbTests/WlbScheduledTaskTests.cs
#	XenModel/WLB/WlbScheduledTask.cs

* CA-34231: Replace negative language with `supporter` or `bond member` in code strings

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `supporter` or `bond member` in Messages string

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/MainWindow.cs
#	XenAdmin/Wizards/PatchingWizard/PatchingWizard_SelectServers.cs
#	XenModel/Messages.Designer.cs
#	XenModel/Messages.resx

* CA-34231: Replace remaining negative language with `supporter` in .resx files

Used ReSharper renaming utility. FriendlyErrorNames.resx has been excluded.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `supporter` or `bond member` in XenAdmin code

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/NewPoolDialog.cs

* CA-34231: Replace negative language with `supporter` or `bond member` in XenModel code

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in CFUValidator code

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	CFUValidator/CFUValidator.cs

* CA-34231: Replace negative language with `coordinator` in solution's comments and hardcoded strings

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `Helpers:GetCoordinator` method

Used ReSharper renaming utility.
also renamed similarly named method in `ObjectChange.cs`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Alerts/Types/HotfixEligibilityAlert.cs
#	XenAdmin/Controls/CustomDataGraph/ArchiveMaintainer.cs

* CA-34231: Replace negative language with `coordinator` in `EvacuateHostDialog.resx`

Used ReSharper renaming utility. Excluded jp and zh resources

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/EvacuateHostDialog.resx

* CA-34231: Replace negative language with `coordinator` in `EvacuateHostDialog.resx`

Used ReSharper renaming utility. Excluded jp and zh resource files.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/NewPoolDialog.resx

* CA-34231: Rename missing language references for change to `coordinator`

Misc files were not saved before last commits.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `Messages.resx`'s code

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/HACommand.cs
#	XenAdmin/TabPages/AdPage.cs
#	XenModel/Actions/Network/CreateBondAction.cs
#	XenModel/Actions/Network/NetworkAction.cs
#	XenModel/Messages.Designer.cs
#	XenModel/Messages.resx

* CA-34231: Replace negative language with `coordinator` in `ExternalPluginAction.cs`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `XenAdmin/Commands`

Used ReSharper renaming utility. Also replace negative language in missed comment in `ExternalPluginAction.cs`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/AddHostToPoolCommand.cs
#	XenAdmin/Commands/HACommand.cs

* CA-34231: Replace negative language with `coordinator` in `Helpers.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `NetworkingHelper.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `PoolJoinRules.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/NewPoolDialog.cs

* CA-34231: Replace negative language with `coordinator` in `XenAdmin/Commands`, `Controls`, and `Core`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Commands/AddHostToPoolCommand.cs

* CA-34231: Replace negative language with `coordinator` in `XenAdmin/Diagnostics`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `coordinator` in `XenAdmin/Dialogs`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/NewPoolDialog.cs

* CA-34231: Replace remaining negative language with `coordinator` in `XenAdmin`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/MainWindow.cs
#	XenAdmin/TabPages/GeneralTabPage.cs
#	XenAdmin/Wizards/PatchingWizard/PatchingWizard_SelectServers.cs
#	XenAdmin/Wizards/RollingUpgradeWizard/RollingUpgradeExtrasPage.cs
#	XenAdmin/Wizards/RollingUpgradeWizard/RollingUpgradeWizard.cs
#	XenAdmin/Wizards/RollingUpgradeWizard/RollingUpgradeWizardPrecheckPage.cs
#	XenAdmin/XenSearch/Columns.cs

* CA-34231: Replace remaining negative language with `coordinator` in `XenModel\Actions`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenModel/Actions/Network/CreateBondAction.cs

* CA-34231: Replace remaining negative language with `coordinator` in `XenModel`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative strings with `main` in `Messages.resx`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenModel/Messages.Designer.cs
#	XenModel/Messages.resx

* CA-34231: Replace remaining negative string names with `main` in `Messages.resx`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/OptionsPages/SaveAndRestoreOptionsPage.cs
#	XenModel/Messages.resx

* CA-34231: Rename dialogs to replace negative connotations with `main`

Used ReSharper renaming utility

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `main` in `SaveAndResoreOptionsPage.cs`

Also updated its resx file. Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

# Conflicts:
#	XenAdmin/Dialogs/OptionsPages/SaveAndRestoreOptionsPage.cs

* CA-34231: Fix invalid reference in `SaveAndRestoreOptionsPage.Designer.cs` after renaming

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `main` in `EnterMainPasswordDialog.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `main` in `ChangeMainPasswordDialog.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Fix invalid reference not changed after renaming `EnterMainPasswordDialog.cs`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative language with `main` in `XenAdmin/Dialogs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Update class names in HelpManager.resx

Following renaming of main password dialog. Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace negative language with `main` in `Metadata.cs`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Remove remaning negative language with `coordinator` from `Messages.resx`

Used ReSharper renaming

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Remove remaning negative language with `other pool member` from `Messages.resx`

Used ReSharper

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CA-34231: Replace remaining negative language in solution

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Remove commented out code in VNCGraphicsClient.cs

Code has only been improved partially as it's not strictly relevant to the PR

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Amend negative word replacement in XSVNCScreen.cs

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Simplify debug call formatting in NewPoolDialog.cs

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Add code mistakenly removed in MainWindow.cs

Removed as part of `f155f9c8`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Revert renaming of constant related to Windows' API

Considered external to CH Center

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Amend hotkey for Coordinator field in `NewPoolDialog`

Previous ALT+<key> hotkey was conflicting with CreatePool

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Remove unecessary whitespace in EvacuateHostDialog.cs

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Update if block to exclude unecessary else in DRFailoverWizard.cs

Not relevant to the PR, but the change is small enought to no need extra testing

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Amend typo in PoolJoinRules.cs

supporer -> supporter

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Replace missing negative language with `coordinator` in `XenAPI-Extensions/Pool.cs`

Variables and methods XenAPI-Extensions were mistakenly skipped

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Replace negative language in `XenApi-Extensions` with `coordinator/interface`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Replace negative language in `XenApi-Extensions` with `supporter/member`

Used ReSharper renaming utility.

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Replace remaining negative language in `XenServerHealthCheckBugTool.cs`

This is only used to format the string

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Change line-endings to CRLF in `Page_CloudConfigParamters.cs`

Done in order to fix merge conflict into master

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>

* CP-34231: Amend misc negative language renaming typos

`XenServerHealthCheckBugTool` and `XenServerHealthCheckService`

Signed-off-by: Danilo Del Busso <Danilo.Del.Busso@citrix.com>
2021-08-31 11:31:16 +01:00

778 lines
31 KiB
C#

/* Copyright (c) Citrix Systems, Inc.
* 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.
*/
using System;
using System.Collections.Generic;
using XenAdmin.Core;
namespace XenAdmin.Wlb
{
public class WlbScheduledTask : WlbConfigurationBase
{
private const string KEY_TASK_NAME = "TaskName";
private const string KEY_TASK_DESCRIPTION = "TaskDescription";
private const string KEY_TASK_ENABLED = "TaskEnabled";
private const string KEY_TASK_OWNER = "TaskOwner";
private const string KEY_TASK_LAST_RUN_RESULT = "TaskLastRunResult";
private const string KEY_TASK_LAST_TOUCHED_BY = "TaskLastTouchedBy";
private const string KEY_TASK_LAST_TOUCHED = "TaskLastTouched";
private const string KEY_TRIGGER_TYPE = "TriggerType";
private const string KEY_TRIGGER_DAYS_OF_WEEK = "TriggerDaysOfWeek";
private const string KEY_TRIGGER_EXECUTE_TIME = "TriggerExecuteTime";
private const string KEY_TRIGGER_LAST_RUN = "TriggerLastRun";
private const string KEY_TRIGGER_ENABLED_DATE = "TriggerEndabledDate";
private const string KEY_TRIGGER_DISABLED_DATE = "TriggerDisabledDate";
private const string KEY_DELETE_TASK = "TaskDelete";
private const string KEY_ACTION_TYPE = "ActionType";
/// <summary>
/// Public enumeration describing the interval period of a WlbTaskTrigger
/// </summary>
public enum WlbTaskTriggerType : int
{
/// <summary>
/// A single-shot trigger
/// </summary>
Once = 0,
/// <summary>
/// A trigger that occurs every day at a particular time
/// </summary>
Daily = 1,
/// <summary>
/// A trigger that occurs every week on a set of days at a particulat time
/// </summary>
Weekly = 2,
/// <summary>
/// A trigger that occurs once every month on a given date
/// </summary>
Monthly = 3
}
public enum WlbTaskActionType : int
{
Unknown = 0,
SetOptimizationMode = 1,
ReportSubscription = 2
}
/// <summary>
/// Public enumeration of the days on which a weekly WlbTaskTrigger will run
/// </summary>
[FlagsAttribute]
public enum WlbTaskDaysOfWeek
{
/// <summary>
/// None
/// </summary>
None = 0,
/// <summary>
/// Sunday
/// </summary>
Sunday = 1,
/// <summary>
/// Monday
/// </summary>
Monday = 2,
/// <summary>
/// Tuesday
/// </summary>
Tuesday = 4,
/// <summary>
/// Wednesday
/// </summary>
Wednesday = 8,
/// <summary>
/// Thursday
/// </summary>
Thursday = 16,
/// <summary>
/// Friday
/// </summary>
Friday = 32,
/// <summary>
/// Saturday
/// </summary>
Saturday = 64,
/// <summary>
/// All weekdays
/// </summary>
Weekends = Sunday | Saturday,
/// <summary>
/// Only weekend days
/// </summary>
Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
/// <summary>
/// All days
/// </summary>
All = Weekdays | Weekends
}
public static string DaysOfWeekL10N(WlbTaskDaysOfWeek days)
{
switch (days)
{
case WlbTaskDaysOfWeek.Sunday:
return Messages.SUNDAY_LONG;
case WlbTaskDaysOfWeek.Monday:
return Messages.MONDAY_LONG;
case WlbTaskDaysOfWeek.Tuesday:
return Messages.TUESDAY_LONG;
case WlbTaskDaysOfWeek.Wednesday:
return Messages.WEDNESDAY_LONG;
case WlbTaskDaysOfWeek.Thursday:
return Messages.THURSDAY_LONG;
case WlbTaskDaysOfWeek.Friday:
return Messages.FRIDAY_LONG;
case WlbTaskDaysOfWeek.Saturday:
return Messages.SATURDAY_LONG;
case WlbTaskDaysOfWeek.Weekdays:
return Messages.WLB_DAY_WEEKDAYS;
case WlbTaskDaysOfWeek.Weekends:
return Messages.WLB_DAY_WEEKENDS;
case WlbTaskDaysOfWeek.All:
return Messages.WLB_DAY_ALL;
default:
return "";
}
}
public static WlbPoolPerformanceMode GetTaskOptMode(WlbScheduledTask task)
{
WlbPoolPerformanceMode mode = WlbPoolPerformanceMode.MaximizePerformance;
if (task.TaskParameters["OptMode"] == "0")
{
mode = WlbPoolPerformanceMode.MaximizePerformance;
}
else
{
mode = WlbPoolPerformanceMode.MaximizeDensity;
}
return mode;
}
/// <summary>
/// Returns the offset minutes between Utc and local time
/// Add this to local time to get UTC
/// Subtract from UTC to get local time
/// </summary>
/// <returns>(double) number of minutes between Utc and Local time</returns>
private static double LocalOffsetMinutes()
{
TimeSpan difference = DateTime.UtcNow.Subtract(DateTime.Now);
return difference.TotalMinutes;
}
/// <summary>
/// Accepts a client's local time DayOfWeek and RunTime of a scheduled task
/// and returns the DaysOfWeek and RunTime adjusted to UTC time
/// </summary>
/// <param name="LocalDaysOfWeek">Task's DaysOfWeek value in local time</param>
/// <param name="LocalRunTime">Task's RunTime in local time</param>
/// <param name="UtcDaysOfWeek">(Output) Task's DaysOfWeek value adjusted to UTC</param>
/// <param name="UtcRunTime">(Output) Task's RunTime value adjusted to UTC</param>
public static void GetUTCTaskTimes(WlbScheduledTask.WlbTaskDaysOfWeek LocalDaysOfWeek, DateTime LocalRunTime,
out WlbScheduledTask.WlbTaskDaysOfWeek UtcDaysOfWeek, out DateTime UtcRunTime)
{
UtcDaysOfWeek = LocalDaysOfWeek;
UtcRunTime = LocalRunTime.AddMinutes(LocalOffsetMinutes());
if (DateTime.Compare(LocalRunTime.Date, UtcRunTime.Date) < 0)
{
UtcDaysOfWeek = WlbScheduledTask.NextDay(LocalDaysOfWeek);
}
else if (DateTime.Compare(LocalRunTime.Date, UtcRunTime.Date) > 0)
{
UtcDaysOfWeek = WlbScheduledTask.PreviousDay(LocalDaysOfWeek);
}
}
/// <summary>
/// Accepts UTC DayOfWeek and RunTime of a scheduled task
/// and returns the DaysOfWeek and RunTime adjusted to client's local time
/// </summary>
/// <param name="UtcDaysOfWeek">Task's DaysOfWeek value in UTC</param>
/// <param name="UtcRunTime">Task's RunTime in UTC</param>
/// <param name="LocalDaysOfWeek">(Output) Task's DaysOfWeek value adjusted to local time</param>
/// <param name="LocalRunTime">(Output) Task's RunTime value adjusted to local time</param>
public static void GetLocalTaskTimes(WlbScheduledTask.WlbTaskDaysOfWeek UtcDaysOfWeek, DateTime UtcRunTime,
out WlbScheduledTask.WlbTaskDaysOfWeek LocalDaysOfWeek, out DateTime LocalRunTime)
{
LocalDaysOfWeek = UtcDaysOfWeek;
LocalRunTime = UtcRunTime.AddMinutes(LocalOffsetMinutes() * -1);
if (UtcDaysOfWeek != WlbTaskDaysOfWeek.None &&
UtcDaysOfWeek != WlbTaskDaysOfWeek.All &&
UtcDaysOfWeek != WlbTaskDaysOfWeek.Weekdays &&
UtcDaysOfWeek != WlbTaskDaysOfWeek.Weekends)
{
if (DateTime.Compare(UtcRunTime.Date, LocalRunTime.Date) < 0)
{
LocalDaysOfWeek = WlbScheduledTask.NextDay(UtcDaysOfWeek);
}
else if (DateTime.Compare(UtcRunTime.Date, LocalRunTime.Date) > 0)
{
LocalDaysOfWeek = WlbScheduledTask.PreviousDay(UtcDaysOfWeek);
}
}
}
public static WlbTaskDaysOfWeek NextDay(WlbTaskDaysOfWeek daysOfWeek)
{
// Doing some hackery here to shift days in the enumeration
switch (daysOfWeek)
{
case WlbTaskDaysOfWeek.Saturday:
{
return WlbTaskDaysOfWeek.Sunday;
}
case WlbTaskDaysOfWeek.Weekends:
{
return (WlbTaskDaysOfWeek.Sunday |
WlbTaskDaysOfWeek.Monday);
}
case WlbTaskDaysOfWeek.Weekdays:
{
return (WlbTaskDaysOfWeek.Tuesday |
WlbTaskDaysOfWeek.Wednesday |
WlbTaskDaysOfWeek.Thursday |
WlbTaskDaysOfWeek.Friday |
WlbTaskDaysOfWeek.Saturday);
}
case WlbTaskDaysOfWeek.All:
{
return daysOfWeek;
}
// single days, Sunday through Friday, which can easily be
// shifted back by one. This also handles None (0).
default:
{
//do the circular shift of rightmost 7 bits, discard the rest
int tempDays = (int)daysOfWeek;
tempDays = (tempDays << 1 | tempDays >> 6) & 0x0000007F;
return (WlbTaskDaysOfWeek)tempDays;
//return (WlbTaskDaysOfWeek)(((int)daysOfWeek) * 2);
}
}
}
public static WlbTaskDaysOfWeek PreviousDay(WlbTaskDaysOfWeek daysOfWeek)
{
// Doing some hackery here to shift days in the enumeration
switch (daysOfWeek)
{
case WlbTaskDaysOfWeek.Sunday:
{
return WlbTaskDaysOfWeek.Saturday;
}
case WlbTaskDaysOfWeek.Weekends:
{
return (WlbTaskDaysOfWeek.Friday |
WlbTaskDaysOfWeek.Saturday);
}
case WlbTaskDaysOfWeek.Weekdays:
{
return (WlbTaskDaysOfWeek.Sunday |
WlbTaskDaysOfWeek.Monday |
WlbTaskDaysOfWeek.Tuesday |
WlbTaskDaysOfWeek.Wednesday |
WlbTaskDaysOfWeek.Thursday);
}
case WlbTaskDaysOfWeek.All:
{
return daysOfWeek;
}
// single days, monday through saturday, which can easily be
// shifted back by one. This also handles None (0).
default:
{
//do the circular shift of rightmost 7 bits, discard the rest
int tempDays = (int)daysOfWeek;
tempDays = (tempDays >> 1 | tempDays << 6) & 0x0000007F;
return (WlbTaskDaysOfWeek)tempDays;
//return (WlbTaskDaysOfWeek)(((int)daysOfWeek) / 2);
}
}
}
public static WlbScheduledTask.WlbTaskDaysOfWeek ConvertToWlbTaskDayOfWeek(DayOfWeek dayOfWeek)
{
return (WlbScheduledTask.WlbTaskDaysOfWeek)(Math.Pow(2,(int)dayOfWeek) % 127);
}
public static DayOfWeek ConvertFromWlbTaskDayOfWeek(WlbScheduledTask.WlbTaskDaysOfWeek wlbDayOfWeek)
{
return (DayOfWeek)(Math.Log((int)wlbDayOfWeek, 2));
}
public WlbScheduledTask(string TaskId)
{
base.Configuration = new Dictionary<string, string>();
base.ItemId = TaskId;
//Define the key base
base.KeyBase = WlbConfigurationKeyBase.schedTask;
//Define the known keys
WlbConfigurationKeys = new List<string>(new string[]
{
KEY_TASK_NAME,
KEY_TASK_DESCRIPTION,
KEY_TASK_ENABLED,
KEY_TASK_OWNER,
KEY_TASK_LAST_RUN_RESULT,
KEY_TASK_LAST_TOUCHED_BY,
KEY_TASK_LAST_TOUCHED,
KEY_TRIGGER_TYPE,
KEY_TRIGGER_DAYS_OF_WEEK,
KEY_TRIGGER_EXECUTE_TIME,
KEY_TRIGGER_LAST_RUN,
KEY_TRIGGER_ENABLED_DATE,
KEY_TRIGGER_DISABLED_DATE,
KEY_DELETE_TASK,
KEY_ACTION_TYPE
});
}
public bool DeleteTask
{
get { return GetConfigValueBool(BuildComplexKey(KEY_DELETE_TASK)); }
set { SetConfigValueBool(BuildComplexKey(KEY_DELETE_TASK), value, true); }
}
public string Name
{
get { return GetConfigValueString(BuildComplexKey(KEY_TASK_NAME)); }
set { SetConfigValueString(BuildComplexKey(KEY_TASK_NAME), value, true); }
}
public string Description
{
get { return GetConfigValueString(BuildComplexKey(KEY_TASK_DESCRIPTION)); }
set { SetConfigValueString(BuildComplexKey(KEY_TASK_DESCRIPTION), value, true); }
}
public bool Enabled
{
get { return GetConfigValueBool(BuildComplexKey(KEY_TASK_ENABLED)); }
set { SetConfigValueBool(BuildComplexKey(KEY_TASK_ENABLED), value, true); }
}
public string Owner
{
get { return GetConfigValueString(BuildComplexKey(KEY_TASK_OWNER)); }
set { SetConfigValueString(BuildComplexKey(KEY_TASK_OWNER), value, true); }
}
public bool LastRunResult
{
get { return GetConfigValueBool(BuildComplexKey(KEY_TASK_LAST_RUN_RESULT)); }
set { SetConfigValueBool(BuildComplexKey(KEY_TASK_LAST_RUN_RESULT), value, true); }
}
public string LastTouchedBy
{
get { return GetConfigValueString(BuildComplexKey(KEY_TASK_LAST_TOUCHED_BY)); }
set { SetConfigValueString(BuildComplexKey(KEY_TASK_LAST_TOUCHED_BY), value, true); }
}
public DateTime LastTouched
{
get { return GetConfigValueUTCDateTime(BuildComplexKey(KEY_TASK_LAST_TOUCHED)); }
set { SetConfigValueUTCDateTime(BuildComplexKey(KEY_TASK_LAST_TOUCHED), value, true); }
}
public WlbTaskTriggerType TriggerInterval
{
get { return (WlbTaskTriggerType)GetConfigValueInt(BuildComplexKey(KEY_TRIGGER_TYPE)); }
set { SetConfigValueInt(BuildComplexKey(KEY_TRIGGER_TYPE), (int)value, true); }
}
public WlbTaskDaysOfWeek DaysOfWeek
{
get { return (WlbTaskDaysOfWeek)GetConfigValueInt(BuildComplexKey(KEY_TRIGGER_DAYS_OF_WEEK)); }
set { SetConfigValueInt(BuildComplexKey(KEY_TRIGGER_DAYS_OF_WEEK), (int)value, true); }
}
public DateTime RunTime
{
get { return GetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_EXECUTE_TIME)); }
set { SetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_EXECUTE_TIME), value, true); }
}
public DateTime LastRunDate
{
get { return GetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_LAST_RUN)); }
set { SetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_LAST_RUN), value, true); }
}
public DateTime EnableDate
{
get { return GetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_ENABLED_DATE)); }
set { SetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_ENABLED_DATE), value, true); }
}
public DateTime DisableTime
{
get { return GetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_DISABLED_DATE)); }
set { SetConfigValueUTCDateTime(BuildComplexKey(KEY_TRIGGER_DISABLED_DATE), value, true); }
}
public WlbTaskActionType ActionType
{
get { return (WlbTaskActionType)GetConfigValueInt(BuildComplexKey(KEY_ACTION_TYPE)); }
set { SetConfigValueInt(BuildComplexKey(KEY_ACTION_TYPE), (int)value, true); }
}
public Dictionary<string, string> TaskParameters
{
get { return GetOtherParameters(); }
set { SetOtherParameters(value); }
}
public void AddTaskParameter(string key, string value)
{
SetOtherParameter(key, value);
}
public int TaskId
{
get
{
int taskId = 0;
Int32.TryParse(ItemId, out taskId);
return taskId;
}
}
public WlbScheduledTask Clone()
{
WlbScheduledTask newTask = new WlbScheduledTask(this.TaskId.ToString());
newTask.ActionType = this.ActionType;
newTask.DaysOfWeek = this.DaysOfWeek;
newTask.DeleteTask = this.DeleteTask;
newTask.Description = this.Description;
newTask.DisableTime = this.DisableTime;
newTask.Enabled = this.Enabled;
newTask.EnableDate = this.EnableDate;
newTask.RunTime = this.RunTime;
newTask.LastRunDate = this.LastRunDate;
newTask.LastRunResult = this.LastRunResult;
newTask.LastTouched = this.LastTouched;
newTask.LastTouchedBy = this.LastTouchedBy;
newTask.Name = this.Name;
newTask.Owner = this.Owner;
newTask.TaskParameters = this.TaskParameters;
newTask.TriggerInterval = this.TriggerInterval;
return newTask;
}
}
public class WlbScheduledTasks
{
private Dictionary<string, WlbScheduledTask> _tasks = new Dictionary<string, WlbScheduledTask>();
public WlbScheduledTasks() { ;}
/// <summary>
/// Exposes the actual list of WlbScheduledTasks
/// </summary>
public Dictionary<string, WlbScheduledTask> TaskList
{
set { _tasks = value; }
get { return _tasks; }
}
/// <summary>
/// Exposes a sorted version of the WlbScheduledTasks collection
/// </summary>
public SortedDictionary<int, WlbScheduledTask> SortedTaskList
{
get
{
SortedDictionary<int, WlbScheduledTask> sortedTasks = new SortedDictionary<int, WlbScheduledTask>();
foreach (WlbScheduledTask task in _tasks.Values)
{
if (!task.DeleteTask)
{
WlbScheduledTask.WlbTaskDaysOfWeek localDaysOfWeek;
DateTime localRunTime;
WlbScheduledTask.GetLocalTaskTimes((task.DaysOfWeek), task.RunTime, out localDaysOfWeek, out localRunTime);
int sortKey = GetSortKey(localDaysOfWeek, localRunTime);
//if the task is disabled, bump the sort key to prevent conficts
// with any new tasks. This could start to get wierd after 100 duplicate
// disabled tasks, but then it will be the user's problem.
if (!task.Enabled)
{
sortKey += 1;
while (sortedTasks.ContainsKey(sortKey))
{
sortKey += 1;
}
}
WlbScheduledTask virtualTask = task.Clone();
virtualTask.DaysOfWeek = task.DaysOfWeek;
if (!sortedTasks.ContainsKey(sortKey))
{
sortedTasks.Add(sortKey, virtualTask);
}
}
}
return sortedTasks;
}
}
/// <summary>
/// Exposes a virtual representation of the WlbScheduledTasks collection, in which aggregate days
/// are separated into individual days. The entire list is also presorted chronologically.
/// </summary>
public SortedDictionary<int, WlbScheduledTask> VirtualTaskList
{
get
{
SortedDictionary<int, WlbScheduledTask> virtualTasks = new SortedDictionary<int, WlbScheduledTask>();
foreach (WlbScheduledTask task in _tasks.Values)
{
if (!task.DeleteTask)
{
foreach (WlbScheduledTask.WlbTaskDaysOfWeek dayValue in Enum.GetValues(typeof(WlbScheduledTask.WlbTaskDaysOfWeek)))
{
if (dayValue != WlbScheduledTask.WlbTaskDaysOfWeek.None &&
dayValue != WlbScheduledTask.WlbTaskDaysOfWeek.All &&
dayValue != WlbScheduledTask.WlbTaskDaysOfWeek.Weekdays &&
dayValue != WlbScheduledTask.WlbTaskDaysOfWeek.Weekends &&
((task.DaysOfWeek & dayValue) == dayValue))
{
DateTime localRunTime;
WlbScheduledTask.WlbTaskDaysOfWeek localDaysOfWeek;
WlbScheduledTask.GetLocalTaskTimes((task.DaysOfWeek & dayValue), task.RunTime, out localDaysOfWeek, out localRunTime);
int sortKey = GetSortKey(localDaysOfWeek, localRunTime);
//if the task is disabled, bump the sort key to prevent conficts
// with any new tasks. This could start to get wierd after 100 duplicate
// disabled tasks, but then it will be the user's problem.
if (!task.Enabled)
{
sortKey += 1;
while (virtualTasks.ContainsKey(sortKey))
{
sortKey += 1;
}
}
WlbScheduledTask virtualTask = task.Clone();
virtualTask.DaysOfWeek = dayValue;
if (!virtualTasks.ContainsKey(sortKey))
{
virtualTasks.Add(sortKey, virtualTask);
}
}
}
}
}
return virtualTasks;
}
}
/// <summary>
/// Creates an artificial sort key that is used to sort the presentation of scheduled tasks.
/// </summary>
/// <param name="localDaysOfWeek">WlbScheduledTask.DaysOfWeek enumeration of the task denoting on which days it will run</param>
/// <param name="localRunTime">DateTime run time of the task denoting on when the task </param>
/// <returns></returns>
private static int GetSortKey(WlbScheduledTask.WlbTaskDaysOfWeek localDaysOfWeek, DateTime localRunTime)
{
int sortKey;
//The day of week is the primary sort item
switch(localDaysOfWeek)
{
//Put ALL tasks at the front of the list
case WlbScheduledTask.WlbTaskDaysOfWeek.All:
{
sortKey = 0;
break;
}
//Next are WEEKDAY tasks
case WlbScheduledTask.WlbTaskDaysOfWeek.Weekdays:
{
sortKey = 200000;
break;
}
//Next are WEEKEND tasks
case WlbScheduledTask.WlbTaskDaysOfWeek.Weekends:
{
sortKey = 400000;
break;
}
//Finally, single-day tasks
default:
{
sortKey = (int)localDaysOfWeek * 1000000;
break;
}
}
//Add the run time of day as a secondary sort item
//Multiply it by 100 to allow room for disabled tasks
sortKey += (int)localRunTime.TimeOfDay.TotalMinutes * 100;
return sortKey;
}
public WlbScheduledTasks(Dictionary<string,string> Configuration)
{
foreach (string key in Configuration.Keys)
{
if (key.StartsWith("schedTask_"))
{
string[] keyElements = key.Split('_');
string taskId = keyElements[1];
if (!_tasks.ContainsKey(taskId))
{
_tasks.Add(taskId, new WlbScheduledTask(taskId));
_tasks[taskId].AddParameter(key, Configuration[key]);
}
else
{
_tasks[taskId].AddParameter(key, Configuration[key]);
}
}
}
}
public Dictionary<string, string> ToDictionary()
{
Dictionary<string, string> collectionDictionary = null;
foreach (WlbScheduledTask scheduleTask in _tasks.Values)
{
Dictionary<string, string> taskDictionary = scheduleTask.ToDictionary();
foreach (string key in taskDictionary.Keys)
{
if (null == collectionDictionary)
{
collectionDictionary = new Dictionary<string, string>();
}
collectionDictionary.Add(key, taskDictionary[key]);
}
foreach (string key in scheduleTask.TaskParameters.Keys)
{
string complexKey = string.Format("{0}_{1}_{2}", scheduleTask.KeyBase, scheduleTask.TaskId.ToString(), key);
if (collectionDictionary.ContainsKey(complexKey))
{
collectionDictionary[complexKey] = scheduleTask.TaskParameters[key];
}
else
{
collectionDictionary.Add(complexKey, scheduleTask.TaskParameters[key]);
}
}
}
return collectionDictionary;
}
public WlbScheduledTask GetNextRunningTask()
{
WlbScheduledTask firstTask = null;
int currentTimeSortKey = GetSortKey(WlbScheduledTask.ConvertToWlbTaskDayOfWeek(DateTime.Now.DayOfWeek), DateTime.Now);
foreach (int key in this.VirtualTaskList.Keys)
{
//only consider Enabled tasks
if (this.VirtualTaskList[key].Enabled)
{
if (null == firstTask)
{
firstTask = this.VirtualTaskList[key];
}
if (key > currentTimeSortKey)
{
return this.VirtualTaskList[key];
}
}
}
//we are still here, so we have not found the next task. this means that we
// need to account for week wrapping. This shoudl be the first task of the Virtual
// Task List
return firstTask;
}
public WlbScheduledTask GetLastRunningTask()
{
int[] taskKeys = new int[this.VirtualTaskList.Keys.Count];
this.VirtualTaskList.Keys.CopyTo(taskKeys,0);
WlbScheduledTask lastTask = this.VirtualTaskList[taskKeys[taskKeys.Length-1]];
int currentTimeSortKey = GetSortKey(WlbScheduledTask.ConvertToWlbTaskDayOfWeek(DateTime.Now.DayOfWeek), DateTime.Now);
for (int i = taskKeys.Length-1; i>=0; i--)
{
//Only consider Enabled tasks
if (this.VirtualTaskList[taskKeys[i]].Enabled)
{
if (taskKeys[i] < currentTimeSortKey)
{
return this.VirtualTaskList[taskKeys[i]];
}
}
}
//we are still here, so we have not found the previous task. this means that we
// need to account for week wrapping. This should be the last task of the Virtual
// Task List
return lastTask;
}
public WlbPoolPerformanceMode GetCurrentScheduledPerformanceMode()
{
WlbScheduledTask lastTask = GetLastRunningTask();
return (WlbPoolPerformanceMode)int.Parse(lastTask.TaskParameters["OptMode"]);
}
}
}