Add Quota for Hyper-V replication
This commit is contained in:
parent
bf3ec75c08
commit
054241f84e
13 changed files with 321 additions and 161 deletions
|
@ -8921,6 +8921,12 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe
|
||||||
END
|
END
|
||||||
GO
|
GO
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaID] = '572')
|
||||||
|
BEGIN
|
||||||
|
INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (572, 33, 20, N'VPS2012.ReplicationEnabled', N'Allow user to Replication', 1, 0, NULL, NULL)
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [ProviderName] = 'HyperV2012R2')
|
IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [ProviderName] = 'HyperV2012R2')
|
||||||
BEGIN
|
BEGIN
|
||||||
INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (350, 33, N'HyperV2012R2', N'Microsoft Hyper-V 2012 R2', N'WebsitePanel.Providers.Virtualization.HyperV2012R2, WebsitePanel.Providers.Virtualization.HyperV2012R2', N'HyperV2012R2', 1)
|
INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) VALUES (350, 33, N'HyperV2012R2', N'Microsoft Hyper-V 2012 R2', N'WebsitePanel.Providers.Virtualization.HyperV2012R2, WebsitePanel.Providers.Virtualization.HyperV2012R2', N'HyperV2012R2', 1)
|
||||||
|
|
|
@ -223,6 +223,7 @@ order by rg.groupOrder
|
||||||
public const string VPS2012_RESET_ALOWED = "VPS2012.ResetAlowed"; // Allow user to Reset VPS
|
public const string VPS2012_RESET_ALOWED = "VPS2012.ResetAlowed"; // Allow user to Reset VPS
|
||||||
public const string VPS2012_REINSTALL_ALLOWED = "VPS2012.ReinstallAllowed"; // Allow user to Re-install VPS
|
public const string VPS2012_REINSTALL_ALLOWED = "VPS2012.ReinstallAllowed"; // Allow user to Re-install VPS
|
||||||
public const string VPS2012_BANDWIDTH = "VPS2012.Bandwidth"; // Monthly bandwidth, GB
|
public const string VPS2012_BANDWIDTH = "VPS2012.Bandwidth"; // Monthly bandwidth, GB
|
||||||
|
public const string VPS2012_REPLICATION_ENABLED = "VPS2012.ReplicationEnabled";
|
||||||
|
|
||||||
public const string VPSForPC_SERVERS_NUMBER = "VPSForPC.ServersNumber"; // Number of VPS
|
public const string VPSForPC_SERVERS_NUMBER = "VPSForPC.ServersNumber"; // Number of VPS
|
||||||
public const string VPSForPC_MANAGING_ALLOWED = "VPSForPC.ManagingAllowed"; // Allow user to create VPS
|
public const string VPSForPC_MANAGING_ALLOWED = "VPSForPC.ManagingAllowed"; // Allow user to create VPS
|
||||||
|
|
|
@ -349,3 +349,60 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
public string Comment { get; set; }
|
public string Comment { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esAuthentication.asmx.cs(51): public int AuthenticateUser(string username, string password, string ip)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esAuthentication.asmx.cs(57): public UserInfo GetUserByUsernamePassword(string username, string password, string ip)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esAuthentication.asmx.cs(63): public int ChangeUserPasswordByUsername(string username, string oldPassword, string newPassword, string ip)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esAuthentication.asmx.cs(69): public int SendPasswordReminder(string username, string ip)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esAuthentication.asmx.cs(81): public int SetupControlPanelAccounts(string passwordA, string passwordB, string ip)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esBlackBerry.asmx.cs(92): public ResultObject SetActivationPasswordWithExpirationTime(int itemId, int accountId, string password, int time)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esExchangeServer.asmx.cs(221): public bool CheckAccountCredentials(int itemId, string email, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esExchangeServer.asmx.cs(231): public int CreateMailbox(int itemId, int accountId, ExchangeAccountType accountType, string accountName, string displayName,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esExchangeServer.asmx.cs(231): string name, string domain, string password, bool sendSetupInstructions, string setupInstructionMailAddress, int mailboxPlanId, int archivedPlanId, string subscriberNumber, bool EnableArchiving)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(195): public ResultObject SendResetUserPasswordLinkSms(int itemId, int accountId, string reason, string phoneTo = null)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(197): return OrganizationController.SendResetUserPasswordLinkSms(itemId, accountId, reason, phoneTo);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(202): public ResultObject SendResetUserPasswordPincodeSms(Guid token, string phoneTo = null)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(204): return OrganizationController.SendResetUserPasswordPincodeSms(token, phoneTo);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(259): public int CreateUser(int itemId, string displayName, string name, string domain, string password, string subscriberNumber, bool sendNotification, string to)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(262): return OrganizationController.CreateUser(itemId, displayName, name, domain, password, subscriberNumber, true, sendNotification, to, out accountName);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(266): public int ImportUser(int itemId, string accountName, string displayName, string name, string domain, string password, string subscriberNumber)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(268): return OrganizationController.ImportUser(itemId, accountName, displayName, name, domain, password, subscriberNumber);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(293): string password, bool hideAddressBook, bool disabled, bool locked, string firstName, string initials,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(298): bool userMustChangePassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(301): password, hideAddressBook, disabled, locked, firstName, initials,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(305): webPage, notes, externalEmail, subscriberNumber, levelId, isVIP, userMustChangePassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(318): public int SetUserPassword(int itemId, int accountId, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(320): return OrganizationController.SetUserPassword(itemId, accountId, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(353): public PasswordPolicyResult GetPasswordPolicy(int itemId)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(355): return OrganizationController.GetPasswordPolicy(itemId);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(359): public void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, bool finalStep)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esOrganizations.asmx.cs(361): OrganizationController.SendResetUserPasswordEmail(itemId, accountId, reason, mailTo, finalStep);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esPackages.asmx.cs(449): public int CreateUserWizard(int parentPackageId, string username, string password,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esPackages.asmx.cs(456): return UserCreationWizard.CreateUserAccount(parentPackageId, username, password,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(108): public int CheckServerAvailable(string serverUrl, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(110): return ServerController.CheckServerAvailable(serverUrl, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(126): public int UpdateServerConnectionPassword(int serverId, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(128): return ServerController.UpdateServerConnectionPassword(serverId, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(132): public int UpdateServerADPassword(int serverId, string adPassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esServers.asmx.cs(134): return ServerController.UpdateServerADPassword(serverId, adPassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esUsers.asmx.cs(152): string password,
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esUsers.asmx.cs(178): user.Password = password;
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esUsers.asmx.cs(272): public int ChangeUserPassword(int userId, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esUsers.asmx.cs(274): return UserController.ChangeUserPassword(userId, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(127): return WebServerController.InstallFrontPage(siteItemId, username, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(137): public int ChangeFrontPagePassword(int siteItemId, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(139): return WebServerController.ChangeFrontPagePassword(siteItemId, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(337): public ResultObject GrantWebDeployPublishingAccess(int siteItemId, string accountName, string accountPassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(339): return WebServerController.GrantWebDeployPublishingAccess(siteItemId, accountName, accountPassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(361): public ResultObject ChangeWebDeployPublishingPassword(int siteItemId, string newAccountPassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(363): return WebServerController.ChangeWebDeployPublishingPassword(siteItemId, newAccountPassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(536): public ResultObject GrantWebManagementAccess(int siteItemId, string accountName, string accountPassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(538): return WebServerController.GrantWebManagementAccess(siteItemId, accountName, accountPassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(548): public ResultObject ChangeWebManagementAccessPassword(int siteItemId, string accountPassword)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(550): return WebServerController.ChangeWebManagementAccessPassword(siteItemId, accountPassword);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(567): public ResultObject InstallPfx(byte[] certificate, int siteItemId, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(569): return WebServerController.InstallPfx(certificate, siteItemId, password);
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(597): public byte[] ExportCertificate(int siteId, string serialNumber, string password)
|
||||||
|
//C:\Work\WSPExpert\WebsitePanel\Sources\WebsitePanel.EnterpriseServer\esWebServers.asmx.cs(599): return WebServerController.ExportCertificate(siteId, serialNumber, password);
|
|
@ -121,6 +121,7 @@
|
||||||
public const string DISABLE_REPLICATION_ERROR = "VPS_DISABLE_REPLICATION_ERROR";
|
public const string DISABLE_REPLICATION_ERROR = "VPS_DISABLE_REPLICATION_ERROR";
|
||||||
public const string PAUSE_REPLICATION_ERROR = "VPS_PAUSE_REPLICATION_ERROR";
|
public const string PAUSE_REPLICATION_ERROR = "VPS_PAUSE_REPLICATION_ERROR";
|
||||||
public const string RESUME_REPLICATION_ERROR = "VPS_RESUME_REPLICATION_ERROR";
|
public const string RESUME_REPLICATION_ERROR = "VPS_RESUME_REPLICATION_ERROR";
|
||||||
|
public const string QUOTA_REPLICATION_ENABLED = "VPS_QUOTA_REPLICATION_ENABLED";
|
||||||
|
|
||||||
|
|
||||||
public const string HOST_NAMER_IS_ALREADY_USED = "HOST_NAMER_IS_ALREADY_USED";
|
public const string HOST_NAMER_IS_ALREADY_USED = "HOST_NAMER_IS_ALREADY_USED";
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace WebsitePanel.EnterpriseServer.Code.Virtualization2012
|
||||||
|
{
|
||||||
|
public static class QuotaHelper
|
||||||
|
{
|
||||||
|
public static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, long currentVal, long val, string messageKey)
|
||||||
|
{
|
||||||
|
CheckQuotaValue(cntx, errors, quotaName, currentVal, val, messageKey);
|
||||||
|
}
|
||||||
|
public static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, int currentVal, int val, string messageKey)
|
||||||
|
{
|
||||||
|
CheckQuotaValue(cntx, errors, quotaName, Convert.ToInt64(currentVal), Convert.ToInt64(val), messageKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, int val, string messageKey)
|
||||||
|
{
|
||||||
|
CheckQuotaValue(cntx, errors, quotaName, 0, val, messageKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckBooleanQuota(PackageContext cntx, List<string> errors, string quotaName, bool val, string messageKey)
|
||||||
|
{
|
||||||
|
CheckQuotaValue(cntx, errors, quotaName, 0, val ? 1 : 0, messageKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckListsQuota(PackageContext cntx, List<string> errors, string quotaName, string messageKey)
|
||||||
|
{
|
||||||
|
CheckQuotaValue(cntx, errors, quotaName, 0, -1, messageKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckQuotaValue(PackageContext cntx, List<string> errors, string quotaName, long currentVal, long val, string messageKey)
|
||||||
|
{
|
||||||
|
if (!cntx.Quotas.ContainsKey(quotaName))
|
||||||
|
return;
|
||||||
|
|
||||||
|
QuotaValueInfo quota = cntx.Quotas[quotaName];
|
||||||
|
|
||||||
|
if (val == -1 && quota.QuotaExhausted) // check if quota already reached
|
||||||
|
{
|
||||||
|
errors.Add(messageKey + ":" + quota.QuotaAllocatedValue);
|
||||||
|
}
|
||||||
|
else if (quota.QuotaAllocatedValue == -1)
|
||||||
|
return; // unlimited
|
||||||
|
else if (quota.QuotaTypeId == 1 && val == 1 && quota.QuotaAllocatedValue == 0) // bool quota
|
||||||
|
errors.Add(messageKey);
|
||||||
|
else if (quota.QuotaTypeId == 2)
|
||||||
|
{
|
||||||
|
long maxValue = quota.QuotaAllocatedValue - quota.QuotaUsedValue + currentVal;
|
||||||
|
if (val > maxValue)
|
||||||
|
errors.Add(messageKey + ":" + maxValue);
|
||||||
|
}
|
||||||
|
else if (quota.QuotaTypeId == 3 && val > quota.QuotaAllocatedValue)
|
||||||
|
{
|
||||||
|
int maxValue = quota.QuotaAllocatedValue;
|
||||||
|
errors.Add(messageKey + ":" + maxValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,90 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using WebsitePanel.Providers.Common;
|
||||||
|
using WebsitePanel.Providers.Virtualization;
|
||||||
|
using WebsitePanel.Providers.Virtualization2012;
|
||||||
|
|
||||||
|
namespace WebsitePanel.EnterpriseServer.Code.Virtualization2012
|
||||||
|
{
|
||||||
|
public static class ReplicationHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void CleanUpReplicaServer(VirtualMachine originalVm)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ResultObject result = new ResultObject();
|
||||||
|
|
||||||
|
// Get replica server
|
||||||
|
var replicaServer = GetReplicaForService(originalVm.ServiceId, ref result);
|
||||||
|
|
||||||
|
// Clean up replica server
|
||||||
|
var replicaVm = replicaServer.GetVirtualMachines().FirstOrDefault(m => m.Name == originalVm.Name);
|
||||||
|
if (replicaVm != null)
|
||||||
|
{
|
||||||
|
replicaServer.DisableVmReplication(replicaVm.VirtualMachineId);
|
||||||
|
replicaServer.ShutDownVirtualMachine(replicaVm.VirtualMachineId, true, "ReplicaDelete");
|
||||||
|
replicaServer.DeleteVirtualMachine(replicaVm.VirtualMachineId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { /* skip */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ReplicationServerInfo GetReplicaInfoForService(int serviceId, ref ResultObject result)
|
||||||
|
{
|
||||||
|
// Get service id of replica server
|
||||||
|
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
|
||||||
|
string replicaServiceId = vsSesstings["ReplicaServerId"];
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(replicaServiceId))
|
||||||
|
{
|
||||||
|
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get replica server info for replica service id
|
||||||
|
VirtualizationServer2012 vsReplica = VirtualizationHelper.GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
|
||||||
|
StringDictionary vsReplicaSesstings = ServerController.GetServiceSettings(Convert.ToInt32(replicaServiceId));
|
||||||
|
string computerName = vsReplicaSesstings["ServerName"];
|
||||||
|
var replicaServerInfo = vsReplica.GetReplicaServer(computerName);
|
||||||
|
|
||||||
|
if (!replicaServerInfo.Enabled)
|
||||||
|
{
|
||||||
|
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return replicaServerInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VirtualizationServer2012 GetReplicaForService(int serviceId, ref ResultObject result)
|
||||||
|
{
|
||||||
|
// Get service id of replica server
|
||||||
|
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
|
||||||
|
string replicaServiceId = vsSesstings["ReplicaServerId"];
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(replicaServiceId))
|
||||||
|
{
|
||||||
|
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get replica server for replica service id
|
||||||
|
return VirtualizationHelper.GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckReplicationQuota(int packageId, ref ResultObject result)
|
||||||
|
{
|
||||||
|
List<string> quotaResults = new List<string>();
|
||||||
|
PackageContext cntx = PackageController.GetPackageContext(packageId);
|
||||||
|
|
||||||
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REPLICATION_ENABLED, true, VirtualizationErrorCodes.QUOTA_REPLICATION_ENABLED);
|
||||||
|
|
||||||
|
if (quotaResults.Count > 0)
|
||||||
|
result.ErrorCodes.AddRange(quotaResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using WebsitePanel.Providers.Virtualization2012;
|
||||||
|
|
||||||
|
namespace WebsitePanel.EnterpriseServer.Code.Virtualization2012
|
||||||
|
{
|
||||||
|
public static class VirtualizationHelper
|
||||||
|
{
|
||||||
|
public static VirtualizationServer2012 GetVirtualizationProxy(int serviceId)
|
||||||
|
{
|
||||||
|
VirtualizationServer2012 ws = new VirtualizationServer2012();
|
||||||
|
ServiceProviderProxy.Init(ws, serviceId);
|
||||||
|
return ws;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,7 @@ using System.Net.Mail;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using WebsitePanel.EnterpriseServer.Code.Virtualization2012;
|
||||||
using WebsitePanel.Providers.Virtualization2012;
|
using WebsitePanel.Providers.Virtualization2012;
|
||||||
|
|
||||||
namespace WebsitePanel.EnterpriseServer
|
namespace WebsitePanel.EnterpriseServer
|
||||||
|
@ -377,24 +378,24 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
quotaResults.Add(VirtualizationErrorCodes.QUOTA_NOT_IN_DYNAMIC_RAM);
|
quotaResults.Add(VirtualizationErrorCodes.QUOTA_NOT_IN_DYNAMIC_RAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckListsQuota(cntx, quotaResults, Quotas.VPS2012_SERVERS_NUMBER, VirtualizationErrorCodes.QUOTA_EXCEEDED_SERVERS_NUMBER);
|
QuotaHelper.CheckListsQuota(cntx, quotaResults, Quotas.VPS2012_SERVERS_NUMBER, VirtualizationErrorCodes.QUOTA_EXCEEDED_SERVERS_NUMBER);
|
||||||
|
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_SNAPSHOTS_NUMBER, snapshots, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_SNAPSHOTS_NUMBER, snapshots, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REINSTALL_ALLOWED, reinstallAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REINSTALL_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REINSTALL_ALLOWED, reinstallAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REINSTALL_ALLOWED);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED);
|
||||||
|
|
||||||
// check external addresses number
|
// check external addresses number
|
||||||
if (!randomExternalAddresses && externalAddresses != null)
|
if (!randomExternalAddresses && externalAddresses != null)
|
||||||
|
@ -407,7 +408,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
// check private addresses number
|
// check private addresses number
|
||||||
if (!randomPrivateAddresses && privateAddresses != null)
|
if (!randomPrivateAddresses && privateAddresses != null)
|
||||||
privateAddressesNumber = privateAddresses.Length;
|
privateAddressesNumber = privateAddresses.Length;
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER, privateAddressesNumber, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_ADDRESSES_NUMBER);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER, privateAddressesNumber, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_ADDRESSES_NUMBER);
|
||||||
|
|
||||||
// check management network parameters
|
// check management network parameters
|
||||||
NetworkAdapterDetails manageNic = GetManagementNetworkDetails(packageId);
|
NetworkAdapterDetails manageNic = GetManagementNetworkDetails(packageId);
|
||||||
|
@ -1110,58 +1111,6 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, long currentVal, long val, string messageKey)
|
|
||||||
{
|
|
||||||
CheckQuotaValue(cntx, errors, quotaName, currentVal, val, messageKey);
|
|
||||||
}
|
|
||||||
private static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, int currentVal, int val, string messageKey)
|
|
||||||
{
|
|
||||||
CheckQuotaValue(cntx, errors, quotaName, Convert.ToInt64(currentVal), Convert.ToInt64(val), messageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckNumericQuota(PackageContext cntx, List<string> errors, string quotaName, int val, string messageKey)
|
|
||||||
{
|
|
||||||
CheckQuotaValue(cntx, errors, quotaName, 0, val, messageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckBooleanQuota(PackageContext cntx, List<string> errors, string quotaName, bool val, string messageKey)
|
|
||||||
{
|
|
||||||
CheckQuotaValue(cntx, errors, quotaName, 0, val ? 1 : 0, messageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckListsQuota(PackageContext cntx, List<string> errors, string quotaName, string messageKey)
|
|
||||||
{
|
|
||||||
CheckQuotaValue(cntx, errors, quotaName, 0, -1, messageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckQuotaValue(PackageContext cntx, List<string> errors, string quotaName, long currentVal, long val, string messageKey)
|
|
||||||
{
|
|
||||||
if (!cntx.Quotas.ContainsKey(quotaName))
|
|
||||||
return;
|
|
||||||
|
|
||||||
QuotaValueInfo quota = cntx.Quotas[quotaName];
|
|
||||||
|
|
||||||
if(val == -1 && quota.QuotaExhausted) // check if quota already reached
|
|
||||||
{
|
|
||||||
errors.Add(messageKey + ":" + quota.QuotaAllocatedValue);
|
|
||||||
}
|
|
||||||
else if(quota.QuotaAllocatedValue == -1)
|
|
||||||
return; // unlimited
|
|
||||||
else if (quota.QuotaTypeId == 1 && val == 1 && quota.QuotaAllocatedValue == 0) // bool quota
|
|
||||||
errors.Add(messageKey);
|
|
||||||
else if (quota.QuotaTypeId == 2)
|
|
||||||
{
|
|
||||||
long maxValue = quota.QuotaAllocatedValue - quota.QuotaUsedValue + currentVal;
|
|
||||||
if(val > maxValue)
|
|
||||||
errors.Add(messageKey + ":" + maxValue);
|
|
||||||
}
|
|
||||||
else if (quota.QuotaTypeId == 3 && val > quota.QuotaAllocatedValue)
|
|
||||||
{
|
|
||||||
int maxValue = quota.QuotaAllocatedValue;
|
|
||||||
errors.Add(messageKey + ":" + maxValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IntResult ImportVirtualMachine(int packageId,
|
public static IntResult ImportVirtualMachine(int packageId,
|
||||||
int serviceId, string vmId,
|
int serviceId, string vmId,
|
||||||
string osTemplateFile, string adminPassword,
|
string osTemplateFile, string adminPassword,
|
||||||
|
@ -2005,22 +1954,22 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
quotaResults.Add(VirtualizationErrorCodes.QUOTA_NOT_IN_DYNAMIC_RAM);
|
quotaResults.Add(VirtualizationErrorCodes.QUOTA_NOT_IN_DYNAMIC_RAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, currentRam, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, currentRam, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, vm.HddSize, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, vm.HddSize, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD);
|
||||||
CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_SNAPSHOTS_NUMBER, snapshots, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS);
|
QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_SNAPSHOTS_NUMBER, snapshots, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REINSTALL_ALLOWED, reinstallAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REINSTALL_ALLOWED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REINSTALL_ALLOWED, reinstallAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REINSTALL_ALLOWED);
|
||||||
|
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED);
|
||||||
CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED);
|
QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED);
|
||||||
|
|
||||||
// check acceptable values
|
// check acceptable values
|
||||||
if (ramMB <= 0)
|
if (ramMB <= 0)
|
||||||
|
@ -3639,9 +3588,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
private static VirtualizationServer2012 GetVirtualizationProxy(int serviceId)
|
private static VirtualizationServer2012 GetVirtualizationProxy(int serviceId)
|
||||||
{
|
{
|
||||||
VirtualizationServer2012 ws = new VirtualizationServer2012();
|
return VirtualizationHelper.GetVirtualizationProxy(serviceId);
|
||||||
ServiceProviderProxy.Init(ws, serviceId);
|
|
||||||
return ws;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VirtualMachine GetVirtualMachineByItemId(int itemId)
|
public static VirtualMachine GetVirtualMachineByItemId(int itemId)
|
||||||
|
@ -3790,15 +3737,22 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
TaskManager.StartTask("VPS2012", "SetVmReplication");
|
TaskManager.StartTask("VPS2012", "SetVmReplication");
|
||||||
|
|
||||||
ResultObject result = new ResultObject();
|
ResultObject result = new ResultObject();
|
||||||
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
||||||
|
|
||||||
|
// Check Quotas
|
||||||
|
ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result);
|
||||||
|
if (result.ErrorCodes.Count > 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
||||||
|
|
||||||
// Get replica server
|
// Get replica server
|
||||||
var replicaServerInfo = GetReplicaInfoForService(vm.ServiceId, ref result);
|
var replicaServerInfo = ReplicationHelper.GetReplicaInfoForService(vm.ServiceId, ref result);
|
||||||
if (result.ErrorCodes.Count > 0)
|
if (result.ErrorCodes.Count > 0) return result;
|
||||||
return result;
|
|
||||||
|
|
||||||
// We should use enable replication or set replication?
|
// We should use enable replication or set replication?
|
||||||
var vmReplica = vs.GetReplication(vm.VirtualMachineId);
|
var vmReplica = vs.GetReplication(vm.VirtualMachineId);
|
||||||
|
@ -3831,10 +3785,15 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
||||||
|
|
||||||
|
// Check Quotas
|
||||||
|
ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result);
|
||||||
|
if (result.ErrorCodes.Count > 0) return result;
|
||||||
|
|
||||||
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
||||||
vs.DisableVmReplication(vm.VirtualMachineId);
|
vs.DisableVmReplication(vm.VirtualMachineId);
|
||||||
|
|
||||||
CleanUpReplicaServer(vm);
|
ReplicationHelper.CleanUpReplicaServer(vm);
|
||||||
|
|
||||||
result.IsSuccess = true;
|
result.IsSuccess = true;
|
||||||
}
|
}
|
||||||
|
@ -3851,6 +3810,11 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
||||||
|
|
||||||
|
// Check Quotas
|
||||||
|
ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result);
|
||||||
|
if (result.ErrorCodes.Count > 0) return result;
|
||||||
|
|
||||||
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
||||||
vs.PauseReplication(vm.VirtualMachineId);
|
vs.PauseReplication(vm.VirtualMachineId);
|
||||||
|
|
||||||
|
@ -3869,6 +3833,11 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
|
||||||
|
|
||||||
|
// Check Quotas
|
||||||
|
ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result);
|
||||||
|
if (result.ErrorCodes.Count > 0) return result;
|
||||||
|
|
||||||
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
|
||||||
vs.ResumeReplication(vm.VirtualMachineId);
|
vs.ResumeReplication(vm.VirtualMachineId);
|
||||||
|
|
||||||
|
@ -3881,74 +3850,6 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Private methods
|
|
||||||
|
|
||||||
private static void CleanUpReplicaServer(VirtualMachine originalVm)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ResultObject result = new ResultObject();
|
|
||||||
|
|
||||||
// Get replica server
|
|
||||||
var replicaServer = GetReplicaForService(originalVm.ServiceId, ref result);
|
|
||||||
|
|
||||||
// Clean up replica server
|
|
||||||
var replicaVm = replicaServer.GetVirtualMachines().FirstOrDefault(m => m.Name == originalVm.Name);
|
|
||||||
if (replicaVm != null)
|
|
||||||
{
|
|
||||||
replicaServer.DisableVmReplication(replicaVm.VirtualMachineId);
|
|
||||||
replicaServer.ShutDownVirtualMachine(replicaVm.VirtualMachineId, true, "ReplicaDelete");
|
|
||||||
replicaServer.DeleteVirtualMachine(replicaVm.VirtualMachineId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch { /* skip */ }
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ReplicationServerInfo GetReplicaInfoForService(int serviceId, ref ResultObject result)
|
|
||||||
{
|
|
||||||
// Get service id of replica server
|
|
||||||
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
|
|
||||||
string replicaServiceId = vsSesstings["ReplicaServerId"];
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(replicaServiceId))
|
|
||||||
{
|
|
||||||
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get replica server info for replica service id
|
|
||||||
VirtualizationServer2012 vsReplica = GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
|
|
||||||
StringDictionary vsReplicaSesstings = ServerController.GetServiceSettings(Convert.ToInt32(replicaServiceId));
|
|
||||||
string computerName = vsReplicaSesstings["ServerName"];
|
|
||||||
var replicaServerInfo = vsReplica.GetReplicaServer(computerName);
|
|
||||||
|
|
||||||
if (!replicaServerInfo.Enabled)
|
|
||||||
{
|
|
||||||
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return replicaServerInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static VirtualizationServer2012 GetReplicaForService(int serviceId, ref ResultObject result)
|
|
||||||
{
|
|
||||||
// Get service id of replica server
|
|
||||||
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
|
|
||||||
string replicaServiceId = vsSesstings["ReplicaServerId"];
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(replicaServiceId))
|
|
||||||
{
|
|
||||||
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get replica server for replica service id
|
|
||||||
return GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,6 +185,9 @@
|
||||||
<Compile Include="Users\UserAsyncWorker.cs" />
|
<Compile Include="Users\UserAsyncWorker.cs" />
|
||||||
<Compile Include="Users\UserController.cs" />
|
<Compile Include="Users\UserController.cs" />
|
||||||
<Compile Include="Virtualization2012\CreateServerAsyncWorker2012.cs" />
|
<Compile Include="Virtualization2012\CreateServerAsyncWorker2012.cs" />
|
||||||
|
<Compile Include="Virtualization2012\Helpers\QuotaHelper.cs" />
|
||||||
|
<Compile Include="Virtualization2012\Helpers\ReplicationHelper.cs" />
|
||||||
|
<Compile Include="Virtualization2012\Helpers\VirtualizationHelper.cs" />
|
||||||
<Compile Include="Virtualization2012\VirtualizationServerController2012.cs" />
|
<Compile Include="Virtualization2012\VirtualizationServerController2012.cs" />
|
||||||
<Compile Include="VirtualizationForPrivateCloud\CreateAsyncVMfromVM.cs" />
|
<Compile Include="VirtualizationForPrivateCloud\CreateAsyncVMfromVM.cs" />
|
||||||
<Compile Include="VirtualizationForPrivateCloud\CreateServerAsyncWorkerForPrivateCloud.cs" />
|
<Compile Include="VirtualizationForPrivateCloud\CreateServerAsyncWorkerForPrivateCloud.cs" />
|
||||||
|
|
|
@ -4121,6 +4121,9 @@
|
||||||
<data name="Error.VPS_REQUIRED" xml:space="preserve">
|
<data name="Error.VPS_REQUIRED" xml:space="preserve">
|
||||||
<value>Please fill required fields</value>
|
<value>Please fill required fields</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Error.VPS_QUOTA_REPLICATION_ENABLED" xml:space="preserve">
|
||||||
|
<value>Replications is not allowed in the hosting plan</value>
|
||||||
|
</data>
|
||||||
|
|
||||||
<data name="VPS.VPS_JOB_FAILED_ERROR" xml:space="preserve">
|
<data name="VPS.VPS_JOB_FAILED_ERROR" xml:space="preserve">
|
||||||
<value>Job execution failed with the following code: {1}</value>
|
<value>Job execution failed with the following code: {1}</value>
|
||||||
|
@ -5244,6 +5247,9 @@
|
||||||
<data name="Quota.VPS2012.StartShutdownAllowed" xml:space="preserve">
|
<data name="Quota.VPS2012.StartShutdownAllowed" xml:space="preserve">
|
||||||
<value>Allow user to Start, Turn off VPS</value>
|
<value>Allow user to Start, Turn off VPS</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Quota.VPS2012.ReplicationEnabled" xml:space="preserve">
|
||||||
|
<value>Allow user to Replication</value>
|
||||||
|
</data>
|
||||||
<data name="Error.CreateCheckPointError" xml:space="preserve">
|
<data name="Error.CreateCheckPointError" xml:space="preserve">
|
||||||
<value>Error creating CheckPoint</value>
|
<value>Error creating CheckPoint</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -134,7 +134,12 @@ namespace WebsitePanel.Portal.VPS2012.UserControls
|
||||||
tabsList.Add(CreateTab("vps_network", "Tab.Network"));
|
tabsList.Add(CreateTab("vps_network", "Tab.Network"));
|
||||||
|
|
||||||
if (VirtualMachines2012Helper.IsReplicationEnabled(PanelSecurity.PackageId) && !createError)
|
if (VirtualMachines2012Helper.IsReplicationEnabled(PanelSecurity.PackageId) && !createError)
|
||||||
|
{
|
||||||
|
if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_REPLICATION_ENABLED))
|
||||||
|
{
|
||||||
tabsList.Add(CreateTab("vps_replication", "Tab.Replication"));
|
tabsList.Add(CreateTab("vps_replication", "Tab.Replication"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions"));
|
//tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions"));
|
||||||
//tabsList.Add(CreateTab("vps_tools", "Tab.Tools"));
|
//tabsList.Add(CreateTab("vps_tools", "Tab.Tools"));
|
||||||
|
|
|
@ -52,7 +52,9 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
gvServers.Columns[4].Visible = !isUserSelected;
|
gvServers.Columns[4].Visible = !isUserSelected;
|
||||||
|
|
||||||
// replication
|
// replication
|
||||||
gvServers.Columns[5].Visible = VirtualMachines2012Helper.IsReplicationEnabled(PanelSecurity.PackageId);
|
gvServers.Columns[5].Visible =
|
||||||
|
PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_REPLICATION_ENABLED) &&
|
||||||
|
VirtualMachines2012Helper.IsReplicationEnabled(PanelSecurity.PackageId);
|
||||||
|
|
||||||
// check package quotas
|
// check package quotas
|
||||||
bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId);
|
bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId);
|
||||||
|
|
|
@ -33,7 +33,8 @@ using System.Collections.Generic;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.UI;
|
using System.Web.UI;
|
||||||
using System.Web.UI.WebControls;
|
using System.Web.UI.WebControls;
|
||||||
using WebsitePanel.Providers.Common;
|
using WebsitePanel.EnterpriseServer;
|
||||||
|
using WebsitePanel.Providers.Common;
|
||||||
using WebsitePanel.Providers.Virtualization;
|
using WebsitePanel.Providers.Virtualization;
|
||||||
|
|
||||||
namespace WebsitePanel.Portal.VPS2012
|
namespace WebsitePanel.Portal.VPS2012
|
||||||
|
@ -46,6 +47,13 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
|
|
||||||
protected void Page_Load(object sender, EventArgs e)
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (!PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_REPLICATION_ENABLED))
|
||||||
|
{
|
||||||
|
ShowErrorMessage("VPS_QUOTA_REPLICATION_ENABLED");
|
||||||
|
ReplicationPanel.Visible = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!IsPostBack)
|
if (!IsPostBack)
|
||||||
{
|
{
|
||||||
Bind();
|
Bind();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue