diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index d646dd41..3fe1c018 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -8921,6 +8921,12 @@ INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDe END 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') 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) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index b9347a17..21ca9804 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -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_REINSTALL_ALLOWED = "VPS2012.ReinstallAllowed"; // Allow user to Re-install VPS 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_MANAGING_ALLOWED = "VPSForPC.ManagingAllowed"; // Allow user to create VPS diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserInfo.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserInfo.cs index c1e4376e..259d0c53 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserInfo.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Users/UserInfo.cs @@ -349,3 +349,60 @@ namespace WebsitePanel.EnterpriseServer 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); \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Virtualization/VirtualizationErrorCodes.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Virtualization/VirtualizationErrorCodes.cs index d7f37e80..82ea54dc 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Virtualization/VirtualizationErrorCodes.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Virtualization/VirtualizationErrorCodes.cs @@ -121,6 +121,7 @@ public const string DISABLE_REPLICATION_ERROR = "VPS_DISABLE_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 QUOTA_REPLICATION_ENABLED = "VPS_QUOTA_REPLICATION_ENABLED"; public const string HOST_NAMER_IS_ALREADY_USED = "HOST_NAMER_IS_ALREADY_USED"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/QuotaHelper.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/QuotaHelper.cs new file mode 100644 index 00000000..a04b30c0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/QuotaHelper.cs @@ -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 errors, string quotaName, long currentVal, long val, string messageKey) + { + CheckQuotaValue(cntx, errors, quotaName, currentVal, val, messageKey); + } + public static void CheckNumericQuota(PackageContext cntx, List 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 errors, string quotaName, int val, string messageKey) + { + CheckQuotaValue(cntx, errors, quotaName, 0, val, messageKey); + } + + public static void CheckBooleanQuota(PackageContext cntx, List errors, string quotaName, bool val, string messageKey) + { + CheckQuotaValue(cntx, errors, quotaName, 0, val ? 1 : 0, messageKey); + } + + public static void CheckListsQuota(PackageContext cntx, List errors, string quotaName, string messageKey) + { + CheckQuotaValue(cntx, errors, quotaName, 0, -1, messageKey); + } + + public static void CheckQuotaValue(PackageContext cntx, List 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); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/ReplicationHelper.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/ReplicationHelper.cs new file mode 100644 index 00000000..eaf899b6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/ReplicationHelper.cs @@ -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 quotaResults = new List(); + 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); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/VirtualizationHelper.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/VirtualizationHelper.cs new file mode 100644 index 00000000..bd19b4cf --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/Helpers/VirtualizationHelper.cs @@ -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; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs index 27d5b0d9..c957f141 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs @@ -42,6 +42,7 @@ using System.Net.Mail; using System.Diagnostics; using System.Linq; using System.Net; +using WebsitePanel.EnterpriseServer.Code.Virtualization2012; using WebsitePanel.Providers.Virtualization2012; namespace WebsitePanel.EnterpriseServer @@ -377,24 +378,24 @@ namespace WebsitePanel.EnterpriseServer 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); - CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM); - 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_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU); + QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM); + QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD); + 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); - CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED); + 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); - 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); - 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_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED); + 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); - CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED); // check external addresses number if (!randomExternalAddresses && externalAddresses != null) @@ -407,7 +408,7 @@ namespace WebsitePanel.EnterpriseServer // check private addresses number if (!randomPrivateAddresses && privateAddresses != null) 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 NetworkAdapterDetails manageNic = GetManagementNetworkDetails(packageId); @@ -1110,58 +1111,6 @@ namespace WebsitePanel.EnterpriseServer } } - private static void CheckNumericQuota(PackageContext cntx, List errors, string quotaName, long currentVal, long val, string messageKey) - { - CheckQuotaValue(cntx, errors, quotaName, currentVal, val, messageKey); - } - private static void CheckNumericQuota(PackageContext cntx, List 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 errors, string quotaName, int val, string messageKey) - { - CheckQuotaValue(cntx, errors, quotaName, 0, val, messageKey); - } - - private static void CheckBooleanQuota(PackageContext cntx, List errors, string quotaName, bool val, string messageKey) - { - CheckQuotaValue(cntx, errors, quotaName, 0, val ? 1 : 0, messageKey); - } - - private static void CheckListsQuota(PackageContext cntx, List errors, string quotaName, string messageKey) - { - CheckQuotaValue(cntx, errors, quotaName, 0, -1, messageKey); - } - - private static void CheckQuotaValue(PackageContext cntx, List 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, int serviceId, string vmId, string osTemplateFile, string adminPassword, @@ -2005,22 +1954,22 @@ namespace WebsitePanel.EnterpriseServer quotaResults.Add(VirtualizationErrorCodes.QUOTA_NOT_IN_DYNAMIC_RAM); } - CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU); - 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); - 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); - 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); - 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); - 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); - - 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.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU); + QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, currentRam, newRam, VirtualizationErrorCodes.QUOTA_EXCEEDED_RAM); + QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_HDD, vm.HddSize, hddGB, VirtualizationErrorCodes.QUOTA_EXCEEDED_HDD); + QuotaHelper.CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_SNAPSHOTS_NUMBER, snapshots, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS); + + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_DVD_ENABLED, dvdInstalled, VirtualizationErrorCodes.QUOTA_EXCEEDED_DVD_ENABLED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_BOOT_CD_ALLOWED, bootFromCD, VirtualizationErrorCodes.QUOTA_EXCEEDED_CD_ALLOWED); + + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_START_SHUTDOWN_ALLOWED, startShutdownAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PAUSE_RESUME_ALLOWED, pauseResumeAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REBOOT_ALLOWED, rebootAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_RESET_ALOWED, resetAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_REINSTALL_ALLOWED, reinstallAllowed, VirtualizationErrorCodes.QUOTA_EXCEEDED_REINSTALL_ALLOWED); + + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED, externalNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_NETWORK_ENABLED); + QuotaHelper.CheckBooleanQuota(cntx, quotaResults, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED, privateNetworkEnabled, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_NETWORK_ENABLED); // check acceptable values if (ramMB <= 0) @@ -3639,9 +3588,7 @@ namespace WebsitePanel.EnterpriseServer private static VirtualizationServer2012 GetVirtualizationProxy(int serviceId) { - VirtualizationServer2012 ws = new VirtualizationServer2012(); - ServiceProviderProxy.Init(ws, serviceId); - return ws; + return VirtualizationHelper.GetVirtualizationProxy(serviceId); } public static VirtualMachine GetVirtualMachineByItemId(int itemId) @@ -3790,15 +3737,22 @@ namespace WebsitePanel.EnterpriseServer TaskManager.StartTask("VPS2012", "SetVmReplication"); ResultObject result = new ResultObject(); + + try { VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // Check Quotas + ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result); + if (result.ErrorCodes.Count > 0) + return result; + VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId); // Get replica server - var replicaServerInfo = GetReplicaInfoForService(vm.ServiceId, ref result); - if (result.ErrorCodes.Count > 0) - return result; + var replicaServerInfo = ReplicationHelper.GetReplicaInfoForService(vm.ServiceId, ref result); + if (result.ErrorCodes.Count > 0) return result; // We should use enable replication or set replication? var vmReplica = vs.GetReplication(vm.VirtualMachineId); @@ -3831,10 +3785,15 @@ namespace WebsitePanel.EnterpriseServer try { VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // Check Quotas + ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result); + if (result.ErrorCodes.Count > 0) return result; + VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId); vs.DisableVmReplication(vm.VirtualMachineId); - CleanUpReplicaServer(vm); + ReplicationHelper.CleanUpReplicaServer(vm); result.IsSuccess = true; } @@ -3851,6 +3810,11 @@ namespace WebsitePanel.EnterpriseServer try { VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // Check Quotas + ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result); + if (result.ErrorCodes.Count > 0) return result; + VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId); vs.PauseReplication(vm.VirtualMachineId); @@ -3869,6 +3833,11 @@ namespace WebsitePanel.EnterpriseServer try { VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // Check Quotas + ReplicationHelper.CheckReplicationQuota(vm.PackageId, ref result); + if (result.ErrorCodes.Count > 0) return result; + VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId); vs.ResumeReplication(vm.VirtualMachineId); @@ -3881,74 +3850,6 @@ namespace WebsitePanel.EnterpriseServer 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 } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj index 9fa34343..1532ee8a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj @@ -185,6 +185,9 @@ + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 050e1912..61846104 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -4121,6 +4121,9 @@ Please fill required fields + + Replications is not allowed in the hosting plan + Job execution failed with the following code: {1} @@ -5244,6 +5247,9 @@ Allow user to Start, Turn off VPS + + Allow user to Replication + Error creating CheckPoint diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs index aef33468..f1547dcb 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs @@ -134,7 +134,12 @@ namespace WebsitePanel.Portal.VPS2012.UserControls tabsList.Add(CreateTab("vps_network", "Tab.Network")); if (VirtualMachines2012Helper.IsReplicationEnabled(PanelSecurity.PackageId) && !createError) - tabsList.Add(CreateTab("vps_replication", "Tab.Replication")); + { + if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_REPLICATION_ENABLED)) + { + tabsList.Add(CreateTab("vps_replication", "Tab.Replication")); + } + } //tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions")); //tabsList.Add(CreateTab("vps_tools", "Tab.Tools")); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs index e54442d9..5fe12dc2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs @@ -52,7 +52,9 @@ namespace WebsitePanel.Portal.VPS2012 gvServers.Columns[4].Visible = !isUserSelected; // 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 bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsReplications.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsReplications.ascx.cs index f16c9209..386ff082 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsReplications.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsReplications.ascx.cs @@ -33,7 +33,8 @@ using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; -using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Virtualization; namespace WebsitePanel.Portal.VPS2012 @@ -46,6 +47,13 @@ namespace WebsitePanel.Portal.VPS2012 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) { Bind();