From 03a675cf03ed3950b9e21ee0adbe712f9653905a Mon Sep 17 00:00:00 2001 From: Alexander Trofimov Date: Mon, 6 Apr 2015 10:31:41 +0300 Subject: [PATCH] wsp-10327 Add Dynamic Memory to VPS - Isolate VPS2012. --- WebsitePanel/Database/update_db.sql | 288 +- .../Packages/PackageSettings.cs | 1 + .../Packages/Quotas.cs | 20 + .../Servers/ResourceGroups.cs | 1 + .../VirtualizationServerProxy.cs | 2858 +++++------ .../VirtualizationServerProxy2012.cs | 4523 +++++++++++++++++ ...ebsitePanel.EnterpriseServer.Client.csproj | 1 + .../Data/DataProvider.cs | 15 + .../Packages/PackageController.cs | 18 + .../Servers/ServerController.cs | 6 + .../CreateServerAsyncWorker2012.cs | 85 + .../VirtualizationServerController2012.cs | 3687 ++++++++++++++ .../WebsitePanel.EnterpriseServer.Code.csproj | 2 + .../WebsitePanel.EnterpriseServer.csproj | 5 + .../esVirtualizationServer2012.asmx | 1 + .../esVirtualizationServer2012.asmx.cs | 476 ++ .../App_Containers/Default/VPS2012.ascx | 10 + .../App_Data/ModulesData.config | 2 + .../App_Data/WebsitePanel_Modules.config | 31 + .../App_Data/WebsitePanel_Pages.config | 14 + .../WebsitePanel_Pages.ascx.resx | 6 + .../WebsitePanel_SharedResources.ascx.resx | 68 + .../SpaceSettings.ascx.resx | 3 + .../WebsitePanel/Code/Framework/ES.cs | 5 + .../Code/Helpers/VirtualMachines2012Helper.cs | 129 + .../DesktopModules/WebsitePanel/Login.ascx.cs | 20 + .../WebsitePanel/ServersEditService.ascx.cs | 1 + .../WebsitePanel/SpaceSettings.ascx | 3 + .../WebsitePanel/SpaceSettings.ascx.cs | 2 + .../SpaceSettings.ascx.designer.cs | 37 +- .../AllocatePackageIPAddresses.ascx.cs | 8 +- .../VdcCreateServer.ascx.resx | 7 +- .../WebsitePanel/VPS/VdcCreateServer.ascx | 7 - .../WebsitePanel/VPS/VdcCreateServer.ascx.cs | 41 +- .../VPS/VdcCreateServer.ascx.designer.cs | 27 - .../VPS/VpsDetailsEditConfiguration.ascx | 3 - .../VPS/VpsDetailsEditConfiguration.ascx.cs | 30 - ...sDetailsEditConfiguration.ascx.designer.cs | 9 - .../VdcAddExternalAddress.ascx.resx | 126 + .../App_LocalResources/VdcAuditLog.ascx.resx | 126 + .../VdcCreateServer.ascx.resx | 375 ++ .../VdcExternalNetwork.ascx.resx | 135 + .../App_LocalResources/VdcHome.ascx.resx | 189 + .../VdcImportServer.ascx.resx | 243 + .../VdcManagementNetwork.ascx.resx | 126 + .../VdcPermissions.ascx.resx | 138 + .../VdcPrivateNetwork.ascx.resx | 150 + .../VpsDetailsAddExternalAddress.ascx.resx | 156 + .../VpsDetailsAddPrivateAddress.ascx.resx | 153 + .../VpsDetailsAuditLog.ascx.resx | 126 + .../VpsDetailsConfiguration.ascx.resx | 222 + .../VpsDetailsDvd.ascx.resx | 141 + .../VpsDetailsEditConfiguration.ascx.resx | 216 + .../VpsDetailsGeneral.ascx.resx | 303 ++ .../VpsDetailsHelp.ascx.resx | 144 + .../VpsDetailsInsertDvd.ascx.resx | 144 + .../VpsDetailsNetwork.ascx.resx | 195 + .../VpsDetailsPermissions.ascx.resx | 132 + .../VpsDetailsSnapshots.ascx.resx | 174 + .../VpsDetailsTools.ascx.resx | 138 + .../VpsMoveServer.ascx.resx | 147 + .../VpsToolsDeleteServer.ascx.resx | 156 + .../VpsToolsReinstallServer.ascx.resx | 159 + .../App_LocalResources/Connect.aspx.resx | 123 + .../VPS2012/RemoteDesktop/Connect.aspx | 231 + .../VPS2012/RemoteDesktop/Connect.aspx.cs | 56 + .../RemoteDesktop/Connect.aspx.designer.cs | 78 + .../VPS2012/RemoteDesktop/msrdp.cab | Bin 0 -> 349978 bytes .../VPS2012/TestVirtualMachineTemplate.aspx | 46 + .../TestVirtualMachineTemplate.aspx.cs | 55 + ...estVirtualMachineTemplate.aspx.designer.cs | 69 + .../App_LocalResources/Breadcrumb.ascx.resx | 120 + .../DynamicMemory.ascx.resx | 126 + .../App_LocalResources/Generation.ascx.resx | 132 + .../App_LocalResources/Menu.ascx.resx | 138 + .../App_LocalResources/ServerTabs.ascx.resx | 156 + .../VPS2012/UserControls/Breadcrumb.ascx | 4 + .../VPS2012/UserControls/Breadcrumb.ascx.cs | 50 + .../UserControls/Breadcrumb.ascx.designer.cs | 24 + .../VPS2012/UserControls/DynamicMemory.ascx | 17 + .../UserControls/DynamicMemory.ascx.cs | 50 + .../DynamicMemory.ascx.designer.cs | 42 + .../VPS2012/UserControls/FormTitle.ascx | 4 + .../VPS2012/UserControls/FormTitle.ascx.cs | 53 + .../UserControls/FormTitle.ascx.designer.cs | 33 + .../VPS2012/UserControls/Generation.ascx | 24 + .../VPS2012/UserControls/Generation.ascx.cs | 54 + .../UserControls/Generation.ascx.designer.cs | 60 + .../VPS2012/UserControls/Menu.ascx | 18 + .../VPS2012/UserControls/Menu.ascx.cs | 129 + .../UserControls/Menu.ascx.designer.cs | 24 + .../VPS2012/UserControls/ServerTabs.ascx | 75 + .../VPS2012/UserControls/ServerTabs.ascx.cs | 230 + .../UserControls/ServerTabs.ascx.designer.cs | 123 + .../VPS2012/VdcAddExternalAddress.ascx | 39 + .../VPS2012/VdcAddExternalAddress.ascx.cs | 43 + .../VdcAddExternalAddress.ascx.designer.cs | 69 + .../WebsitePanel/VPS2012/VdcAuditLog.ascx | 34 + .../WebsitePanel/VPS2012/VdcAuditLog.ascx.cs | 44 + .../VPS2012/VdcAuditLog.ascx.designer.cs | 60 + .../WebsitePanel/VPS2012/VdcCreateServer.ascx | 570 +++ .../VPS2012/VdcCreateServer.ascx.cs | 375 ++ .../VPS2012/VdcCreateServer.ascx.designer.cs | 1365 +++++ .../VPS2012/VdcExternalNetwork.ascx | 61 + .../VPS2012/VdcExternalNetwork.ascx.cs | 45 + .../VdcExternalNetwork.ascx.designer.cs | 114 + .../WebsitePanel/VPS2012/VdcHome.ascx | 139 + .../WebsitePanel/VPS2012/VdcHome.ascx.cs | 138 + .../VPS2012/VdcHome.ascx.designer.cs | 177 + .../WebsitePanel/VPS2012/VdcImportServer.ascx | 283 ++ .../VPS2012/VdcImportServer.ascx.cs | 231 + .../VPS2012/VdcImportServer.ascx.designer.cs | 627 +++ .../VPS2012/VdcManagementNetwork.ascx | 39 + .../VPS2012/VdcManagementNetwork.ascx.cs | 44 + .../VdcManagementNetwork.ascx.designer.cs | 60 + .../WebsitePanel/VPS2012/VdcPermissions.ascx | 121 + .../VPS2012/VdcPermissions.ascx.cs | 56 + .../VPS2012/VdcPermissions.ascx.designer.cs | 141 + .../VPS2012/VdcPrivateNetwork.ascx | 98 + .../VPS2012/VdcPrivateNetwork.ascx.cs | 66 + .../VdcPrivateNetwork.ascx.designer.cs | 123 + .../VPS2012/VirtualMachineImage.ashx | 1 + .../VPS2012/VirtualMachineImage.ashx.cs | 66 + .../VPS2012/VirtualMachineSnapshotImage.ashx | 1 + .../VirtualMachineSnapshotImage.ashx.cs | 71 + .../VPS2012/VpsDetailsAddExternalAddress.ascx | 101 + .../VpsDetailsAddExternalAddress.ascx.cs | 119 + ...DetailsAddExternalAddress.ascx.designer.cs | 231 + .../VPS2012/VpsDetailsAddPrivateAddress.ascx | 96 + .../VpsDetailsAddPrivateAddress.ascx.cs | 118 + ...sDetailsAddPrivateAddress.ascx.designer.cs | 213 + .../VPS2012/VpsDetailsAuditLog.ascx | 37 + .../VPS2012/VpsDetailsAuditLog.ascx.cs | 44 + .../VpsDetailsAuditLog.ascx.designer.cs | 78 + .../VPS2012/VpsDetailsConfiguration.ascx | 257 + .../VPS2012/VpsDetailsConfiguration.ascx.cs | 132 + .../VpsDetailsConfiguration.ascx.designer.cs | 474 ++ .../WebsitePanel/VPS2012/VpsDetailsDvd.ascx | 62 + .../VPS2012/VpsDetailsDvd.ascx.cs | 101 + .../VPS2012/VpsDetailsDvd.ascx.designer.cs | 114 + .../VPS2012/VpsDetailsEditConfiguration.ascx | 201 + .../VpsDetailsEditConfiguration.ascx.cs | 209 + ...sDetailsEditConfiguration.ascx.designer.cs | 447 ++ .../VPS2012/VpsDetailsGeneral.ascx | 295 ++ .../VPS2012/VpsDetailsGeneral.ascx.cs | 299 ++ .../VpsDetailsGeneral.ascx.designer.cs | 609 +++ .../WebsitePanel/VPS2012/VpsDetailsHelp.ascx | 76 + .../VPS2012/VpsDetailsHelp.ascx.cs | 93 + .../VPS2012/VpsDetailsHelp.ascx.designer.cs | 168 + .../VPS2012/VpsDetailsInsertDvd.ascx | 71 + .../VPS2012/VpsDetailsInsertDvd.ascx.cs | 95 + .../VpsDetailsInsertDvd.ascx.designer.cs | 105 + .../VPS2012/VpsDetailsNetwork.ascx | 200 + .../VPS2012/VpsDetailsNetwork.ascx.cs | 296 ++ .../VpsDetailsNetwork.ascx.designer.cs | 339 ++ .../VPS2012/VpsDetailsPermissions.ascx | 75 + .../VPS2012/VpsDetailsPermissions.ascx.cs | 44 + .../VpsDetailsPermissions.ascx.designer.cs | 96 + .../VPS2012/VpsDetailsSnapshots.ascx | 146 + .../VPS2012/VpsDetailsSnapshots.ascx.cs | 262 + .../VpsDetailsSnapshots.ascx.designer.cs | 267 + .../WebsitePanel/VPS2012/VpsDetailsTools.ascx | 56 + .../VPS2012/VpsDetailsTools.ascx.cs | 56 + .../VPS2012/VpsDetailsTools.ascx.designer.cs | 87 + .../WebsitePanel/VPS2012/VpsMoveServer.ascx | 75 + .../VPS2012/VpsMoveServer.ascx.cs | 112 + .../VPS2012/VpsMoveServer.ascx.designer.cs | 141 + .../VPS2012/VpsToolsDeleteServer.ascx | 92 + .../VPS2012/VpsToolsDeleteServer.ascx.cs | 116 + .../VpsToolsDeleteServer.ascx.designer.cs | 186 + .../VPS2012/VpsToolsReinstallServer.ascx | 109 + .../VPS2012/VpsToolsReinstallServer.ascx.cs | 58 + .../VpsToolsReinstallServer.ascx.designer.cs | 213 + .../WebsitePanel.Portal.Modules.csproj | 389 +- .../WebsitePanel.WebPortal.csproj | 1 + WebsitePanel/Sources/generate_es_proxies.bat | 11 +- 176 files changed, 31069 insertions(+), 1612 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy2012.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/CreateServerAsyncWorker2012.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/App_Containers/Default/VPS2012.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/VirtualMachines2012Helper.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcAddExternalAddress.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcAuditLog.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcCreateServer.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcExternalNetwork.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcHome.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcImportServer.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcManagementNetwork.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPermissions.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPrivateNetwork.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddExternalAddress.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddPrivateAddress.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAuditLog.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsConfiguration.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsDvd.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsEditConfiguration.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsGeneral.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsHelp.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsInsertDvd.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsNetwork.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsPermissions.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsSnapshots.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsTools.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsMoveServer.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsDeleteServer.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsReinstallServer.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/App_LocalResources/Connect.aspx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/msrdp.cab create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Breadcrumb.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/DynamicMemory.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Generation.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Menu.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/ServerTabs.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.designer.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.designer.cs diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 228701b7..972a6006 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -8218,6 +8218,21 @@ AS INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 3) + ELSE IF @QuotaID = 558 -- RAM of VPS + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'RamSize' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 559 -- HDD of VPS + SET @Result = (SELECT SUM(CAST(SIP.PropertyValue AS int)) FROM ServiceItemProperties AS SIP + INNER JOIN ServiceItems AS SI ON SIP.ItemID = SI.ItemID + INNER JOIN PackagesTreeCache AS PT ON SI.PackageID = PT.PackageID + WHERE SIP.PropertyName = 'HddSize' AND PT.ParentPackageID = @PackageID) + ELSE IF @QuotaID = 562 -- External IP addresses of VPS + SET @Result = (SELECT COUNT(PIP.PackageAddressID) FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + INNER JOIN PackagesTreeCache AS PT ON PIP.PackageID = PT.PackageID + WHERE PT.ParentPackageID = @PackageID AND IP.PoolID = 3) ELSE IF @QuotaID = 100 -- Dedicated Web IP addresses SET @Result = (SELECT COUNT(PIP.PackageAddressID) FROM PackageIPAddresses AS PIP INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID @@ -8861,16 +8876,168 @@ RETURN GO -- Hyper-V 2012 R2 Provider +IF NOT EXISTS (SELECT * FROM [dbo].[ResourceGroups] WHERE [GroupName] = 'VPS2012') +BEGIN +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController], [ShowGroup]) VALUES (33, N'VPS2012', 19, NULL, 1) + +INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (41, 33, N'VirtualMachine', N'WebsitePanel.Providers.Virtualization.VirtualMachine, WebsitePanel.Providers.Base', 1, 0, 0, 1, 1, 1, 0, 0) + +INSERT [dbo].[ServiceItemTypes] ([ItemTypeID], [GroupID], [DisplayName], [TypeName], [TypeOrder], [CalculateDiskspace], [CalculateBandwidth], [Suspendable], [Disposable], [Searchable], [Importable], [Backupable]) VALUES (42, 33, N'VirtualSwitch', N'WebsitePanel.Providers.Virtualization.VirtualSwitch, WebsitePanel.Providers.Base', 2, 0, 0, 1, 1, 1, 0, 0) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (553, 33, 1, N'VPS2012.ServersNumber', N'Number of VPS', 2, 0, 41, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (554, 33, 2, N'VPS2012.ManagingAllowed', N'Allow user to create VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (555, 33, 3, N'VPS2012.CpuNumber', N'Number of CPU cores', 3, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (556, 33, 7, N'VPS2012.BootCdAllowed', N'Boot from CD allowed', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (557, 33, 8, N'VPS2012.BootCdEnabled', N'Boot from CD', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (558, 33, 4, N'VPS2012.Ram', N'RAM size, MB', 2, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (559, 33, 5, N'VPS2012.Hdd', N'Hard Drive size, GB', 2, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (560, 33, 6, N'VPS2012.DvdEnabled', N'DVD drive', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (561, 33, 10, N'VPS2012.ExternalNetworkEnabled', N'External Network', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (562, 33, 11, N'VPS2012.ExternalIPAddressesNumber', N'Number of External IP addresses', 2, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (563, 33, 13, N'VPS2012.PrivateNetworkEnabled', N'Private Network', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (564, 33, 14, N'VPS2012.PrivateIPAddressesNumber', N'Number of Private IP addresses per VPS', 3, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (565, 33, 9, N'VPS2012.SnapshotsNumber', N'Number of Snaphots', 3, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (566, 33, 15, N'VPS2012.StartShutdownAllowed', N'Allow user to Start, Turn off and Shutdown VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (567, 33, 16, N'VPS2012.PauseResumeAllowed', N'Allow user to Pause, Resume VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (568, 33, 17, N'VPS2012.RebootAllowed', N'Allow user to Reboot VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (569, 33, 18, N'VPS2012.ResetAlowed', N'Allow user to Reset VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (570, 33, 19, N'VPS2012.ReinstallAllowed', N'Allow user to Re-install VPS', 1, 0, NULL, NULL) + +INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (571, 33, 12, N'VPS2012.Bandwidth', N'Monthly bandwidth, GB', 2, 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, 30, 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) END ELSE BEGIN -UPDATE [dbo].[Providers] SET [EditorControl] = N'HyperV2012R2' WHERE [ProviderName] = 'HyperV2012R2' +UPDATE [dbo].[Providers] SET [EditorControl] = N'HyperV2012R2', [GroupID] = 33 WHERE [ProviderName] = 'HyperV2012R2' END GO +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetVirtualMachinesPaged2012') +DROP PROCEDURE GetVirtualMachinesPaged2012 +GO +CREATE PROCEDURE [dbo].[GetVirtualMachinesPaged2012] +( + @ActorID int, + @PackageID int, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @StartRow int, + @MaximumRows int, + @Recursive bit +) +AS +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +SI.ItemTypeID = 41 -- VPS2012 +AND ((@Recursive = 0 AND P.PackageID = @PackageID) +OR (@Recursive = 1 AND dbo.CheckPackageParent(@PackageID, P.PackageID) = 1)) +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'SI.ItemName ASC' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT COUNT(SI.ItemID) FROM Packages AS P +INNER JOIN ServiceItems AS SI ON P.PackageID = SI.PackageID +INNER JOIN Users AS U ON P.UserID = U.UserID +LEFT OUTER JOIN ( + SELECT PIP.ItemID, IP.ExternalIP FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + WHERE PIP.IsPrimary = 1 AND IP.PoolID = 3 -- external IP addresses +) AS EIP ON SI.ItemID = EIP.ItemID +LEFT OUTER JOIN PrivateIPAddresses AS PIP ON PIP.ItemID = SI.ItemID AND PIP.IsPrimary = 1 +WHERE ' + @condition + ' + +DECLARE @Items AS TABLE +( + ItemID int +); + +WITH TempItems AS ( + SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row, + SI.ItemID + FROM Packages AS P + INNER JOIN ServiceItems AS SI ON P.PackageID = SI.PackageID + INNER JOIN Users AS U ON P.UserID = U.UserID + LEFT OUTER JOIN ( + SELECT PIP.ItemID, IP.ExternalIP FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + WHERE PIP.IsPrimary = 1 AND IP.PoolID = 3 -- external IP addresses + ) AS EIP ON SI.ItemID = EIP.ItemID + LEFT OUTER JOIN PrivateIPAddresses AS PIP ON PIP.ItemID = SI.ItemID AND PIP.IsPrimary = 1 + WHERE ' + @condition + ' +) + +INSERT INTO @Items +SELECT ItemID FROM TempItems +WHERE TempItems.Row BETWEEN @StartRow + 1 and @StartRow + @MaximumRows + +SELECT + SI.ItemID, + SI.ItemName, + SI.PackageID, + P.PackageName, + P.UserID, + U.Username, + + EIP.ExternalIP, + PIP.IPAddress +FROM @Items AS TSI +INNER JOIN ServiceItems AS SI ON TSI.ItemID = SI.ItemID +INNER JOIN Packages AS P ON SI.PackageID = P.PackageID +INNER JOIN Users AS U ON P.UserID = U.UserID +LEFT OUTER JOIN ( + SELECT PIP.ItemID, IP.ExternalIP FROM PackageIPAddresses AS PIP + INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID + WHERE PIP.IsPrimary = 1 AND IP.PoolID = 3 -- external IP addresses +) AS EIP ON SI.ItemID = EIP.ItemID +LEFT OUTER JOIN PrivateIPAddresses AS PIP ON PIP.ItemID = SI.ItemID AND PIP.IsPrimary = 1 +' + +--print @sql + +exec sp_executesql @sql, N'@PackageID int, @StartRow int, @MaximumRows int, @Recursive bit', +@PackageID, @StartRow, @MaximumRows, @Recursive + +RETURN +GO + + --ES OWA Editing IF NOT EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'EnterpriseFoldersOwaPermissions') CREATE TABLE EnterpriseFoldersOwaPermissions @@ -9461,4 +9628,119 @@ END GO -UPDATE [dbo].[Quotas] SET GroupID = 45 WHERE QuotaName = 'EnterpriseStorage.DriveMaps' \ No newline at end of file +UPDATE [dbo].[Quotas] SET GroupID = 45 WHERE QuotaName = 'EnterpriseStorage.DriveMaps' +Go + +ALTER PROCEDURE [dbo].[AddServiceItem] +( + @ActorID int, + @PackageID int, + @ServiceID int, + @ItemName nvarchar(500), + @ItemTypeName nvarchar(200), + @ItemID int OUTPUT, + @XmlProperties ntext, + @CreatedDate datetime +) +AS +BEGIN TRAN + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- get GroupID +DECLARE @GroupID int +SELECT + @GroupID = PROV.GroupID +FROM Services AS S +INNER JOIN Providers AS PROV ON S.ProviderID = PROV.ProviderID +WHERE S.ServiceID = @ServiceID + +DECLARE @ItemTypeID int +SELECT @ItemTypeID = ItemTypeID FROM ServiceItemTypes +WHERE TypeName = @ItemTypeName +AND ((@GroupID IS NULL) OR (@GroupID IS NOT NULL AND GroupID = @GroupID)) + +-- Fix to allow plans assigned to serveradmin +IF (@ItemTypeName = 'WebsitePanel.Providers.HostedSolution.Organization, WebsitePanel.Providers.Base') +BEGIN + IF NOT EXISTS (SELECT * FROM ServiceItems WHERE PackageID = 1) + BEGIN + INSERT INTO ServiceItems (PackageID, ItemTypeID,ServiceID,ItemName,CreatedDate) + VALUES(1, @ItemTypeID, @ServiceID, 'System', @CreatedDate) + + DECLARE @TempItemID int + + SET @TempItemID = SCOPE_IDENTITY() + INSERT INTO ExchangeOrganizations (ItemID, OrganizationID) + VALUES(@TempItemID, 'System') + END +END + + +-- add item +INSERT INTO ServiceItems +( + PackageID, + ServiceID, + ItemName, + ItemTypeID, + CreatedDate +) +VALUES +( + @PackageID, + @ServiceID, + @ItemName, + @ItemTypeID, + @CreatedDate +) + +SET @ItemID = SCOPE_IDENTITY() + +DECLARE @idoc int +--Create an internal representation of the XML document. +EXEC sp_xml_preparedocument @idoc OUTPUT, @XmlProperties + +-- Execute a SELECT statement that uses the OPENXML rowset provider. +DELETE FROM ServiceItemProperties +WHERE ItemID = @ItemID + +CREATE TABLE #TempTable( + ItemID int, + PropertyName nvarchar(50), + PropertyValue nvarchar(3000)) + +INSERT INTO #TempTable (ItemID, PropertyName, PropertyValue) +SELECT + @ItemID, + PropertyName, + PropertyValue +FROM OPENXML(@idoc, '/properties/property',1) WITH +( + PropertyName nvarchar(50) '@name', + PropertyValue nvarchar(3000) '@value' +) as PV + +-- Move data from temp table to real table +INSERT INTO ServiceItemProperties +( + ItemID, + PropertyName, + PropertyValue +) +SELECT + ItemID, + PropertyName, + PropertyValue +FROM #TempTable + +DROP TABLE #TempTable + +-- remove document +exec sp_xml_removedocument @idoc + +COMMIT TRAN +RETURN +GO diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs index 9481c0c9..96501589 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/PackageSettings.cs @@ -44,6 +44,7 @@ namespace WebsitePanel.EnterpriseServer public const string EXCHANGE_SERVER = "ExchangeServer"; public const string HOSTED_SOLLUTION = "HostedSollution"; public const string VIRTUAL_PRIVATE_SERVERS = "VirtualPrivateServers"; + public const string VIRTUAL_PRIVATE_SERVERS_2012 = "VirtualPrivateServers2012"; public const string VIRTUAL_PRIVATE_SERVERS_FOR_PRIVATE_CLOUD = "VirtualPrivateServersForPrivateCloud"; public int PackageId; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index 47155cb1..bd209203 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -201,6 +201,26 @@ order by rg.groupOrder public const string VPS_REINSTALL_ALLOWED = "VPS.ReinstallAllowed"; // Allow user to Re-install VPS public const string VPS_BANDWIDTH = "VPS.Bandwidth"; // Monthly bandwidth, GB + public const string VPS2012_SERVERS_NUMBER = "VPS2012.ServersNumber"; // Number of VPS + public const string VPS2012_MANAGING_ALLOWED = "VPS2012.ManagingAllowed"; // Allow user to create VPS + public const string VPS2012_CPU_NUMBER = "VPS2012.CpuNumber"; // Number of CPU cores + public const string VPS2012_BOOT_CD_ALLOWED = "VPS2012.BootCdAllowed"; // Boot from CD allowed + public const string VPS2012_BOOT_CD_ENABLED = "VPS2012.BootCdEnabled"; // Boot from CD + public const string VPS2012_RAM = "VPS2012.Ram"; // RAM size, MB + public const string VPS2012_HDD = "VPS2012.Hdd"; // Hard Drive size, GB + public const string VPS2012_DVD_ENABLED = "VPS2012.DvdEnabled"; // DVD drive + public const string VPS2012_EXTERNAL_NETWORK_ENABLED = "VPS2012.ExternalNetworkEnabled"; // External Network + public const string VPS2012_EXTERNAL_IP_ADDRESSES_NUMBER = "VPS2012.ExternalIPAddressesNumber"; // Number of External IP addresses + public const string VPS2012_PRIVATE_NETWORK_ENABLED = "VPS2012.PrivateNetworkEnabled"; // Private Network + public const string VPS2012_PRIVATE_IP_ADDRESSES_NUMBER = "VPS2012.PrivateIPAddressesNumber"; // Number of Private IP addresses per VPS + public const string VPS2012_SNAPSHOTS_NUMBER = "VPS2012.SnapshotsNumber"; // Number of Snaphots + public const string VPS2012_START_SHUTDOWN_ALLOWED = "VPS2012.StartShutdownAllowed"; // Allow user to Start, Turn off and Shutdown VPS + public const string VPS2012_PAUSE_RESUME_ALLOWED = "VPS2012.PauseResumeAllowed"; // Allow user to Pause, Resume VPS + public const string VPS2012_REBOOT_ALLOWED = "VPS2012.RebootAllowed"; // Allow user to Reboot 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_BANDWIDTH = "VPS2012.Bandwidth"; // Monthly bandwidth, GB + 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_CPU_NUMBER = "VPSForPC.CpuNumber"; // Number of CPU cores diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs index 0e412bfb..3c80d70e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs @@ -51,6 +51,7 @@ namespace WebsitePanel.EnterpriseServer public const string HostedCRM = "Hosted CRM"; // CRM 4/2011 public const string HostedCRM2013 = "Hosted CRM2013"; // CRM 2013/2015 public const string VPS = "VPS"; + public const string VPS2012 = "VPS2012"; public const string BlackBerry = "BlackBerry"; public const string OCS = "OCS"; public const string VPSForPC = "VPSForPC"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy.cs index 26699aa8..bd5a855b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy.cs @@ -3120,1435 +3120,1435 @@ namespace WebsitePanel.EnterpriseServer { } } - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachinesCompletedEventHandler(object sender, GetVirtualMachinesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachinesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachinesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachineMetaItemsPaged Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachineMetaItemsPaged)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachinesByServiceIdCompletedEventHandler(object sender, GetVirtualMachinesByServiceIdCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachinesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachinesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachine[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachine[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineItemCompletedEventHandler(object sender, GetVirtualMachineItemCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineItemCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineItemCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachine Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachine)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void EvaluateVirtualMachineTemplateCompletedEventHandler(object sender, EvaluateVirtualMachineTemplateCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class EvaluateVirtualMachineTemplateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal EvaluateVirtualMachineTemplateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExternalNetworkDetailsCompletedEventHandler(object sender, GetExternalNetworkDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExternalNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExternalNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public NetworkAdapterDetails Result { - get { - this.RaiseExceptionIfNecessary(); - return ((NetworkAdapterDetails)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPackagePrivateIPAddressesPagedCompletedEventHandler(object sender, GetPackagePrivateIPAddressesPagedCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPackagePrivateIPAddressesPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPackagePrivateIPAddressesPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public PrivateIPAddressesPaged Result { - get { - this.RaiseExceptionIfNecessary(); - return ((PrivateIPAddressesPaged)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPackagePrivateIPAddressesCompletedEventHandler(object sender, GetPackagePrivateIPAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPackagePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPackagePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public PrivateIPAddress[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((PrivateIPAddress[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPrivateNetworkDetailsCompletedEventHandler(object sender, GetPrivateNetworkDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPrivateNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPrivateNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public NetworkAdapterDetails Result { - get { - this.RaiseExceptionIfNecessary(); - return ((NetworkAdapterDetails)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetSpaceUserPermissionsCompletedEventHandler(object sender, GetSpaceUserPermissionsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachinePermission[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachinePermission[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateSpaceUserPermissionsCompletedEventHandler(object sender, UpdateSpaceUserPermissionsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetSpaceAuditLogCompletedEventHandler(object sender, GetSpaceAuditLogCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetSpaceAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetSpaceAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LogRecord[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LogRecord[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineAuditLogCompletedEventHandler(object sender, GetVirtualMachineAuditLogCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LogRecord[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LogRecord[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOperatingSystemTemplatesCompletedEventHandler(object sender, GetOperatingSystemTemplatesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOperatingSystemTemplatesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOperatingSystemTemplatesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LibraryItem[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LibraryItem[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetOperatingSystemTemplatesByServiceIdCompletedEventHandler(object sender, GetOperatingSystemTemplatesByServiceIdCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetOperatingSystemTemplatesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetOperatingSystemTemplatesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LibraryItem[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LibraryItem[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetMaximumCpuCoresNumberCompletedEventHandler(object sender, GetMaximumCpuCoresNumberCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetMaximumCpuCoresNumberCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetMaximumCpuCoresNumberCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetDefaultExportPathCompletedEventHandler(object sender, GetDefaultExportPathCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetDefaultExportPathCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetDefaultExportPathCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateDefaultVirtualMachineCompletedEventHandler(object sender, CreateDefaultVirtualMachineCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateDefaultVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CreateDefaultVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public IntResult Result { - get { - this.RaiseExceptionIfNecessary(); - return ((IntResult)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateVirtualMachineCompletedEventHandler(object sender, CreateVirtualMachineCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CreateVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public IntResult Result { - get { - this.RaiseExceptionIfNecessary(); - return ((IntResult)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void ImportVirtualMachineCompletedEventHandler(object sender, ImportVirtualMachineCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class ImportVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal ImportVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public IntResult Result { - get { - this.RaiseExceptionIfNecessary(); - return ((IntResult)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineThumbnailCompletedEventHandler(object sender, GetVirtualMachineThumbnailCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public byte[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((byte[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineGeneralDetailsCompletedEventHandler(object sender, GetVirtualMachineGeneralDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineGeneralDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineGeneralDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachine Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachine)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineExtendedInfoCompletedEventHandler(object sender, GetVirtualMachineExtendedInfoCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineExtendedInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineExtendedInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachine Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachine)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CancelVirtualMachineJobCompletedEventHandler(object sender, CancelVirtualMachineJobCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CancelVirtualMachineJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CancelVirtualMachineJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateVirtualMachineHostNameCompletedEventHandler(object sender, UpdateVirtualMachineHostNameCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateVirtualMachineHostNameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateVirtualMachineHostNameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void ChangeVirtualMachineStateCompletedEventHandler(object sender, ChangeVirtualMachineStateCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class ChangeVirtualMachineStateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal ChangeVirtualMachineStateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineJobsCompletedEventHandler(object sender, GetVirtualMachineJobsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineJobsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineJobsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ConcreteJob[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ConcreteJob[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void ChangeAdministratorPasswordCompletedEventHandler(object sender, ChangeAdministratorPasswordCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class ChangeAdministratorPasswordCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal ChangeAdministratorPasswordCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateVirtualMachineConfigurationCompletedEventHandler(object sender, UpdateVirtualMachineConfigurationCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateVirtualMachineConfigurationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateVirtualMachineConfigurationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetInsertedDvdDiskCompletedEventHandler(object sender, GetInsertedDvdDiskCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetInsertedDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetInsertedDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LibraryItem Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LibraryItem)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetLibraryDisksCompletedEventHandler(object sender, GetLibraryDisksCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetLibraryDisksCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetLibraryDisksCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public LibraryItem[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((LibraryItem[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void InsertDvdDiskCompletedEventHandler(object sender, InsertDvdDiskCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class InsertDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal InsertDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void EjectDvdDiskCompletedEventHandler(object sender, EjectDvdDiskCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class EjectDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal EjectDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineSnapshotsCompletedEventHandler(object sender, GetVirtualMachineSnapshotsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineSnapshotsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineSnapshotsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachineSnapshot[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachineSnapshot[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetSnapshotCompletedEventHandler(object sender, GetSnapshotCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachineSnapshot Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachineSnapshot)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void CreateSnapshotCompletedEventHandler(object sender, CreateSnapshotCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CreateSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal CreateSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void ApplySnapshotCompletedEventHandler(object sender, ApplySnapshotCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class ApplySnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal ApplySnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void RenameSnapshotCompletedEventHandler(object sender, RenameSnapshotCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class RenameSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal RenameSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteSnapshotCompletedEventHandler(object sender, DeleteSnapshotCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteSnapshotSubtreeCompletedEventHandler(object sender, DeleteSnapshotSubtreeCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteSnapshotSubtreeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteSnapshotSubtreeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetSnapshotThumbnailCompletedEventHandler(object sender, GetSnapshotThumbnailCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetSnapshotThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetSnapshotThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public byte[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((byte[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExternalNetworkAdapterDetailsCompletedEventHandler(object sender, GetExternalNetworkAdapterDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExternalNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExternalNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public NetworkAdapterDetails Result { - get { - this.RaiseExceptionIfNecessary(); - return ((NetworkAdapterDetails)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, AddVirtualMachineExternalIPAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal AddVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SetVirtualMachinePrimaryExternalIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachineExternalIPAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetPrivateNetworkAdapterDetailsCompletedEventHandler(object sender, GetPrivateNetworkAdapterDetailsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetPrivateNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetPrivateNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public NetworkAdapterDetails Result { - get { - this.RaiseExceptionIfNecessary(); - return ((NetworkAdapterDetails)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void AddVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, AddVirtualMachinePrivateIPAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class AddVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal AddVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SetVirtualMachinePrimaryPrivateIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachinePermissionsCompletedEventHandler(object sender, GetVirtualMachinePermissionsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachinePermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachinePermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualMachinePermission[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualMachinePermission[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void UpdateVirtualMachineUserPermissionsCompletedEventHandler(object sender, UpdateVirtualMachineUserPermissionsCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class UpdateVirtualMachineUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal UpdateVirtualMachineUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetExternalSwitchesCompletedEventHandler(object sender, GetExternalSwitchesCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetExternalSwitchesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetExternalSwitchesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public VirtualSwitch[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((VirtualSwitch[])(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DeleteVirtualMachineCompletedEventHandler(object sender, DeleteVirtualMachineCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class DeleteVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal DeleteVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void ReinstallVirtualMachineCompletedEventHandler(object sender, ReinstallVirtualMachineCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class ReinstallVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal ReinstallVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public int Result { - get { - this.RaiseExceptionIfNecessary(); - return ((int)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetVirtualMachineSummaryTextCompletedEventHandler(object sender, GetVirtualMachineSummaryTextCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetVirtualMachineSummaryTextCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetVirtualMachineSummaryTextCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public string Result { - get { - this.RaiseExceptionIfNecessary(); - return ((string)(this.results[0])); - } - } - } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void SendVirtualMachineSummaryLetterCompletedEventHandler(object sender, SendVirtualMachineSummaryLetterCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SendVirtualMachineSummaryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal SendVirtualMachineSummaryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public ResultObject Result { - get { - this.RaiseExceptionIfNecessary(); - return ((ResultObject)(this.results[0])); - } - } - } + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachinesCompletedEventHandler(object sender, GetVirtualMachinesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachinesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachinesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachineMetaItemsPaged Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachineMetaItemsPaged)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachinesByServiceIdCompletedEventHandler(object sender, GetVirtualMachinesByServiceIdCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachinesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachinesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachine[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachine[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineItemCompletedEventHandler(object sender, GetVirtualMachineItemCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineItemCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineItemCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachine Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachine)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void EvaluateVirtualMachineTemplateCompletedEventHandler(object sender, EvaluateVirtualMachineTemplateCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class EvaluateVirtualMachineTemplateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal EvaluateVirtualMachineTemplateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public string Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((string)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetExternalNetworkDetailsCompletedEventHandler(object sender, GetExternalNetworkDetailsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetExternalNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetExternalNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public NetworkAdapterDetails Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((NetworkAdapterDetails)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetPackagePrivateIPAddressesPagedCompletedEventHandler(object sender, GetPackagePrivateIPAddressesPagedCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetPackagePrivateIPAddressesPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetPackagePrivateIPAddressesPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public PrivateIPAddressesPaged Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((PrivateIPAddressesPaged)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetPackagePrivateIPAddressesCompletedEventHandler(object sender, GetPackagePrivateIPAddressesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetPackagePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetPackagePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public PrivateIPAddress[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((PrivateIPAddress[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetPrivateNetworkDetailsCompletedEventHandler(object sender, GetPrivateNetworkDetailsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetPrivateNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetPrivateNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public NetworkAdapterDetails Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((NetworkAdapterDetails)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetSpaceUserPermissionsCompletedEventHandler(object sender, GetSpaceUserPermissionsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachinePermission[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachinePermission[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void UpdateSpaceUserPermissionsCompletedEventHandler(object sender, UpdateSpaceUserPermissionsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class UpdateSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal UpdateSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public int Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((int)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetSpaceAuditLogCompletedEventHandler(object sender, GetSpaceAuditLogCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetSpaceAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetSpaceAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LogRecord[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LogRecord[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineAuditLogCompletedEventHandler(object sender, GetVirtualMachineAuditLogCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LogRecord[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LogRecord[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetOperatingSystemTemplatesCompletedEventHandler(object sender, GetOperatingSystemTemplatesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetOperatingSystemTemplatesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetOperatingSystemTemplatesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LibraryItem[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LibraryItem[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetOperatingSystemTemplatesByServiceIdCompletedEventHandler(object sender, GetOperatingSystemTemplatesByServiceIdCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetOperatingSystemTemplatesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetOperatingSystemTemplatesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LibraryItem[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LibraryItem[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetMaximumCpuCoresNumberCompletedEventHandler(object sender, GetMaximumCpuCoresNumberCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetMaximumCpuCoresNumberCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetMaximumCpuCoresNumberCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public int Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((int)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetDefaultExportPathCompletedEventHandler(object sender, GetDefaultExportPathCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetDefaultExportPathCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetDefaultExportPathCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public string Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((string)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void CreateDefaultVirtualMachineCompletedEventHandler(object sender, CreateDefaultVirtualMachineCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class CreateDefaultVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal CreateDefaultVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public IntResult Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((IntResult)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void CreateVirtualMachineCompletedEventHandler(object sender, CreateVirtualMachineCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class CreateVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal CreateVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public IntResult Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((IntResult)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void ImportVirtualMachineCompletedEventHandler(object sender, ImportVirtualMachineCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class ImportVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal ImportVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public IntResult Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((IntResult)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineThumbnailCompletedEventHandler(object sender, GetVirtualMachineThumbnailCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public byte[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((byte[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineGeneralDetailsCompletedEventHandler(object sender, GetVirtualMachineGeneralDetailsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineGeneralDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineGeneralDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachine Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachine)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineExtendedInfoCompletedEventHandler(object sender, GetVirtualMachineExtendedInfoCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineExtendedInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineExtendedInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachine Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachine)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void CancelVirtualMachineJobCompletedEventHandler(object sender, CancelVirtualMachineJobCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class CancelVirtualMachineJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal CancelVirtualMachineJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public int Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((int)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void UpdateVirtualMachineHostNameCompletedEventHandler(object sender, UpdateVirtualMachineHostNameCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class UpdateVirtualMachineHostNameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal UpdateVirtualMachineHostNameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void ChangeVirtualMachineStateCompletedEventHandler(object sender, ChangeVirtualMachineStateCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class ChangeVirtualMachineStateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal ChangeVirtualMachineStateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineJobsCompletedEventHandler(object sender, GetVirtualMachineJobsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineJobsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineJobsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ConcreteJob[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ConcreteJob[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void ChangeAdministratorPasswordCompletedEventHandler(object sender, ChangeAdministratorPasswordCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class ChangeAdministratorPasswordCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal ChangeAdministratorPasswordCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void UpdateVirtualMachineConfigurationCompletedEventHandler(object sender, UpdateVirtualMachineConfigurationCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class UpdateVirtualMachineConfigurationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal UpdateVirtualMachineConfigurationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetInsertedDvdDiskCompletedEventHandler(object sender, GetInsertedDvdDiskCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetInsertedDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetInsertedDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LibraryItem Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LibraryItem)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetLibraryDisksCompletedEventHandler(object sender, GetLibraryDisksCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetLibraryDisksCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetLibraryDisksCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public LibraryItem[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((LibraryItem[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void InsertDvdDiskCompletedEventHandler(object sender, InsertDvdDiskCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class InsertDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal InsertDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void EjectDvdDiskCompletedEventHandler(object sender, EjectDvdDiskCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class EjectDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal EjectDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineSnapshotsCompletedEventHandler(object sender, GetVirtualMachineSnapshotsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineSnapshotsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineSnapshotsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachineSnapshot[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachineSnapshot[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetSnapshotCompletedEventHandler(object sender, GetSnapshotCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachineSnapshot Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachineSnapshot)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void CreateSnapshotCompletedEventHandler(object sender, CreateSnapshotCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class CreateSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal CreateSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void ApplySnapshotCompletedEventHandler(object sender, ApplySnapshotCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class ApplySnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal ApplySnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void RenameSnapshotCompletedEventHandler(object sender, RenameSnapshotCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class RenameSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal RenameSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void DeleteSnapshotCompletedEventHandler(object sender, DeleteSnapshotCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class DeleteSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal DeleteSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void DeleteSnapshotSubtreeCompletedEventHandler(object sender, DeleteSnapshotSubtreeCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class DeleteSnapshotSubtreeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal DeleteSnapshotSubtreeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetSnapshotThumbnailCompletedEventHandler(object sender, GetSnapshotThumbnailCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetSnapshotThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetSnapshotThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public byte[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((byte[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetExternalNetworkAdapterDetailsCompletedEventHandler(object sender, GetExternalNetworkAdapterDetailsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetExternalNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetExternalNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public NetworkAdapterDetails Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((NetworkAdapterDetails)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void AddVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, AddVirtualMachineExternalIPAddressesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class AddVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal AddVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void SetVirtualMachinePrimaryExternalIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void DeleteVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachineExternalIPAddressesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class DeleteVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal DeleteVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetPrivateNetworkAdapterDetailsCompletedEventHandler(object sender, GetPrivateNetworkAdapterDetailsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetPrivateNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetPrivateNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public NetworkAdapterDetails Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((NetworkAdapterDetails)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void AddVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, AddVirtualMachinePrivateIPAddressesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class AddVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal AddVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void SetVirtualMachinePrimaryPrivateIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void DeleteVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachinePermissionsCompletedEventHandler(object sender, GetVirtualMachinePermissionsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachinePermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachinePermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualMachinePermission[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualMachinePermission[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void UpdateVirtualMachineUserPermissionsCompletedEventHandler(object sender, UpdateVirtualMachineUserPermissionsCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class UpdateVirtualMachineUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal UpdateVirtualMachineUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public int Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((int)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetExternalSwitchesCompletedEventHandler(object sender, GetExternalSwitchesCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetExternalSwitchesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetExternalSwitchesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public VirtualSwitch[] Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((VirtualSwitch[])(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void DeleteVirtualMachineCompletedEventHandler(object sender, DeleteVirtualMachineCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class DeleteVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal DeleteVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void ReinstallVirtualMachineCompletedEventHandler(object sender, ReinstallVirtualMachineCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class ReinstallVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal ReinstallVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public int Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((int)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void GetVirtualMachineSummaryTextCompletedEventHandler(object sender, GetVirtualMachineSummaryTextCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class GetVirtualMachineSummaryTextCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal GetVirtualMachineSummaryTextCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public string Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((string)(this.results[0])); + // } + // } + //} + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //public delegate void SendVirtualMachineSummaryLetterCompletedEventHandler(object sender, SendVirtualMachineSummaryLetterCompletedEventArgs e); + + ///// + //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + //[System.Diagnostics.DebuggerStepThroughAttribute()] + //[System.ComponentModel.DesignerCategoryAttribute("code")] + //public partial class SendVirtualMachineSummaryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + // private object[] results; + + // internal SendVirtualMachineSummaryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + // base(exception, cancelled, userState) { + // this.results = results; + // } + + // /// + // public ResultObject Result { + // get { + // this.RaiseExceptionIfNecessary(); + // return ((ResultObject)(this.results[0])); + // } + // } + //} //Hyper-V Cloud /// diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy2012.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy2012.cs new file mode 100644 index 00000000..45cfcd16 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/VirtualizationServerProxy2012.cs @@ -0,0 +1,4523 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.8000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by wsdl, Version=2.0.50727.42. +// +namespace WebsitePanel.EnterpriseServer { + using System.Xml.Serialization; + using System.Web.Services; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System; + using System.Diagnostics; + using WebsitePanel.Providers; + using WebsitePanel.Providers.Common; + using WebsitePanel.Providers.Virtualization; + using WebsitePanel.Providers.ResultObjects; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="esVirtualizationServer2012Soap", Namespace="http://smbsaas/websitepanel/enterpriseserver")] + [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] + public partial class esVirtualizationServer2012 : Microsoft.Web.Services3.WebServicesClientProtocol { + + private System.Threading.SendOrPostCallback GetVirtualMachinesOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachinesByServiceIdOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineItemOperationCompleted; + + private System.Threading.SendOrPostCallback EvaluateVirtualMachineTemplateOperationCompleted; + + private System.Threading.SendOrPostCallback GetExternalNetworkDetailsOperationCompleted; + + private System.Threading.SendOrPostCallback GetPackagePrivateIPAddressesPagedOperationCompleted; + + private System.Threading.SendOrPostCallback GetPackagePrivateIPAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback GetPrivateNetworkDetailsOperationCompleted; + + private System.Threading.SendOrPostCallback GetSpaceUserPermissionsOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateSpaceUserPermissionsOperationCompleted; + + private System.Threading.SendOrPostCallback GetSpaceAuditLogOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineAuditLogOperationCompleted; + + private System.Threading.SendOrPostCallback GetOperatingSystemTemplatesOperationCompleted; + + private System.Threading.SendOrPostCallback GetOperatingSystemTemplatesByServiceIdOperationCompleted; + + private System.Threading.SendOrPostCallback GetMaximumCpuCoresNumberOperationCompleted; + + private System.Threading.SendOrPostCallback GetDefaultExportPathOperationCompleted; + + private System.Threading.SendOrPostCallback CreateDefaultVirtualMachineOperationCompleted; + + private System.Threading.SendOrPostCallback CreateVirtualMachineOperationCompleted; + + private System.Threading.SendOrPostCallback ImportVirtualMachineOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineThumbnailOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineGeneralDetailsOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineExtendedInfoOperationCompleted; + + private System.Threading.SendOrPostCallback CancelVirtualMachineJobOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateVirtualMachineHostNameOperationCompleted; + + private System.Threading.SendOrPostCallback ChangeVirtualMachineStateOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineJobsOperationCompleted; + + private System.Threading.SendOrPostCallback ChangeAdministratorPasswordOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateVirtualMachineConfigurationOperationCompleted; + + private System.Threading.SendOrPostCallback GetInsertedDvdDiskOperationCompleted; + + private System.Threading.SendOrPostCallback GetLibraryDisksOperationCompleted; + + private System.Threading.SendOrPostCallback InsertDvdDiskOperationCompleted; + + private System.Threading.SendOrPostCallback EjectDvdDiskOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineSnapshotsOperationCompleted; + + private System.Threading.SendOrPostCallback GetSnapshotOperationCompleted; + + private System.Threading.SendOrPostCallback CreateSnapshotOperationCompleted; + + private System.Threading.SendOrPostCallback ApplySnapshotOperationCompleted; + + private System.Threading.SendOrPostCallback RenameSnapshotOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteSnapshotOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteSnapshotSubtreeOperationCompleted; + + private System.Threading.SendOrPostCallback GetSnapshotThumbnailOperationCompleted; + + private System.Threading.SendOrPostCallback GetExternalNetworkAdapterDetailsOperationCompleted; + + private System.Threading.SendOrPostCallback AddVirtualMachineExternalIPAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback SetVirtualMachinePrimaryExternalIPAddressOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteVirtualMachineExternalIPAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback GetPrivateNetworkAdapterDetailsOperationCompleted; + + private System.Threading.SendOrPostCallback AddVirtualMachinePrivateIPAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback SetVirtualMachinePrimaryPrivateIPAddressOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteVirtualMachinePrivateIPAddressesOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachinePermissionsOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateVirtualMachineUserPermissionsOperationCompleted; + + private System.Threading.SendOrPostCallback GetExternalSwitchesOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteVirtualMachineOperationCompleted; + + private System.Threading.SendOrPostCallback ReinstallVirtualMachineOperationCompleted; + + private System.Threading.SendOrPostCallback GetVirtualMachineSummaryTextOperationCompleted; + + private System.Threading.SendOrPostCallback SendVirtualMachineSummaryLetterOperationCompleted; + + /// + public esVirtualizationServer2012() { + this.Url = "http://127.0.0.1:9012/esVirtualizationServer2012.asmx"; + } + + /// + public event GetVirtualMachinesCompletedEventHandler GetVirtualMachinesCompleted; + + /// + public event GetVirtualMachinesByServiceIdCompletedEventHandler GetVirtualMachinesByServiceIdCompleted; + + /// + public event GetVirtualMachineItemCompletedEventHandler GetVirtualMachineItemCompleted; + + /// + public event EvaluateVirtualMachineTemplateCompletedEventHandler EvaluateVirtualMachineTemplateCompleted; + + /// + public event GetExternalNetworkDetailsCompletedEventHandler GetExternalNetworkDetailsCompleted; + + /// + public event GetPackagePrivateIPAddressesPagedCompletedEventHandler GetPackagePrivateIPAddressesPagedCompleted; + + /// + public event GetPackagePrivateIPAddressesCompletedEventHandler GetPackagePrivateIPAddressesCompleted; + + /// + public event GetPrivateNetworkDetailsCompletedEventHandler GetPrivateNetworkDetailsCompleted; + + /// + public event GetSpaceUserPermissionsCompletedEventHandler GetSpaceUserPermissionsCompleted; + + /// + public event UpdateSpaceUserPermissionsCompletedEventHandler UpdateSpaceUserPermissionsCompleted; + + /// + public event GetSpaceAuditLogCompletedEventHandler GetSpaceAuditLogCompleted; + + /// + public event GetVirtualMachineAuditLogCompletedEventHandler GetVirtualMachineAuditLogCompleted; + + /// + public event GetOperatingSystemTemplatesCompletedEventHandler GetOperatingSystemTemplatesCompleted; + + /// + public event GetOperatingSystemTemplatesByServiceIdCompletedEventHandler GetOperatingSystemTemplatesByServiceIdCompleted; + + /// + public event GetMaximumCpuCoresNumberCompletedEventHandler GetMaximumCpuCoresNumberCompleted; + + /// + public event GetDefaultExportPathCompletedEventHandler GetDefaultExportPathCompleted; + + /// + public event CreateDefaultVirtualMachineCompletedEventHandler CreateDefaultVirtualMachineCompleted; + + /// + public event CreateVirtualMachineCompletedEventHandler CreateVirtualMachineCompleted; + + /// + public event ImportVirtualMachineCompletedEventHandler ImportVirtualMachineCompleted; + + /// + public event GetVirtualMachineThumbnailCompletedEventHandler GetVirtualMachineThumbnailCompleted; + + /// + public event GetVirtualMachineGeneralDetailsCompletedEventHandler GetVirtualMachineGeneralDetailsCompleted; + + /// + public event GetVirtualMachineExtendedInfoCompletedEventHandler GetVirtualMachineExtendedInfoCompleted; + + /// + public event CancelVirtualMachineJobCompletedEventHandler CancelVirtualMachineJobCompleted; + + /// + public event UpdateVirtualMachineHostNameCompletedEventHandler UpdateVirtualMachineHostNameCompleted; + + /// + public event ChangeVirtualMachineStateCompletedEventHandler ChangeVirtualMachineStateCompleted; + + /// + public event GetVirtualMachineJobsCompletedEventHandler GetVirtualMachineJobsCompleted; + + /// + public event ChangeAdministratorPasswordCompletedEventHandler ChangeAdministratorPasswordCompleted; + + /// + public event UpdateVirtualMachineConfigurationCompletedEventHandler UpdateVirtualMachineConfigurationCompleted; + + /// + public event GetInsertedDvdDiskCompletedEventHandler GetInsertedDvdDiskCompleted; + + /// + public event GetLibraryDisksCompletedEventHandler GetLibraryDisksCompleted; + + /// + public event InsertDvdDiskCompletedEventHandler InsertDvdDiskCompleted; + + /// + public event EjectDvdDiskCompletedEventHandler EjectDvdDiskCompleted; + + /// + public event GetVirtualMachineSnapshotsCompletedEventHandler GetVirtualMachineSnapshotsCompleted; + + /// + public event GetSnapshotCompletedEventHandler GetSnapshotCompleted; + + /// + public event CreateSnapshotCompletedEventHandler CreateSnapshotCompleted; + + /// + public event ApplySnapshotCompletedEventHandler ApplySnapshotCompleted; + + /// + public event RenameSnapshotCompletedEventHandler RenameSnapshotCompleted; + + /// + public event DeleteSnapshotCompletedEventHandler DeleteSnapshotCompleted; + + /// + public event DeleteSnapshotSubtreeCompletedEventHandler DeleteSnapshotSubtreeCompleted; + + /// + public event GetSnapshotThumbnailCompletedEventHandler GetSnapshotThumbnailCompleted; + + /// + public event GetExternalNetworkAdapterDetailsCompletedEventHandler GetExternalNetworkAdapterDetailsCompleted; + + /// + public event AddVirtualMachineExternalIPAddressesCompletedEventHandler AddVirtualMachineExternalIPAddressesCompleted; + + /// + public event SetVirtualMachinePrimaryExternalIPAddressCompletedEventHandler SetVirtualMachinePrimaryExternalIPAddressCompleted; + + /// + public event DeleteVirtualMachineExternalIPAddressesCompletedEventHandler DeleteVirtualMachineExternalIPAddressesCompleted; + + /// + public event GetPrivateNetworkAdapterDetailsCompletedEventHandler GetPrivateNetworkAdapterDetailsCompleted; + + /// + public event AddVirtualMachinePrivateIPAddressesCompletedEventHandler AddVirtualMachinePrivateIPAddressesCompleted; + + /// + public event SetVirtualMachinePrimaryPrivateIPAddressCompletedEventHandler SetVirtualMachinePrimaryPrivateIPAddressCompleted; + + /// + public event DeleteVirtualMachinePrivateIPAddressesCompletedEventHandler DeleteVirtualMachinePrivateIPAddressesCompleted; + + /// + public event GetVirtualMachinePermissionsCompletedEventHandler GetVirtualMachinePermissionsCompleted; + + /// + public event UpdateVirtualMachineUserPermissionsCompletedEventHandler UpdateVirtualMachineUserPermissionsCompleted; + + /// + public event GetExternalSwitchesCompletedEventHandler GetExternalSwitchesCompleted; + + /// + public event DeleteVirtualMachineCompletedEventHandler DeleteVirtualMachineCompleted; + + /// + public event ReinstallVirtualMachineCompletedEventHandler ReinstallVirtualMachineCompleted; + + /// + public event GetVirtualMachineSummaryTextCompletedEventHandler GetVirtualMachineSummaryTextCompleted; + + /// + public event SendVirtualMachineSummaryLetterCompletedEventHandler SendVirtualMachineSummaryLetterCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachines", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachineMetaItemsPaged GetVirtualMachines(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive) { + object[] results = this.Invoke("GetVirtualMachines", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows, + recursive}); + return ((VirtualMachineMetaItemsPaged)(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachines(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachines", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows, + recursive}, callback, asyncState); + } + + /// + public VirtualMachineMetaItemsPaged EndGetVirtualMachines(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachineMetaItemsPaged)(results[0])); + } + + /// + public void GetVirtualMachinesAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive) { + this.GetVirtualMachinesAsync(packageId, filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive, null); + } + + /// + public void GetVirtualMachinesAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive, object userState) { + if ((this.GetVirtualMachinesOperationCompleted == null)) { + this.GetVirtualMachinesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachinesOperationCompleted); + } + this.InvokeAsync("GetVirtualMachines", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows, + recursive}, this.GetVirtualMachinesOperationCompleted, userState); + } + + private void OnGetVirtualMachinesOperationCompleted(object arg) { + if ((this.GetVirtualMachinesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachinesCompleted(this, new GetVirtualMachinesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachinesByServiceId", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachine[] GetVirtualMachinesByServiceId(int serviceId) { + object[] results = this.Invoke("GetVirtualMachinesByServiceId", new object[] { + serviceId}); + return ((VirtualMachine[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachinesByServiceId(int serviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachinesByServiceId", new object[] { + serviceId}, callback, asyncState); + } + + /// + public VirtualMachine[] EndGetVirtualMachinesByServiceId(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachine[])(results[0])); + } + + /// + public void GetVirtualMachinesByServiceIdAsync(int serviceId) { + this.GetVirtualMachinesByServiceIdAsync(serviceId, null); + } + + /// + public void GetVirtualMachinesByServiceIdAsync(int serviceId, object userState) { + if ((this.GetVirtualMachinesByServiceIdOperationCompleted == null)) { + this.GetVirtualMachinesByServiceIdOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachinesByServiceIdOperationCompleted); + } + this.InvokeAsync("GetVirtualMachinesByServiceId", new object[] { + serviceId}, this.GetVirtualMachinesByServiceIdOperationCompleted, userState); + } + + private void OnGetVirtualMachinesByServiceIdOperationCompleted(object arg) { + if ((this.GetVirtualMachinesByServiceIdCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachinesByServiceIdCompleted(this, new GetVirtualMachinesByServiceIdCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineItem", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachine GetVirtualMachineItem(int itemId) { + object[] results = this.Invoke("GetVirtualMachineItem", new object[] { + itemId}); + return ((VirtualMachine)(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineItem(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineItem", new object[] { + itemId}, callback, asyncState); + } + + /// + public VirtualMachine EndGetVirtualMachineItem(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachine)(results[0])); + } + + /// + public void GetVirtualMachineItemAsync(int itemId) { + this.GetVirtualMachineItemAsync(itemId, null); + } + + /// + public void GetVirtualMachineItemAsync(int itemId, object userState) { + if ((this.GetVirtualMachineItemOperationCompleted == null)) { + this.GetVirtualMachineItemOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineItemOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineItem", new object[] { + itemId}, this.GetVirtualMachineItemOperationCompleted, userState); + } + + private void OnGetVirtualMachineItemOperationCompleted(object arg) { + if ((this.GetVirtualMachineItemCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineItemCompleted(this, new GetVirtualMachineItemCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/EvaluateVirtualMachineTemplate", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string EvaluateVirtualMachineTemplate(int itemId, string template) { + object[] results = this.Invoke("EvaluateVirtualMachineTemplate", new object[] { + itemId, + template}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginEvaluateVirtualMachineTemplate(int itemId, string template, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("EvaluateVirtualMachineTemplate", new object[] { + itemId, + template}, callback, asyncState); + } + + /// + public string EndEvaluateVirtualMachineTemplate(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void EvaluateVirtualMachineTemplateAsync(int itemId, string template) { + this.EvaluateVirtualMachineTemplateAsync(itemId, template, null); + } + + /// + public void EvaluateVirtualMachineTemplateAsync(int itemId, string template, object userState) { + if ((this.EvaluateVirtualMachineTemplateOperationCompleted == null)) { + this.EvaluateVirtualMachineTemplateOperationCompleted = new System.Threading.SendOrPostCallback(this.OnEvaluateVirtualMachineTemplateOperationCompleted); + } + this.InvokeAsync("EvaluateVirtualMachineTemplate", new object[] { + itemId, + template}, this.EvaluateVirtualMachineTemplateOperationCompleted, userState); + } + + private void OnEvaluateVirtualMachineTemplateOperationCompleted(object arg) { + if ((this.EvaluateVirtualMachineTemplateCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.EvaluateVirtualMachineTemplateCompleted(this, new EvaluateVirtualMachineTemplateCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExternalNetworkDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public NetworkAdapterDetails GetExternalNetworkDetails(int packageId) { + object[] results = this.Invoke("GetExternalNetworkDetails", new object[] { + packageId}); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public System.IAsyncResult BeginGetExternalNetworkDetails(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExternalNetworkDetails", new object[] { + packageId}, callback, asyncState); + } + + /// + public NetworkAdapterDetails EndGetExternalNetworkDetails(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public void GetExternalNetworkDetailsAsync(int packageId) { + this.GetExternalNetworkDetailsAsync(packageId, null); + } + + /// + public void GetExternalNetworkDetailsAsync(int packageId, object userState) { + if ((this.GetExternalNetworkDetailsOperationCompleted == null)) { + this.GetExternalNetworkDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExternalNetworkDetailsOperationCompleted); + } + this.InvokeAsync("GetExternalNetworkDetails", new object[] { + packageId}, this.GetExternalNetworkDetailsOperationCompleted, userState); + } + + private void OnGetExternalNetworkDetailsOperationCompleted(object arg) { + if ((this.GetExternalNetworkDetailsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExternalNetworkDetailsCompleted(this, new GetExternalNetworkDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPackagePrivateIPAddressesPaged", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public PrivateIPAddressesPaged GetPackagePrivateIPAddressesPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + object[] results = this.Invoke("GetPackagePrivateIPAddressesPaged", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows}); + return ((PrivateIPAddressesPaged)(results[0])); + } + + /// + public System.IAsyncResult BeginGetPackagePrivateIPAddressesPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPackagePrivateIPAddressesPaged", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows}, callback, asyncState); + } + + /// + public PrivateIPAddressesPaged EndGetPackagePrivateIPAddressesPaged(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((PrivateIPAddressesPaged)(results[0])); + } + + /// + public void GetPackagePrivateIPAddressesPagedAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { + this.GetPackagePrivateIPAddressesPagedAsync(packageId, filterColumn, filterValue, sortColumn, startRow, maximumRows, null); + } + + /// + public void GetPackagePrivateIPAddressesPagedAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) { + if ((this.GetPackagePrivateIPAddressesPagedOperationCompleted == null)) { + this.GetPackagePrivateIPAddressesPagedOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPackagePrivateIPAddressesPagedOperationCompleted); + } + this.InvokeAsync("GetPackagePrivateIPAddressesPaged", new object[] { + packageId, + filterColumn, + filterValue, + sortColumn, + startRow, + maximumRows}, this.GetPackagePrivateIPAddressesPagedOperationCompleted, userState); + } + + private void OnGetPackagePrivateIPAddressesPagedOperationCompleted(object arg) { + if ((this.GetPackagePrivateIPAddressesPagedCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPackagePrivateIPAddressesPagedCompleted(this, new GetPackagePrivateIPAddressesPagedCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPackagePrivateIPAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public PrivateIPAddress[] GetPackagePrivateIPAddresses(int packageId) { + object[] results = this.Invoke("GetPackagePrivateIPAddresses", new object[] { + packageId}); + return ((PrivateIPAddress[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetPackagePrivateIPAddresses(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPackagePrivateIPAddresses", new object[] { + packageId}, callback, asyncState); + } + + /// + public PrivateIPAddress[] EndGetPackagePrivateIPAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((PrivateIPAddress[])(results[0])); + } + + /// + public void GetPackagePrivateIPAddressesAsync(int packageId) { + this.GetPackagePrivateIPAddressesAsync(packageId, null); + } + + /// + public void GetPackagePrivateIPAddressesAsync(int packageId, object userState) { + if ((this.GetPackagePrivateIPAddressesOperationCompleted == null)) { + this.GetPackagePrivateIPAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPackagePrivateIPAddressesOperationCompleted); + } + this.InvokeAsync("GetPackagePrivateIPAddresses", new object[] { + packageId}, this.GetPackagePrivateIPAddressesOperationCompleted, userState); + } + + private void OnGetPackagePrivateIPAddressesOperationCompleted(object arg) { + if ((this.GetPackagePrivateIPAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPackagePrivateIPAddressesCompleted(this, new GetPackagePrivateIPAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPrivateNetworkDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public NetworkAdapterDetails GetPrivateNetworkDetails(int packageId) { + object[] results = this.Invoke("GetPrivateNetworkDetails", new object[] { + packageId}); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public System.IAsyncResult BeginGetPrivateNetworkDetails(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPrivateNetworkDetails", new object[] { + packageId}, callback, asyncState); + } + + /// + public NetworkAdapterDetails EndGetPrivateNetworkDetails(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public void GetPrivateNetworkDetailsAsync(int packageId) { + this.GetPrivateNetworkDetailsAsync(packageId, null); + } + + /// + public void GetPrivateNetworkDetailsAsync(int packageId, object userState) { + if ((this.GetPrivateNetworkDetailsOperationCompleted == null)) { + this.GetPrivateNetworkDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPrivateNetworkDetailsOperationCompleted); + } + this.InvokeAsync("GetPrivateNetworkDetails", new object[] { + packageId}, this.GetPrivateNetworkDetailsOperationCompleted, userState); + } + + private void OnGetPrivateNetworkDetailsOperationCompleted(object arg) { + if ((this.GetPrivateNetworkDetailsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPrivateNetworkDetailsCompleted(this, new GetPrivateNetworkDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetSpaceUserPermissions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachinePermission[] GetSpaceUserPermissions(int packageId) { + object[] results = this.Invoke("GetSpaceUserPermissions", new object[] { + packageId}); + return ((VirtualMachinePermission[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetSpaceUserPermissions(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetSpaceUserPermissions", new object[] { + packageId}, callback, asyncState); + } + + /// + public VirtualMachinePermission[] EndGetSpaceUserPermissions(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachinePermission[])(results[0])); + } + + /// + public void GetSpaceUserPermissionsAsync(int packageId) { + this.GetSpaceUserPermissionsAsync(packageId, null); + } + + /// + public void GetSpaceUserPermissionsAsync(int packageId, object userState) { + if ((this.GetSpaceUserPermissionsOperationCompleted == null)) { + this.GetSpaceUserPermissionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSpaceUserPermissionsOperationCompleted); + } + this.InvokeAsync("GetSpaceUserPermissions", new object[] { + packageId}, this.GetSpaceUserPermissionsOperationCompleted, userState); + } + + private void OnGetSpaceUserPermissionsOperationCompleted(object arg) { + if ((this.GetSpaceUserPermissionsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSpaceUserPermissionsCompleted(this, new GetSpaceUserPermissionsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateSpaceUserPermissions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int UpdateSpaceUserPermissions(int packageId, VirtualMachinePermission[] permissions) { + object[] results = this.Invoke("UpdateSpaceUserPermissions", new object[] { + packageId, + permissions}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginUpdateSpaceUserPermissions(int packageId, VirtualMachinePermission[] permissions, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("UpdateSpaceUserPermissions", new object[] { + packageId, + permissions}, callback, asyncState); + } + + /// + public int EndUpdateSpaceUserPermissions(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void UpdateSpaceUserPermissionsAsync(int packageId, VirtualMachinePermission[] permissions) { + this.UpdateSpaceUserPermissionsAsync(packageId, permissions, null); + } + + /// + public void UpdateSpaceUserPermissionsAsync(int packageId, VirtualMachinePermission[] permissions, object userState) { + if ((this.UpdateSpaceUserPermissionsOperationCompleted == null)) { + this.UpdateSpaceUserPermissionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateSpaceUserPermissionsOperationCompleted); + } + this.InvokeAsync("UpdateSpaceUserPermissions", new object[] { + packageId, + permissions}, this.UpdateSpaceUserPermissionsOperationCompleted, userState); + } + + private void OnUpdateSpaceUserPermissionsOperationCompleted(object arg) { + if ((this.UpdateSpaceUserPermissionsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateSpaceUserPermissionsCompleted(this, new UpdateSpaceUserPermissionsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetSpaceAuditLog", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LogRecord[] GetSpaceAuditLog(int packageId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows) { + object[] results = this.Invoke("GetSpaceAuditLog", new object[] { + packageId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}); + return ((LogRecord[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetSpaceAuditLog(int packageId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetSpaceAuditLog", new object[] { + packageId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}, callback, asyncState); + } + + /// + public LogRecord[] EndGetSpaceAuditLog(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LogRecord[])(results[0])); + } + + /// + public void GetSpaceAuditLogAsync(int packageId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows) { + this.GetSpaceAuditLogAsync(packageId, startPeriod, endPeriod, severity, sortColumn, startRow, maximumRows, null); + } + + /// + public void GetSpaceAuditLogAsync(int packageId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows, object userState) { + if ((this.GetSpaceAuditLogOperationCompleted == null)) { + this.GetSpaceAuditLogOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSpaceAuditLogOperationCompleted); + } + this.InvokeAsync("GetSpaceAuditLog", new object[] { + packageId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}, this.GetSpaceAuditLogOperationCompleted, userState); + } + + private void OnGetSpaceAuditLogOperationCompleted(object arg) { + if ((this.GetSpaceAuditLogCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSpaceAuditLogCompleted(this, new GetSpaceAuditLogCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineAuditLog", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LogRecord[] GetVirtualMachineAuditLog(int itemId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows) { + object[] results = this.Invoke("GetVirtualMachineAuditLog", new object[] { + itemId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}); + return ((LogRecord[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineAuditLog(int itemId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineAuditLog", new object[] { + itemId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}, callback, asyncState); + } + + /// + public LogRecord[] EndGetVirtualMachineAuditLog(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LogRecord[])(results[0])); + } + + /// + public void GetVirtualMachineAuditLogAsync(int itemId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows) { + this.GetVirtualMachineAuditLogAsync(itemId, startPeriod, endPeriod, severity, sortColumn, startRow, maximumRows, null); + } + + /// + public void GetVirtualMachineAuditLogAsync(int itemId, System.DateTime startPeriod, System.DateTime endPeriod, int severity, string sortColumn, int startRow, int maximumRows, object userState) { + if ((this.GetVirtualMachineAuditLogOperationCompleted == null)) { + this.GetVirtualMachineAuditLogOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineAuditLogOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineAuditLog", new object[] { + itemId, + startPeriod, + endPeriod, + severity, + sortColumn, + startRow, + maximumRows}, this.GetVirtualMachineAuditLogOperationCompleted, userState); + } + + private void OnGetVirtualMachineAuditLogOperationCompleted(object arg) { + if ((this.GetVirtualMachineAuditLogCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineAuditLogCompleted(this, new GetVirtualMachineAuditLogCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetOperatingSystemTemplates", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LibraryItem[] GetOperatingSystemTemplates(int packageId) { + object[] results = this.Invoke("GetOperatingSystemTemplates", new object[] { + packageId}); + return ((LibraryItem[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetOperatingSystemTemplates(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetOperatingSystemTemplates", new object[] { + packageId}, callback, asyncState); + } + + /// + public LibraryItem[] EndGetOperatingSystemTemplates(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LibraryItem[])(results[0])); + } + + /// + public void GetOperatingSystemTemplatesAsync(int packageId) { + this.GetOperatingSystemTemplatesAsync(packageId, null); + } + + /// + public void GetOperatingSystemTemplatesAsync(int packageId, object userState) { + if ((this.GetOperatingSystemTemplatesOperationCompleted == null)) { + this.GetOperatingSystemTemplatesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOperatingSystemTemplatesOperationCompleted); + } + this.InvokeAsync("GetOperatingSystemTemplates", new object[] { + packageId}, this.GetOperatingSystemTemplatesOperationCompleted, userState); + } + + private void OnGetOperatingSystemTemplatesOperationCompleted(object arg) { + if ((this.GetOperatingSystemTemplatesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetOperatingSystemTemplatesCompleted(this, new GetOperatingSystemTemplatesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetOperatingSystemTemplatesByService" + + "Id", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LibraryItem[] GetOperatingSystemTemplatesByServiceId(int serviceId) { + object[] results = this.Invoke("GetOperatingSystemTemplatesByServiceId", new object[] { + serviceId}); + return ((LibraryItem[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetOperatingSystemTemplatesByServiceId(int serviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetOperatingSystemTemplatesByServiceId", new object[] { + serviceId}, callback, asyncState); + } + + /// + public LibraryItem[] EndGetOperatingSystemTemplatesByServiceId(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LibraryItem[])(results[0])); + } + + /// + public void GetOperatingSystemTemplatesByServiceIdAsync(int serviceId) { + this.GetOperatingSystemTemplatesByServiceIdAsync(serviceId, null); + } + + /// + public void GetOperatingSystemTemplatesByServiceIdAsync(int serviceId, object userState) { + if ((this.GetOperatingSystemTemplatesByServiceIdOperationCompleted == null)) { + this.GetOperatingSystemTemplatesByServiceIdOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOperatingSystemTemplatesByServiceIdOperationCompleted); + } + this.InvokeAsync("GetOperatingSystemTemplatesByServiceId", new object[] { + serviceId}, this.GetOperatingSystemTemplatesByServiceIdOperationCompleted, userState); + } + + private void OnGetOperatingSystemTemplatesByServiceIdOperationCompleted(object arg) { + if ((this.GetOperatingSystemTemplatesByServiceIdCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetOperatingSystemTemplatesByServiceIdCompleted(this, new GetOperatingSystemTemplatesByServiceIdCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMaximumCpuCoresNumber", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int GetMaximumCpuCoresNumber(int packageId) { + object[] results = this.Invoke("GetMaximumCpuCoresNumber", new object[] { + packageId}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginGetMaximumCpuCoresNumber(int packageId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetMaximumCpuCoresNumber", new object[] { + packageId}, callback, asyncState); + } + + /// + public int EndGetMaximumCpuCoresNumber(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void GetMaximumCpuCoresNumberAsync(int packageId) { + this.GetMaximumCpuCoresNumberAsync(packageId, null); + } + + /// + public void GetMaximumCpuCoresNumberAsync(int packageId, object userState) { + if ((this.GetMaximumCpuCoresNumberOperationCompleted == null)) { + this.GetMaximumCpuCoresNumberOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMaximumCpuCoresNumberOperationCompleted); + } + this.InvokeAsync("GetMaximumCpuCoresNumber", new object[] { + packageId}, this.GetMaximumCpuCoresNumberOperationCompleted, userState); + } + + private void OnGetMaximumCpuCoresNumberOperationCompleted(object arg) { + if ((this.GetMaximumCpuCoresNumberCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetMaximumCpuCoresNumberCompleted(this, new GetMaximumCpuCoresNumberCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDefaultExportPath", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetDefaultExportPath(int itemId) { + object[] results = this.Invoke("GetDefaultExportPath", new object[] { + itemId}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetDefaultExportPath(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetDefaultExportPath", new object[] { + itemId}, callback, asyncState); + } + + /// + public string EndGetDefaultExportPath(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetDefaultExportPathAsync(int itemId) { + this.GetDefaultExportPathAsync(itemId, null); + } + + /// + public void GetDefaultExportPathAsync(int itemId, object userState) { + if ((this.GetDefaultExportPathOperationCompleted == null)) { + this.GetDefaultExportPathOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetDefaultExportPathOperationCompleted); + } + this.InvokeAsync("GetDefaultExportPath", new object[] { + itemId}, this.GetDefaultExportPathOperationCompleted, userState); + } + + private void OnGetDefaultExportPathOperationCompleted(object arg) { + if ((this.GetDefaultExportPathCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetDefaultExportPathCompleted(this, new GetDefaultExportPathCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateDefaultVirtualMachine", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public IntResult CreateDefaultVirtualMachine(int packageId, string hostname, string osTemplate, string password, string summaryLetterEmail) { + object[] results = this.Invoke("CreateDefaultVirtualMachine", new object[] { + packageId, + hostname, + osTemplate, + password, + summaryLetterEmail}); + return ((IntResult)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateDefaultVirtualMachine(int packageId, string hostname, string osTemplate, string password, string summaryLetterEmail, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CreateDefaultVirtualMachine", new object[] { + packageId, + hostname, + osTemplate, + password, + summaryLetterEmail}, callback, asyncState); + } + + /// + public IntResult EndCreateDefaultVirtualMachine(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((IntResult)(results[0])); + } + + /// + public void CreateDefaultVirtualMachineAsync(int packageId, string hostname, string osTemplate, string password, string summaryLetterEmail) { + this.CreateDefaultVirtualMachineAsync(packageId, hostname, osTemplate, password, summaryLetterEmail, null); + } + + /// + public void CreateDefaultVirtualMachineAsync(int packageId, string hostname, string osTemplate, string password, string summaryLetterEmail, object userState) { + if ((this.CreateDefaultVirtualMachineOperationCompleted == null)) { + this.CreateDefaultVirtualMachineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateDefaultVirtualMachineOperationCompleted); + } + this.InvokeAsync("CreateDefaultVirtualMachine", new object[] { + packageId, + hostname, + osTemplate, + password, + summaryLetterEmail}, this.CreateDefaultVirtualMachineOperationCompleted, userState); + } + + private void OnCreateDefaultVirtualMachineOperationCompleted(object arg) { + if ((this.CreateDefaultVirtualMachineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateDefaultVirtualMachineCompleted(this, new CreateDefaultVirtualMachineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateVirtualMachine", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public IntResult CreateVirtualMachine( + int packageId, + string hostname, + string osTemplateFile, + string password, + string summaryLetterEmail, + int generation, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + int externalAddressesNumber, + bool randomExternalAddresses, + int[] externalAddresses, + bool privateNetworkEnabled, + int privateAddressesNumber, + bool randomPrivateAddresses, + string[] privateAddresses) { + object[] results = this.Invoke("CreateVirtualMachine", new object[] { + packageId, + hostname, + osTemplateFile, + password, + summaryLetterEmail, + generation, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + externalAddressesNumber, + randomExternalAddresses, + externalAddresses, + privateNetworkEnabled, + privateAddressesNumber, + randomPrivateAddresses, + privateAddresses}); + return ((IntResult)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateVirtualMachine( + int packageId, + string hostname, + string osTemplateFile, + string password, + string summaryLetterEmail, + int generation, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + int externalAddressesNumber, + bool randomExternalAddresses, + int[] externalAddresses, + bool privateNetworkEnabled, + int privateAddressesNumber, + bool randomPrivateAddresses, + string[] privateAddresses, + System.AsyncCallback callback, + object asyncState) { + return this.BeginInvoke("CreateVirtualMachine", new object[] { + packageId, + hostname, + osTemplateFile, + password, + summaryLetterEmail, + generation, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + externalAddressesNumber, + randomExternalAddresses, + externalAddresses, + privateNetworkEnabled, + privateAddressesNumber, + randomPrivateAddresses, + privateAddresses}, callback, asyncState); + } + + /// + public IntResult EndCreateVirtualMachine(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((IntResult)(results[0])); + } + + /// + public void CreateVirtualMachineAsync( + int packageId, + string hostname, + string osTemplateFile, + string password, + string summaryLetterEmail, + int generation, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + int externalAddressesNumber, + bool randomExternalAddresses, + int[] externalAddresses, + bool privateNetworkEnabled, + int privateAddressesNumber, + bool randomPrivateAddresses, + string[] privateAddresses) { + this.CreateVirtualMachineAsync(packageId, hostname, osTemplateFile, password, summaryLetterEmail, generation, cpuCores, ramMB, hddGB, snapshots, dvdInstalled, bootFromCD, numLock, startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, externalNetworkEnabled, externalAddressesNumber, randomExternalAddresses, externalAddresses, privateNetworkEnabled, privateAddressesNumber, randomPrivateAddresses, privateAddresses, null); + } + + /// + public void CreateVirtualMachineAsync( + int packageId, + string hostname, + string osTemplateFile, + string password, + string summaryLetterEmail, + int generation, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + int externalAddressesNumber, + bool randomExternalAddresses, + int[] externalAddresses, + bool privateNetworkEnabled, + int privateAddressesNumber, + bool randomPrivateAddresses, + string[] privateAddresses, + object userState) { + if ((this.CreateVirtualMachineOperationCompleted == null)) { + this.CreateVirtualMachineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateVirtualMachineOperationCompleted); + } + this.InvokeAsync("CreateVirtualMachine", new object[] { + packageId, + hostname, + osTemplateFile, + password, + summaryLetterEmail, + generation, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + externalAddressesNumber, + randomExternalAddresses, + externalAddresses, + privateNetworkEnabled, + privateAddressesNumber, + randomPrivateAddresses, + privateAddresses}, this.CreateVirtualMachineOperationCompleted, userState); + } + + private void OnCreateVirtualMachineOperationCompleted(object arg) { + if ((this.CreateVirtualMachineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateVirtualMachineCompleted(this, new CreateVirtualMachineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ImportVirtualMachine", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public IntResult ImportVirtualMachine(int packageId, int serviceId, string vmId, string osTemplateFile, string adminPassword, bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, string externalNicMacAddress, int[] externalAddresses, string managementNicMacAddress, int managementAddress) { + object[] results = this.Invoke("ImportVirtualMachine", new object[] { + packageId, + serviceId, + vmId, + osTemplateFile, + adminPassword, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNicMacAddress, + externalAddresses, + managementNicMacAddress, + managementAddress}); + return ((IntResult)(results[0])); + } + + /// + public System.IAsyncResult BeginImportVirtualMachine( + int packageId, + int serviceId, + string vmId, + string osTemplateFile, + string adminPassword, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + string externalNicMacAddress, + int[] externalAddresses, + string managementNicMacAddress, + int managementAddress, + System.AsyncCallback callback, + object asyncState) { + return this.BeginInvoke("ImportVirtualMachine", new object[] { + packageId, + serviceId, + vmId, + osTemplateFile, + adminPassword, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNicMacAddress, + externalAddresses, + managementNicMacAddress, + managementAddress}, callback, asyncState); + } + + /// + public IntResult EndImportVirtualMachine(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((IntResult)(results[0])); + } + + /// + public void ImportVirtualMachineAsync(int packageId, int serviceId, string vmId, string osTemplateFile, string adminPassword, bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, string externalNicMacAddress, int[] externalAddresses, string managementNicMacAddress, int managementAddress) { + this.ImportVirtualMachineAsync(packageId, serviceId, vmId, osTemplateFile, adminPassword, startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, externalNicMacAddress, externalAddresses, managementNicMacAddress, managementAddress, null); + } + + /// + public void ImportVirtualMachineAsync(int packageId, int serviceId, string vmId, string osTemplateFile, string adminPassword, bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, string externalNicMacAddress, int[] externalAddresses, string managementNicMacAddress, int managementAddress, object userState) { + if ((this.ImportVirtualMachineOperationCompleted == null)) { + this.ImportVirtualMachineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnImportVirtualMachineOperationCompleted); + } + this.InvokeAsync("ImportVirtualMachine", new object[] { + packageId, + serviceId, + vmId, + osTemplateFile, + adminPassword, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNicMacAddress, + externalAddresses, + managementNicMacAddress, + managementAddress}, this.ImportVirtualMachineOperationCompleted, userState); + } + + private void OnImportVirtualMachineOperationCompleted(object arg) { + if ((this.ImportVirtualMachineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ImportVirtualMachineCompleted(this, new ImportVirtualMachineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineThumbnail", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + [return: System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] + public byte[] GetVirtualMachineThumbnail(int itemId, ThumbnailSize size) { + object[] results = this.Invoke("GetVirtualMachineThumbnail", new object[] { + itemId, + size}); + return ((byte[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineThumbnail(int itemId, ThumbnailSize size, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineThumbnail", new object[] { + itemId, + size}, callback, asyncState); + } + + /// + public byte[] EndGetVirtualMachineThumbnail(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((byte[])(results[0])); + } + + /// + public void GetVirtualMachineThumbnailAsync(int itemId, ThumbnailSize size) { + this.GetVirtualMachineThumbnailAsync(itemId, size, null); + } + + /// + public void GetVirtualMachineThumbnailAsync(int itemId, ThumbnailSize size, object userState) { + if ((this.GetVirtualMachineThumbnailOperationCompleted == null)) { + this.GetVirtualMachineThumbnailOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineThumbnailOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineThumbnail", new object[] { + itemId, + size}, this.GetVirtualMachineThumbnailOperationCompleted, userState); + } + + private void OnGetVirtualMachineThumbnailOperationCompleted(object arg) { + if ((this.GetVirtualMachineThumbnailCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineThumbnailCompleted(this, new GetVirtualMachineThumbnailCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineGeneralDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachine GetVirtualMachineGeneralDetails(int itemId) { + object[] results = this.Invoke("GetVirtualMachineGeneralDetails", new object[] { + itemId}); + return ((VirtualMachine)(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineGeneralDetails(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineGeneralDetails", new object[] { + itemId}, callback, asyncState); + } + + /// + public VirtualMachine EndGetVirtualMachineGeneralDetails(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachine)(results[0])); + } + + /// + public void GetVirtualMachineGeneralDetailsAsync(int itemId) { + this.GetVirtualMachineGeneralDetailsAsync(itemId, null); + } + + /// + public void GetVirtualMachineGeneralDetailsAsync(int itemId, object userState) { + if ((this.GetVirtualMachineGeneralDetailsOperationCompleted == null)) { + this.GetVirtualMachineGeneralDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineGeneralDetailsOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineGeneralDetails", new object[] { + itemId}, this.GetVirtualMachineGeneralDetailsOperationCompleted, userState); + } + + private void OnGetVirtualMachineGeneralDetailsOperationCompleted(object arg) { + if ((this.GetVirtualMachineGeneralDetailsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineGeneralDetailsCompleted(this, new GetVirtualMachineGeneralDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineExtendedInfo", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachine GetVirtualMachineExtendedInfo(int serviceId, string vmId) { + object[] results = this.Invoke("GetVirtualMachineExtendedInfo", new object[] { + serviceId, + vmId}); + return ((VirtualMachine)(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineExtendedInfo(int serviceId, string vmId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineExtendedInfo", new object[] { + serviceId, + vmId}, callback, asyncState); + } + + /// + public VirtualMachine EndGetVirtualMachineExtendedInfo(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachine)(results[0])); + } + + /// + public void GetVirtualMachineExtendedInfoAsync(int serviceId, string vmId) { + this.GetVirtualMachineExtendedInfoAsync(serviceId, vmId, null); + } + + /// + public void GetVirtualMachineExtendedInfoAsync(int serviceId, string vmId, object userState) { + if ((this.GetVirtualMachineExtendedInfoOperationCompleted == null)) { + this.GetVirtualMachineExtendedInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineExtendedInfoOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineExtendedInfo", new object[] { + serviceId, + vmId}, this.GetVirtualMachineExtendedInfoOperationCompleted, userState); + } + + private void OnGetVirtualMachineExtendedInfoOperationCompleted(object arg) { + if ((this.GetVirtualMachineExtendedInfoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineExtendedInfoCompleted(this, new GetVirtualMachineExtendedInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CancelVirtualMachineJob", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int CancelVirtualMachineJob(string jobId) { + object[] results = this.Invoke("CancelVirtualMachineJob", new object[] { + jobId}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginCancelVirtualMachineJob(string jobId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CancelVirtualMachineJob", new object[] { + jobId}, callback, asyncState); + } + + /// + public int EndCancelVirtualMachineJob(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void CancelVirtualMachineJobAsync(string jobId) { + this.CancelVirtualMachineJobAsync(jobId, null); + } + + /// + public void CancelVirtualMachineJobAsync(string jobId, object userState) { + if ((this.CancelVirtualMachineJobOperationCompleted == null)) { + this.CancelVirtualMachineJobOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCancelVirtualMachineJobOperationCompleted); + } + this.InvokeAsync("CancelVirtualMachineJob", new object[] { + jobId}, this.CancelVirtualMachineJobOperationCompleted, userState); + } + + private void OnCancelVirtualMachineJobOperationCompleted(object arg) { + if ((this.CancelVirtualMachineJobCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CancelVirtualMachineJobCompleted(this, new CancelVirtualMachineJobCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateVirtualMachineHostName", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject UpdateVirtualMachineHostName(int itemId, string hostname, bool updateNetBIOS) { + object[] results = this.Invoke("UpdateVirtualMachineHostName", new object[] { + itemId, + hostname, + updateNetBIOS}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginUpdateVirtualMachineHostName(int itemId, string hostname, bool updateNetBIOS, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("UpdateVirtualMachineHostName", new object[] { + itemId, + hostname, + updateNetBIOS}, callback, asyncState); + } + + /// + public ResultObject EndUpdateVirtualMachineHostName(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void UpdateVirtualMachineHostNameAsync(int itemId, string hostname, bool updateNetBIOS) { + this.UpdateVirtualMachineHostNameAsync(itemId, hostname, updateNetBIOS, null); + } + + /// + public void UpdateVirtualMachineHostNameAsync(int itemId, string hostname, bool updateNetBIOS, object userState) { + if ((this.UpdateVirtualMachineHostNameOperationCompleted == null)) { + this.UpdateVirtualMachineHostNameOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateVirtualMachineHostNameOperationCompleted); + } + this.InvokeAsync("UpdateVirtualMachineHostName", new object[] { + itemId, + hostname, + updateNetBIOS}, this.UpdateVirtualMachineHostNameOperationCompleted, userState); + } + + private void OnUpdateVirtualMachineHostNameOperationCompleted(object arg) { + if ((this.UpdateVirtualMachineHostNameCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateVirtualMachineHostNameCompleted(this, new UpdateVirtualMachineHostNameCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ChangeVirtualMachineState", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject ChangeVirtualMachineState(int itemId, VirtualMachineRequestedState state) { + object[] results = this.Invoke("ChangeVirtualMachineState", new object[] { + itemId, + state}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginChangeVirtualMachineState(int itemId, VirtualMachineRequestedState state, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ChangeVirtualMachineState", new object[] { + itemId, + state}, callback, asyncState); + } + + /// + public ResultObject EndChangeVirtualMachineState(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void ChangeVirtualMachineStateAsync(int itemId, VirtualMachineRequestedState state) { + this.ChangeVirtualMachineStateAsync(itemId, state, null); + } + + /// + public void ChangeVirtualMachineStateAsync(int itemId, VirtualMachineRequestedState state, object userState) { + if ((this.ChangeVirtualMachineStateOperationCompleted == null)) { + this.ChangeVirtualMachineStateOperationCompleted = new System.Threading.SendOrPostCallback(this.OnChangeVirtualMachineStateOperationCompleted); + } + this.InvokeAsync("ChangeVirtualMachineState", new object[] { + itemId, + state}, this.ChangeVirtualMachineStateOperationCompleted, userState); + } + + private void OnChangeVirtualMachineStateOperationCompleted(object arg) { + if ((this.ChangeVirtualMachineStateCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ChangeVirtualMachineStateCompleted(this, new ChangeVirtualMachineStateCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineJobs", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ConcreteJob[] GetVirtualMachineJobs(int itemId) { + object[] results = this.Invoke("GetVirtualMachineJobs", new object[] { + itemId}); + return ((ConcreteJob[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineJobs(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineJobs", new object[] { + itemId}, callback, asyncState); + } + + /// + public ConcreteJob[] EndGetVirtualMachineJobs(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ConcreteJob[])(results[0])); + } + + /// + public void GetVirtualMachineJobsAsync(int itemId) { + this.GetVirtualMachineJobsAsync(itemId, null); + } + + /// + public void GetVirtualMachineJobsAsync(int itemId, object userState) { + if ((this.GetVirtualMachineJobsOperationCompleted == null)) { + this.GetVirtualMachineJobsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineJobsOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineJobs", new object[] { + itemId}, this.GetVirtualMachineJobsOperationCompleted, userState); + } + + private void OnGetVirtualMachineJobsOperationCompleted(object arg) { + if ((this.GetVirtualMachineJobsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineJobsCompleted(this, new GetVirtualMachineJobsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ChangeAdministratorPassword", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject ChangeAdministratorPassword(int itemId, string password) { + object[] results = this.Invoke("ChangeAdministratorPassword", new object[] { + itemId, + password}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginChangeAdministratorPassword(int itemId, string password, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ChangeAdministratorPassword", new object[] { + itemId, + password}, callback, asyncState); + } + + /// + public ResultObject EndChangeAdministratorPassword(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void ChangeAdministratorPasswordAsync(int itemId, string password) { + this.ChangeAdministratorPasswordAsync(itemId, password, null); + } + + /// + public void ChangeAdministratorPasswordAsync(int itemId, string password, object userState) { + if ((this.ChangeAdministratorPasswordOperationCompleted == null)) { + this.ChangeAdministratorPasswordOperationCompleted = new System.Threading.SendOrPostCallback(this.OnChangeAdministratorPasswordOperationCompleted); + } + this.InvokeAsync("ChangeAdministratorPassword", new object[] { + itemId, + password}, this.ChangeAdministratorPasswordOperationCompleted, userState); + } + + private void OnChangeAdministratorPasswordOperationCompleted(object arg) { + if ((this.ChangeAdministratorPasswordCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ChangeAdministratorPasswordCompleted(this, new ChangeAdministratorPasswordCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateVirtualMachineConfiguration", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject UpdateVirtualMachineConfiguration(int itemId, int cpuCores, int ramMB, int hddGB, int snapshots, bool dvdInstalled, bool bootFromCD, bool numLock, bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, bool externalNetworkEnabled, bool privateNetworkEnabled) { + object[] results = this.Invoke("UpdateVirtualMachineConfiguration", new object[] { + itemId, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + privateNetworkEnabled}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginUpdateVirtualMachineConfiguration( + int itemId, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + bool privateNetworkEnabled, + System.AsyncCallback callback, + object asyncState) { + return this.BeginInvoke("UpdateVirtualMachineConfiguration", new object[] { + itemId, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + privateNetworkEnabled}, callback, asyncState); + } + + /// + public ResultObject EndUpdateVirtualMachineConfiguration(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void UpdateVirtualMachineConfigurationAsync(int itemId, int cpuCores, int ramMB, int hddGB, int snapshots, bool dvdInstalled, bool bootFromCD, bool numLock, bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, bool externalNetworkEnabled, bool privateNetworkEnabled) { + this.UpdateVirtualMachineConfigurationAsync(itemId, cpuCores, ramMB, hddGB, snapshots, dvdInstalled, bootFromCD, numLock, startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, externalNetworkEnabled, privateNetworkEnabled, null); + } + + /// + public void UpdateVirtualMachineConfigurationAsync( + int itemId, + int cpuCores, + int ramMB, + int hddGB, + int snapshots, + bool dvdInstalled, + bool bootFromCD, + bool numLock, + bool startShutdownAllowed, + bool pauseResumeAllowed, + bool rebootAllowed, + bool resetAllowed, + bool reinstallAllowed, + bool externalNetworkEnabled, + bool privateNetworkEnabled, + object userState) { + if ((this.UpdateVirtualMachineConfigurationOperationCompleted == null)) { + this.UpdateVirtualMachineConfigurationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateVirtualMachineConfigurationOperationCompleted); + } + this.InvokeAsync("UpdateVirtualMachineConfiguration", new object[] { + itemId, + cpuCores, + ramMB, + hddGB, + snapshots, + dvdInstalled, + bootFromCD, + numLock, + startShutdownAllowed, + pauseResumeAllowed, + rebootAllowed, + resetAllowed, + reinstallAllowed, + externalNetworkEnabled, + privateNetworkEnabled}, this.UpdateVirtualMachineConfigurationOperationCompleted, userState); + } + + private void OnUpdateVirtualMachineConfigurationOperationCompleted(object arg) { + if ((this.UpdateVirtualMachineConfigurationCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateVirtualMachineConfigurationCompleted(this, new UpdateVirtualMachineConfigurationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetInsertedDvdDisk", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LibraryItem GetInsertedDvdDisk(int itemId) { + object[] results = this.Invoke("GetInsertedDvdDisk", new object[] { + itemId}); + return ((LibraryItem)(results[0])); + } + + /// + public System.IAsyncResult BeginGetInsertedDvdDisk(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetInsertedDvdDisk", new object[] { + itemId}, callback, asyncState); + } + + /// + public LibraryItem EndGetInsertedDvdDisk(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LibraryItem)(results[0])); + } + + /// + public void GetInsertedDvdDiskAsync(int itemId) { + this.GetInsertedDvdDiskAsync(itemId, null); + } + + /// + public void GetInsertedDvdDiskAsync(int itemId, object userState) { + if ((this.GetInsertedDvdDiskOperationCompleted == null)) { + this.GetInsertedDvdDiskOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetInsertedDvdDiskOperationCompleted); + } + this.InvokeAsync("GetInsertedDvdDisk", new object[] { + itemId}, this.GetInsertedDvdDiskOperationCompleted, userState); + } + + private void OnGetInsertedDvdDiskOperationCompleted(object arg) { + if ((this.GetInsertedDvdDiskCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetInsertedDvdDiskCompleted(this, new GetInsertedDvdDiskCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetLibraryDisks", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public LibraryItem[] GetLibraryDisks(int itemId) { + object[] results = this.Invoke("GetLibraryDisks", new object[] { + itemId}); + return ((LibraryItem[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetLibraryDisks(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetLibraryDisks", new object[] { + itemId}, callback, asyncState); + } + + /// + public LibraryItem[] EndGetLibraryDisks(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((LibraryItem[])(results[0])); + } + + /// + public void GetLibraryDisksAsync(int itemId) { + this.GetLibraryDisksAsync(itemId, null); + } + + /// + public void GetLibraryDisksAsync(int itemId, object userState) { + if ((this.GetLibraryDisksOperationCompleted == null)) { + this.GetLibraryDisksOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetLibraryDisksOperationCompleted); + } + this.InvokeAsync("GetLibraryDisks", new object[] { + itemId}, this.GetLibraryDisksOperationCompleted, userState); + } + + private void OnGetLibraryDisksOperationCompleted(object arg) { + if ((this.GetLibraryDisksCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetLibraryDisksCompleted(this, new GetLibraryDisksCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/InsertDvdDisk", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject InsertDvdDisk(int itemId, string isoPath) { + object[] results = this.Invoke("InsertDvdDisk", new object[] { + itemId, + isoPath}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginInsertDvdDisk(int itemId, string isoPath, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("InsertDvdDisk", new object[] { + itemId, + isoPath}, callback, asyncState); + } + + /// + public ResultObject EndInsertDvdDisk(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void InsertDvdDiskAsync(int itemId, string isoPath) { + this.InsertDvdDiskAsync(itemId, isoPath, null); + } + + /// + public void InsertDvdDiskAsync(int itemId, string isoPath, object userState) { + if ((this.InsertDvdDiskOperationCompleted == null)) { + this.InsertDvdDiskOperationCompleted = new System.Threading.SendOrPostCallback(this.OnInsertDvdDiskOperationCompleted); + } + this.InvokeAsync("InsertDvdDisk", new object[] { + itemId, + isoPath}, this.InsertDvdDiskOperationCompleted, userState); + } + + private void OnInsertDvdDiskOperationCompleted(object arg) { + if ((this.InsertDvdDiskCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.InsertDvdDiskCompleted(this, new InsertDvdDiskCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/EjectDvdDisk", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject EjectDvdDisk(int itemId) { + object[] results = this.Invoke("EjectDvdDisk", new object[] { + itemId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginEjectDvdDisk(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("EjectDvdDisk", new object[] { + itemId}, callback, asyncState); + } + + /// + public ResultObject EndEjectDvdDisk(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void EjectDvdDiskAsync(int itemId) { + this.EjectDvdDiskAsync(itemId, null); + } + + /// + public void EjectDvdDiskAsync(int itemId, object userState) { + if ((this.EjectDvdDiskOperationCompleted == null)) { + this.EjectDvdDiskOperationCompleted = new System.Threading.SendOrPostCallback(this.OnEjectDvdDiskOperationCompleted); + } + this.InvokeAsync("EjectDvdDisk", new object[] { + itemId}, this.EjectDvdDiskOperationCompleted, userState); + } + + private void OnEjectDvdDiskOperationCompleted(object arg) { + if ((this.EjectDvdDiskCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.EjectDvdDiskCompleted(this, new EjectDvdDiskCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineSnapshots", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachineSnapshot[] GetVirtualMachineSnapshots(int itemId) { + object[] results = this.Invoke("GetVirtualMachineSnapshots", new object[] { + itemId}); + return ((VirtualMachineSnapshot[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineSnapshots(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineSnapshots", new object[] { + itemId}, callback, asyncState); + } + + /// + public VirtualMachineSnapshot[] EndGetVirtualMachineSnapshots(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachineSnapshot[])(results[0])); + } + + /// + public void GetVirtualMachineSnapshotsAsync(int itemId) { + this.GetVirtualMachineSnapshotsAsync(itemId, null); + } + + /// + public void GetVirtualMachineSnapshotsAsync(int itemId, object userState) { + if ((this.GetVirtualMachineSnapshotsOperationCompleted == null)) { + this.GetVirtualMachineSnapshotsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineSnapshotsOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineSnapshots", new object[] { + itemId}, this.GetVirtualMachineSnapshotsOperationCompleted, userState); + } + + private void OnGetVirtualMachineSnapshotsOperationCompleted(object arg) { + if ((this.GetVirtualMachineSnapshotsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineSnapshotsCompleted(this, new GetVirtualMachineSnapshotsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetSnapshot", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachineSnapshot GetSnapshot(int itemId, string snaphostId) { + object[] results = this.Invoke("GetSnapshot", new object[] { + itemId, + snaphostId}); + return ((VirtualMachineSnapshot)(results[0])); + } + + /// + public System.IAsyncResult BeginGetSnapshot(int itemId, string snaphostId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetSnapshot", new object[] { + itemId, + snaphostId}, callback, asyncState); + } + + /// + public VirtualMachineSnapshot EndGetSnapshot(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachineSnapshot)(results[0])); + } + + /// + public void GetSnapshotAsync(int itemId, string snaphostId) { + this.GetSnapshotAsync(itemId, snaphostId, null); + } + + /// + public void GetSnapshotAsync(int itemId, string snaphostId, object userState) { + if ((this.GetSnapshotOperationCompleted == null)) { + this.GetSnapshotOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSnapshotOperationCompleted); + } + this.InvokeAsync("GetSnapshot", new object[] { + itemId, + snaphostId}, this.GetSnapshotOperationCompleted, userState); + } + + private void OnGetSnapshotOperationCompleted(object arg) { + if ((this.GetSnapshotCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSnapshotCompleted(this, new GetSnapshotCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateSnapshot", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject CreateSnapshot(int itemId) { + object[] results = this.Invoke("CreateSnapshot", new object[] { + itemId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginCreateSnapshot(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("CreateSnapshot", new object[] { + itemId}, callback, asyncState); + } + + /// + public ResultObject EndCreateSnapshot(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void CreateSnapshotAsync(int itemId) { + this.CreateSnapshotAsync(itemId, null); + } + + /// + public void CreateSnapshotAsync(int itemId, object userState) { + if ((this.CreateSnapshotOperationCompleted == null)) { + this.CreateSnapshotOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateSnapshotOperationCompleted); + } + this.InvokeAsync("CreateSnapshot", new object[] { + itemId}, this.CreateSnapshotOperationCompleted, userState); + } + + private void OnCreateSnapshotOperationCompleted(object arg) { + if ((this.CreateSnapshotCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CreateSnapshotCompleted(this, new CreateSnapshotCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ApplySnapshot", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject ApplySnapshot(int itemId, string snapshotId) { + object[] results = this.Invoke("ApplySnapshot", new object[] { + itemId, + snapshotId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginApplySnapshot(int itemId, string snapshotId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ApplySnapshot", new object[] { + itemId, + snapshotId}, callback, asyncState); + } + + /// + public ResultObject EndApplySnapshot(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void ApplySnapshotAsync(int itemId, string snapshotId) { + this.ApplySnapshotAsync(itemId, snapshotId, null); + } + + /// + public void ApplySnapshotAsync(int itemId, string snapshotId, object userState) { + if ((this.ApplySnapshotOperationCompleted == null)) { + this.ApplySnapshotOperationCompleted = new System.Threading.SendOrPostCallback(this.OnApplySnapshotOperationCompleted); + } + this.InvokeAsync("ApplySnapshot", new object[] { + itemId, + snapshotId}, this.ApplySnapshotOperationCompleted, userState); + } + + private void OnApplySnapshotOperationCompleted(object arg) { + if ((this.ApplySnapshotCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ApplySnapshotCompleted(this, new ApplySnapshotCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/RenameSnapshot", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject RenameSnapshot(int itemId, string snapshotId, string newName) { + object[] results = this.Invoke("RenameSnapshot", new object[] { + itemId, + snapshotId, + newName}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginRenameSnapshot(int itemId, string snapshotId, string newName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("RenameSnapshot", new object[] { + itemId, + snapshotId, + newName}, callback, asyncState); + } + + /// + public ResultObject EndRenameSnapshot(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void RenameSnapshotAsync(int itemId, string snapshotId, string newName) { + this.RenameSnapshotAsync(itemId, snapshotId, newName, null); + } + + /// + public void RenameSnapshotAsync(int itemId, string snapshotId, string newName, object userState) { + if ((this.RenameSnapshotOperationCompleted == null)) { + this.RenameSnapshotOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRenameSnapshotOperationCompleted); + } + this.InvokeAsync("RenameSnapshot", new object[] { + itemId, + snapshotId, + newName}, this.RenameSnapshotOperationCompleted, userState); + } + + private void OnRenameSnapshotOperationCompleted(object arg) { + if ((this.RenameSnapshotCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RenameSnapshotCompleted(this, new RenameSnapshotCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteSnapshot", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteSnapshot(int itemId, string snapshotId) { + object[] results = this.Invoke("DeleteSnapshot", new object[] { + itemId, + snapshotId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteSnapshot(int itemId, string snapshotId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteSnapshot", new object[] { + itemId, + snapshotId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteSnapshot(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteSnapshotAsync(int itemId, string snapshotId) { + this.DeleteSnapshotAsync(itemId, snapshotId, null); + } + + /// + public void DeleteSnapshotAsync(int itemId, string snapshotId, object userState) { + if ((this.DeleteSnapshotOperationCompleted == null)) { + this.DeleteSnapshotOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteSnapshotOperationCompleted); + } + this.InvokeAsync("DeleteSnapshot", new object[] { + itemId, + snapshotId}, this.DeleteSnapshotOperationCompleted, userState); + } + + private void OnDeleteSnapshotOperationCompleted(object arg) { + if ((this.DeleteSnapshotCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteSnapshotCompleted(this, new DeleteSnapshotCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteSnapshotSubtree", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteSnapshotSubtree(int itemId, string snapshotId) { + object[] results = this.Invoke("DeleteSnapshotSubtree", new object[] { + itemId, + snapshotId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteSnapshotSubtree(int itemId, string snapshotId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteSnapshotSubtree", new object[] { + itemId, + snapshotId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteSnapshotSubtree(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteSnapshotSubtreeAsync(int itemId, string snapshotId) { + this.DeleteSnapshotSubtreeAsync(itemId, snapshotId, null); + } + + /// + public void DeleteSnapshotSubtreeAsync(int itemId, string snapshotId, object userState) { + if ((this.DeleteSnapshotSubtreeOperationCompleted == null)) { + this.DeleteSnapshotSubtreeOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteSnapshotSubtreeOperationCompleted); + } + this.InvokeAsync("DeleteSnapshotSubtree", new object[] { + itemId, + snapshotId}, this.DeleteSnapshotSubtreeOperationCompleted, userState); + } + + private void OnDeleteSnapshotSubtreeOperationCompleted(object arg) { + if ((this.DeleteSnapshotSubtreeCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteSnapshotSubtreeCompleted(this, new DeleteSnapshotSubtreeCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetSnapshotThumbnail", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + [return: System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] + public byte[] GetSnapshotThumbnail(int itemId, string snapshotId, ThumbnailSize size) { + object[] results = this.Invoke("GetSnapshotThumbnail", new object[] { + itemId, + snapshotId, + size}); + return ((byte[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetSnapshotThumbnail(int itemId, string snapshotId, ThumbnailSize size, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetSnapshotThumbnail", new object[] { + itemId, + snapshotId, + size}, callback, asyncState); + } + + /// + public byte[] EndGetSnapshotThumbnail(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((byte[])(results[0])); + } + + /// + public void GetSnapshotThumbnailAsync(int itemId, string snapshotId, ThumbnailSize size) { + this.GetSnapshotThumbnailAsync(itemId, snapshotId, size, null); + } + + /// + public void GetSnapshotThumbnailAsync(int itemId, string snapshotId, ThumbnailSize size, object userState) { + if ((this.GetSnapshotThumbnailOperationCompleted == null)) { + this.GetSnapshotThumbnailOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSnapshotThumbnailOperationCompleted); + } + this.InvokeAsync("GetSnapshotThumbnail", new object[] { + itemId, + snapshotId, + size}, this.GetSnapshotThumbnailOperationCompleted, userState); + } + + private void OnGetSnapshotThumbnailOperationCompleted(object arg) { + if ((this.GetSnapshotThumbnailCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSnapshotThumbnailCompleted(this, new GetSnapshotThumbnailCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExternalNetworkAdapterDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId) { + object[] results = this.Invoke("GetExternalNetworkAdapterDetails", new object[] { + itemId}); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public System.IAsyncResult BeginGetExternalNetworkAdapterDetails(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExternalNetworkAdapterDetails", new object[] { + itemId}, callback, asyncState); + } + + /// + public NetworkAdapterDetails EndGetExternalNetworkAdapterDetails(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public void GetExternalNetworkAdapterDetailsAsync(int itemId) { + this.GetExternalNetworkAdapterDetailsAsync(itemId, null); + } + + /// + public void GetExternalNetworkAdapterDetailsAsync(int itemId, object userState) { + if ((this.GetExternalNetworkAdapterDetailsOperationCompleted == null)) { + this.GetExternalNetworkAdapterDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExternalNetworkAdapterDetailsOperationCompleted); + } + this.InvokeAsync("GetExternalNetworkAdapterDetails", new object[] { + itemId}, this.GetExternalNetworkAdapterDetailsOperationCompleted, userState); + } + + private void OnGetExternalNetworkAdapterDetailsOperationCompleted(object arg) { + if ((this.GetExternalNetworkAdapterDetailsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExternalNetworkAdapterDetailsCompleted(this, new GetExternalNetworkAdapterDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddVirtualMachineExternalIPAddresses" + + "", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject AddVirtualMachineExternalIPAddresses(int itemId, bool selectRandom, int addressesNumber, int[] addressId) { + object[] results = this.Invoke("AddVirtualMachineExternalIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addressId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginAddVirtualMachineExternalIPAddresses(int itemId, bool selectRandom, int addressesNumber, int[] addressId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddVirtualMachineExternalIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addressId}, callback, asyncState); + } + + /// + public ResultObject EndAddVirtualMachineExternalIPAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void AddVirtualMachineExternalIPAddressesAsync(int itemId, bool selectRandom, int addressesNumber, int[] addressId) { + this.AddVirtualMachineExternalIPAddressesAsync(itemId, selectRandom, addressesNumber, addressId, null); + } + + /// + public void AddVirtualMachineExternalIPAddressesAsync(int itemId, bool selectRandom, int addressesNumber, int[] addressId, object userState) { + if ((this.AddVirtualMachineExternalIPAddressesOperationCompleted == null)) { + this.AddVirtualMachineExternalIPAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddVirtualMachineExternalIPAddressesOperationCompleted); + } + this.InvokeAsync("AddVirtualMachineExternalIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addressId}, this.AddVirtualMachineExternalIPAddressesOperationCompleted, userState); + } + + private void OnAddVirtualMachineExternalIPAddressesOperationCompleted(object arg) { + if ((this.AddVirtualMachineExternalIPAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddVirtualMachineExternalIPAddressesCompleted(this, new AddVirtualMachineExternalIPAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetVirtualMachinePrimaryExternalIPAd" + + "dress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject SetVirtualMachinePrimaryExternalIPAddress(int itemId, int addressId) { + object[] results = this.Invoke("SetVirtualMachinePrimaryExternalIPAddress", new object[] { + itemId, + addressId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginSetVirtualMachinePrimaryExternalIPAddress(int itemId, int addressId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetVirtualMachinePrimaryExternalIPAddress", new object[] { + itemId, + addressId}, callback, asyncState); + } + + /// + public ResultObject EndSetVirtualMachinePrimaryExternalIPAddress(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void SetVirtualMachinePrimaryExternalIPAddressAsync(int itemId, int addressId) { + this.SetVirtualMachinePrimaryExternalIPAddressAsync(itemId, addressId, null); + } + + /// + public void SetVirtualMachinePrimaryExternalIPAddressAsync(int itemId, int addressId, object userState) { + if ((this.SetVirtualMachinePrimaryExternalIPAddressOperationCompleted == null)) { + this.SetVirtualMachinePrimaryExternalIPAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetVirtualMachinePrimaryExternalIPAddressOperationCompleted); + } + this.InvokeAsync("SetVirtualMachinePrimaryExternalIPAddress", new object[] { + itemId, + addressId}, this.SetVirtualMachinePrimaryExternalIPAddressOperationCompleted, userState); + } + + private void OnSetVirtualMachinePrimaryExternalIPAddressOperationCompleted(object arg) { + if ((this.SetVirtualMachinePrimaryExternalIPAddressCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetVirtualMachinePrimaryExternalIPAddressCompleted(this, new SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteVirtualMachineExternalIPAddres" + + "ses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteVirtualMachineExternalIPAddresses(int itemId, int[] addressId) { + object[] results = this.Invoke("DeleteVirtualMachineExternalIPAddresses", new object[] { + itemId, + addressId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteVirtualMachineExternalIPAddresses(int itemId, int[] addressId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteVirtualMachineExternalIPAddresses", new object[] { + itemId, + addressId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteVirtualMachineExternalIPAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteVirtualMachineExternalIPAddressesAsync(int itemId, int[] addressId) { + this.DeleteVirtualMachineExternalIPAddressesAsync(itemId, addressId, null); + } + + /// + public void DeleteVirtualMachineExternalIPAddressesAsync(int itemId, int[] addressId, object userState) { + if ((this.DeleteVirtualMachineExternalIPAddressesOperationCompleted == null)) { + this.DeleteVirtualMachineExternalIPAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteVirtualMachineExternalIPAddressesOperationCompleted); + } + this.InvokeAsync("DeleteVirtualMachineExternalIPAddresses", new object[] { + itemId, + addressId}, this.DeleteVirtualMachineExternalIPAddressesOperationCompleted, userState); + } + + private void OnDeleteVirtualMachineExternalIPAddressesOperationCompleted(object arg) { + if ((this.DeleteVirtualMachineExternalIPAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteVirtualMachineExternalIPAddressesCompleted(this, new DeleteVirtualMachineExternalIPAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPrivateNetworkAdapterDetails", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public NetworkAdapterDetails GetPrivateNetworkAdapterDetails(int itemId) { + object[] results = this.Invoke("GetPrivateNetworkAdapterDetails", new object[] { + itemId}); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public System.IAsyncResult BeginGetPrivateNetworkAdapterDetails(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPrivateNetworkAdapterDetails", new object[] { + itemId}, callback, asyncState); + } + + /// + public NetworkAdapterDetails EndGetPrivateNetworkAdapterDetails(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((NetworkAdapterDetails)(results[0])); + } + + /// + public void GetPrivateNetworkAdapterDetailsAsync(int itemId) { + this.GetPrivateNetworkAdapterDetailsAsync(itemId, null); + } + + /// + public void GetPrivateNetworkAdapterDetailsAsync(int itemId, object userState) { + if ((this.GetPrivateNetworkAdapterDetailsOperationCompleted == null)) { + this.GetPrivateNetworkAdapterDetailsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPrivateNetworkAdapterDetailsOperationCompleted); + } + this.InvokeAsync("GetPrivateNetworkAdapterDetails", new object[] { + itemId}, this.GetPrivateNetworkAdapterDetailsOperationCompleted, userState); + } + + private void OnGetPrivateNetworkAdapterDetailsOperationCompleted(object arg) { + if ((this.GetPrivateNetworkAdapterDetailsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPrivateNetworkAdapterDetailsCompleted(this, new GetPrivateNetworkAdapterDetailsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/AddVirtualMachinePrivateIPAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject AddVirtualMachinePrivateIPAddresses(int itemId, bool selectRandom, int addressesNumber, string[] addresses) { + object[] results = this.Invoke("AddVirtualMachinePrivateIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addresses}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginAddVirtualMachinePrivateIPAddresses(int itemId, bool selectRandom, int addressesNumber, string[] addresses, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("AddVirtualMachinePrivateIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addresses}, callback, asyncState); + } + + /// + public ResultObject EndAddVirtualMachinePrivateIPAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void AddVirtualMachinePrivateIPAddressesAsync(int itemId, bool selectRandom, int addressesNumber, string[] addresses) { + this.AddVirtualMachinePrivateIPAddressesAsync(itemId, selectRandom, addressesNumber, addresses, null); + } + + /// + public void AddVirtualMachinePrivateIPAddressesAsync(int itemId, bool selectRandom, int addressesNumber, string[] addresses, object userState) { + if ((this.AddVirtualMachinePrivateIPAddressesOperationCompleted == null)) { + this.AddVirtualMachinePrivateIPAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddVirtualMachinePrivateIPAddressesOperationCompleted); + } + this.InvokeAsync("AddVirtualMachinePrivateIPAddresses", new object[] { + itemId, + selectRandom, + addressesNumber, + addresses}, this.AddVirtualMachinePrivateIPAddressesOperationCompleted, userState); + } + + private void OnAddVirtualMachinePrivateIPAddressesOperationCompleted(object arg) { + if ((this.AddVirtualMachinePrivateIPAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddVirtualMachinePrivateIPAddressesCompleted(this, new AddVirtualMachinePrivateIPAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetVirtualMachinePrimaryPrivateIPAdd" + + "ress", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject SetVirtualMachinePrimaryPrivateIPAddress(int itemId, int addressId) { + object[] results = this.Invoke("SetVirtualMachinePrimaryPrivateIPAddress", new object[] { + itemId, + addressId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginSetVirtualMachinePrimaryPrivateIPAddress(int itemId, int addressId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SetVirtualMachinePrimaryPrivateIPAddress", new object[] { + itemId, + addressId}, callback, asyncState); + } + + /// + public ResultObject EndSetVirtualMachinePrimaryPrivateIPAddress(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void SetVirtualMachinePrimaryPrivateIPAddressAsync(int itemId, int addressId) { + this.SetVirtualMachinePrimaryPrivateIPAddressAsync(itemId, addressId, null); + } + + /// + public void SetVirtualMachinePrimaryPrivateIPAddressAsync(int itemId, int addressId, object userState) { + if ((this.SetVirtualMachinePrimaryPrivateIPAddressOperationCompleted == null)) { + this.SetVirtualMachinePrimaryPrivateIPAddressOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetVirtualMachinePrimaryPrivateIPAddressOperationCompleted); + } + this.InvokeAsync("SetVirtualMachinePrimaryPrivateIPAddress", new object[] { + itemId, + addressId}, this.SetVirtualMachinePrimaryPrivateIPAddressOperationCompleted, userState); + } + + private void OnSetVirtualMachinePrimaryPrivateIPAddressOperationCompleted(object arg) { + if ((this.SetVirtualMachinePrimaryPrivateIPAddressCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SetVirtualMachinePrimaryPrivateIPAddressCompleted(this, new SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteVirtualMachinePrivateIPAddress" + + "es", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteVirtualMachinePrivateIPAddresses(int itemId, int[] addressId) { + object[] results = this.Invoke("DeleteVirtualMachinePrivateIPAddresses", new object[] { + itemId, + addressId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteVirtualMachinePrivateIPAddresses(int itemId, int[] addressId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteVirtualMachinePrivateIPAddresses", new object[] { + itemId, + addressId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteVirtualMachinePrivateIPAddresses(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteVirtualMachinePrivateIPAddressesAsync(int itemId, int[] addressId) { + this.DeleteVirtualMachinePrivateIPAddressesAsync(itemId, addressId, null); + } + + /// + public void DeleteVirtualMachinePrivateIPAddressesAsync(int itemId, int[] addressId, object userState) { + if ((this.DeleteVirtualMachinePrivateIPAddressesOperationCompleted == null)) { + this.DeleteVirtualMachinePrivateIPAddressesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteVirtualMachinePrivateIPAddressesOperationCompleted); + } + this.InvokeAsync("DeleteVirtualMachinePrivateIPAddresses", new object[] { + itemId, + addressId}, this.DeleteVirtualMachinePrivateIPAddressesOperationCompleted, userState); + } + + private void OnDeleteVirtualMachinePrivateIPAddressesOperationCompleted(object arg) { + if ((this.DeleteVirtualMachinePrivateIPAddressesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteVirtualMachinePrivateIPAddressesCompleted(this, new DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachinePermissions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualMachinePermission[] GetVirtualMachinePermissions(int itemId) { + object[] results = this.Invoke("GetVirtualMachinePermissions", new object[] { + itemId}); + return ((VirtualMachinePermission[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachinePermissions(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachinePermissions", new object[] { + itemId}, callback, asyncState); + } + + /// + public VirtualMachinePermission[] EndGetVirtualMachinePermissions(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualMachinePermission[])(results[0])); + } + + /// + public void GetVirtualMachinePermissionsAsync(int itemId) { + this.GetVirtualMachinePermissionsAsync(itemId, null); + } + + /// + public void GetVirtualMachinePermissionsAsync(int itemId, object userState) { + if ((this.GetVirtualMachinePermissionsOperationCompleted == null)) { + this.GetVirtualMachinePermissionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachinePermissionsOperationCompleted); + } + this.InvokeAsync("GetVirtualMachinePermissions", new object[] { + itemId}, this.GetVirtualMachinePermissionsOperationCompleted, userState); + } + + private void OnGetVirtualMachinePermissionsOperationCompleted(object arg) { + if ((this.GetVirtualMachinePermissionsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachinePermissionsCompleted(this, new GetVirtualMachinePermissionsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UpdateVirtualMachineUserPermissions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int UpdateVirtualMachineUserPermissions(int itemId, VirtualMachinePermission[] permissions) { + object[] results = this.Invoke("UpdateVirtualMachineUserPermissions", new object[] { + itemId, + permissions}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginUpdateVirtualMachineUserPermissions(int itemId, VirtualMachinePermission[] permissions, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("UpdateVirtualMachineUserPermissions", new object[] { + itemId, + permissions}, callback, asyncState); + } + + /// + public int EndUpdateVirtualMachineUserPermissions(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void UpdateVirtualMachineUserPermissionsAsync(int itemId, VirtualMachinePermission[] permissions) { + this.UpdateVirtualMachineUserPermissionsAsync(itemId, permissions, null); + } + + /// + public void UpdateVirtualMachineUserPermissionsAsync(int itemId, VirtualMachinePermission[] permissions, object userState) { + if ((this.UpdateVirtualMachineUserPermissionsOperationCompleted == null)) { + this.UpdateVirtualMachineUserPermissionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateVirtualMachineUserPermissionsOperationCompleted); + } + this.InvokeAsync("UpdateVirtualMachineUserPermissions", new object[] { + itemId, + permissions}, this.UpdateVirtualMachineUserPermissionsOperationCompleted, userState); + } + + private void OnUpdateVirtualMachineUserPermissionsOperationCompleted(object arg) { + if ((this.UpdateVirtualMachineUserPermissionsCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateVirtualMachineUserPermissionsCompleted(this, new UpdateVirtualMachineUserPermissionsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetExternalSwitches", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public VirtualSwitch[] GetExternalSwitches(int serviceId, string computerName) { + object[] results = this.Invoke("GetExternalSwitches", new object[] { + serviceId, + computerName}); + return ((VirtualSwitch[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetExternalSwitches(int serviceId, string computerName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExternalSwitches", new object[] { + serviceId, + computerName}, callback, asyncState); + } + + /// + public VirtualSwitch[] EndGetExternalSwitches(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((VirtualSwitch[])(results[0])); + } + + /// + public void GetExternalSwitchesAsync(int serviceId, string computerName) { + this.GetExternalSwitchesAsync(serviceId, computerName, null); + } + + /// + public void GetExternalSwitchesAsync(int serviceId, string computerName, object userState) { + if ((this.GetExternalSwitchesOperationCompleted == null)) { + this.GetExternalSwitchesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExternalSwitchesOperationCompleted); + } + this.InvokeAsync("GetExternalSwitches", new object[] { + serviceId, + computerName}, this.GetExternalSwitchesOperationCompleted, userState); + } + + private void OnGetExternalSwitchesOperationCompleted(object arg) { + if ((this.GetExternalSwitchesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExternalSwitchesCompleted(this, new GetExternalSwitchesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DeleteVirtualMachine", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteVirtualMachine(int itemId, bool saveFiles, bool exportVps, string exportPath) { + object[] results = this.Invoke("DeleteVirtualMachine", new object[] { + itemId, + saveFiles, + exportVps, + exportPath}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteVirtualMachine(int itemId, bool saveFiles, bool exportVps, string exportPath, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("DeleteVirtualMachine", new object[] { + itemId, + saveFiles, + exportVps, + exportPath}, callback, asyncState); + } + + /// + public ResultObject EndDeleteVirtualMachine(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteVirtualMachineAsync(int itemId, bool saveFiles, bool exportVps, string exportPath) { + this.DeleteVirtualMachineAsync(itemId, saveFiles, exportVps, exportPath, null); + } + + /// + public void DeleteVirtualMachineAsync(int itemId, bool saveFiles, bool exportVps, string exportPath, object userState) { + if ((this.DeleteVirtualMachineOperationCompleted == null)) { + this.DeleteVirtualMachineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteVirtualMachineOperationCompleted); + } + this.InvokeAsync("DeleteVirtualMachine", new object[] { + itemId, + saveFiles, + exportVps, + exportPath}, this.DeleteVirtualMachineOperationCompleted, userState); + } + + private void OnDeleteVirtualMachineOperationCompleted(object arg) { + if ((this.DeleteVirtualMachineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteVirtualMachineCompleted(this, new DeleteVirtualMachineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ReinstallVirtualMachine", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int ReinstallVirtualMachine(int itemId, string adminPassword, bool preserveVirtualDiskFiles, bool saveVirtualDisk, bool exportVps, string exportPath) { + object[] results = this.Invoke("ReinstallVirtualMachine", new object[] { + itemId, + adminPassword, + preserveVirtualDiskFiles, + saveVirtualDisk, + exportVps, + exportPath}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginReinstallVirtualMachine(int itemId, string adminPassword, bool preserveVirtualDiskFiles, bool saveVirtualDisk, bool exportVps, string exportPath, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ReinstallVirtualMachine", new object[] { + itemId, + adminPassword, + preserveVirtualDiskFiles, + saveVirtualDisk, + exportVps, + exportPath}, callback, asyncState); + } + + /// + public int EndReinstallVirtualMachine(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void ReinstallVirtualMachineAsync(int itemId, string adminPassword, bool preserveVirtualDiskFiles, bool saveVirtualDisk, bool exportVps, string exportPath) { + this.ReinstallVirtualMachineAsync(itemId, adminPassword, preserveVirtualDiskFiles, saveVirtualDisk, exportVps, exportPath, null); + } + + /// + public void ReinstallVirtualMachineAsync(int itemId, string adminPassword, bool preserveVirtualDiskFiles, bool saveVirtualDisk, bool exportVps, string exportPath, object userState) { + if ((this.ReinstallVirtualMachineOperationCompleted == null)) { + this.ReinstallVirtualMachineOperationCompleted = new System.Threading.SendOrPostCallback(this.OnReinstallVirtualMachineOperationCompleted); + } + this.InvokeAsync("ReinstallVirtualMachine", new object[] { + itemId, + adminPassword, + preserveVirtualDiskFiles, + saveVirtualDisk, + exportVps, + exportPath}, this.ReinstallVirtualMachineOperationCompleted, userState); + } + + private void OnReinstallVirtualMachineOperationCompleted(object arg) { + if ((this.ReinstallVirtualMachineCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ReinstallVirtualMachineCompleted(this, new ReinstallVirtualMachineCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachineSummaryText", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string GetVirtualMachineSummaryText(int itemId) { + object[] results = this.Invoke("GetVirtualMachineSummaryText", new object[] { + itemId}); + return ((string)(results[0])); + } + + /// + public System.IAsyncResult BeginGetVirtualMachineSummaryText(int itemId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetVirtualMachineSummaryText", new object[] { + itemId}, callback, asyncState); + } + + /// + public string EndGetVirtualMachineSummaryText(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((string)(results[0])); + } + + /// + public void GetVirtualMachineSummaryTextAsync(int itemId) { + this.GetVirtualMachineSummaryTextAsync(itemId, null); + } + + /// + public void GetVirtualMachineSummaryTextAsync(int itemId, object userState) { + if ((this.GetVirtualMachineSummaryTextOperationCompleted == null)) { + this.GetVirtualMachineSummaryTextOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetVirtualMachineSummaryTextOperationCompleted); + } + this.InvokeAsync("GetVirtualMachineSummaryText", new object[] { + itemId}, this.GetVirtualMachineSummaryTextOperationCompleted, userState); + } + + private void OnGetVirtualMachineSummaryTextOperationCompleted(object arg) { + if ((this.GetVirtualMachineSummaryTextCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetVirtualMachineSummaryTextCompleted(this, new GetVirtualMachineSummaryTextCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SendVirtualMachineSummaryLetter", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject SendVirtualMachineSummaryLetter(int itemId, string to, string bcc) { + object[] results = this.Invoke("SendVirtualMachineSummaryLetter", new object[] { + itemId, + to, + bcc}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginSendVirtualMachineSummaryLetter(int itemId, string to, string bcc, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SendVirtualMachineSummaryLetter", new object[] { + itemId, + to, + bcc}, callback, asyncState); + } + + /// + public ResultObject EndSendVirtualMachineSummaryLetter(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void SendVirtualMachineSummaryLetterAsync(int itemId, string to, string bcc) { + this.SendVirtualMachineSummaryLetterAsync(itemId, to, bcc, null); + } + + /// + public void SendVirtualMachineSummaryLetterAsync(int itemId, string to, string bcc, object userState) { + if ((this.SendVirtualMachineSummaryLetterOperationCompleted == null)) { + this.SendVirtualMachineSummaryLetterOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendVirtualMachineSummaryLetterOperationCompleted); + } + this.InvokeAsync("SendVirtualMachineSummaryLetter", new object[] { + itemId, + to, + bcc}, this.SendVirtualMachineSummaryLetterOperationCompleted, userState); + } + + private void OnSendVirtualMachineSummaryLetterOperationCompleted(object arg) { + if ((this.SendVirtualMachineSummaryLetterCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SendVirtualMachineSummaryLetterCompleted(this, new SendVirtualMachineSummaryLetterCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachinesCompletedEventHandler(object sender, GetVirtualMachinesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachinesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachinesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachineMetaItemsPaged Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachineMetaItemsPaged)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachinesByServiceIdCompletedEventHandler(object sender, GetVirtualMachinesByServiceIdCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachinesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachinesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachine[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachine[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineItemCompletedEventHandler(object sender, GetVirtualMachineItemCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineItemCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineItemCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachine Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachine)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void EvaluateVirtualMachineTemplateCompletedEventHandler(object sender, EvaluateVirtualMachineTemplateCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EvaluateVirtualMachineTemplateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal EvaluateVirtualMachineTemplateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetExternalNetworkDetailsCompletedEventHandler(object sender, GetExternalNetworkDetailsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExternalNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExternalNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public NetworkAdapterDetails Result { + get { + this.RaiseExceptionIfNecessary(); + return ((NetworkAdapterDetails)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPackagePrivateIPAddressesPagedCompletedEventHandler(object sender, GetPackagePrivateIPAddressesPagedCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPackagePrivateIPAddressesPagedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPackagePrivateIPAddressesPagedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public PrivateIPAddressesPaged Result { + get { + this.RaiseExceptionIfNecessary(); + return ((PrivateIPAddressesPaged)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPackagePrivateIPAddressesCompletedEventHandler(object sender, GetPackagePrivateIPAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPackagePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPackagePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public PrivateIPAddress[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((PrivateIPAddress[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPrivateNetworkDetailsCompletedEventHandler(object sender, GetPrivateNetworkDetailsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPrivateNetworkDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPrivateNetworkDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public NetworkAdapterDetails Result { + get { + this.RaiseExceptionIfNecessary(); + return ((NetworkAdapterDetails)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetSpaceUserPermissionsCompletedEventHandler(object sender, GetSpaceUserPermissionsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachinePermission[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachinePermission[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void UpdateSpaceUserPermissionsCompletedEventHandler(object sender, UpdateSpaceUserPermissionsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UpdateSpaceUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UpdateSpaceUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetSpaceAuditLogCompletedEventHandler(object sender, GetSpaceAuditLogCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSpaceAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSpaceAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LogRecord[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LogRecord[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineAuditLogCompletedEventHandler(object sender, GetVirtualMachineAuditLogCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineAuditLogCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineAuditLogCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LogRecord[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LogRecord[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetOperatingSystemTemplatesCompletedEventHandler(object sender, GetOperatingSystemTemplatesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOperatingSystemTemplatesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetOperatingSystemTemplatesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LibraryItem[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LibraryItem[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetOperatingSystemTemplatesByServiceIdCompletedEventHandler(object sender, GetOperatingSystemTemplatesByServiceIdCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOperatingSystemTemplatesByServiceIdCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetOperatingSystemTemplatesByServiceIdCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LibraryItem[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LibraryItem[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetMaximumCpuCoresNumberCompletedEventHandler(object sender, GetMaximumCpuCoresNumberCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetMaximumCpuCoresNumberCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetMaximumCpuCoresNumberCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetDefaultExportPathCompletedEventHandler(object sender, GetDefaultExportPathCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetDefaultExportPathCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetDefaultExportPathCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateDefaultVirtualMachineCompletedEventHandler(object sender, CreateDefaultVirtualMachineCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateDefaultVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateDefaultVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public IntResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((IntResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateVirtualMachineCompletedEventHandler(object sender, CreateVirtualMachineCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public IntResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((IntResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ImportVirtualMachineCompletedEventHandler(object sender, ImportVirtualMachineCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ImportVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ImportVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public IntResult Result { + get { + this.RaiseExceptionIfNecessary(); + return ((IntResult)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineThumbnailCompletedEventHandler(object sender, GetVirtualMachineThumbnailCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public byte[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((byte[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineGeneralDetailsCompletedEventHandler(object sender, GetVirtualMachineGeneralDetailsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineGeneralDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineGeneralDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachine Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachine)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineExtendedInfoCompletedEventHandler(object sender, GetVirtualMachineExtendedInfoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineExtendedInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineExtendedInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachine Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachine)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CancelVirtualMachineJobCompletedEventHandler(object sender, CancelVirtualMachineJobCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CancelVirtualMachineJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CancelVirtualMachineJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void UpdateVirtualMachineHostNameCompletedEventHandler(object sender, UpdateVirtualMachineHostNameCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UpdateVirtualMachineHostNameCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UpdateVirtualMachineHostNameCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ChangeVirtualMachineStateCompletedEventHandler(object sender, ChangeVirtualMachineStateCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ChangeVirtualMachineStateCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ChangeVirtualMachineStateCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineJobsCompletedEventHandler(object sender, GetVirtualMachineJobsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineJobsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineJobsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ConcreteJob[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ConcreteJob[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ChangeAdministratorPasswordCompletedEventHandler(object sender, ChangeAdministratorPasswordCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ChangeAdministratorPasswordCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ChangeAdministratorPasswordCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void UpdateVirtualMachineConfigurationCompletedEventHandler(object sender, UpdateVirtualMachineConfigurationCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UpdateVirtualMachineConfigurationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UpdateVirtualMachineConfigurationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetInsertedDvdDiskCompletedEventHandler(object sender, GetInsertedDvdDiskCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetInsertedDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetInsertedDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LibraryItem Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LibraryItem)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetLibraryDisksCompletedEventHandler(object sender, GetLibraryDisksCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetLibraryDisksCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetLibraryDisksCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public LibraryItem[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((LibraryItem[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void InsertDvdDiskCompletedEventHandler(object sender, InsertDvdDiskCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class InsertDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal InsertDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void EjectDvdDiskCompletedEventHandler(object sender, EjectDvdDiskCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EjectDvdDiskCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal EjectDvdDiskCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineSnapshotsCompletedEventHandler(object sender, GetVirtualMachineSnapshotsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineSnapshotsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineSnapshotsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachineSnapshot[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachineSnapshot[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetSnapshotCompletedEventHandler(object sender, GetSnapshotCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachineSnapshot Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachineSnapshot)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void CreateSnapshotCompletedEventHandler(object sender, CreateSnapshotCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CreateSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CreateSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ApplySnapshotCompletedEventHandler(object sender, ApplySnapshotCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ApplySnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ApplySnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void RenameSnapshotCompletedEventHandler(object sender, RenameSnapshotCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RenameSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal RenameSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteSnapshotCompletedEventHandler(object sender, DeleteSnapshotCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteSnapshotSubtreeCompletedEventHandler(object sender, DeleteSnapshotSubtreeCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteSnapshotSubtreeCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteSnapshotSubtreeCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetSnapshotThumbnailCompletedEventHandler(object sender, GetSnapshotThumbnailCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSnapshotThumbnailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetSnapshotThumbnailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public byte[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((byte[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetExternalNetworkAdapterDetailsCompletedEventHandler(object sender, GetExternalNetworkAdapterDetailsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExternalNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExternalNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public NetworkAdapterDetails Result { + get { + this.RaiseExceptionIfNecessary(); + return ((NetworkAdapterDetails)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, AddVirtualMachineExternalIPAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetVirtualMachinePrimaryExternalIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetVirtualMachinePrimaryExternalIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteVirtualMachineExternalIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachineExternalIPAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteVirtualMachineExternalIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteVirtualMachineExternalIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPrivateNetworkAdapterDetailsCompletedEventHandler(object sender, GetPrivateNetworkAdapterDetailsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPrivateNetworkAdapterDetailsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPrivateNetworkAdapterDetailsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public NetworkAdapterDetails Result { + get { + this.RaiseExceptionIfNecessary(); + return ((NetworkAdapterDetails)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void AddVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, AddVirtualMachinePrivateIPAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SetVirtualMachinePrimaryPrivateIPAddressCompletedEventHandler(object sender, SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SetVirtualMachinePrimaryPrivateIPAddressCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteVirtualMachinePrivateIPAddressesCompletedEventHandler(object sender, DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteVirtualMachinePrivateIPAddressesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachinePermissionsCompletedEventHandler(object sender, GetVirtualMachinePermissionsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachinePermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachinePermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualMachinePermission[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualMachinePermission[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void UpdateVirtualMachineUserPermissionsCompletedEventHandler(object sender, UpdateVirtualMachineUserPermissionsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UpdateVirtualMachineUserPermissionsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UpdateVirtualMachineUserPermissionsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetExternalSwitchesCompletedEventHandler(object sender, GetExternalSwitchesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExternalSwitchesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExternalSwitchesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public VirtualSwitch[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((VirtualSwitch[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void DeleteVirtualMachineCompletedEventHandler(object sender, DeleteVirtualMachineCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal DeleteVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void ReinstallVirtualMachineCompletedEventHandler(object sender, ReinstallVirtualMachineCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ReinstallVirtualMachineCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ReinstallVirtualMachineCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetVirtualMachineSummaryTextCompletedEventHandler(object sender, GetVirtualMachineSummaryTextCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetVirtualMachineSummaryTextCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetVirtualMachineSummaryTextCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void SendVirtualMachineSummaryLetterCompletedEventHandler(object sender, SendVirtualMachineSummaryLetterCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SendVirtualMachineSummaryLetterCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SendVirtualMachineSummaryLetterCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj index 481ef66f..dcd48338 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/WebsitePanel.EnterpriseServer.Client.csproj @@ -91,6 +91,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 1ed10655..d60b57fa 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -3456,6 +3456,21 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("@Recursive", recursive)); return reader; } + public static IDataReader GetVirtualMachinesPaged2012(int actorId, int packageId, string filterColumn, string filterValue, + string sortColumn, int startRow, int maximumRows, bool recursive) + { + IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + "GetVirtualMachinesPaged2012", + new SqlParameter("@ActorID", actorId), + new SqlParameter("@PackageID", packageId), + new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)), + new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)), + new SqlParameter("@SortColumn", VerifyColumnName(sortColumn)), + new SqlParameter("@StartRow", startRow), + new SqlParameter("@MaximumRows", maximumRows), + new SqlParameter("@Recursive", recursive)); + return reader; + } #endregion public static IDataReader GetVirtualMachinesForPCPaged(int actorId, int packageId, string filterColumn, string filterValue, diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs index 292abb2a..b47b2088 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Packages/PackageController.cs @@ -488,6 +488,7 @@ namespace WebsitePanel.EnterpriseServer ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MySql5, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Statistics, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS, domain, ""); + ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS2012, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPSForPC, domain, ""); } } @@ -711,6 +712,11 @@ namespace WebsitePanel.EnterpriseServer if (Utils.ParseBool(vpsSettings["AutoAssignExternalIP"], true)) ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPS, IPAddressPool.VpsExternalNetwork); + // allocate "VPS" IP addresses + int vps2012ServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS2012); + StringDictionary vps2012Settings = ServerController.GetServiceSettings(vps2012ServiceId); + if (Utils.ParseBool(vps2012Settings["AutoAssignExternalIP"], true)) + ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPS2012, IPAddressPool.VpsExternalNetwork); // allocate "VPSForPC" IP addresses int vpsfcpServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPSForPC); @@ -1681,6 +1687,18 @@ namespace WebsitePanel.EnterpriseServer } } + // VPS2012 + else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS_2012, settingsName, true) == 0) + { + // load Exchange service settings + int vpsServiceId = GetPackageServiceId(packageId, ResourceGroups.VPS2012); + if (vpsServiceId > 0) + { + StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId); + settings["HostnamePattern"] = vpsSettings["HostnamePattern"]; + } + } + //vpforCP else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS_FOR_PRIVATE_CLOUD, settingsName, true) == 0) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs index c9aec104..9f87f606 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs @@ -1481,6 +1481,10 @@ namespace WebsitePanel.EnterpriseServer { return Quotas.VPS_EXTERNAL_IP_ADDRESSES_NUMBER; } + else if (String.Compare(groupName, ResourceGroups.VPS2012, true) == 0) + { + return Quotas.VPS2012_EXTERNAL_IP_ADDRESSES_NUMBER; + } else if (String.Compare(groupName, ResourceGroups.VPSForPC, true) == 0) { return Quotas.VPSForPC_EXTERNAL_IP_ADDRESSES_NUMBER; @@ -1840,6 +1844,7 @@ namespace WebsitePanel.EnterpriseServer ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MySql5, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Statistics, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS, domain, ""); + ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS2012, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPSForPC, domain, ""); } @@ -2403,6 +2408,7 @@ namespace WebsitePanel.EnterpriseServer ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.MySql5, domain, ""); ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.Statistics, domain, ""); ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.VPS, domain, ""); + ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.VPS2012, domain, ""); ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.VPSForPC, domain, ""); ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.Dns, domain, ""); break; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/CreateServerAsyncWorker2012.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/CreateServerAsyncWorker2012.cs new file mode 100644 index 00000000..5bc09f46 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/CreateServerAsyncWorker2012.cs @@ -0,0 +1,85 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Threading; + +using WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.EnterpriseServer +{ + public class CreateServerAsyncWorker2012 + { + #region Properties + public int ThreadUserId { get; set; } + public string TaskId { get; set; } + + public VirtualMachine Item { get; set; } + public LibraryItem OsTemplate { get; set; } + + public int ExternalAddressesNumber { get; set; } + public bool RandomExternalAddresses { get; set; } + public int[] ExternalAddresses { get; set; } + + public int PrivateAddressesNumber { get; set; } + public bool RandomPrivateAddresses { get; set; } + public string[] PrivateAddresses { get; set; } + + public string SummaryLetterEmail { get; set; } + #endregion + + public CreateServerAsyncWorker2012() + { + ThreadUserId = -1; // admin + } + + #region Create + public void CreateAsync() + { + // start asynchronously + Thread t = new Thread(new ThreadStart(Create)); + t.Start(); + } + + private void Create() + { + // impersonate thread + if (ThreadUserId != -1) + SecurityContext.SetThreadPrincipal(ThreadUserId); + + // perform backup + VirtualizationServerController2012.CreateVirtualMachineInternal(TaskId, Item, OsTemplate, + ExternalAddressesNumber, RandomExternalAddresses, ExternalAddresses, + PrivateAddressesNumber, RandomPrivateAddresses, PrivateAddresses, + SummaryLetterEmail); + } + #endregion + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs new file mode 100644 index 00000000..40a599ab --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Virtualization2012/VirtualizationServerController2012.cs @@ -0,0 +1,3687 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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.Data; +using System.Xml; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Virtualization; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using WebsitePanel.Providers; +using System.Text; +using System.Collections; +using System.Net.Mail; +using System.Diagnostics; +using System.Linq; +using System.Net; + +namespace WebsitePanel.EnterpriseServer +{ + public class VirtualizationServerController2012 + { + private const string SHUTDOWN_REASON = "WebsitePanel - Initiated by user"; + private const string SHUTDOWN_REASON_CHANGE_CONFIG = "WebsitePanel - changing VPS configuration"; + private const Int64 Size1G = 0x40000000; + private const string MS_MAC_PREFIX = "00155D"; // IEEE prefix of MS MAC addresses + + // default server creation (if "Unlimited" was specified in the hosting plan) + private const int DEFAULT_PASSWORD_LENGTH = 12; + private const int DEFAULT_RAM_SIZE = 512; // megabytes + private const int DEFAULT_HDD_SIZE = 20; // gigabytes + private const int DEFAULT_PRIVATE_IPS_NUMBER = 1; + private const int DEFAULT_SNAPSHOTS_NUMBER = 5; + + #region Virtual Machines + public static VirtualMachineMetaItemsPaged GetVirtualMachines(int packageId, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive) + { + VirtualMachineMetaItemsPaged result = new VirtualMachineMetaItemsPaged(); + + // get reader + IDataReader reader = DataProvider.GetVirtualMachinesPaged2012( + SecurityContext.User.UserId, + packageId, filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive); + + // number of items = first data reader + reader.Read(); + result.Count = (int)reader[0]; + + // items = second data reader + reader.NextResult(); + result.Items = ObjectUtils.CreateListFromDataReader(reader).ToArray(); + + return result; + } + + public static VirtualMachine[] GetVirtualMachinesByServiceId(int serviceId) + { + // get proxy + VirtualizationServer vps = GetVirtualizationProxy(serviceId); + + // load details + return vps.GetVirtualMachines(); + } + #endregion + + #region Private Network + public static PrivateIPAddressesPaged GetPackagePrivateIPAddressesPaged(int packageId, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + PrivateIPAddressesPaged result = new PrivateIPAddressesPaged(); + + // get reader + IDataReader reader = DataProvider.GetPackagePrivateIPAddressesPaged(packageId, filterColumn, filterValue, + sortColumn, startRow, maximumRows); + + // number of items = first data reader + reader.Read(); + result.Count = (int)reader[0]; + + // items = second data reader + reader.NextResult(); + result.Items = ObjectUtils.CreateListFromDataReader(reader).ToArray(); + + return result; + } + + public static List GetPackagePrivateIPAddresses(int packageId) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetPackagePrivateIPAddresses(packageId)); + } + #endregion + + #region User Permissions + public static List GetSpaceUserPermissions(int packageId) + { + List result = new List(); + return result; + } + + public static int UpdateSpaceUserPermissions(int packageId, VirtualMachinePermission[] permissions) + { + // VDC - UPDATE_PERMISSIONS + return 0; + } + #endregion + + #region Audit Log + public static List GetSpaceAuditLog(int packageId, DateTime startPeriod, DateTime endPeriod, + int severity, string sortColumn, int startRow, int maximumRows) + { + List result = new List(); + return result; + } + + public static List GetVirtualMachineAuditLog(int itemId, DateTime startPeriod, DateTime endPeriod, + int severity, string sortColumn, int startRow, int maximumRows) + { + List result = new List(); + return result; + } + #endregion + + #region VPS Create – Name & OS + public static LibraryItem[] GetOperatingSystemTemplates(int packageId) + { + // load service settings + int serviceId = GetServiceId(packageId); + + // return templates + return GetOperatingSystemTemplatesByServiceId(serviceId); + } + + public static LibraryItem[] GetOperatingSystemTemplatesByServiceId(int serviceId) + { + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + string path = settings["OsTemplatesPath"]; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(serviceId); + + return vs.GetLibraryItems(path); + } + #endregion + + #region VPS Create - Configuration + public static int GetMaximumCpuCoresNumber(int packageId) + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxyByPackageId(packageId); + + return vs.GetProcessorCoresNumber(); + } + + public static string GetDefaultExportPath(int itemId) + { + // load meta item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + if (vm == null) + return null; + + // load settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + return settings["ExportedVpsPath"]; + } + #endregion + + #region VPS Create + public static IntResult CreateDefaultVirtualMachine(int packageId, + string hostname, string osTemplate, string password, string summaryLetterEmail) + { + if (String.IsNullOrEmpty(osTemplate)) + throw new ArgumentNullException("osTemplate"); + + IntResult res = new IntResult(); + + // load package info + PackageInfo package = PackageController.GetPackage(packageId); + if (package == null) + { + res.ErrorCodes.Add("VPS_CREATE_PACKAGE_NOT_FOUND"); + return res; + } + + // generate host name if not specified + if (String.IsNullOrEmpty(hostname)) + { + // load hostname pattern + PackageSettings spaceSettings = PackageController.GetPackageSettings(packageId, PackageSettings.VIRTUAL_PRIVATE_SERVERS_2012); + string hostnamePattern = spaceSettings["HostnamePattern"]; + if (String.IsNullOrEmpty(hostnamePattern)) + { + res.ErrorCodes.Add("VPS_CREATE_EMPTY_HOSTNAME_PATTERN"); + return res; + } + + hostname = EvaluateSpaceVariables(hostnamePattern, packageId); + } + + // generate password if not specified + if (String.IsNullOrEmpty(password)) + { + int passwordLength = DEFAULT_PASSWORD_LENGTH; // default length + + // load password policy + UserSettings userSettings = UserController.GetUserSettings(package.UserId, UserSettings.VPS_POLICY); + string passwordPolicy = userSettings["AdministratorPasswordPolicy"]; + + if (!String.IsNullOrEmpty(passwordPolicy)) + { + // get second parameter - max length + passwordLength = Utils.ParseInt(passwordPolicy.Split(';')[1].Trim(), passwordLength); + } + + // generate password + password = Utils.GetRandomString(passwordLength); + } + + // load quotas + PackageContext cntx = PackageController.GetPackageContext(packageId); + if (cntx.Groups.ContainsKey(ResourceGroups.VPS2012)) + { + res.ErrorCodes.Add("VPS_CREATE_VPS_GROUP_DISABLED"); + return res; + } + + int generation = 1; + + // CPU cores + int cpuCores = cntx.Quotas[Quotas.VPS2012_CPU_NUMBER].QuotaAllocatedValue; + if (cpuCores == -1) // unlimited is not possible + cpuCores = GetMaximumCpuCoresNumber(packageId); + + // RAM + int ramMB = cntx.Quotas[Quotas.VPS2012_RAM].QuotaAllocatedValue; + if (ramMB == -1) // unlimited is not possible + ramMB = DEFAULT_RAM_SIZE; + + // HDD + int hddGB = cntx.Quotas[Quotas.VPS2012_HDD].QuotaAllocatedValue; + if (hddGB == -1) // unlimited is not possible + hddGB = DEFAULT_HDD_SIZE; + + // snapshots + int snapshots = cntx.Quotas[Quotas.VPS2012_SNAPSHOTS_NUMBER].QuotaAllocatedValue; + if (snapshots == -1) // unlimited is not possible + snapshots = DEFAULT_SNAPSHOTS_NUMBER; + + bool dvdInstalled = !cntx.Quotas[Quotas.VPS2012_DVD_ENABLED].QuotaExhausted; + bool bootFromCD = !cntx.Quotas[Quotas.VPS2012_BOOT_CD_ENABLED].QuotaExhausted; + bool numLock = true; + + bool startShutdownAllowed = !cntx.Quotas[Quotas.VPS2012_START_SHUTDOWN_ALLOWED].QuotaExhausted; + bool pauseResumeAllowed = !cntx.Quotas[Quotas.VPS2012_PAUSE_RESUME_ALLOWED].QuotaExhausted; + bool rebootAllowed = !cntx.Quotas[Quotas.VPS2012_REBOOT_ALLOWED].QuotaExhausted; + bool resetAllowed = !cntx.Quotas[Quotas.VPS2012_RESET_ALOWED].QuotaExhausted; + bool reinstallAllowed = !cntx.Quotas[Quotas.VPS2012_REINSTALL_ALLOWED].QuotaExhausted; + + bool externalNetworkEnabled = !cntx.Quotas[Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED].QuotaExhausted; + int externalAddressesNumber = cntx.Quotas[Quotas.VPS2012_EXTERNAL_IP_ADDRESSES_NUMBER].QuotaAllocatedValue; + bool randomExternalAddresses = true; + int[] externalAddresses = new int[0]; // empty array + if (externalNetworkEnabled) + { + int maxExternalAddresses = ServerController.GetPackageUnassignedIPAddresses(packageId, IPAddressPool.VpsExternalNetwork).Count; + if (externalAddressesNumber == -1 + || externalAddressesNumber > maxExternalAddresses) + externalAddressesNumber = maxExternalAddresses; + } + + bool privateNetworkEnabled = !cntx.Quotas[Quotas.VPS2012_PRIVATE_NETWORK_ENABLED].QuotaExhausted; + int privateAddressesNumber = cntx.Quotas[Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER].QuotaAllocatedValue; + bool randomPrivateAddresses = true; + string[] privateAddresses = new string[0]; // empty array + if (privateAddressesNumber == -1) // unlimited is not possible + { + privateAddressesNumber = DEFAULT_PRIVATE_IPS_NUMBER; + } + + // create server and return result + return CreateVirtualMachine(packageId, hostname, osTemplate, password, summaryLetterEmail, + generation, cpuCores, ramMB, hddGB, snapshots, + dvdInstalled, bootFromCD, numLock, + startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, + externalNetworkEnabled, externalAddressesNumber, randomExternalAddresses, externalAddresses, + privateNetworkEnabled, privateAddressesNumber, randomPrivateAddresses, privateAddresses); + } + + public static IntResult CreateVirtualMachine(int packageId, + string hostname, string osTemplateFile, string password, string summaryLetterEmail, + int generation, int cpuCores, int ramMB, int hddGB, int snapshots, + bool dvdInstalled, bool bootFromCD, bool numLock, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + bool externalNetworkEnabled, int externalAddressesNumber, bool randomExternalAddresses, int[] externalAddresses, + bool privateNetworkEnabled, int privateAddressesNumber, bool randomPrivateAddresses, string[] privateAddresses) + { + // result object + IntResult res = new IntResult(); + + // meta item + VirtualMachine vm = null; + + try + { + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, packageId, DemandPackage.IsActive)) + return res; + + #endregion + + #region Check if host name is already used + + try + { + ServiceProviderItem item = PackageController.GetPackageItemByName(packageId, hostname, + typeof (VirtualMachine)); + if (item != null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.HOST_NAMER_IS_ALREADY_USED); + return res; + } + } + catch(Exception ex) + { + res.AddError(VirtualizationErrorCodes.CANNOT_CHECK_HOST_EXISTS, ex); + return res; + } + + #endregion + + #region Check Quotas + // check quotas + List quotaResults = new List(); + PackageContext cntx = PackageController.GetPackageContext(packageId); + + 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, ramMB, 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); + + 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); + + // check external addresses number + if (!randomExternalAddresses && externalAddresses != null) + externalAddressesNumber = externalAddresses.Length; + + int maxAddresses = ServerController.GetPackageUnassignedIPAddresses(packageId, IPAddressPool.VpsExternalNetwork).Count; + if (externalNetworkEnabled && externalAddressesNumber > maxAddresses) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_EXTERNAL_ADDRESSES_NUMBER + ":" + maxAddresses.ToString()); + + // 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); + + // check management network parameters + NetworkAdapterDetails manageNic = GetManagementNetworkDetails(packageId); + if (!String.IsNullOrEmpty(manageNic.NetworkId)) + { + // network enabled - check management IPs pool + int manageIpsNumber = ServerController.GetUnallottedIPAddresses( + packageId, ResourceGroups.VPS2012, IPAddressPool.VpsManagementNetwork).Count; + + if (manageIpsNumber == 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_MANAGEMENT_NETWORK); + } + + // check acceptable values + if (ramMB <= 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_RAM); + if (hddGB <= 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_HDD); + if (snapshots < 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_SNAPSHOTS); + + if (quotaResults.Count > 0) + { + res.ErrorCodes.AddRange(quotaResults); + return res; + } + #endregion + + #region Check input parameters + // check private network IP addresses if they are specified + List checkResults = CheckPrivateIPAddresses(packageId, privateAddresses); + if (checkResults.Count > 0) + { + res.ErrorCodes.AddRange(checkResults); + return res; + } + #endregion + + #region Context variables + // service ID + int serviceId = GetServiceId(packageId); + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + #endregion + + #region Create meta item + // create meta item + vm = new VirtualMachine(); + + vm.Name = hostname; + vm.AdministratorPassword = CryptoUtils.Encrypt(password); + vm.PackageId = packageId; + vm.VirtualMachineId = null; // from service + vm.ServiceId = serviceId; + + vm.CurrentTaskId = Guid.NewGuid().ToString("N"); // generate creation task id + vm.ProvisioningStatus = VirtualMachineProvisioningStatus.InProgress; + + vm.Generation = generation; + vm.CpuCores = cpuCores; + vm.RamSize = ramMB; + vm.HddSize = hddGB; + vm.SnapshotsNumber = snapshots; + vm.DvdDriveInstalled = dvdInstalled; + vm.BootFromCD = bootFromCD; + vm.NumLockEnabled = numLock; + vm.StartTurnOffAllowed = startShutdownAllowed; + vm.PauseResumeAllowed = pauseResumeAllowed; + vm.RebootAllowed = rebootAllowed; + vm.ResetAllowed = resetAllowed; + vm.ReinstallAllowed = reinstallAllowed; + + // networking + vm.ExternalNetworkEnabled = externalNetworkEnabled; + vm.PrivateNetworkEnabled = privateNetworkEnabled; + vm.ManagementNetworkEnabled = !String.IsNullOrEmpty(manageNic.NetworkId); + + // load OS templates + LibraryItem osTemplate = null; + + try + { + LibraryItem[] osTemplates = GetOperatingSystemTemplates(vm.PackageId); + foreach (LibraryItem item in osTemplates) + { + if (String.Compare(item.Path, osTemplateFile, true) == 0) + { + osTemplate = item; + + // check minimal disk size + if (osTemplate.DiskSize > 0 && vm.HddSize < osTemplate.DiskSize) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.QUOTA_TEMPLATE_DISK_MINIMAL_SIZE + ":" + osTemplate.DiskSize); + return res; + } + + vm.OperatingSystemTemplate = osTemplate.Name; + vm.LegacyNetworkAdapter = osTemplate.LegacyNetworkAdapter; + vm.RemoteDesktopEnabled = osTemplate.RemoteDesktop; + break; + } + } + } + catch (Exception ex) + { + res.AddError(VirtualizationErrorCodes.GET_OS_TEMPLATES_ERROR, ex); + return res; + } + + // setup VM paths + string templatesPath = settings["OsTemplatesPath"]; + string rootFolderPattern = settings["RootFolder"]; + if(rootFolderPattern.IndexOf("[") == -1) + { + // no pattern has been specified + if(!rootFolderPattern.EndsWith("\\")) + rootFolderPattern += "\\"; + rootFolderPattern += "[username]\\[vps_hostname]"; + } + + vm.RootFolderPath = EvaluateItemVariables(rootFolderPattern, vm); + var correctVhdPath = GetCorrectTemplateFilePath(templatesPath, osTemplateFile); + vm.OperatingSystemTemplatePath = correctVhdPath; + vm.VirtualHardDrivePath = Path.Combine(vm.RootFolderPath, hostname + Path.GetExtension(correctVhdPath)); + + // save meta-item + try + { + vm.Id = PackageController.AddPackageItem(vm); + } + catch (Exception ex) + { + res.AddError(VirtualizationErrorCodes.CREATE_META_ITEM_ERROR, ex); + return res; + } + + #endregion + + #region Start Asynchronous task + try + { + // asynchronous process starts here + CreateServerAsyncWorker worker = new CreateServerAsyncWorker(); + + worker.TaskId = vm.CurrentTaskId; // async task ID + worker.ThreadUserId = SecurityContext.User.UserId; + worker.Item = vm; + worker.OsTemplate = osTemplate; + + worker.ExternalAddressesNumber = externalAddressesNumber; + worker.RandomExternalAddresses = randomExternalAddresses; + worker.ExternalAddresses = externalAddresses; + + worker.PrivateAddressesNumber = privateAddressesNumber; + worker.RandomPrivateAddresses = randomPrivateAddresses; + worker.PrivateAddresses = privateAddresses; + + worker.SummaryLetterEmail = summaryLetterEmail; + + worker.CreateAsync(); + } + catch (Exception ex) + { + // delete meta item + PackageController.DeletePackageItem(vm.Id); + + // return from method + res.AddError(VirtualizationErrorCodes.CREATE_TASK_START_ERROR, ex); + return res; + } + #endregion + } + catch (Exception ex) + { + res.AddError(VirtualizationErrorCodes.CREATE_ERROR, ex); + return res; + } + + res.Value = vm.Id; + res.IsSuccess = true; + return res; + } + + private static string GetCorrectTemplateFilePath(string templatesPath, string osTemplateFile) + { + if (osTemplateFile.Trim().EndsWith(".vhdx")) + return Path.Combine(templatesPath, osTemplateFile); + + return Path.Combine(templatesPath, osTemplateFile + ".vhd"); + } + + internal static void CreateVirtualMachineInternal(string taskId, VirtualMachine vm, LibraryItem osTemplate, + int externalAddressesNumber, bool randomExternalAddresses, int[] externalAddresses, + int privateAddressesNumber, bool randomPrivateAddresses, string[] privateAddresses, + string summaryLetterEmail) + { + // start task + TaskManager.StartTask(taskId, "VPS2012", "CREATE", vm.Name, vm.Id, vm.PackageId); + + try + { + // set Error flag + vm.ProvisioningStatus = VirtualMachineProvisioningStatus.Error; + + // load proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + + #region Setup External network + TaskManager.Write("VPS_CREATE_SETUP_EXTERNAL_NETWORK"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + + try + { + if (vm.ExternalNetworkEnabled) + { + // provision IP addresses + ResultObject privResult = AddVirtualMachineExternalIPAddresses(vm.Id, randomExternalAddresses, + externalAddressesNumber, externalAddresses, false); + + // set primary IP address + NetworkAdapterDetails extNic = GetExternalNetworkAdapterDetails(vm.Id); + if (extNic.IPAddresses.Length > 0) + SetVirtualMachinePrimaryExternalIPAddress(vm.Id, extNic.IPAddresses[0].AddressId, false); + + // connect to network + vm.ExternalSwitchId = settings["ExternalNetworkId"]; + vm.ExternalNicMacAddress = GenerateMacAddress(); + } + else + { + TaskManager.Write("VPS_CREATE_SETUP_EXTERNAL_NETWORK_SKIP"); + } + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_SETUP_EXTERNAL_NETWORK_ERROR"); + return; + } + #endregion + + #region Setup Management network + TaskManager.Write("VPS_CREATE_SETUP_MANAGEMENT_NETWORK"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + + try + { + if (vm.ManagementNetworkEnabled) + { + // check that package contains unassigned IP + // that could be re-used + List packageIps = ServerController.GetPackageUnassignedIPAddresses( + vm.PackageId, IPAddressPool.VpsManagementNetwork); + + if (packageIps.Count == 0) + { + // must be fresh space + // allocate package IP from the pool + List ips = ServerController.GetUnallottedIPAddresses( + vm.PackageId, ResourceGroups.VPS2012, IPAddressPool.VpsManagementNetwork); + + if (ips.Count > 0) + { + // assign IP to the package + ServerController.AllocatePackageIPAddresses(vm.PackageId, new int[] { ips[0].AddressId }); + + // re-read package IPs + packageIps = ServerController.GetPackageUnassignedIPAddresses( + vm.PackageId, IPAddressPool.VpsManagementNetwork); + } + else + { + // nothing to allocate - pool empty + TaskManager.WriteWarning("VPS_CREATE_SETUP_MANAGEMENT_NETWORK_POOL_EMPTY"); + } + } + + if (packageIps.Count > 0) + { + // assign to the item + ServerController.AddItemIPAddress(vm.Id, packageIps[0].PackageAddressID); + + // set primary IP address + ServerController.SetItemPrimaryIPAddress(vm.Id, packageIps[0].PackageAddressID); + + // connect to network + vm.ManagementSwitchId = settings["ManagementNetworkId"]; + vm.ManagementNicMacAddress = GenerateMacAddress(); + } + } + else + { + TaskManager.Write("VPS_CREATE_SETUP_MANAGEMENT_NETWORK_SKIP"); + } + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_SETUP_MANAGEMENT_NETWORK_ERROR"); + return; + } + #endregion + + #region Setup Private network + TaskManager.Write("VPS_CREATE_SETUP_PRIVATE_NETWORK"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + + try + { + if (vm.PrivateNetworkEnabled) + { + NetworkAdapterDetails privNic = GetPrivateNetworkDetailsInternal(vm.ServiceId); + + if (!privNic.IsDHCP) + { + // provision IP addresses + ResultObject extResult = AddVirtualMachinePrivateIPAddresses(vm.Id, randomPrivateAddresses, privateAddressesNumber, privateAddresses, false); + + // set primary IP address + privNic = GetPrivateNetworkAdapterDetails(vm.Id); + if (privNic.IPAddresses.Length > 0) + SetVirtualMachinePrimaryPrivateIPAddress(vm.Id, privNic.IPAddresses[0].AddressId, false); + } + + // connecto to network + vm.PrivateSwitchId = settings["PrivateNetworkId"]; + + if (String.IsNullOrEmpty(vm.PrivateSwitchId)) + { + // create/load private virtual switch + vm.PrivateSwitchId = EnsurePrivateVirtualSwitch(vm); + if (vm.PrivateSwitchId == null) + return; // exit on error + } + vm.PrivateNicMacAddress = GenerateMacAddress(); + } + else + { + TaskManager.Write("VPS_CREATE_SETUP_PRIVATE_NETWORK_SKIP"); + } + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_SETUP_PRIVATE_NETWORK_ERROR"); + return; + } + #endregion + + // update service item + VirtualMachineProvisioningStatus status = vm.ProvisioningStatus; + vm.ProvisioningStatus = VirtualMachineProvisioningStatus.InProgress; + PackageController.UpdatePackageItem(vm); + vm.ProvisioningStatus = status; + + #region Copy/convert VHD + JobResult result = null; + ReturnCode code = ReturnCode.OK; + TaskManager.Write("VPS_CREATE_OS_TEMPLATE", osTemplate.Name); + TaskManager.Write("VPS_CREATE_CONVERT_VHD"); + TaskManager.Write("VPS_CREATE_CONVERT_SOURCE_VHD", vm.OperatingSystemTemplatePath); + TaskManager.Write("VPS_CREATE_CONVERT_DEST_VHD", vm.VirtualHardDrivePath); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + try + { + // convert VHD + VirtualHardDiskType vhdType = (VirtualHardDiskType)Enum.Parse(typeof(VirtualHardDiskType), settings["VirtualDiskType"], true); + result = vs.ConvertVirtualHardDisk(vm.OperatingSystemTemplatePath, vm.VirtualHardDrivePath, vhdType); + + // check return + if (result.ReturnValue != ReturnCode.JobStarted) + { + TaskManager.WriteError("VPS_CREATE_CONVERT_VHD_ERROR_JOB_START", result.ReturnValue.ToString()); + return; + } + + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + TaskManager.WriteError("VPS_CREATE_CONVERT_VHD_ERROR_JOB_EXEC", result.Job.ErrorDescription.ToString()); + return; + } + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_CONVERT_VHD_ERROR"); + return; + } + #endregion + + #region Get VHD info + VirtualHardDiskInfo vhdInfo = null; + try + { + vhdInfo = vs.GetVirtualHardDiskInfo(vm.VirtualHardDrivePath); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_GET_VHD_INFO"); + return; + } + + if (vhdInfo == null || vhdInfo.InUse) + { + // master VHD is in use + TaskManager.WriteError("VPS_CREATE_MASTER_VHD_IN_USE"); + return; + } + + // check if it should be expanded + int hddSizeGB = Convert.ToInt32(vhdInfo.MaxInternalSize / Size1G); + + TaskManager.Write("VPS_CREATE_EXPAND_SOURCE_VHD_SIZE", hddSizeGB.ToString()); + TaskManager.Write("VPS_CREATE_EXPAND_DEST_VHD_SIZE", vm.HddSize.ToString()); + #endregion + + #region Expand VHD + bool expanded = false; + if (vm.HddSize > hddSizeGB) + { + TaskManager.Write("VPS_CREATE_EXPAND_VHD"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + + // expand VHD + try + { + result = vs.ExpandVirtualHardDisk(vm.VirtualHardDrivePath, (ulong)vm.HddSize); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_EXPAND_VHD_ERROR"); + return; + } + + // check return + if (result.ReturnValue != ReturnCode.JobStarted) + { + // error starting Expand job + TaskManager.WriteError("VPS_CREATE_EXPAND_VHD_ERROR_JOB_START", result.ReturnValue.ToString()); + return; + } + + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + // error executing Expand job + TaskManager.WriteError("VPS_CREATE_EXPAND_VHD_ERROR_JOB_EXEC", result.Job.ErrorDescription); + return; + } + expanded = true; + } + else + { + // skip expanding + TaskManager.Write("VPS_CREATE_EXPAND_VHD_SKIP"); + } + #endregion + + #region Process VHD contents + // mount VHD + if ((expanded && osTemplate.ProcessVolume != -1) + || (osTemplate.SysprepFiles != null && osTemplate.SysprepFiles.Length > 0)) + { + try + { + #region Mount VHD + MountedDiskInfo mountedInfo = vs.MountVirtualHardDisk(vm.VirtualHardDrivePath); + if (mountedInfo == null) + { + // mount returned NULL + TaskManager.WriteError("VPS_CREATE_MOUNT_VHD_NULL"); + return; + } + #endregion + + #region Expand volume + if (expanded && osTemplate.ProcessVolume != -1 && mountedInfo.DiskVolumes.Length > 0) + { + try + { + vs.ExpandDiskVolume(mountedInfo.DiskAddress, mountedInfo.DiskVolumes[osTemplate.ProcessVolume]); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_DISKPART_ERROR"); + } + } + else + { + TaskManager.Write("VPS_CREATE_EXPAND_VHD_SKIP_NO_VOLUMES"); + } + #endregion + + #region Sysprep + if (mountedInfo.DiskVolumes.Length > 0 + && osTemplate.ProcessVolume != -1 + && osTemplate.SysprepFiles != null && osTemplate.SysprepFiles.Length > 0) + { + foreach (string remoteFile in osTemplate.SysprepFiles) + { + try + { + TaskManager.Write("VPS_CREATE_SYSPREP_FILE", remoteFile); + + // build remote path + string path = remoteFile; + if (!remoteFile.StartsWith("\\")) + path = remoteFile.Substring(remoteFile.IndexOf("\\")); + + path = String.Format("{0}:{1}", mountedInfo.DiskVolumes[osTemplate.ProcessVolume], path); + + // read remote file + string contents = vs.ReadRemoteFile(path); + if (contents == null) + { + TaskManager.Write("VPS_CREATE_SYSPREP_FILE_NOT_FOUND", remoteFile); + continue; + } + + // process file contents + contents = EvaluateVirtualMachineTemplate(vm.Id, false, false, contents); + + // write remote file + vs.WriteRemoteFile(path, contents); + } + catch (Exception ex) + { + TaskManager.WriteError("VPS_CREATE_SYSPREP_FILE_ERROR", ex.Message); + } + } + } + #endregion + + #region Unmount VHD + try + { + code = vs.UnmountVirtualHardDisk(vm.VirtualHardDrivePath); + if (code != ReturnCode.OK) + { + TaskManager.WriteError("VPS_CREATE_UNMOUNT_ERROR_JOB_START", code.ToString()); + return; + } + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_UNMOUNT_ERROR"); + return; + } + #endregion + } + catch (Exception ex) + { + // error mounting + TaskManager.WriteError(ex, "VPS_CREATE_MOUNT_VHD"); + return; + } + } // end if (expanded ... + #endregion + + #region Create Virtual Machine + TaskManager.Write("VPS_CREATE_CPU_CORES", vm.CpuCores.ToString()); + TaskManager.Write("VPS_CREATE_RAM_SIZE", vm.RamSize.ToString()); + TaskManager.Write("VPS_CREATE_CREATE_VM"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + // create virtual machine + try + { + // create + vm = vs.CreateVirtualMachine(vm); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_CREATE_VM_ERROR"); + return; + } + + // update meta item + PackageController.UpdatePackageItem(vm); + + TaskManager.Write("VPS_CREATE_CREATED_VM"); + #endregion + + // set OK flag + vm.ProvisioningStatus = VirtualMachineProvisioningStatus.OK; + + #region Send KVP + // configure computer name + if (osTemplate.ProvisionComputerName) + { + TaskManager.Write("VPS_CREATE_SET_COMPUTER_NAME_KVP"); + SendComputerNameKVP(vm.Id, vm.Name); + } + + // change administrator password + if (osTemplate.ProvisionAdministratorPassword) + { + TaskManager.Write("VPS_CREATE_SET_PASSWORD_KVP"); + SendAdministratorPasswordKVP(vm.Id, CryptoUtils.Decrypt(vm.AdministratorPassword)); + } + + // configure network adapters + if(osTemplate.ProvisionNetworkAdapters) + { + // external NIC + TaskManager.Write("VPS_CREATE_SET_EXTERNAL_NIC_KVP"); + if (vm.ExternalNetworkEnabled) + { + result = SendNetworkAdapterKVP(vm.Id, "External"); + + if (result.ReturnValue != ReturnCode.JobStarted) + TaskManager.WriteWarning("VPS_CREATE_SET_EXTERNAL_NIC_KVP_ERROR", result.ReturnValue.ToString()); + } + + // management NIC + TaskManager.Write("VPS_CREATE_SET_MANAGEMENT_NIC_KVP"); + if (vm.ManagementNetworkEnabled) + { + result = SendNetworkAdapterKVP(vm.Id, "Management"); + + if (result.ReturnValue != ReturnCode.JobStarted) + TaskManager.WriteWarning("VPS_CREATE_SET_MANAGEMENT_NIC_KVP_ERROR", result.ReturnValue.ToString()); + } + + // private NIC + TaskManager.Write("VPS_CREATE_SET_PRIVATE_NIC_KVP"); + if (vm.PrivateNetworkEnabled) + { + result = SendNetworkAdapterKVP(vm.Id, "Private"); + + if (result.ReturnValue != ReturnCode.JobStarted) + TaskManager.WriteWarning("VPS_CREATE_SET_PRIVATE_NIC_KVP_ERROR", result.ReturnValue.ToString()); + } + } + #endregion + + #region Start VPS + TaskManager.Write("VPS_CREATE_START_VPS"); + TaskManager.IndicatorCurrent = -1; // Some providers (for example HyperV2012R2) could not provide progress + + try + { + // start virtual machine + result = vs.ChangeVirtualMachineState(vm.VirtualMachineId, VirtualMachineRequestedState.Start); + + // check return + if (result.ReturnValue == ReturnCode.JobStarted) + { + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + TaskManager.WriteWarning("VPS_CREATE_START_VPS_ERROR_JOB_EXEC", result.Job.ErrorDescription.ToString()); + } + } + else + { + TaskManager.WriteWarning("VPS_CREATE_START_VPS_ERROR_JOB_START", result.ReturnValue.ToString()); + } + } + catch (Exception ex) + { + TaskManager.WriteWarning("VPS_CREATE_START_VPS_ERROR", ex.Message); + } + TaskManager.Write("VPS_CREATE_STARTED_VPS"); + #endregion + + #region Send Summary letter + // send summary e-mail + if (!String.IsNullOrEmpty(summaryLetterEmail)) + { + SendVirtualMachineSummaryLetter(vm.Id, summaryLetterEmail, null, true); + } + #endregion + + } + catch (Exception ex) + { + TaskManager.WriteError(ex, VirtualizationErrorCodes.CREATE_ERROR); + return; + } + finally + { + // reset task ID + vm.CurrentTaskId = null; + PackageController.UpdatePackageItem(vm); + + if (vm.ProvisioningStatus == VirtualMachineProvisioningStatus.OK) + TaskManager.Write("VPS_CREATE_SUCCESS"); + else if (vm.ProvisioningStatus == VirtualMachineProvisioningStatus.Error) + TaskManager.Write("VPS_CREATE_ERROR_END"); + + // complete task + TaskManager.CompleteTask(); + } + } + + 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, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + string externalNicMacAddress, int[] externalAddresses, + string managementNicMacAddress, int managementAddress) + { + // result object + IntResult res = new IntResult(); + + // meta item + VirtualMachine item = null; + + try + { + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsAdmin)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, packageId, DemandPackage.IsActive)) + return res; + + #endregion + + // load package context + PackageContext cntx = PackageController.GetPackageContext(packageId); + + item = new VirtualMachine(); + item.ServiceId = serviceId; + item.PackageId = packageId; + item.VirtualMachineId = vmId; + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + + // load virtual machine info from service + VirtualizationServer vs = GetVirtualizationProxy(serviceId); + VirtualMachine vm = vs.GetVirtualMachineEx(vmId); + + // set VM properties + item.Name = vm.Name; + item.ProvisioningStatus = VirtualMachineProvisioningStatus.OK; + + item.CpuCores = vm.CpuCores; + item.RamSize = vm.RamSize; + item.HddSize = vm.HddSize; + item.VirtualHardDrivePath = vm.VirtualHardDrivePath; + item.RootFolderPath = Path.GetDirectoryName(vm.VirtualHardDrivePath); + item.SnapshotsNumber = cntx.Quotas[Quotas.VPS2012_SNAPSHOTS_NUMBER].QuotaAllocatedValue; + item.DvdDriveInstalled = vm.DvdDriveInstalled; + item.BootFromCD = vm.BootFromCD; + item.NumLockEnabled = vm.NumLockEnabled; + item.StartTurnOffAllowed = startShutdownAllowed; + item.PauseResumeAllowed = pauseResumeAllowed; + item.RebootAllowed = rebootAllowed; + item.ResetAllowed = resetAllowed; + item.ReinstallAllowed = reinstallAllowed; + + // remote desktop + if(!String.IsNullOrEmpty(adminPassword)) + { + item.RemoteDesktopEnabled = true; + item.AdministratorPassword = CryptoUtils.Encrypt(adminPassword); + } + + // set OS template + string templatesPath = settings["OsTemplatesPath"]; + var correctVhdPath = GetCorrectTemplateFilePath(templatesPath, osTemplateFile); + item.OperatingSystemTemplatePath = correctVhdPath; + try + { + LibraryItem[] osTemplates = GetOperatingSystemTemplatesByServiceId(serviceId); + foreach (LibraryItem osTemplate in osTemplates) + { + if (String.Compare(osTemplate.Path, osTemplateFile, true) == 0) + { + item.OperatingSystemTemplate = osTemplate.Name; + item.LegacyNetworkAdapter = osTemplate.LegacyNetworkAdapter; + break; + } + } + } + catch (Exception ex) + { + res.AddError(VirtualizationErrorCodes.GET_OS_TEMPLATES_ERROR, ex); + return res; + } + + // save item + int itemId = PackageController.AddPackageItem(item); + item.Id = itemId; + res.Value = itemId; + + #region Setup external network + // setup external network + if (!String.IsNullOrEmpty(externalNicMacAddress)) + { + item.ExternalNetworkEnabled = true; + item.ExternalNicMacAddress = externalNicMacAddress; + item.ExternalSwitchId = settings["ExternalNetworkId"]; + + // assign selected IP addresses to package + ServerController.AllocatePackageIPAddresses(packageId, externalAddresses); + + // re-read package IPs + List packageIPs = ServerController.GetPackageUnassignedIPAddresses( + packageId, IPAddressPool.VpsExternalNetwork); + + // assign IP addresses to VM + for(int i = 0; i < externalAddresses.Length; i++) + { + foreach (PackageIPAddress ip in packageIPs) + { + if (ip.AddressID == externalAddresses[i]) + { + // assign to the item + ServerController.AddItemIPAddress(itemId, ip.PackageAddressID); + + // set primary IP address + if(i == 0) + ServerController.SetItemPrimaryIPAddress(itemId, ip.PackageAddressID); + + break; + } + } + } + } + #endregion + + #region Setup management network + // setup management network + if (!String.IsNullOrEmpty(managementNicMacAddress)) + { + item.ManagementNetworkEnabled = true; + item.ManagementNicMacAddress = managementNicMacAddress; + item.ManagementSwitchId = settings["ManagementNetworkId"]; + + // assign selected IP addresses to package + ServerController.AllocatePackageIPAddresses(packageId, new int[] { managementAddress }); + + // re-read package IPs + List packageIPs = ServerController.GetPackageUnassignedIPAddresses( + packageId, IPAddressPool.VpsManagementNetwork); + + // assign IP addresses to VM + foreach (PackageIPAddress ip in packageIPs) + { + if (ip.AddressID == managementAddress) + { + // assign to the item + ServerController.AddItemIPAddress(itemId, ip.PackageAddressID); + + break; + } + } + } + #endregion + + // save item once again + PackageController.UpdatePackageItem(item); + } + catch (Exception ex) + { + res.AddError(VirtualizationErrorCodes.IMPORT_ERROR, ex); + return res; + } + + res.IsSuccess = true; + return res; + } + + private static JobResult SendNetworkAdapterKVP(int itemId, string adapterName) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + if (vm == null) + return null; + + // build task parameters + Dictionary props = new Dictionary(); + NetworkAdapterDetails nic = null; + + if(String.Compare(adapterName, "external", true) == 0) + { + // external + nic = GetExternalNetworkAdapterDetails(itemId); + } + else if(String.Compare(adapterName, "private", true) == 0) + { + // private + nic = GetPrivateNetworkAdapterDetails(itemId); + } + else + { + // management + nic = GetManagementNetworkAdapterDetails(itemId); + } + + // network format + if (nic != null && !String.IsNullOrEmpty(nic.MacAddress)) + { + props["MAC"] = nic.MacAddress.Replace("-", ":"); + props["EnableDHCP"] = nic.IsDHCP.ToString(); + if (!nic.IsDHCP) + { + string[] ips = new string[nic.IPAddresses.Length]; + string[] subnetMasks = new string[nic.IPAddresses.Length]; + for (int i = 0; i < ips.Length; i++) + { + ips[i] = nic.IPAddresses[i].IPAddress; + subnetMasks[i] = nic.IPAddresses[i].SubnetMask; + + // set gateway from the first (primary) IP + if (i == 0) + props["DefaultIPGateway"] = nic.IPAddresses[i].DefaultGateway; + } + + props["IPAddress"] = String.Join(";", ips); + props["SubnetMask"] = String.Join(";", subnetMasks); + + // name servers + props["PreferredDNSServer"] = nic.PreferredNameServer; + if (!String.IsNullOrEmpty(nic.AlternateNameServer)) + props["PreferredDNSServer"] += ";" + nic.AlternateNameServer; + } + } + + // DNS + if (!props.ContainsKey("PreferredDNSServer") + || String.IsNullOrEmpty(props["PreferredDNSServer"])) + { + props["PreferredDNSServer"] = "0.0.0.0"; // obtain automatically + } + + // send items + return SendKvpItems(itemId, "SetupNetworkAdapter", props); + } + + private static string GetSymbolDelimitedMacAddress(string mac, string delimiter) + { + if (String.IsNullOrEmpty(mac)) + return mac; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6; i++) + { + sb.Append(mac[i * 2]).Append(mac[i * 2 + 1]); + if (i < 5) sb.Append(delimiter); + } + return sb.ToString(); + } + + private static JobResult SendComputerNameKVP(int itemId, string computerName) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + if (vm == null) + return null; + + // build task parameters + Dictionary props = new Dictionary(); + + props["FullComputerName"] = computerName; + + // send items + return SendKvpItems(itemId, "ChangeComputerName", props); + } + + private static JobResult SendAdministratorPasswordKVP(int itemId, string password) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + if (vm == null) + return null; + + // build task parameters + Dictionary props = new Dictionary(); + + props["Password"] = password; + + // send items + return SendKvpItems(itemId, "ChangeAdministratorPassword", props); + } + + private static JobResult SendKvpItems(int itemId, string taskName, Dictionary taskProps) + { + string TASK_PREFIX = "WSP-"; + + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + if (vm == null) + return null; + + JobResult result = null; + + // load proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + try + { + // delete completed task definitions + List completedTasks = new List(); + KvpExchangeDataItem[] vmKvps = vs.GetKVPItems(vm.VirtualMachineId); + foreach (KvpExchangeDataItem vmKvp in vmKvps) + { + if (vmKvp.Name.StartsWith(TASK_PREFIX)) + completedTasks.Add(vmKvp.Name); + } + + // delete completed items + vs.RemoveKVPItems(vm.VirtualMachineId, completedTasks.ToArray()); + } + catch (Exception ex) + { + // log error + TaskManager.WriteWarning(String.Format("Error deleting KVP items: {0}", ex.Message)); + } + + // build items array + List items = new List(); + foreach (string propName in taskProps.Keys) + items.Add(propName + "=" + taskProps[propName]); + + taskName = String.Format("{0}{1}-{2}", TASK_PREFIX, taskName, DateTime.Now.Ticks); + string taskData = String.Join("|", items.ToArray()); + + // create KVP item + KvpExchangeDataItem[] kvp = new KvpExchangeDataItem[1]; + kvp[0] = new KvpExchangeDataItem(); + kvp[0].Name = taskName; + kvp[0].Data = taskData; + + try + { + // try adding KVP items + result = vs.AddKVPItems(vm.VirtualMachineId, kvp); + + if (result.Job != null && result.Job.JobState == ConcreteJobState.Exception) + { + // try updating KVP items + return vs.ModifyKVPItems(vm.VirtualMachineId, kvp); + } + else + { + return result; + } + } + catch (Exception ex) + { + // log error + TaskManager.WriteWarning(String.Format("Error setting KVP items '{0}': {1}", kvp[0].Data, ex.Message)); + } + + return null; + } + + private static string EnsurePrivateVirtualSwitch(ServiceProviderItem item) + { + // try locate switch in the package + List items = PackageController.GetPackageItemsByType(item.PackageId, typeof(VirtualSwitch)); + + // exists - return ID + if (items.Count > 0) + return ((VirtualSwitch)items[0]).SwitchId; + + // switch name + string name = EvaluateItemVariables("[username] - [space_name]", item); + + // log + TaskManager.Write("VPS_CREATE_PRIVATE_VIRTUAL_SWITCH", name); + + try + { + // create switch + // load proxy + VirtualizationServer vs = GetVirtualizationProxy(item.ServiceId); + + // create switch + VirtualSwitch sw = vs.CreateSwitch(name); + sw.ServiceId = item.ServiceId; + sw.PackageId = item.PackageId; + + // save item + PackageController.AddPackageItem(sw); + + return sw.SwitchId; + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "VPS_CREATE_PRIVATE_VIRTUAL_SWITCH_ERROR"); + return null; + } + } + + private static string EvaluateItemVariables(string str, ServiceProviderItem item) + { + str = Utils.ReplaceStringVariable(str, "vps_hostname", item.Name); + + return EvaluateSpaceVariables(str, item.PackageId); + } + + private static string EvaluateSpaceVariables(string str, int packageId) + { + // load package + PackageInfo package = PackageController.GetPackage(packageId); + UserInfo user = UserController.GetUser(package.UserId); + str = Utils.ReplaceStringVariable(str, "space_id", packageId.ToString()); + str = Utils.ReplaceStringVariable(str, "space_name", package.PackageName); + str = Utils.ReplaceStringVariable(str, "user_id", user.UserId.ToString()); + str = Utils.ReplaceStringVariable(str, "username", user.Username); + + return str; + } + #endregion + + #region VPS – General + + public static List GetVirtualMachineJobs(int itemId) + { + // load meta item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + if (vm == null) + return null; + + // get proxy + VirtualizationServer vps = GetVirtualizationProxy(vm.ServiceId); + + // load jobs + ConcreteJob[] jobs = vps.GetVirtualMachineJobs(vm.VirtualMachineId); + List retJobs = new List(); + + foreach (ConcreteJob job in jobs) + { + if (job.JobState == ConcreteJobState.Running) + { + retJobs.Add(job); + } + } + + return retJobs; + } + + public static byte[] GetVirtualMachineThumbnail(int itemId, ThumbnailSize size) + { + // load meta item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + if (vm == null) + return null; + + // get proxy + VirtualizationServer vps = GetVirtualizationProxy(vm.ServiceId); + + // return thumbnail + return vps.GetVirtualMachineThumbnailImage(vm.VirtualMachineId, size); + } + + public static VirtualMachine GetVirtualMachineGeneralDetails(int itemId) + { + // load meta item + VirtualMachine machine = GetVirtualMachineByItemId(itemId); + + if (machine == null || String.IsNullOrEmpty(machine.VirtualMachineId)) + return null; + + // get proxy + VirtualizationServer vps = GetVirtualizationProxy(machine.ServiceId); + + // load details + VirtualMachine vm = vps.GetVirtualMachine(machine.VirtualMachineId); + + // add meta props + vm.Id = machine.Id; + vm.Name = machine.Name; + vm.RamSize = machine.RamSize; + vm.ServiceId = machine.ServiceId; + + return vm; + } + + public static VirtualMachine GetVirtualMachineExtendedInfo(int serviceId, string vmId) + { + // get proxy + VirtualizationServer vps = GetVirtualizationProxy(serviceId); + + // load details + return vps.GetVirtualMachineEx(vmId); + } + + public static int CancelVirtualMachineJob(string jobId) + { + // VPS - CANCEL_JOB + return 0; + } + + public static ResultObject UpdateVirtualMachineHostName(int itemId, string hostname, bool updateNetBIOS) + { + if (String.IsNullOrEmpty(hostname)) + throw new ArgumentNullException("hostname"); + + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "UPDATE_HOSTNAME", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // update virtual machine name + JobResult result = vs.RenameVirtualMachine(vm.VirtualMachineId, hostname); + if (result.ReturnValue != ReturnCode.OK) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // update meta item + vm.Name = hostname; + PackageController.UpdatePackageItem(vm); + + // update NetBIOS name if required + if (updateNetBIOS) + { + result = SendComputerNameKVP(itemId, hostname); + if (result.ReturnValue != ReturnCode.JobStarted + && result.Job.JobState == ConcreteJobState.Completed) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.CHANGE_ADMIN_PASSWORD_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject ChangeVirtualMachineStateExternal(int itemId, VirtualMachineRequestedState state) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + #region Check Quotas + // check quotas + List quotaResults = new List(); + + if ((state == VirtualMachineRequestedState.Start + || state == VirtualMachineRequestedState.TurnOff + || state == VirtualMachineRequestedState.ShutDown) + && !vm.StartTurnOffAllowed) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_START_SHUTDOWN_ALLOWED); + + else if ((state == VirtualMachineRequestedState.Pause + || state == VirtualMachineRequestedState.Resume) + && !vm.PauseResumeAllowed) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_PAUSE_RESUME_ALLOWED); + + else if (state == VirtualMachineRequestedState.Reboot + && !vm.RebootAllowed) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_REBOOT_ALLOWED); + + else if (state == VirtualMachineRequestedState.Reset + && !vm.ResetAllowed) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_EXCEEDED_RESET_ALOWED); + + if (quotaResults.Count > 0) + { + res.ErrorCodes.AddRange(quotaResults); + res.IsSuccess = false; + TaskManager.CompleteResultTask(); + return res; + } + #endregion + + return ChangeVirtualMachineState(itemId, state); + } + + private static ResultObject ChangeVirtualMachineState(int itemId, VirtualMachineRequestedState state) + { + // start task + ResultObject res = TaskManager.StartResultTask("VPS", "CHANGE_STATE"); + + try + { + // load service item + VirtualMachine machine = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (machine == null) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + BackgroundTask topTask = TaskManager.TopTask; + topTask.ItemId = machine.Id; + topTask.ItemName = machine.Name; + topTask.PackageId = machine.PackageId; + + TaskController.UpdateTask(topTask); + + TaskManager.WriteParameter("New state", state); + + // load proxy + VirtualizationServer vps = GetVirtualizationProxy(machine.ServiceId); + + try + { + if (state == VirtualMachineRequestedState.ShutDown) + { + ReturnCode code = vps.ShutDownVirtualMachine(machine.VirtualMachineId, true, SHUTDOWN_REASON); + if (code != ReturnCode.OK) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.JOB_START_ERROR + ":" + code); + TaskManager.CompleteResultTask(res); + return res; + } + + // spin until fully stopped + VirtualMachine vm = vps.GetVirtualMachine(machine.VirtualMachineId); + while (vm.State != VirtualMachineState.Off) + { + System.Threading.Thread.Sleep(1000); // sleep 1 second + vm = vps.GetVirtualMachine(machine.VirtualMachineId); + } + } + else if (state == VirtualMachineRequestedState.Reboot) + { + // shutdown first + ResultObject shutdownResult = ChangeVirtualMachineState(itemId, + VirtualMachineRequestedState.ShutDown); + if (!shutdownResult.IsSuccess) + { + TaskManager.CompleteResultTask(res); + return shutdownResult; + } + + // start machine + ResultObject startResult = ChangeVirtualMachineState(itemId, VirtualMachineRequestedState.Start); + if (!startResult.IsSuccess) + { + TaskManager.CompleteResultTask(res); + return startResult; + } + } + else + { + if (state == VirtualMachineRequestedState.Resume) + state = VirtualMachineRequestedState.Start; + + JobResult result = vps.ChangeVirtualMachineState(machine.VirtualMachineId, state); + + if (result.Job.JobState == ConcreteJobState.Completed) + { + LogReturnValueResult(res, result); + TaskManager.CompleteTask(); + return res; + } + else + { + // check return + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // wait for completion + if (!JobCompleted(vps, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + } + } + catch(Exception ex) + { + res.IsSuccess = false; + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_CHANGE_VIRTUAL_SERVER_STATE); + TaskManager.WriteError(ex); + } + } + catch (Exception ex) + { + res.IsSuccess = false; + res.ErrorCodes.Add(VirtualizationErrorCodes.CHANGE_VIRTUAL_MACHINE_STATE_GENERAL_ERROR); + TaskManager.WriteError(ex); + return res; + } + + TaskManager.CompleteTask(); + return res; + } + #endregion + + #region VPS - Configuration + public static ResultObject ChangeAdministratorPassword(int itemId, string password) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "CHANGE_ADMIN_PASSWORD", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // change administrator password + JobResult result = SendAdministratorPasswordKVP(itemId, password); + if (result.ReturnValue != ReturnCode.JobStarted + && result.Job.JobState == ConcreteJobState.Completed) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // update meta item + vm.AdministratorPassword = CryptoUtils.Encrypt(password); + PackageController.UpdatePackageItem(vm); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.CHANGE_ADMIN_PASSWORD_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + #endregion + + #region VPS – Edit Configuration + public static ResultObject UpdateVirtualMachineConfiguration(int itemId, int cpuCores, int ramMB, int hddGB, int snapshots, + bool dvdInstalled, bool bootFromCD, bool numLock, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + bool externalNetworkEnabled, + bool privateNetworkEnabled) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + #region Check Quotas + // check quotas + List quotaResults = new List(); + PackageContext cntx = PackageController.GetPackageContext(vm.PackageId); + + CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_CPU_NUMBER, cpuCores, VirtualizationErrorCodes.QUOTA_EXCEEDED_CPU); + CheckNumericQuota(cntx, quotaResults, Quotas.VPS2012_RAM, vm.RamSize, ramMB, 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); + + // check acceptable values + if (ramMB <= 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_RAM); + if (hddGB <= 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_HDD); + if (snapshots < 0) + quotaResults.Add(VirtualizationErrorCodes.QUOTA_WRONG_SNAPSHOTS); + + if (quotaResults.Count > 0) + { + res.ErrorCodes.AddRange(quotaResults); + return res; + } + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "UPDATE_CONFIGURATION", vm.Id, vm.Name, vm.PackageId); + + try + { + JobResult result = null; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // stop VPS if required + VirtualMachine vps = vs.GetVirtualMachine(vm.VirtualMachineId); + + bool wasStarted = false; + + // stop (shut down) virtual machine + if (vps.State != VirtualMachineState.Off) + { + wasStarted = true; + ReturnCode code = vs.ShutDownVirtualMachine(vm.VirtualMachineId, true, SHUTDOWN_REASON_CHANGE_CONFIG); + if (code == ReturnCode.OK) + { + // spin until fully stopped + vps = vs.GetVirtualMachine(vm.VirtualMachineId); + while (vps.State != VirtualMachineState.Off) + { + System.Threading.Thread.Sleep(1000); // sleep 1 second + vps = vs.GetVirtualMachine(vm.VirtualMachineId); + } + } + else + { + // turn off + result = vs.ChangeVirtualMachineState(vm.VirtualMachineId, VirtualMachineRequestedState.TurnOff); + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + } // end OFF + + // update meta-item + vm.CpuCores = cpuCores; + vm.RamSize = ramMB; + vm.HddSize = hddGB; + vm.SnapshotsNumber = snapshots; + + vm.BootFromCD = bootFromCD; + vm.NumLockEnabled = numLock; + vm.DvdDriveInstalled = dvdInstalled; + + vm.StartTurnOffAllowed = startShutdownAllowed; + vm.PauseResumeAllowed = pauseResumeAllowed; + vm.ResetAllowed = resetAllowed; + vm.RebootAllowed = rebootAllowed; + vm.ReinstallAllowed = reinstallAllowed; + + vm.ExternalNetworkEnabled = externalNetworkEnabled; + vm.PrivateNetworkEnabled = privateNetworkEnabled; + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + + #region setup external network + if (vm.ExternalNetworkEnabled + && String.IsNullOrEmpty(vm.ExternalNicMacAddress)) + { + // connect to network + vm.ExternalSwitchId = settings["ExternalNetworkId"]; + vm.ExternalNicMacAddress = GenerateMacAddress(); + } + #endregion + + #region setup private network + if (vm.PrivateNetworkEnabled + && String.IsNullOrEmpty(vm.PrivateNicMacAddress)) + { + // connecto to network + vm.PrivateSwitchId = settings["PrivateNetworkId"]; + + if (String.IsNullOrEmpty(vm.PrivateSwitchId)) + { + // create/load private virtual switch + vm.PrivateSwitchId = EnsurePrivateVirtualSwitch(vm); + } + vm.PrivateNicMacAddress = GenerateMacAddress(); + } + #endregion + + // update configuration on virtualization server + vm = vs.UpdateVirtualMachine(vm); + + // update meta item + PackageController.UpdatePackageItem(vm); + + // unprovision external IP addresses + if (!vm.ExternalNetworkEnabled) + ServerController.DeleteItemIPAddresses(itemId); + else + // send KVP config items + SendNetworkAdapterKVP(itemId, "External"); + + // unprovision private IP addresses + if (!vm.PrivateNetworkEnabled) + DataProvider.DeleteItemPrivateIPAddresses(SecurityContext.User.UserId, itemId); + else + // send KVP config items + SendNetworkAdapterKVP(itemId, "Private"); + + // start if required + if (wasStarted) + { + result = vs.ChangeVirtualMachineState(vm.VirtualMachineId, VirtualMachineRequestedState.Start); + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.CHANGE_VM_CONFIGURATION, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + #endregion + + #region DVD + public static LibraryItem GetInsertedDvdDisk(int itemId) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + string isoPath = vs.GetInsertedDVD(vm.VirtualMachineId); + + if (String.IsNullOrEmpty(isoPath)) + return null; + + // load library items + LibraryItem[] disks = GetLibraryDisks(itemId); + + // find required disk + isoPath = Path.GetFileName(isoPath); + foreach (LibraryItem disk in disks) + { + if (String.Compare(isoPath, disk.Path, true) == 0) + return disk; + } + return null; + } + + public static LibraryItem[] GetLibraryDisks(int itemId) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + string path = settings["DvdLibraryPath"]; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + return vs.GetLibraryItems(path); + } + + public static ResultObject InsertDvdDisk(int itemId, string isoPath) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "INSERT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); + + try + { + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + string libPath = settings["DvdLibraryPath"]; + + // combine full path + string fullPath = Path.Combine(libPath, isoPath); + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // insert DVD + JobResult result = vs.InsertDVD(vm.VirtualMachineId, fullPath); + if (result.ReturnValue != ReturnCode.OK) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.INSERT_DVD_DISK_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject EjectDvdDisk(int itemId) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "EJECT_DVD_DISK", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // insert DVD + JobResult result = vs.EjectDVD(vm.VirtualMachineId); + if (result.ReturnValue != ReturnCode.OK) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.EJECT_DVD_DISK_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + #endregion + + #region Snaphosts + public static VirtualMachineSnapshot[] GetVirtualMachineSnapshots(int itemId) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + return vs.GetVirtualMachineSnapshots(vm.VirtualMachineId); + } + + public static VirtualMachineSnapshot GetSnapshot(int itemId, string snaphostId) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + return vs.GetSnapshot(snaphostId); + } + + public static ResultObject CreateSnapshot(int itemId) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "TAKE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + #region Check Quotas + // check quotas + List quotaResults = new List(); + PackageContext cntx = PackageController.GetPackageContext(vm.PackageId); + + // check the number of created snapshots + int createdNumber = vs.GetVirtualMachineSnapshots(vm.VirtualMachineId).Length; + if (createdNumber >= vm.SnapshotsNumber) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.QUOTA_EXCEEDED_SNAPSHOTS + ":" + vm.SnapshotsNumber); + return res; + } + #endregion + + // take snapshot + JobResult result = vs.CreateSnapshot(vm.VirtualMachineId); + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.TAKE_SNAPSHOT_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject ApplySnapshot(int itemId, string snapshotId) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "APPLY_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); + + try + { + JobResult result = null; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // check VM state + VirtualMachine vps = vs.GetVirtualMachine(vm.VirtualMachineId); + + // stop virtual machine + if (vps.State != VirtualMachineState.Off) + { + result = vs.ChangeVirtualMachineState(vm.VirtualMachineId, VirtualMachineRequestedState.TurnOff); + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + + // take snapshot + result = vs.ApplySnapshot(vm.VirtualMachineId, snapshotId); + if (result.ReturnValue != ReturnCode.OK) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.APPLY_SNAPSHOT_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject RenameSnapshot(int itemId, string snapshotId, string newName) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "RENAME_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // take snapshot + JobResult result = vs.RenameSnapshot(vm.VirtualMachineId, snapshotId, newName); + if (result.ReturnValue != ReturnCode.OK) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.RENAME_SNAPSHOT_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject DeleteSnapshot(int itemId, string snapshotId) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // take snapshot + JobResult result = vs.DeleteSnapshot(snapshotId); + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.DELETE_SNAPSHOT_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject DeleteSnapshotSubtree(int itemId, string snapshotId) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "DELETE_SNAPSHOT_SUBTREE", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // take snapshot + JobResult result = vs.DeleteSnapshotSubtree(snapshotId); + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.DELETE_SNAPSHOT_SUBTREE_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static byte[] GetSnapshotThumbnail(int itemId, string snapshotId, ThumbnailSize size) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + return vs.GetSnapshotThumbnailImage(snapshotId, size); + } + #endregion + + #region Network - External + public static NetworkAdapterDetails GetExternalNetworkDetails(int packageId) + { + // load service + int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS2012); + + return GetExternalNetworkDetailsInternal(serviceId); + } + + public static NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // get default NIC + NetworkAdapterDetails nic = GetExternalNetworkDetailsInternal(vm.ServiceId); + + // update NIC + nic.MacAddress = GetSymbolDelimitedMacAddress(vm.ExternalNicMacAddress, "-"); + + // load IP addresses + nic.IPAddresses = ObjectUtils.CreateListFromDataReader( + DataProvider.GetItemIPAddresses(SecurityContext.User.UserId, itemId, (int)IPAddressPool.VpsExternalNetwork)).ToArray(); + + // update subnet CIDR + foreach (NetworkAdapterIPAddress ip in nic.IPAddresses) + ip.SubnetMaskCidr = GetSubnetMaskCidr(ip.SubnetMask); + + if (nic.IPAddresses.Length > 0) + { + // from primary address + nic.SubnetMask = nic.IPAddresses[0].SubnetMask; + nic.SubnetMaskCidr = GetSubnetMaskCidr(nic.SubnetMask); + nic.DefaultGateway = nic.IPAddresses[0].DefaultGateway; + } + + return nic; + } + + public static NetworkAdapterDetails GetManagementNetworkDetails(int packageId) + { + // load service + int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS2012); + return GetManagementNetworkDetailsInternal(serviceId); + } + + private static NetworkAdapterDetails GetExternalNetworkDetailsInternal(int serviceId) + { + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + + // create NIC object + NetworkAdapterDetails nic = new NetworkAdapterDetails(); + nic.NetworkId = settings["ExternalNetworkId"]; + nic.PreferredNameServer = settings["ExternalPreferredNameServer"]; + nic.AlternateNameServer = settings["ExternalAlternateNameServer"]; + return nic; + } + + public static NetworkAdapterDetails GetManagementNetworkAdapterDetails(int itemId) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // get default NIC + NetworkAdapterDetails nic = GetManagementNetworkDetailsInternal(vm.ServiceId); + + // update NIC + nic.MacAddress = GetSymbolDelimitedMacAddress(vm.ManagementNicMacAddress, "-"); + + // load IP addresses + nic.IPAddresses = ObjectUtils.CreateListFromDataReader( + DataProvider.GetItemIPAddresses(SecurityContext.User.UserId, itemId, (int)IPAddressPool.VpsManagementNetwork)).ToArray(); + + // update subnet CIDR + foreach (NetworkAdapterIPAddress ip in nic.IPAddresses) + ip.SubnetMaskCidr = GetSubnetMaskCidr(ip.SubnetMask); + + if (nic.IPAddresses.Length > 0) + { + // from primary address + nic.SubnetMask = nic.IPAddresses[0].SubnetMask; + nic.SubnetMaskCidr = GetSubnetMaskCidr(nic.SubnetMask); + nic.DefaultGateway = nic.IPAddresses[0].DefaultGateway; + } + + return nic; + } + + private static NetworkAdapterDetails GetManagementNetworkDetailsInternal(int serviceId) + { + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + + // create NIC object + NetworkAdapterDetails nic = new NetworkAdapterDetails(); + nic.NetworkId = settings["ManagementNetworkId"]; + nic.IsDHCP = (String.Compare(settings["ManagementNicConfig"], "DHCP", true) == 0); + + if (!nic.IsDHCP) + { + nic.PreferredNameServer = settings["ManagementPreferredNameServer"]; + nic.AlternateNameServer = settings["ManagementAlternateNameServer"]; + } + return nic; + } + + public static ResultObject AddVirtualMachineExternalIPAddresses(int itemId, bool selectRandom, int addressesNumber, int[] addressIds, bool provisionKvp) + { + if (addressIds == null) + throw new ArgumentNullException("addressIds"); + + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "ADD_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + if (selectRandom) + { + List ips = ServerController.GetPackageUnassignedIPAddresses(vm.PackageId, IPAddressPool.VpsExternalNetwork); + if (addressesNumber > ips.Count) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.NOT_ENOUGH_PACKAGE_IP_ADDRESSES); + return res; + } + + // get next N unassigned addresses + addressIds = new int[addressesNumber]; + for (int i = 0; i < addressesNumber; i++) + addressIds[i] = ips[i].PackageAddressID; + } + + // add addresses + foreach (int addressId in addressIds) + ServerController.AddItemIPAddress(itemId, addressId); + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "External"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.ADD_VIRTUAL_MACHINE_EXTERNAL_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject SetVirtualMachinePrimaryExternalIPAddress(int itemId, int packageAddressId, bool provisionKvp) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + // call database + ServerController.SetItemPrimaryIPAddress(itemId, packageAddressId); + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "External"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.SET_VIRTUAL_MACHINE_PRIMARY_EXTERNAL_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject DeleteVirtualMachineExternalIPAddresses(int itemId, int[] packageAddressIds, bool provisionKvp) + { + if (packageAddressIds == null) + throw new ArgumentNullException("addressIds"); + + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "DELETE_EXTERNAL_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + // call database + foreach (int packageAddressId in packageAddressIds) + ServerController.DeleteItemIPAddress(itemId, packageAddressId); + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "External"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.DELETE_VIRTUAL_MACHINE_EXTERNAL_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + #endregion + + #region Network – Private + public static NetworkAdapterDetails GetPrivateNetworkDetails(int packageId) + { + // load service + int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS2012); + + return GetPrivateNetworkDetailsInternal(serviceId); + } + + public static NetworkAdapterDetails GetPrivateNetworkAdapterDetails(int itemId) + { + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // load default internal adapter + NetworkAdapterDetails nic = GetPrivateNetworkDetailsInternal(vm.ServiceId); + + // update NIC + nic.MacAddress = GetSymbolDelimitedMacAddress(vm.PrivateNicMacAddress, "-"); + + // load IP addresses + nic.IPAddresses = ObjectUtils.CreateListFromDataReader( + DataProvider.GetItemPrivateIPAddresses(SecurityContext.User.UserId, itemId)).ToArray(); + + foreach (NetworkAdapterIPAddress ip in nic.IPAddresses) + { + ip.SubnetMask = nic.SubnetMask; + ip.SubnetMaskCidr = nic.SubnetMaskCidr; + ip.DefaultGateway = nic.DefaultGateway; + } + + return nic; + } + + private static NetworkAdapterDetails GetPrivateNetworkDetailsInternal(int serviceId) + { + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(serviceId); + + // create NIC object + NetworkAdapterDetails nic = new NetworkAdapterDetails(); + + string networkFormat = settings["PrivateNetworkFormat"]; + if (String.IsNullOrEmpty(networkFormat)) + { + // custom format + nic.NetworkFormat = settings["PrivateIPAddress"]; + var v6 = IPAddress.Parse(nic.NetworkFormat).V6; + nic.SubnetMask = GetPrivateNetworkSubnetMask(settings["PrivateSubnetMask"], v6); + } + else + { + // standard format + string[] formatPair = settings["PrivateNetworkFormat"].Split('/'); + nic.NetworkFormat = formatPair[0]; + var v6 = IPAddress.Parse(nic.NetworkFormat).V6; + nic.SubnetMask = GetPrivateNetworkSubnetMask(formatPair[1], v6); + } + + nic.SubnetMaskCidr = GetSubnetMaskCidr(nic.SubnetMask); + nic.DefaultGateway = settings["PrivateDefaultGateway"]; + nic.PreferredNameServer = settings["PrivatePreferredNameServer"]; + nic.AlternateNameServer = settings["PrivateAlternateNameServer"]; + + return nic; + } + + public static ResultObject AddVirtualMachinePrivateIPAddresses(int itemId, bool selectRandom, int addressesNumber, string[] addresses, bool provisionKvp) + { + // trace info + Trace.TraceInformation("Entering AddVirtualMachinePrivateIPAddresses()"); + Trace.TraceInformation("Item ID: {0}", itemId); + Trace.TraceInformation("SelectRandom: {0}", selectRandom); + Trace.TraceInformation("AddressesNumber: {0}", addressesNumber); + + if (addresses != null) + { + foreach(var address in addresses) + Trace.TraceInformation("addresses[n]: {0}", address); + } + + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "ADD_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + // load network adapter + NetworkAdapterDetails nic = GetPrivateNetworkAdapterDetails(itemId); + + bool wasEmptyList = (nic.IPAddresses.Length == 0); + + if(wasEmptyList) + Trace.TraceInformation("NIC IP addresses list is empty"); + + // check IP addresses if they are specified + List checkResults = CheckPrivateIPAddresses(vm.PackageId, addresses); + if (checkResults.Count > 0) + { + res.ErrorCodes.AddRange(checkResults); + res.IsSuccess = false; + TaskManager.CompleteResultTask(); + return res; + } + + // load all existing private IP addresses + List ips = GetPackagePrivateIPAddresses(vm.PackageId); + + // sort them + SortedList sortedIps = GetSortedNormalizedIPAddresses(ips, nic.SubnetMask); + + if (selectRandom) + { + // generate N number of IP addresses + addresses = new string[addressesNumber]; + for (int i = 0; i < addressesNumber; i++) + addresses[i] = GenerateNextAvailablePrivateIP(sortedIps, nic.SubnetMask, nic.NetworkFormat); + } + + PackageContext cntx = PackageController.GetPackageContext(vm.PackageId); + QuotaValueInfo quota = cntx.Quotas[Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER]; + if (quota.QuotaAllocatedValue != -1) + { + int maxAddresses = quota.QuotaAllocatedValue - nic.IPAddresses.Length; + + if (addresses.Length > maxAddresses) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.QUOTA_EXCEEDED_PRIVATE_ADDRESSES_NUMBER + ":" + maxAddresses); + return res; + } + } + + // add addresses to database + foreach (string address in addresses) + DataProvider.AddItemPrivateIPAddress(SecurityContext.User.UserId, itemId, address); + + // set primary IP address + if (wasEmptyList) + { + nic = GetPrivateNetworkAdapterDetails(itemId); + if (nic.IPAddresses.Length > 0) + SetVirtualMachinePrimaryPrivateIPAddress(itemId, nic.IPAddresses[0].AddressId, false); + } + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "Private"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.ADD_VIRTUAL_MACHINE_PRIVATE_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + private static List CheckPrivateIPAddresses(int packageId, string[] addresses) + { + List codes = new List(); + + // check IP addresses if they are specified + if (addresses != null && addresses.Length > 0) + { + // load network adapter + NetworkAdapterDetails nic = GetPrivateNetworkDetails(packageId); + + foreach (string address in addresses) + { + if (!CheckPrivateIPAddress(nic.SubnetMask, address)) + codes.Add(VirtualizationErrorCodes.WRONG_PRIVATE_IP_ADDRESS_FORMAT + ":" + address); + } + } + + return codes; + } + + public static ResultObject SetVirtualMachinePrimaryPrivateIPAddress(int itemId, int addressId, bool provisionKvp) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "SET_PRIMARY_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + // call data access layer + DataProvider.SetItemPrivatePrimaryIPAddress(SecurityContext.User.UserId, itemId, addressId); + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "Private"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.SET_VIRTUAL_MACHINE_PRIMARY_PRIVATE_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static ResultObject DeleteVirtualMachinePrivateIPAddresses(int itemId, int[] addressIds, bool provisionKvp) + { + if (addressIds == null) + throw new ArgumentNullException("addressIds"); + + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "DELETE_PRIVATE_IP", vm.Id, vm.Name, vm.PackageId); + + try + { + // call data access layer + foreach (int addressId in addressIds) + DataProvider.DeleteItemPrivateIPAddress(SecurityContext.User.UserId, itemId, addressId); + + // send KVP config items + if(provisionKvp) + SendNetworkAdapterKVP(itemId, "Private"); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.DELETE_VIRTUAL_MACHINE_PRIVATE_IP_ADDRESS_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + private static string GenerateNextAvailablePrivateIP(SortedList ips, string subnetMask, string startIPAddress) + { + Trace.TraceInformation("Entering GenerateNextAvailablePrivateIP()"); + Trace.TraceInformation("Param - number of sorted IPs in the list: {0}", ips.Count); + Trace.TraceInformation("Param - startIPAddress: {0}", startIPAddress); + Trace.TraceInformation("Param - subnetMask: {0}", subnetMask); + + // start IP address + var ip = IPAddress.Parse(startIPAddress) - 1; + + Trace.TraceInformation("Start looking for next available IP"); + foreach (var addr in ips.Keys) + { + if ((addr - ip) > 1) + { + // it is a gap + break; + } + else + { + ip = addr; + } + } + + // final IP found + ip = ip + 1; + + string genIP = ip.ToString(); + Trace.TraceInformation("Generated IP: {0}", genIP); + + // store in cache + Trace.TraceInformation("Adding to sorted list"); + ips.Add(ip, genIP); + + Trace.TraceInformation("Leaving GenerateNextAvailablePrivateIP()"); + return genIP; + } + + private static SortedList GetSortedNormalizedIPAddresses(List ips, string subnetMask) + { + Trace.TraceInformation("Entering GetSortedNormalizedIPAddresses()"); + Trace.TraceInformation("Param - subnetMask: {0}", subnetMask); + + var mask = IPAddress.Parse(subnetMask); + SortedList sortedIps = new SortedList(); + foreach (PrivateIPAddress ip in ips) + { + var addr = IPAddress.Parse(ip.IPAddress); + sortedIps.Add(addr, ip.IPAddress); + + Trace.TraceInformation("Added {0} to sorted IPs list with key: {1} ", ip.IPAddress, addr.ToString()); + } + Trace.TraceInformation("Leaving GetSortedNormalizedIPAddresses()"); + return sortedIps; + } + + private static string GetPrivateNetworkSubnetMask(string cidr, bool v6) { + if (v6) + { + return "/" + cidr; + } + else + { + return IPAddress.Parse("/" + cidr).ToV4MaskString(); + } + } + + private static string GetSubnetMaskCidr(string subnetMask) { + if (String.IsNullOrEmpty(subnetMask)) + return subnetMask; + var ip = IPAddress.Parse(subnetMask); + if (ip.V4) { + int cidr = 32; + var mask = ip.Address; + while ((mask & 1) == 0 && cidr > 0) { + mask >>= 1; + cidr -= 1; + } + return cidr.ToString(); + } else { + return ip.Cidr.ToString(); + } + } + + private static bool CheckPrivateIPAddress(string subnetMask, string ipAddress) + { + var mask = IPAddress.Parse(subnetMask); + var ip = IPAddress.Parse(ipAddress); + + //return ((mask & ip) == mask); + return true; + } + #endregion + + #region Virtual Machine Permissions + public static List GetVirtualMachinePermissions(int itemId) + { + List result = new List(); + return result; + } + + public static int UpdateVirtualMachineUserPermissions(int itemId, VirtualMachinePermission[] permissions) + { + // VPS - UPDATE_PERMISSIONS + return 0; + } + #endregion + + #region Virtual Switches + public static VirtualSwitch[] GetExternalSwitches(int serviceId, string computerName) + { + VirtualizationServer vs = new VirtualizationServer(); + ServiceProviderProxy.Init(vs, serviceId); + return vs.GetExternalSwitches(computerName); + } + #endregion + + #region Tools + public static ResultObject DeleteVirtualMachine(int itemId, bool saveFiles, bool exportVps, string exportPath) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "DELETE", vm.Id, vm.Name, vm.PackageId); + + try + { + // get proxy + VirtualizationServer vs = GetVirtualizationProxy(vm.ServiceId); + + // check VM state + VirtualMachine vps = vs.GetVirtualMachine(vm.VirtualMachineId); + + JobResult result = null; + + if (vps != null) + { + #region turn off machine (if required) + + // stop virtual machine + if (vps.State != VirtualMachineState.Off) + { + TaskManager.Write("VPS_DELETE_TURN_OFF"); + result = vs.ChangeVirtualMachineState(vm.VirtualMachineId, VirtualMachineRequestedState.TurnOff); + // check result + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + #endregion + + #region export machine + if (exportVps && !String.IsNullOrEmpty(exportPath)) + { + TaskManager.Write("VPS_DELETE_EXPORT"); + result = vs.ExportVirtualMachine(vm.VirtualMachineId, exportPath); + + // check result + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + } + #endregion + + #region delete machine + TaskManager.Write("VPS_DELETE_DELETE"); + result = vs.DeleteVirtualMachine(vm.VirtualMachineId); + + // check result + if (result.ReturnValue != ReturnCode.JobStarted) + { + LogReturnValueResult(res, result); + TaskManager.CompleteResultTask(res); + return res; + } + + // wait for completion + if (!JobCompleted(vs, result.Job)) + { + LogJobResult(res, result.Job); + TaskManager.CompleteResultTask(res); + return res; + } + #endregion + } + + #region delete files + if (!saveFiles) + { + TaskManager.Write("VPS_DELETE_FILES", vm.RootFolderPath); + try + { + vs.DeleteRemoteFile(vm.RootFolderPath); + } + catch (Exception ex) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.DELETE_VM_FILES_ERROR + ": " + ex.Message); + } + } + #endregion + + // delete meta item + PackageController.DeletePackageItem(itemId); + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.DELETE_ERROR, ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static int ReinstallVirtualMachine(int itemId, string adminPassword, bool preserveVirtualDiskFiles, + bool saveVirtualDisk, bool exportVps, string exportPath) + { + // VPS - REINSTALL + return 0; + } + #endregion + + #region Help + public static string GetVirtualMachineSummaryText(int itemId, bool emailMode, bool creation) + { + // load item + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + + // load user info + UserInfo user = PackageController.GetPackageOwner(vm.PackageId); + + // get letter settings + UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.VPS_SUMMARY_LETTER); + + string settingName = user.HtmlMail ? "HtmlBody" : "TextBody"; + string body = settings[settingName]; + if (String.IsNullOrEmpty(body)) + return null; + + string result = EvaluateVirtualMachineTemplate(itemId, emailMode, creation, body); + return user.HtmlMail ? result : result.Replace("\n", "
"); + } + + public static ResultObject SendVirtualMachineSummaryLetter(int itemId, string to, string bcc, bool creation) + { + ResultObject res = new ResultObject(); + + // load service item + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.CANNOT_FIND_VIRTUAL_MACHINE_META_ITEM); + return res; + } + + #region Check account and space statuses + // check account + if (!SecurityContext.CheckAccount(res, DemandAccount.NotDemo | DemandAccount.IsActive)) + return res; + + // check package + if (!SecurityContext.CheckPackage(res, vm.PackageId, DemandPackage.IsActive)) + return res; + #endregion + + // start task + res = TaskManager.StartResultTask("VPS", "SEND_SUMMARY_LETTER", vm.Id, vm.Name, vm.PackageId); + + try + { + // load user info + UserInfo user = PackageController.GetPackageOwner(vm.PackageId); + + // get letter settings + UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.VPS_SUMMARY_LETTER); + + string from = settings["From"]; + if (bcc == null) + bcc = settings["CC"]; + string subject = settings["Subject"]; + string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"]; + bool isHtml = user.HtmlMail; + + MailPriority priority = MailPriority.Normal; + if (!String.IsNullOrEmpty(settings["Priority"])) + priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true); + + if (String.IsNullOrEmpty(body)) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.SUMMARY_TEMPLATE_IS_EMPTY); + return res; + } + + // load user info + if (to == null) + to = user.Email; + + subject = EvaluateVirtualMachineTemplate(itemId, true, creation, subject); + body = EvaluateVirtualMachineTemplate(itemId, true, creation, body); + + // send message + int result = MailHelper.SendMessage(from, to, bcc, subject, body, priority, isHtml); + + if (result != 0) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.SEND_SUMMARY_LETTER_CODE + ":" + result); + TaskManager.WriteWarning("VPS_SEND_SUMMARY_LETTER_ERROR_CODE", result.ToString()); + return res; + } + } + catch (Exception ex) + { + TaskManager.CompleteResultTask(res, VirtualizationErrorCodes.SEND_SUMMARY_LETTER, ex); + TaskManager.WriteWarning("VPS_SEND_SUMMARY_LETTER_ERROR", ex.Message); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static string EvaluateVirtualMachineTemplate(int itemId, bool emailMode, bool creation, string template) + { + Hashtable items = new Hashtable(); + + // load machine details + VirtualMachine vm = GetVirtualMachineByItemId(itemId); + if (vm == null) + throw new Exception("VPS with the specified ID was not found."); + + // space info + PackageInfo package = PackageController.GetPackage(vm.PackageId); + items["space"] = package; + + // user info + items["user"] = PackageController.GetPackageOwner(vm.PackageId); + + // VM item + items["vm"] = vm; + + // load external NIC + items["external_nic"] = GetExternalNetworkAdapterDetails(itemId); + + // load private NIC + items["private_nic"] = GetPrivateNetworkAdapterDetails(itemId); + + // load private NIC + items["management_nic"] = GetManagementNetworkAdapterDetails(itemId); + + // load service settings + StringDictionary settings = ServerController.GetServiceSettings(vm.ServiceId); + + foreach (string key in settings.Keys) + items[key] = settings[key]; + + // service items + items["email"] = emailMode; + items["creation"] = creation; + + // evaluate template + return PackageController.EvaluateTemplate(template, items); + } + #endregion + + #region Helper methods + private static int GetServiceId(int packageId) + { + int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS2012); + return serviceId; + } + + private static VirtualizationServer GetVirtualizationProxyByPackageId(int packageId) + { + // get service + int serviceId = GetServiceId(packageId); + + return GetVirtualizationProxy(serviceId); + } + + private static VirtualizationServer GetVirtualizationProxy(int serviceId) + { + VirtualizationServer ws = new VirtualizationServer(); + ServiceProviderProxy.Init(ws, serviceId); + return ws; + } + + public static VirtualMachine GetVirtualMachineByItemId(int itemId) + { + VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId); + if (vm == null) + return null; + + // host name + int dotIdx = vm.Name.IndexOf("."); + if (dotIdx > -1) + { + vm.Hostname = vm.Name.Substring(0, dotIdx); + vm.Domain = vm.Name.Substring(dotIdx + 1); + } + else + { + vm.Hostname = vm.Name; + vm.Domain = ""; + } + + // check if task was aborted during provisioning + if (!String.IsNullOrEmpty(vm.CurrentTaskId) + && TaskManager.GetTask(vm.CurrentTaskId) == null) + { + // set to error + vm.CurrentTaskId = null; + vm.ProvisioningStatus = VirtualMachineProvisioningStatus.Error; + PackageController.UpdatePackageItem(vm); + } + + vm.AdministratorPassword = CryptoUtils.Decrypt(vm.AdministratorPassword); + return vm; + } + + private static void LogReturnValueResult(ResultObject res, JobResult job) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.JOB_START_ERROR + ":" + job.ReturnValue); + } + + private static void LogJobResult(ResultObject res, ConcreteJob job) + { + res.ErrorCodes.Add(VirtualizationErrorCodes.JOB_FAILED_ERROR + ":" + job.ErrorDescription); + } + + private static bool JobCompleted(VirtualizationServer vs, ConcreteJob job) + { + TaskManager.IndicatorMaximum = 100; + bool jobCompleted = true; + + while (job.JobState == ConcreteJobState.Starting || + job.JobState == ConcreteJobState.Running) + { + System.Threading.Thread.Sleep(1000); + job = vs.GetJob(job.Id); + TaskManager.IndicatorCurrent = job.PercentComplete; + } + + if (job.JobState != ConcreteJobState.Completed) + { + jobCompleted = false; + } + + TaskManager.IndicatorCurrent = 0; // reset indicator + + return jobCompleted; + } + + private static string GenerateMacAddress() + { + return MS_MAC_PREFIX + Utils.GetRandomHexString(3); + } + + #endregion + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj index 58c17bbf..04b9a326 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj @@ -173,6 +173,8 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj index c18d5220..5dbd1017 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/WebsitePanel.EnterpriseServer.csproj @@ -123,6 +123,7 @@ + @@ -176,6 +177,10 @@ esLync.asmx Component + + esVirtualizationServer2012.asmx + Component + esVirtualizationServerForPrivateCloud.asmx Component diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx new file mode 100644 index 00000000..328640b4 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="esVirtualizationServer2012.asmx.cs" Class="WebsitePanel.EnterpriseServer.esVirtualizationServer2012" %> diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx.cs new file mode 100644 index 00000000..bd486169 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esVirtualizationServer2012.asmx.cs @@ -0,0 +1,476 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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.Data; +using System.Web; +using System.Collections; +using System.Collections.Generic; +using System.Web.Services; +using System.Web.Services.Protocols; +using System.ComponentModel; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.ResultObjects; +using Microsoft.Web.Services3; +using WebsitePanel.Providers; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.EnterpriseServer +{ + /// + /// Summary description for esVirtualizationServer + /// + [WebService(Namespace = "http://smbsaas/websitepanel/enterpriseserver")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [Policy("ServerPolicy")] + [ToolboxItem(false)] + public class esVirtualizationServer2012 : System.Web.Services.WebService + { + #region Virtual Machines + [WebMethod] + public VirtualMachineMetaItemsPaged GetVirtualMachines(int packageId, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive) + { + return VirtualizationServerController2012.GetVirtualMachines(packageId, + filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive); + } + + [WebMethod] + public VirtualMachine[] GetVirtualMachinesByServiceId(int serviceId) + { + return VirtualizationServerController2012.GetVirtualMachinesByServiceId(serviceId); + } + + [WebMethod] + public VirtualMachine GetVirtualMachineItem(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachineByItemId(itemId); + } + + [WebMethod] + public string EvaluateVirtualMachineTemplate(int itemId, string template) + { + if (SecurityContext.CheckAccount(DemandAccount.IsActive | DemandAccount.IsAdmin | DemandAccount.NotDemo) != 0) + throw new Exception("This method could be called by serveradmin only."); + + return VirtualizationServerController2012.EvaluateVirtualMachineTemplate(itemId, false, false, template); + } + #endregion + + #region External Network + [WebMethod] + public NetworkAdapterDetails GetExternalNetworkDetails(int packageId) + { + return VirtualizationServerController2012.GetExternalNetworkDetails(packageId); + } + #endregion + + #region Private Network + [WebMethod] + public PrivateIPAddressesPaged GetPackagePrivateIPAddressesPaged(int packageId, + string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) + { + return VirtualizationServerController2012.GetPackagePrivateIPAddressesPaged(packageId, + filterColumn, filterValue, sortColumn, startRow, maximumRows); + } + + [WebMethod] + public List GetPackagePrivateIPAddresses(int packageId) + { + return VirtualizationServerController2012.GetPackagePrivateIPAddresses(packageId); + } + + [WebMethod] + public NetworkAdapterDetails GetPrivateNetworkDetails(int packageId) + { + return VirtualizationServerController2012.GetPrivateNetworkDetails(packageId); + } + #endregion + + #region User Permissions + [WebMethod] + public List GetSpaceUserPermissions(int packageId) + { + return VirtualizationServerController2012.GetSpaceUserPermissions(packageId); + } + + [WebMethod] + public int UpdateSpaceUserPermissions(int packageId, VirtualMachinePermission[] permissions) + { + return VirtualizationServerController2012.UpdateSpaceUserPermissions(packageId, permissions); + } + #endregion + + #region Audit Log + [WebMethod] + public List GetSpaceAuditLog(int packageId, DateTime startPeriod, DateTime endPeriod, + int severity, string sortColumn, int startRow, int maximumRows) + { + return VirtualizationServerController2012.GetSpaceAuditLog(packageId, startPeriod, endPeriod, + severity, sortColumn, startRow, maximumRows); + } + + [WebMethod] + public List GetVirtualMachineAuditLog(int itemId, DateTime startPeriod, DateTime endPeriod, + int severity, string sortColumn, int startRow, int maximumRows) + { + return VirtualizationServerController2012.GetVirtualMachineAuditLog(itemId, startPeriod, endPeriod, + severity, sortColumn, startRow, maximumRows); + } + #endregion + + #region VPS Create – Name & OS + [WebMethod] + public LibraryItem[] GetOperatingSystemTemplates(int packageId) + { + return VirtualizationServerController2012.GetOperatingSystemTemplates(packageId); + } + + [WebMethod] + public LibraryItem[] GetOperatingSystemTemplatesByServiceId(int serviceId) + { + return VirtualizationServerController2012.GetOperatingSystemTemplatesByServiceId(serviceId); + } + #endregion + + #region VPS Create - Configuration + [WebMethod] + public int GetMaximumCpuCoresNumber(int packageId) + { + return VirtualizationServerController2012.GetMaximumCpuCoresNumber(packageId); + } + + [WebMethod] + public string GetDefaultExportPath(int itemId) + { + return VirtualizationServerController2012.GetDefaultExportPath(itemId); + } + #endregion + + #region VPS Create + [WebMethod] + public IntResult CreateDefaultVirtualMachine(int packageId, + string hostname, string osTemplate, string password, string summaryLetterEmail) + { + return VirtualizationServerController2012.CreateDefaultVirtualMachine(packageId, hostname, osTemplate, password, summaryLetterEmail); + } + + [WebMethod] + public IntResult CreateVirtualMachine(int packageId, + string hostname, string osTemplateFile, string password, string summaryLetterEmail, + int generation, int cpuCores, int ramMB, int hddGB, int snapshots, bool dvdInstalled, bool bootFromCD, bool numLock, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + bool externalNetworkEnabled, int externalAddressesNumber, bool randomExternalAddresses, int[] externalAddresses, + bool privateNetworkEnabled, int privateAddressesNumber, bool randomPrivateAddresses, string[] privateAddresses) + { + return VirtualizationServerController2012.CreateVirtualMachine(packageId, + hostname, osTemplateFile, password, summaryLetterEmail, + generation, cpuCores, ramMB, hddGB, snapshots, dvdInstalled, bootFromCD, numLock, + startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, + externalNetworkEnabled, externalAddressesNumber, randomExternalAddresses, externalAddresses, + privateNetworkEnabled, privateAddressesNumber, randomPrivateAddresses, privateAddresses); + } + #endregion + + #region VPS - Import + [WebMethod] + public IntResult ImportVirtualMachine(int packageId, + int serviceId, string vmId, + string osTemplateFile, string adminPassword, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + string externalNicMacAddress, int[] externalAddresses, + string managementNicMacAddress, int managementAddress) + { + return VirtualizationServerController2012.ImportVirtualMachine(packageId, + serviceId, vmId, + osTemplateFile, adminPassword, + startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, + externalNicMacAddress, externalAddresses, + managementNicMacAddress, managementAddress); + } + #endregion + + #region VPS – General + [WebMethod] + public byte[] GetVirtualMachineThumbnail(int itemId, ThumbnailSize size) + { + return VirtualizationServerController2012.GetVirtualMachineThumbnail(itemId, size); + } + + [WebMethod] + public VirtualMachine GetVirtualMachineGeneralDetails(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachineGeneralDetails(itemId); + } + + [WebMethod] + public VirtualMachine GetVirtualMachineExtendedInfo(int serviceId, string vmId) + { + return VirtualizationServerController2012.GetVirtualMachineExtendedInfo(serviceId, vmId); + } + + [WebMethod] + public int CancelVirtualMachineJob(string jobId) + { + return VirtualizationServerController2012.CancelVirtualMachineJob(jobId); + } + + [WebMethod] + public ResultObject UpdateVirtualMachineHostName(int itemId, string hostname, bool updateNetBIOS) + { + return VirtualizationServerController2012.UpdateVirtualMachineHostName(itemId, hostname, updateNetBIOS); + } + + [WebMethod] + public ResultObject ChangeVirtualMachineState(int itemId, VirtualMachineRequestedState state) + { + return VirtualizationServerController2012.ChangeVirtualMachineStateExternal(itemId, state); + } + + + [WebMethod] + public List GetVirtualMachineJobs(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachineJobs(itemId); + + } + #endregion + + #region VPS - Configuration + [WebMethod] + public ResultObject ChangeAdministratorPassword(int itemId, string password) + { + return VirtualizationServerController2012.ChangeAdministratorPassword(itemId, password); + } + #endregion + + #region VPS – Edit Configuration + [WebMethod] + public ResultObject UpdateVirtualMachineConfiguration(int itemId, int cpuCores, int ramMB, int hddGB, int snapshots, + bool dvdInstalled, bool bootFromCD, bool numLock, + bool startShutdownAllowed, bool pauseResumeAllowed, bool rebootAllowed, bool resetAllowed, bool reinstallAllowed, + bool externalNetworkEnabled, + bool privateNetworkEnabled) + { + return VirtualizationServerController2012.UpdateVirtualMachineConfiguration( + itemId, cpuCores, ramMB, hddGB, snapshots, + dvdInstalled, bootFromCD, numLock, + startShutdownAllowed, pauseResumeAllowed, rebootAllowed, resetAllowed, reinstallAllowed, + externalNetworkEnabled, + privateNetworkEnabled); + } + #endregion + + #region DVD + [WebMethod] + public LibraryItem GetInsertedDvdDisk(int itemId) + { + return VirtualizationServerController2012.GetInsertedDvdDisk(itemId); + } + + [WebMethod] + public LibraryItem[] GetLibraryDisks(int itemId) + { + return VirtualizationServerController2012.GetLibraryDisks(itemId); + } + + [WebMethod] + public ResultObject InsertDvdDisk(int itemId, string isoPath) + { + return VirtualizationServerController2012.InsertDvdDisk(itemId, isoPath); + } + + [WebMethod] + public ResultObject EjectDvdDisk(int itemId) + { + return VirtualizationServerController2012.EjectDvdDisk(itemId); + } + #endregion + + #region Snaphosts + [WebMethod] + public VirtualMachineSnapshot[] GetVirtualMachineSnapshots(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachineSnapshots(itemId); + } + + [WebMethod] + public VirtualMachineSnapshot GetSnapshot(int itemId, string snaphostId) + { + return VirtualizationServerController2012.GetSnapshot(itemId, snaphostId); + } + + [WebMethod] + public ResultObject CreateSnapshot(int itemId) + { + return VirtualizationServerController2012.CreateSnapshot(itemId); + } + + [WebMethod] + public ResultObject ApplySnapshot(int itemId, string snapshotId) + { + return VirtualizationServerController2012.ApplySnapshot(itemId, snapshotId); + } + + [WebMethod] + public ResultObject RenameSnapshot(int itemId, string snapshotId, string newName) + { + return VirtualizationServerController2012.RenameSnapshot(itemId, snapshotId, newName); + } + + [WebMethod] + public ResultObject DeleteSnapshot(int itemId, string snapshotId) + { + return VirtualizationServerController2012.DeleteSnapshot(itemId, snapshotId); + } + + [WebMethod] + public ResultObject DeleteSnapshotSubtree(int itemId, string snapshotId) + { + return VirtualizationServerController2012.DeleteSnapshotSubtree(itemId, snapshotId); + } + + [WebMethod] + public byte[] GetSnapshotThumbnail(int itemId, string snapshotId, ThumbnailSize size) + { + return VirtualizationServerController2012.GetSnapshotThumbnail(itemId, snapshotId, size); + } + #endregion + + #region VPS - External Network + [WebMethod] + public NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId) + { + return VirtualizationServerController2012.GetExternalNetworkAdapterDetails(itemId); + } + + [WebMethod] + public ResultObject AddVirtualMachineExternalIPAddresses(int itemId, bool selectRandom, + int addressesNumber, int[] addressId) + { + return VirtualizationServerController2012.AddVirtualMachineExternalIPAddresses(itemId, selectRandom, + addressesNumber, addressId, true); + } + + [WebMethod] + public ResultObject SetVirtualMachinePrimaryExternalIPAddress(int itemId, int addressId) + { + return VirtualizationServerController2012.SetVirtualMachinePrimaryExternalIPAddress(itemId, addressId, true); + } + + [WebMethod] + public ResultObject DeleteVirtualMachineExternalIPAddresses(int itemId, int[] addressId) + { + return VirtualizationServerController2012.DeleteVirtualMachineExternalIPAddresses(itemId, addressId, true); + } + #endregion + + #region VPS – Private Network + [WebMethod] + public NetworkAdapterDetails GetPrivateNetworkAdapterDetails(int itemId) + { + return VirtualizationServerController2012.GetPrivateNetworkAdapterDetails(itemId); + } + + [WebMethod] + public ResultObject AddVirtualMachinePrivateIPAddresses(int itemId, bool selectRandom, + int addressesNumber, string[] addresses) + { + return VirtualizationServerController2012.AddVirtualMachinePrivateIPAddresses(itemId, selectRandom, + addressesNumber, addresses, true); + } + + [WebMethod] + public ResultObject SetVirtualMachinePrimaryPrivateIPAddress(int itemId, int addressId) + { + return VirtualizationServerController2012.SetVirtualMachinePrimaryPrivateIPAddress(itemId, addressId, true); + } + + [WebMethod] + public ResultObject DeleteVirtualMachinePrivateIPAddresses(int itemId, int[] addressId) + { + return VirtualizationServerController2012.DeleteVirtualMachinePrivateIPAddresses(itemId, addressId, true); + } + #endregion + + #region Virtual Machine Permissions + [WebMethod] + public List GetVirtualMachinePermissions(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachinePermissions(itemId); + } + + [WebMethod] + public int UpdateVirtualMachineUserPermissions(int itemId, VirtualMachinePermission[] permissions) + { + return VirtualizationServerController2012.UpdateVirtualMachineUserPermissions(itemId, permissions); + } + #endregion + + #region Virtual Switches + [WebMethod] + public VirtualSwitch[] GetExternalSwitches(int serviceId, string computerName) + { + return VirtualizationServerController2012.GetExternalSwitches(serviceId, computerName); + } + #endregion + + #region Tools + [WebMethod] + public ResultObject DeleteVirtualMachine(int itemId, bool saveFiles, bool exportVps, string exportPath) + { + return VirtualizationServerController2012.DeleteVirtualMachine(itemId, saveFiles, exportVps, exportPath); + } + + [WebMethod] + public int ReinstallVirtualMachine(int itemId, string adminPassword, bool preserveVirtualDiskFiles, + bool saveVirtualDisk, bool exportVps, string exportPath) + { + return VirtualizationServerController2012.ReinstallVirtualMachine(itemId, adminPassword, preserveVirtualDiskFiles, + saveVirtualDisk, exportVps, exportPath); + } + #endregion + + #region Help + [WebMethod] + public string GetVirtualMachineSummaryText(int itemId) + { + return VirtualizationServerController2012.GetVirtualMachineSummaryText(itemId, false, false); + } + + [WebMethod] + public ResultObject SendVirtualMachineSummaryLetter(int itemId, string to, string bcc) + { + return VirtualizationServerController2012.SendVirtualMachineSummaryLetter(itemId, to, bcc, false); + } + #endregion + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Containers/Default/VPS2012.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Containers/Default/VPS2012.ascx new file mode 100644 index 00000000..89c6426c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Containers/Default/VPS2012.ascx @@ -0,0 +1,10 @@ +<%@ Control Language="C#" AutoEventWireup="false" %> +
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config index 54627906..6a632d9b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ModulesData.config @@ -69,6 +69,7 @@ + @@ -123,6 +124,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p>The form allows allocating of additional External IP addresses to this hosting space. These IP addresses are used to configure VPS network adapter connected to External network.</p><p>VPS module is looking for free external IP addresses in "VPS External Network" pool, so WebsitePanel administrator must make sure there are sufficient number of unallotted IP addresses in that pool.</p> + + + Allocate IP Addresses + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcAuditLog.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcAuditLog.ascx.resx new file mode 100644 index 00000000..0ec75155 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcAuditLog.ascx.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p>Audit log displays the chronology of events for all VPS located in the hosting space.</p><p>By default audit log displays all today's events. You may filter the log by date (day, week, month), severity, task and item name (VPS host name).</p><p>To see task details click the link with task name in "Task" column.</p><p>To export log in CSV format click "Export Log" button.</p> + + + Audit Log + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcCreateServer.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcCreateServer.ascx.resx new file mode 100644 index 00000000..dab48649 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcCreateServer.ascx.resx @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Create + + + Next > + + + < Back + + + <p><b>Welcome to VPS Creation Wizard!</b></p><p>The wizard allows specifying parameters of new VPS such as host name, operating system template, administrator password, External and Private (if allowed in the hosting plan) network parameters.</p><p>If e-mail address is specified in "Send summary letter to" then VPS summary information will be sent on that e-mail upon provisioning process completion.</p><p>After clicking "Create" button on the last step of the wizard the process of provisioning a new VPS will be started. The process is asynchronous, so it's not necessary to wait until it's finished.</p> + + + Configuration + + + External Network + + + Name & OS + + + Private Network + + + Summary + + + Enter domain name + + + Enter the number of external IP addresses + + + Enter host name + + + Enter the number of private IP addresses + + + Enter the size of hard disk drive + + + Enter amount of RAM allocated to new VPS + + + Enter the maximum number of snapshots + + + Enter e-mail address to send summary letter + + + Boot from CD + + + DVD drive installed + + + External network enabled + + + "Num Lock" enabled + + + Pause, Resume + + + Private network enabled + + + Reboot + + + Re-install + + + Reset + + + Send summary e-mail to: + + + Start, Turn off and Shutdown + + + CPU: + + + HDD: + + + RAM: + + + Administrator password: + + + Boot from CD: + + + Configuration + + + cores + + + CPU cores: + + + DVD Drive installed: + + + Number of IP addresses: + + + IP addresses list: + + + Number of IP addresses: + + + External Network + + + External network enabled: + + + GB + + + Hard disk size, GB: + + + * Hold CTRL key to select multiple addresses + + + Host name: + + + MB + + + Name and Operating System + + + "Num Lock" enabled: + + + * Type one IP address per line + + + Operating system: + + + Pause, resume allowed: + + + Number of IP addresses: + + + IP addresses list: + + + Number of IP addresses: + + + Private Network + + + Private network enabled: + + + Network addresses format: + + + Subnet mask: + + + RAM, MB: + + + Reboot allowed: + + + Re-install allowed: + + + Reset allowed: + + + Number of snapshots: + + + Start, turn off and shutdown allowed: + + + Summary + + + Create New VPS + + + Randomly select IP addresses from the pool + + + Select IP addresses from the list + + + Randomly select next available IP addresses to the addresses format + + + Assign specified IP addresses + + + Allowed actions + + + BIOS + + + DVD + + + Resources + + + Snapshots + + + Select operating system template + + + <Select OS template> + + + ShowProgressDialog('Creating Virtual Server...'); + + + ({0} max) + + + ({0} max) + + + The pool of available external IP addresses is empty. All IP addresses allocated to the current hosting space are assigned to existing virtual servers. More external IP addresses could be allocated by the host. + + + Enter correct host name, for example "vps01" + + + Enter correct domain name, for example "mydomain.com" + + + Generation: + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcExternalNetwork.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcExternalNetwork.ascx.resx new file mode 100644 index 00000000..a0d73a20 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcExternalNetwork.ascx.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p>The form displays the list of IP addresses from "VPS External Network" pool allocated to the hosting space. Alternatively, this form could be considered as a "map" of external IP addresses and their assignments to virtual machines.</p><p>If any IP has already assigned to some VPS then there will be VPS host name in the "Item name" column.</p><p>If there are lot of VPS in the hosting space you can easily search them by their external IP.</p><p>"Number of IP addresses" quota shows the maximum number of external IP addresses that could be allocated to this space.</p> + + + Bandwidth, GB: + + + Number of IP Addresses: + + + External Network + + + Quotas + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcHome.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcHome.ascx.resx new file mode 100644 index 00000000..8b86f534 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcHome.ascx.resx @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Create VM + + + <p>The form displays the list of Virtual Private Servers created in the hosting space.</p><p>In terms of WebsitePanel VPS module hosting space could be compared to the Virtual Dedicated Center (VDC). You can see VPS bindings to external and private IP addresses as well as search VPS by these fields.</p><p>Quotas in the bottom of the forms show the total amount of computer resources available for VPS.</p> + + + No VPS have been created. To create a new VPS click "Create VPS" button. + + + External IP + + + Host name + + + Private IP + + + Space + + + User + + + External IP + + + Private IP + + + VPS Name + + + User Name + + + Delete + + + HDD, GB: + + + RAM, MB: + + + Virtual Private Servers + + + Number of VPS: + + + Quotas + + + Import VPS + + + return confirm('Remove this VM from meta-base?'); + + + Detach + + + Move + + + Fast Create VM + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcImportServer.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcImportServer.ascx.resx new file mode 100644 index 00000000..d8cecd56 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcImportServer.ascx.resx @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Pause, Resume + + + Reboot + + + Reset + + + Start, Turn off and Shutdown + + + Cancel + + + Import + + + Enable Remote Desktop Web Connection + + + <p>This wizard allows you to import existing Virtual Machine to control panel meta-base to provide its owner self-service functions.</p><p>Importing is absolutely safe for VM as nor VM configuration, nor its state are changing during the process.</p><p>To import VM, first, select registered in control panel Hyper-V service where VM is located. Then select VM, specify its allowed actions and select network adapter bindings.</p><p>External and management networks are determined on appropriate Hyper-V service properties page.</p><p>To enable Remote Desktop Web connections you have to provide real guest OS administrator password (for automatic sign-on).</p> + + + Administrator password: + + + Boot from CD + + + CPU, cores: + + + DVD drive is installed + + + Connected NIC: + + + Assign IP addresses: + + + HDD, Gb: + + + Hyper-V Service: + + + Connected NIC: + + + Assign IP addresses: + + + Num Lock + + + RAM, Mb: + + + Import Existing VPS + + + VHD location: + + + Virtual Machine: + + + Allowed Actions + + + BIOS + + + Configuration + + + DVD + + + External Network + + + Management Network + + + OS Template: + + + <Select Hyper-V service> + + + <Select virtual machine> + + + Please select OS template + + + Please select virtual machine to import + + + Please select Hyper-V service to import VPS from + + + <Select Operating System template> + + + ShowProgressDialog('Importing Virtual Server...'); + + + Please enter guest OS administrator password + + + Select at least one External IP address + + + Select at least one Management IP address + + + <Not connected> + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcManagementNetwork.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcManagementNetwork.ascx.resx new file mode 100644 index 00000000..ead4bdcd --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcManagementNetwork.ascx.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p><b>This form is visible to administrators only.</b></p><p> Management network is not available to resellers and users and it's being managed by WebsitePanel on their behalf.</p><p>Management network is a back-end company network used by system administrators to manage customers' VPS. This network is also used by VPS to access various utility resources and services such as DNS, KMS, backups, etc.</p><p>If Management network is enabled on Hyper-V service properties then every created VPS will be assigned one IP address from "VPS Management Network" pool, so WebsitePanel administrator must make sure there are sufficient number of IP addresses in that pool.</p> + + + Management Network + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPermissions.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPermissions.ascx.resx new file mode 100644 index 00000000..101f29ae --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPermissions.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Updating permissions...'); + + + ShowProgressDialog('Updating permissions...'); + + + User permissions allow... + + + No peers exist under your user account. + + + No peers exist under your user account. + + + User Permissions + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPrivateNetwork.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPrivateNetwork.ascx.resx new file mode 100644 index 00000000..c3aa3949 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VdcPrivateNetwork.ascx.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p>If this form is available in the hosting space then it means that all VPS in this hosting space are connected to dedicated private network available only to this hosting space.</p> <p>Private network is a very powerful mechanizm that allows additional increase of network security. For example, you might have only one front-end server (e.g. server with Exchange CAS and HUB roles installed) connected to External network and all the rest of servers connected to private (internal) network only (e.g. one server with Exchange MB role and second one with DC).</p><p>Quota in the bottom of the form displays the maximum number of private IP addresses that could be assigned to every VPS.</p> + + + No private IP addresses have been used in this hosting space. + + + IP Address + + + VPS Name + + + IP + + + VPS + + + Primary + + + Private Network + + + IP addresses per VPS: + + + Quotas + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddExternalAddress.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddExternalAddress.ascx.resx new file mode 100644 index 00000000..17810cf9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddExternalAddress.ascx.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add + + + Cancel + + + Enter the number of IP addresses + + + <p>This form allows assigning of new IP addresses to VPS "External" network adapter.</p><p>Additional IP addresses could be assigned to the VPS if only there is enough number of free (unassigned) external IP addresses allocated to this hosting space.</p><p>After clicking "Add" button special configuration instructions will be sent to VPS, so it may take some time (up to few minutes) until network adapter parameters are changed.</p> + + + Number of IP addresses: + + + * Hold CTRL key to select multiple addresses + + + Add External IP Addresses + + + Network + + + Randomly select IP addresses from the pool + + + Select IP addresses from the list + + + ({0} max) + + + The pool of available external IP addresses is empty. All IP addresses allocated to the current hosting space are assigned to existing virtual servers. More external IP addresses could be allocated by the host. + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddPrivateAddress.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddPrivateAddress.ascx.resx new file mode 100644 index 00000000..63bd6af6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAddPrivateAddress.ascx.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add + + + Cancel + + + <p>This form allows assigning of new IP addresses to VPS "Private" network adapter.</p><p>In the private network you could assign any IP addresses to VPS, however if you decide to leave this job for WebsitePanel then it will generate private IP addresses for you by the algorithm set on the service level and make sure IPs are not duplicated.</p><p>After clicking "Add" button special configuration instructions will be sent to VPS, so it may take some time (up to few minutes) until network adapter parameters are changed.</p> + + + * Type one IP address per line + + + Number of IP addresses: + + + Add Private IP Addresses + + + Network + + + Enter the number of private IP addresses + + + Randomly select next available IP addresses to the addresses format + + + Assign specified IP addresses + + + ({0} max) + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAuditLog.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAuditLog.ascx.resx new file mode 100644 index 00000000..b3ea1412 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsAuditLog.ascx.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <p>Audit log displays the chronology of events for this VPS.</p><p>By default audit log displays all today's events. You may filter the log by date (day, week, month), severity, task and item name (VPS host name).</p><p>To see task details click the link with task name in "Task" column.</p><p>To export log in CSV format click "Export Log" button.</p> + + + Audit Log + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsConfiguration.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsConfiguration.ascx.resx new file mode 100644 index 00000000..c2391630 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsConfiguration.ascx.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Changing password...', 'PasswordModal'); + + + {0} cores + + + {0} GB + + + {0} MB + + + Network + + + Cancel + + + Change password + + + Change + + + Edit configuration + + + <p>This form shows VPS configuration.</p><p>To change VPS Administrator account password click "Change" link in "Software" section.<br/>To change password special configuration instructions will be sent to VPS, so it may take some time (up to few minutes) until it is changed.</p><p>To change VPS configuration (if allowed in the hosting plan) click "Edit configuration" button.</p> + + + CPU: + + + HDD: + + + RAM: + + + Administrator password: + + + Change Administrator Password + + + Enter new password: + + + Operating system: + + + Number of snapshots: + + + Configuration + + + Boot from CD + + + DVD drive installed + + + External network enabled + + + Num Lock enabled + + + Pause, Resume + + + Private network enabled + + + Reboot + + + Re-Install + + + Reset + + + Start, Turn off and Shutdown + + + Server Actions + + + BIOS + + + DVD + + + Resources + + + Snapshots + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsDvd.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsDvd.ascx.resx new file mode 100644 index 00000000..7357567a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsDvd.ascx.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Ejecting disk...'); + + + <empty> + + + Eject + + + Insert Disk... + + + <p>The form shows the status of DVD drive. If there is <b>&lt;empty&gt;</b> then there is no disk in the drive.</p><p>Click <b>"Insert Disk..."</b> button to browse Media Library.</p><p>Click <b>"Eject"</b> button to remove disk from DVD drive.</p> + + + DVD Drive: + + + DVD + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsEditConfiguration.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsEditConfiguration.ascx.resx new file mode 100644 index 00000000..f01b77a7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsEditConfiguration.ascx.resx @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + if(!confirm('Before applying new configuration VPS will be stopped.\n\nAfter the configuration is changed it will be started again automatically.\n\nDo you want to proceed?')) return false; ShowProgressDialog('Updating configuration...'); + + + Update + + + Boot from CD + + + DVD drive installed + + + External network enabled + + + Num Lock enabled + + + Pause, Resume + + + Private network enabled + + + Reboot + + + Re-Install + + + Reset + + + Start, Turn off and Shutdown + + + <p>Change VPS configuration and click "Update" button.</p><p><b>Before applying new configuration settings VPS will be stopped. After new configuration is applied it will be started again.</b></p> + + + CPU: + + + HDD: + + + RAM: + + + cores + + + GB + + + MB + + + Number of snapshots: + + + Edit Configuration + + + Edit Configuration + + + Please specify HDD size + + + Please specify RAM size + + + Server Actions + + + BIOS + + + DVD + + + Network + + + Resources + + + Snapshots + + + Please enter the number of snapshots + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsGeneral.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsGeneral.ascx.resx new file mode 100644 index 00000000..5d662ca5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsGeneral.ascx.resx @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Changing host name...', 'ChangeHostnameModal'); + + + Delete + + + Pause + + + Reboot + + + Reset + + + Resume + + + Shut&nbsp;Down + + + Snapshot + + + Start + + + Turn&nbsp;Off + + + {0}% + + + {0}% + + + Used: {0} MB, Total: {1} MB + + + if(!confirm('Pause VPS?')) return false; ShowProgressDialog('Pausing...'); + + + if(!confirm('Reboot VPS?')) return false; ShowProgressDialog('Rebooting...'); + + + if(!confirm('Reset VPS?')) return false; ShowProgressDialog('Resetting...'); + + + ShowProgressDialog('Resuming...'); + + + if(!confirm('Shut down VPS?')) return false; ShowProgressDialog('Shutting down...'); + + + ShowProgressDialog('Taking snapshot...'); + + + ShowProgressDialog('Starting...'); + + + if(!confirm('Turn off VPS?')) return false; ShowProgressDialog('Turning off...'); + + + Host&nbsp;name: + + + Cancel + + + Change + + + Edit + + + Update computer network name + + + <p><b>Status</b> shows the current state of VPS. The list of available VPS action buttons on the right depends on the current status.</p><p><b>Uptime</b> is the time since the last VPS start.</p><b>Heartbeat</b> is a very useful indicator as it shows whether VPS operating system is active and respond. If there is "No contact" then it means the system is not started yet, but if there is an "Error" then it means OS does not respond to the host machine.</p><p><b>CPU</b> meter displays VPS processor utilization.</p><p><b>RAM</b> and <b>HDD</b> meters show real-time data provided by VPS operating system.</p> + + + Error + + + Lost communication + + + No contact + + + None + + + OK + + + Paused + + + Change VPS Host Name + + + CPU: + + + Created: + + + Domain: + + + Heartbeat: + + + Host name: + + + RAM: + + + Status: + + + General + + + Uptime: + + + Deleted + + + Migrating + + + Off + + + Paused + + + Pausing + + + Saved + + + Saving + + + Taking Snapshot + + + Running + + + Starting + + + Running + + + Stopping + + + Enter correct host name, for example "vps01" + + + Enter correct domain name, for example "mydomain.com" + + + {0}% + + + Free: {0} GB, Total: {1} GB on {2} drive(s) + + + HDD: + + + Domain: + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsHelp.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsHelp.ascx.resx new file mode 100644 index 00000000..59a45d4c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsHelp.ascx.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Sending e-mail...'); + + + Send + + + <p>This form displays VPS summary information prepared by the host.</p><p>This information could be re-send to any e-mail address specified in "Send instructions by e-mail" section. This section is collapsed by default.</p> + + + BCC: + + + To: + + + Help + + + Send instructions by e-mail + + + Please enter e-mail address + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsInsertDvd.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsInsertDvd.ascx.resx new file mode 100644 index 00000000..5f5792c4 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsInsertDvd.ascx.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + ShowProgressDialog('Inserting disk...'); + + + Insert + + + <p>Browse Media Library and click <b>"Insert"</b> button in the row with DVD you want to insert into drive.</p><p>Click <b>"Cancel"</b> button to return to DVD drive properties screen.</p> + + + No disks found in the media library. + + + Title + + + Browse Media Library + + + DVD + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsNetwork.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsNetwork.ascx.resx new file mode 100644 index 00000000..98dfebbe --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsNetwork.ascx.resx @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add IP... + + + Add IP... + + + Delete + + + Delete + + + Set As Primary + + + Set As Primary + + + <p>This form shows VPS network configuration.</p><p>To assign additional IP addresses to "External" or "Private" adapter click "Add" button in the appropriate section.</p><p>When you delete external or private IP or change network adapter primary IP address the system sends special configuration instructions to VPS operating system, so it may take some time (up to few minutes) until network adapter parameters are changed.</p> + + + No IP addresses are assigned to external network adapter. + + + IP Address + + + Primary + + + No IP addresses are assigned to private network adapter. + + + Server address: + + + Default gateway: + + + Subnet mask: + + + Server address: + + + Network format: + + + Subnet mask: + + + Network + + + IP addresses: + + + IP addresses: + + + External Network + + + Private Network + + + &lt;auto&gt; + + + Gateway + + + Subnet Mask + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsPermissions.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsPermissions.ascx.resx new file mode 100644 index 00000000..867a4a7f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsPermissions.ascx.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Updating permissions...'); + + + User permissions allow... + + + No peers exist under your user account. + + + Permissions + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsSnapshots.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsSnapshots.ascx.resx new file mode 100644 index 00000000..3b106beb --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsSnapshots.ascx.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + if(this.disabled) return false;if(!confirm('Do you want to apply selected snapshot to VPS?')) return false;ShowProgressDialog('Applying snapshot...'); + + + if(this.disabled) return false;if(!confirm('Do you want to completely delete selected snapshot?')) return false;ShowProgressDialog('Deleting snapshot...'); + + + if(!confirm('Do you want to completely delete selected snapshot and all its sub-tree?')) return false;ShowProgressDialog('Deleting snapshot sub-tree...'); + + + ShowProgressDialog('Renaming snapshot...', 'RenameSnapshotModal'); + + + ShowProgressDialog('Taking snapshot...'); + + + Now + + + This virtual server has no snapshots. + + + Apply + + + Cancel + + + Delete + + + Delete Subtree + + + Rename + + + Rename + + + <p>To take a <b>snapshot</b> is much like to take a picture of current VPS state: its configuration, memory and hard disk.</p><p>Snapshots maybe used as backup/restore points when installing new software or using VPS for development or testing purposes. If something has gone wrong there is an ability to roll-back and <b>"Apply"</b> a snapshot with good configuration.</p><p><b>"Rename"</b> button allows renaming snapshot and giving it some informative name, for example "Before applying service pack".</p> + + + Created: + + + Number of Snapshots: + + + Rename Snapshot + + + Snapshots + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsTools.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsTools.ascx.resx new file mode 100644 index 00000000..0f143aa1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsDetailsTools.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Delete VPS + + + Re-install VPS + + + + + + Completely removes VPS and all its data. + + + Re-creates VPS with the same configuration settings and operating system template. The wizard allows to preserve existing virtual disk data. + + + Tools + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsMoveServer.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsMoveServer.ascx.resx new file mode 100644 index 00000000..166a5167 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsMoveServer.ascx.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + <p>This wizard allows you to change Hyper-V service binding for existing Virtual Machine meta-item.</p><p>The wizard <b>DOES NOT PERFORM</b> physical virtual machine migration, but it could be used to point control panel to the right Hyper-V service AFTER virtual machine was moved with some external management tool like Hyper-V manager or SCVMM.</p> + + + Move VPS + + + ShowProgressDialog('Moving Virtual Server...'); + + + Move + + + Destination Hyper-V Service: + + + Please select Hyper-V where VPS has been moved + + + Source Hyper-V service: + + + <Select Hyper-V service> + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsDeleteServer.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsDeleteServer.ascx.resx new file mode 100644 index 00000000..93428664 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsDeleteServer.ascx.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + ShowProgressDialog('Deleting Virtual Server...'); + + + Delete + + + Delete this Virtual Server + + + Export VPS before deletion to the following folder: + + + Do not delete VPS files (virtual hard disk, snapshots) + + + Please enter export path + + + <p>This form confirms deletion of VPS.</p><p>In order to confirm "Delete this virtual server" checkbox must be checked.</p> + + + Administrator options + + + This wizard will delete VPS and all its contents from the virtualization server. + + + Delete VPS Server + + + Delete Server + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsReinstallServer.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsReinstallServer.ascx.resx new file mode 100644 index 00000000..ae295246 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/App_LocalResources/VpsToolsReinstallServer.ascx.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancel + + + Re-install + + + Yes, I confirm re-installation of this VPS + + + Export VPS before re-installation to the following folder: + + + Save existing VPS hard drive files + + + Do not delete VPS virtual hard drive file + + + Enter export path + + + + + + This wizard will re-create VPS with the same configuration settings from scratch and then apply current OS template. + + + New administrator password: + + + All files from existing hard drive will be copied to &quot;old&quot; disk folder on hard drive of new VPS. + + + Re-install VPS Server + + + Re-install Server + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/App_LocalResources/Connect.aspx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/App_LocalResources/Connect.aspx.resx new file mode 100644 index 00000000..2c7a42b1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/App_LocalResources/Connect.aspx.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Remote Desktop Connection + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx new file mode 100644 index 00000000..4222b165 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx @@ -0,0 +1,231 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Connect.aspx.cs" Inherits="WebsitePanel.Portal.VPS2012.RemoteDesktop.Connect" %> + + + + + + <asp:Literal ID="litServerName" runat="server"></asp:Literal> + <asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Remote Desktop Web Connection"></asp:Localize> + + + + + + + + + +
+
+ + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.cs new file mode 100644 index 00000000..ea83ecab --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.cs @@ -0,0 +1,56 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 WebsitePanel.Providers.Virtualization; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012.RemoteDesktop +{ + public partial class Connect : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + resolution.Text = Request["Resolution"]; + + // load server info + VirtualMachine vm = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + litServerName.Text = vm.Name + " - "; + username.Text = "Administrator"; + password.Text = vm.AdministratorPassword; + + // load external network parameters + NetworkAdapterDetails nic = ES.Services.VPS2012.GetExternalNetworkAdapterDetails(PanelRequest.ItemID); + if (nic.IPAddresses.Length > 0) + { + NetworkAdapterIPAddress ip = nic.IPAddresses[0]; + serverName.Text = !String.IsNullOrEmpty(ip.NATAddress) ? ip.NATAddress : ip.IPAddress; + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.designer.cs new file mode 100644 index 00000000..b9b9ff55 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx.designer.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.RemoteDesktop { + + + public partial class Connect { + + /// + /// litServerName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litServerName; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// resolution control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal resolution; + + /// + /// serverName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal serverName; + + /// + /// username control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal username; + + /// + /// password control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal password; + + /// + /// AspForm control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm AspForm; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/msrdp.cab b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/msrdp.cab new file mode 100644 index 0000000000000000000000000000000000000000..695c013727b12bd1d204e5d8a3e838d3ead32508 GIT binary patch literal 349978 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 z z=KW^)>`TLo2>IdiAo#o0|cAWW7+WKt%0eIlb-wrz`AyK4h~-IyPSgCSxC5f<$|Qt`u+X^wEV`_Z`%_m#+5Ape zPpxQQFTSkupAf_yyUr7eJY9&DOQ^mAP59Q&92QbR9fsL$4YAYlY@ADIT-Coy7*`p0 z>#QD_a&^!x&)PJI`?p-WK$+*-Rqt7_K$(l+u6fZc@`JHtf-up!5%uuvCEkjjD*j5Z zjO)#z33bRat#+zbJ1w3)XOe(Pl`L^9h6i(?*n_TJ)$Ra) z<|5s}hFRq{oOY)pOR%tYcKzMRQW1iJAab7>nX13r0;Lkxt0zehFJ#2EbOM|A}6NPp$v^LXP* zxQT&46tBU*mqN`@)S9lv`}oSO)E5=CWxvJ7qYNR4x!={-m9axXUPJv+Q9Bjh)TCcc z#aB~}SJQrb-z7Px;p<#@%>&;imAkRx6)k)N7X>XytCl6)*y!I}#FDBKHlUnwRA^U% z&Bq?ElJL04Gc}YRBq(PK&Rf*=zFL?OeY;a=>F1&KP)Og3wi~2%?(N>#R%W-$o=xzB zB&R%vLJkD8s6f9p88SU5?5$(5nuavk@7MLTuB3V@z#60=qV7b|8bDhNE8wN(R#X>u zFH+92Cb#d;%9z(i5Ut+T+T9t5R!L+H>XZDNFBqmHM}I;?5v%WRjr)(-sna)9s+8hm1#AhSDP5MVlpQ>1k`1tNB`v7stJ20vP@Jzh&A&07u< zZbefPSkP==uPntjzbvSV19*(%;(`tG5hym1>+Lp_XMDZwIh82LQ)-w$Ro*M-)zv9; zv}VbxC%%9vL;kZ*-oOgjfJ64r}=u;45|Bd+zAZKrfb9U z^osk--13cH9cwLR*-<3DJht8dk30$ku@BY8#?DuJr};YEYx*I33t6bLcw+cq2$-je z$0XW~?_v#TV|qIh2EJXWw=o@T*4!ty;a*;c~*q`?o{kftQb767H5z?Wq! z&XDMv!JlHrdN*ozCs~hxKi-cz?x^j-BwIc7zm&KmHV=wJQfLF)AOTD9nD6|WM_9ma zI|`X&GhMz<*EeGsqX3lI8`e4r8U$ohyvj*N$Z+~++j`XvQ?1HvLV3PWUtIz-EHbEC zEDik8U&29L0O!HHys4}J{x7BfON22%OEb(i(jqr8d~sIH7rSc-Oi?wd%X56S?zLWM zmO3~_p0Gf+El{o}jQL4~LQedTM^{SOAyaMI6W}``Go11zbbhx3nGIY14|G(^E-@s+ zFy$)lG?ZCkg2!E*)O8EXJPU$y^8&eXfjk~ghJUt@6A`Rsa)*5ow@I}_vMSSILUp*; z-2k5-r_mk@_ip1bd>t&$~iH!M+PR}*(pUSq+oo0%?RGUSh(x(e8K zwOb@pZlJ9ff}OScvgt6>6APUFvT6ZjlB{t}5(f9y`e7AcKc#l=w4ZBCIi;AAXd_8}iq{%KP zo5Q?XTY>v7wcDxoO!EcZYd%mPlt|d`($^a7x%wcg+L0lT;qL?;ib%dfloc`a16E@$4m2 z2$yePIsPnMNU>E@>1VZ*e&nI+@MptT`e}>c&)1O&m_{L-cNPla$$V-uh7gx~ABFI+ ze3?Q>-9Jqsyq{V{A%r(uLLoH8n@1r$PRb~R3&2hxyhz$#n#Qyjw?S@;_$@JhJ;txo z__bTiTO(mbWO}9pJ^)TpQxe;xPO*feK;^p8XrC`7bxxLp%lpm{5HPWs8E950T#5Nl z1yB!jB^`eX%nCatSB@o|npYU7sVm(U*g)Lqzib(QyV>wAH|#it+SAH)YCZ+je2#Wo zaYsM=pr|hH7=RGEhc*QZadOGN8x!D{8*&)4@ug_&ZVf591R(~y|Cra1ejqLp0mYhI zpxV#kjV;%%gg3V23V35EL&Q77O{Y*dS6nV?T{xssKi)5*fDOH`#r+#`H{jm^zMA>B zvKS`WITMZWx~p3Fn@uQY!tp;~_zPS(>^O^E0koG=sOD3ce-mojIRwF|eF=a3LFkRM z(Gp}y;3$!4k;`9WO($dimtp_gfCsXFcWi@x?%gRD%af?=juo<@MFu2;8`|Ax0mjXC z#&>Z|6>{(QYfY)&q6c_UE;0N@$)(IcVD+cEnz;NQ!~RdKz*Qp387;7RzT{dwWas+& z*4i{B6}2Ns9_4O>+*EG@2}q(vu1B#R5Q9VtiBua=rFrEG%|CEO*!9~^@L%IuRG-qH>W!^D&dZ@J1GfT?P)Q(8C?%%A zp;gPe>#kO{;zlK>HJ){&<*vJ`t6P~B`MQDD$*_MU-X}ZI0 z5`8v*2ND{0W~bFwyCpgm4!JQ%l^%EyB_~S_J%58z4n~Q@y|4o2-tn#zOHHVyzmSgi zEUbl)S>Hh#zs-`Rzr$v2Ef!UWNvHwCt=Zu5xUOS#B7NH;$ZAcTSnMzzP3-UK!wLN+ zJz+=6X4IL5bWE*OQEON3vH|ZZ8R&99U2dpB+^l<9CBn-Ca|Xx9yFuR8M8@quD1ZHE z61Dr|{v^pb^WhL9pt+JwI{f;RiL2Qx%-IO7g{>J6-l^+@fb%uR=|EMC2!1S=91(8g|GT>Dgh91}US{*>V4N zpU3^XO3kN0+>wL@zxt}>(bl*l1wjdRa0|RyB_7!!I1V03@EZ}2oDeLu0Ku-${2OMb z8=|NFH%Zr=wdzINnvaFHS}U{v4U0tHwH4J(suCR0?(J%FM%z?1S8d-i&PQ^hBaR97IX13tq3x98w};tY+A zcNo^6D>1Rv2eqSXwcz(0qr#6&@DEhL^l z-?b~Je824QDbkuxNC)U;R2h;d1o=M9b{s2FzH1nmNC*u1H=~Dg+n_hbbc|7x`LaVz zmX44|0`VY`3rpxpC?rKGh>%GUyXHWicz!hV%aH!#W~$cD3D3h=8$E!PIQOML659t&*ov9R5DRLgd$ z-$EYu_*xHpll8W;+^Sa1RW*OUFPrUOGeo6Wl%I%S`Jq8)!NRg)Sb&3(NtK%nZXj&enmt-`G0-t+BE>4P9Q|FS1Po3+Ry#A0evm~E z78(z<=15=dDy!BkYt3z1^9Jo1vf1x&`!2|yL;)~0;nHx3pYOt3y^2Z7U!mjV5fWrV zCJBPKS-<+hM}IfW{+$n^DONgnJ(5-|9pkyU^&trLd3>28Ciz#uPv+v&CUC zLQ@jgu=(y080DYSDHq&_ST`>{F=(E>wq@j=^Ji#ZhN2M@d z2n)cMSjzsPBr2MV<(ua;uad8?Xx_l4uZA+@BCpPBH!%BdsL>YC-=6R5kk@^puPfHy zZt-?E37j;63`~?0Ym$&R*XmQsRlpMKYd!pTbg%BK@n|(})ZnO3hS=KTaIBpJ6B5mW zB+u(bNxW|xQvd2es=ZdJjb_pH&RVx#bQWGgBE4t`y)s%UcnX4EJsb{Gj6=)}4?s9x zQ)(5WMI;}gprBS$%n7a^$Sf;DNK~{Z3BrSF=tr%Cb1ltEUR0+-PGW2Pl7WygugvgG zG`*G8jcN5AmL0BL=WR*Xt^gb#b@q^J*J>$j8w%Nu*!DLz@U~w8wVAlNqODAlC%^}i zU>iSBO*&xMptwXnG&eF2=kz_0xW(`S+Av)0cMF+5>nH~Ly`h9HElp&zhBCHvs@gHt zqAgCsv{c-9tr_4;$Rk0DEl#re61&G)o>P7g5d2#0G;PrgEi_YWo+Dq=bwa)h9j~GY z%=fxt_q{0>$7{=|gT@g~@*J&prdB%xvZ<|Q7Q@&U+k?nT7GPT@2vbR5j%ML!M3=xK zkKPw%$Mtu@czFb@O(&#DWP4B4K=TL!+V#ucJ;Qd3#n$tK-=4~ac3wEA15Kdi09EJu zr9TDF&t1^w+YM3^JsdmG2GRB1?p`A2d+>j?Cq;7I?KduuPU#8o<T?plAaT z-MtMpfu`(d)pb2Q=iCvs-zqeO%`~yPErR70&XgQ_)x3mFubU@QkgMF$SZFS6R|Knr z?Yo%nH`BJQ;_1`))JYg_R#RsI-48oQG{8#eTKK5iv-#Zn6OT~fuSN=?)Jz=KP5QP)!0UEYIEMp1$LVT*lZVr9i* zPY_`kPb6%tsTglSUYGOKIntVJ7O<=TVMSTQK2-LBoq9hWn&^_pqxp|8e~IQl&iti# zAL=iQ)$gMVmIihx?%y|;aJv4eEgnFy#$~{4mYQ>8qahAiScVqc9u_Fp3e^q87CDzy z6`SDbh7~%_wvEPEG)#pj9?i`b7(?n2`$!z^K@H6mfiq}TCXHZp6t&?}t1rb`)qb1d zRu0Fs$>5sRQ*O#s3OQo_A;^S65Xx2Z*<1%+FDA73;;v(2W_aOCO5jV%g$3YE>euWR zWeTN{y$6_%uO&M4IeSl)w99vT~9 zFPvfM1i&t1bWGY;6HGdkVHC$U(+4V^bH`zHCU!#;r}XHn1F^b=tWY0INR}iI#~z7n zKWcD+c1zkHUPA-nOB!BgJ|;+a^o3|Xd5dm-W9wm;MQ}^4-YHLGhuNQ7)yIo1%2>KY z4DjATVhU`!-^psq)ZUV=ZuX{f0$8@559|$s>4wFNgM7f(W2!=Js3^el9%69>aE0OhVX$4R)YCLgK}BCT@}2=XbXKMZC7Pr=Sh0Kjo%j z>n-sfsK|@eB-t6|Sy-dk2AHwU%UTYMvZUJYSe2e?QLEasp+Vr=7`oSDE=4|nF5Qo+ zj_pWGU4Y%j=)PLiH|$2#f4?+bhQi&Bx{OMZjQ!4VA~UZ2wHPeomtpOaAZxiddk>tEDk_5E7?@3i`E zwrE~e&tU$P{Xv8{M1;WSXy@_2pf$auHNC9)_i6P9`OX~Z&)fU^v#LSRh6d`YoNko3APldD%&bURQJ9-Hg7s*-S35ut+)pl*khyxGemF73GS zk4f9sxy|txV{aaP&dVQt!5Pv4crlO^T9v(NGv)OlA(xj?4}OWnMcQGoOvMSWjga{ zq5E%GEe7S&Z8vx_@>D$gHC;F0AdZ(`=6dK^immRXA2~ul8zlN^J9)EtJ@o9&=Jk+# zvw1zV{ATldXwJ>%_0ZIt&Fdle&F1w`|4rug(7~I`>!IB@nb$+xZ!)ikHr!-h56!)4 zwBzFuOp*UzeL|eB+}b9a>_9HVl3_9h#92-C=~<2Ir+iW78q@XtoJLIB0`YkcUpk zKDn3~J7dOhPzTSCiuI0)9WY}!=!1tx#eOg<_Ah1(C&l3NqhgPaiYaCcC(Ym!qhkJ1 zvAfL}PO8C%QL%}mVw24nPP)MxN5xM6BQti+jNzml{Ku$Rd{pcYW(+6o;9H|&KO7a? zX~u9;4{jP2`-U0AX+F4eRP13hh7*7Au~9MKs8}_|#Oy*3Ga~fYlsTu)rbF+i%$d}m z4)vwX`ExKG`nQxhYj&qY&!jTu&yG~)j8RjWv!ZKM?4eZVJow6}*xjkjk*^;WyETErwsI z*o$SW$j^}{D=l=5OtNHI^jDrnn(VxOyLUKNzeVdp-$$CVg}?eCYKg`CTLT;pE8W+p z%t0wI34=EW@Hy;lTjKuBxR>(5Ehq_w0^~pNYapj6R==H3gBS3a4e@Mv%wkwPYR>V= zUqq?!HtUE~Slm_`IJ5Q+)K0YTMinqe`~c+!o&QOmaVoY zKBkfg1{8s_5k`{@0XsXKxQ0ah9t29W(Wx%~r(yYg$~#<(1^&}&!dO}+EHqAsxc?(l zh)lBA+58*T2mnP|tEXcf&T#tn3$IcubOc5o5<wzLFPcw~3DJs8B%c6kG0q&&^@^t5N?}lVxPFc9NYS!PyR)@olGY@-I=@K{A>iY# z4=4pZuMMv*Fs58ZMNEJqpyg+tpyw6E%3Fz+==A}vd_<15FUVhF1?4?QlWKC(le4P= z4Ke@k0{pK}IxK9Fox*ONd@)a<(*A{X2cf*3R9?lM%9+HDxL+djDhC31v!Tz%q|e}Z zE0XU_TORZ8Mi=ExyEQA3&iE+_$7?pi(|eJRd6e#;NuiSGRvMPif=gSOB=;L+h9DrM z=?43iM}<91+X}viC=WTP(Ubw#^{fE5Nx60 zYW*>HBZZ0^8}uVA3CWfdA)Ydh>xLPqsWt)~hMERKNip7HY7d1_X$$DOKg|co7MU?jul;=f;*O{hSh;E?_Wn9oKyDwHf5H_krk z)m_h7y$7YCTK$msK!a9)7ML+$!_XT8ia-_*p#HHIDrVyY>=0tgH=WYQ0u|p;tSEa? zL${*cDNlf;q^G>juCFWMUws_rhhIwE8%@Cz9_z%<^=N))Fl?k)2q`volpugLiit}^ z!WEDZ7+WPDl87e@zvCcRlH>8}8ycWDB8W5bMea18Dy3y~$e`K;qfd@boVZfmVSdk# z;V9}W&ctO_Z?Ld00>6^Sazc@kYf$6B-C`hoeO|djb;x8H#u<|aGkT(-bXjFFu# zLO-tzA^SybVe%mA)lDCw?ZSuX+=@9edi?ao(G_GEC--peJUc4S2<%o5B4xK1jz+HT zO|%IonsIsJ2#{HxA$SqaROf1QD%vGETWy!Jl&hi8jj~5nBuc@p><&{iQqI*n>_%_3 z&O6C!J>r??GPv0WvkKq6z)9LI+0+*$y=hrO_2$un1e*{fgkq1S+1M9|jcs$&$jwfB zCvh6L;SH=_N-MRbWvh|Zz^q|`D@X^VtwwE6S>!v|tO(k|MBQFpf2S3wZtMJLp$KKo zpC277f;QAI!%ii4V$jbmggb#^A9(EgZV&vPPWN!1&=@2++z1{^wHxMxeR5V}3Rab~XeP?+Cn5txng7%Ifgk_pFNJlaMO zE;Df}q3xS`WGwJc;fcdjj1Spc1(Pux(qT%pyK$O^4el-nZ+rcz7NadtADSy<)K_|? z`qIep8K@YGVI>4ZT&5xrqTshAoVkO!=rD}B1Ciu31Z4MuSttm!a&9X+L@$8y+h|0p~Hw{ybk zkJURHB5qAQavG2N8zL6tQNQtMpdqr+cr<{I{2Z0X7g^~Dbanc%@^(pIZ#Q<*`DmY5 z0Ou_$44~FD9F<-Nld>zy!m{*%5wO_AgoxSXZN$Z}E;ZE)j` zNK&m>(A}u7chdgvmwbIAD|7%Ni!j@%#;DcEb7#eRw_K4f^;S`;;R8CeP$v}XzD%JU zB2G+T7lkfCTD1>-7srAU7BUSTDbfSA*At{~#@a?VD;??2j5sf?D7{z{RhTcHnJ=E1 zFP@n%KFaxZhUZ$KC11VGpe4zFMp+=9?VO(BB;5qPz4sLPIsq!kd(8KSxNo_=VzCpI zK?>#TD%{G1iooR^`MRz4jfp(;D&Rx}pFkB0Wtmc`8Pg4^)Jq%F7{BQC_lH2|#Ix(B z3#Auf?+_E>Cn?P4q_KD_Pa&f1zs}6`R3mgek3+ zxX&Pr>uBua`=?*x;T~GqJh*$iDYI~=0d|5k9Lld5q)=*ROlNQGi3vhU(A#SJbW=z8qjnxQyOs3#Zht@j4j?>B6PTx zqYl@hSqAs6uG~tXOXpw1+k%kR^)%{kwRiIS=NJmLTGM7_jNli)nuWF=hxyl!3wMZY zXs{7cUH#t+1iAJONw~+nM%s6G5FYG=IR%ahR5kl@w_pM_UHD1V&|9lf~eBHHh1%C_|rL%j5uu6K6Jg{;r;y7()Y$?Rkz zFBGfa$|Ik`41!*ee{(qu39nx9D%R04o5e|qH#W1F`M0}v**66E`L`kKVf6!R&j(rT zXw<&6{EcJ%QucfwWoi2ZQ?{`#Y(2Atf>9grZuCU~{xkVUTADICg ziLPwsD=>g#FtY`vDY54f`HaPIe)8$l2@GS?@1G@QKsU*ymXKU(>L}!tm&gIP*7Y17 zs9nE9*b%LMyVlgHHEq+Hw#NON$+FeIk^dVE*Wgh^r!Kn+s2%?7qo}xg?nI;xq7zSq zYxp-GCDD0mY@^WpF?Ffxh@yc$r5AKNGAJ$&M+WF!?(kFJ!vm03! z(KpN2vaXl0J+T-j)4C|})3BL}e7--)w@~t{(ls=iC1ky;>mnN);^z)S!~YpLAn}C% z1>%vJ^bIG!N@|tkA=704<}g3>N3*Cnq>n7WiVXbuE0oODby9p34dYHq>O14w^0dvU zb!+;OW<%B5FIKv`z6PO+AJQlL#P>kbp!k?D78IjkfVW>5X|nc1YUrKNP~Vxs_YnZ) zhd4CK!bmov*yyidK}Nrbv>PyOudAyXzY~hpMc;m912Fl$a;}=pa&=7^>4Ogsp&$s_ zeEeO;l|>mBX`7CNGXD`86g#}KQXA*IWsb@hvdn&s zlcVS@_&y3Bye+`z{vC$-XV!FIU3Y2A7K@gRiPJO}zTLMfGhUNuC$9JdZF5f6$B*5L z_9|NwPT1i(`PV-|ud-Vqt*i5*)o^+Y8^l(A+bT!8GFao#7QXi_+T+I=(Sf&wU2z}j zwrvlyH~GWI%#T@t<-n80=}FgUrO$gpS){*$#j-b1V6`pG?@XCVZiUC{tN79)&td+J zP=H3?!^frz&NB*5;f{}U*2v)MdRw#uTlXd(_m&tb_!Nk}N8>I7=du+$YbN>xd~L`VMkpcuwyunYa0sRYr@{3nXTqCWo;Dea1x_V__#rmZ8Qmf zpLr8j7Yt_ZePXL5W-f-C9?zO;Y?Uuq#a8L-?HDuSu7eF3<-G(&Bz{FlbmB!rM`i^3 zZC#KpalDh+bs8dddLZ-De&lf@*`^MI~Cr3Qcm7vZN;s^Nt?CQJ$r=jBXopW_g zB<9QQ>Ksb}kE;_Mvol*bYDdd3R76Era!%J4)bifceipAx){P-lzL}5RKJJt?K!Ft#}XWb<2)DC|nIdSw;Jc$%-<9)*^Y)tVDLyp2&(yOPDJdQ2Stf zfrG^A<_m7FDjchqv?hsvg{($>7uu$@s_iKh0Jp}op*Nb)KZ;zSE2$vNprQftIFfeN zhKvnKB)34Lw!+^w_*)5o-+;eg!k@)z&C1Gh*sK9 zV6j1*T2g~{Ez1c*3vh<@DmSxw$@iu_UG2FDla8$OeZ5+?sq|F@UkL3Am>-x1JZ(zf z5~1+{FrcrST+-u&4e-8M{a3sPszaK8sFhh-EAuU;jNToN``!N_hY)A?B7sZ>s&Zay zWv)eb4DVYmU(IZdjg9C|FDivY!h;(u|Mv0TV^FK*~iCww)Y$HP9;JQRf6^yc& zgB8s%^lq&Q7UmwJq%#(#+%6X71X`3Hwpe1fMJ)}1Mm>a5yJceS;fj=R5<0B8+G4l4 zE{bvaxkr|t|B~hBCM#ulF^$kf283RFlHR}7rMHz{vL2(j9%&_#^iF>Zs?1o2@yuoD zF-IFc8oJG~o`bVzzd6)5vqH4)aijBG|5?qSq{a;eqFEylCNNqJdSmecv*$e{`{T&U zK5G$MVO9u6mYl);2bx#0g7oTL|2QmN$NjW)KUwxbRP2WGRJM++vZaQIm!~N%7r@^`BYgd0|@RK^W)6GT0(;+ilg_Pq9i| zSMtQD6t#wg;^+X~)wNy6l(Vq96Aow)oH6f)1dJT)w<)xJT0jz8L)8@7OC<%nV4tz< z*T4s@gTJrAUn%@O0)K4Tm6p9B(^Vwc!`OLqEd1pD2!TlucDSkvFSYEnmy@(tYy~JR zhQ?k+fDDD=4R+G)_(H%=9Wdq0vFfeo-ZNK_d*T87AJ4_rX*nmIi(50!#p3i@8+|r9 z(`O?NJdBO2^HF2X!O6J7JP?;r0M;B*ax}nhI_|EwW~?ffjiO9io*kZ6wy3yOs~?bC zQLxp4I72Mg){b|9jpRcO?;YCax^~qTtI0fhnwoTV+@dB6J0_~hvGO%)avYp@$)b*{ z)#QXHislQXMn?y6jdd9B7<$M|uCH(Hpo2|qoBVp!a zQ{tGpw#BZw)!a2#r^6$=W{LSHc20N3`t=_0y%#nYuVN*4S03MKSLcH`a`iBT_feq4 z)!Bf7MUn>RV?B&iKczm)F=M!AtBJBd;w9mr$SvJE@4xT>{N5qC! zO*z$=_%a$~!RSrL)!zf7SD#kDEE!Gb82(#v1UF_EY(C4*ujS*(#7~ z@>r}!pG_`R-GauZjPH66FeQa!23??}TwS?3`I?3LN5*WnNIIG*>cgS@%;U_VY)1E9 z!hfZ%)`}%cy*>`)FBh+Du+Ot7dN_k%v5`qwdcsff|#|w;CAE6Jt z3)*xi+Voq|&*xT-l;bTU1zf-at{sWb!uJIfw_`j=79J&*e}!t>;cpZCeH;FE81d!s z7l1#pe{2@}M~sv!4d2S^0$sy$F3I9b2)V4;#O^2yhP)^664LGK1)63^YdWhnCFOf? z{F04yzX~HLZVT@aJ~@aSyG1-2@u!>_8On&n2Zt=CV{o$eV~5~mCx6~R#0>HGX%`qm zMHn*Rhk8%q1%ne^$e(I^l9HX}gTiUFuUDAl%Z;(cyfK=kHF2t^3RfvR#FGNi49x@a zz(fV_ff#CZ^y|vW07ATRecd#D-3$U&>!*W*Lp}PtsKjz=lhuxXBr{@{UWfjVzS)1u z)ZT^>G5kam#ATS>sor3rOH3&g35d>3`;LZ#H|;t8%DM0Y>$15FTC%#hRb4p*$wMS^ zlnar}i+m9%#Q=Ze90}NAw*(?mLdrs%o`y1&C}Ct4Q9)BqhhrUfHXj+s8B~^!%DVL& z&FyPo)ehw;ziG47WHCRU2f z8zi}yw06cqibW-uWKpS+WO$!l9#3?Fn;-=X3Fw&Lw+cDu3~m1g6B$C1XS3|dO(|MA z{pO9KK+BehOoQ2-GOt)OZoTnx)wHg>qP@p2E(&`O)Jp#isk@oiWNFK3L{VEz2o9cD zOIgskv6@a7Fzf9h{cScoC~m1>wz}D2{>=eh5A)E~7R%CvQ@v<4FSFimA=iB3{wTvz z?@_hX5)4N=^DGwOJMp7Zp+@B*{g3_pz!4OMqpc}S_sURg7hPw;yoWiq^%RB+P}<+D zj3Xe59Q;45)1|ju01aw5iVgbxRphU-cbTBEphNUU_Au+Pr|-nR{Sn@Y{qU+x|CFO_ z=ogiwrPRWFK8*JB!YCg1Ppzqwk2x+B>s(t%{_pS9vIp_lL$yh$!@Ade{T<^Wf9+M2 zl4|~q@)tKzHyY_K~{&QA3w;ABr89Eufw9{3|?bm=dP(nDOm zU)KjO!Xdn8b?1c6t9@z8P6%)LS399z2xnhF%Fu|lfYejIW0%F1Erj0oJhqM zfgrfm^m`<{^@apqM-i$C8`@a+qly`ByDMR5e9?T0&flXhf(BeoZj#g(-U{lFBo@Ob znt!vf6z;+pn(W29P#8|Pd`+D|-H@1Bab;AsoGfxv2!_P}=r-;X(Mk?E;Szz~h?s(~ zm6RZ$7JMmQRk~}VF12U3rj+ohxEDTPti#L%IYt7M0wt={q;zQl$w)w$?UU5xWM%5; z1e1*f6NvRLVfDqDb)-w1j2>-hAXm%t>~b4w1tl%9`ecKlnndbFNpiX&#X{2>S!k|) z8)E#Ud+rpe-qgBb5yh^+|ViLCZdP3h83kUNkh7H0x&w5r6%6~;|LE8{oiX#owNH-wu#lWc4r=nKA zpDs+3{N$Z@S(dngc#6ognvhPSzwX?q74ki6q}69+?5X?G zzIR4E)_-ZlV|`Z7U$Vk{RZ*tL`bpyI;!6x0v&aoQSY``)?dYlg!_Vbech{Lhk;(%dr3R5-Bak%j6jhE+VYT>2z-L{jyTXBZITWv{TL~SvF z`e8wKf0-L-ao?ZJZ@4cU*@C{%y?f~+elQL{VyT=jbhY_}gdMBP2>zp`(OJOe_hIA|`=Z_N70gH1Tu7-MNkk&oT zZmpX3)}Mt16VzS=ue%Pg)3THQ8$uECLwRVk1+AxD0NGe+#NN9~z0nd3MP~}W^O3QJ z-kW?ieEVY?FSA3!1~Cksm*qX7-A>xeX?ckuO~A_$*g?^XrfG=(q|rfpucjoGo7t>; z3Bs$Z`^jAW9X2#L9W@9bu<2vG*xz&rZ}ta^Nv!}sD#U-gz(LoZazQwx7j>Gr0#h?e z%F*8$MB&+I%86S@Atb361u)<7jdQ&gc2T}B_JnnljvM&;k}!YoXS8>ZWpQKgUX_np zCQ`zQW+}Y%O{C2vL#IG&;cM7oQmJFf5peK!sn1?)fo?@%RZUngdWo7^8!MT;=>pX? zF~}eJnQ>0^8g-#61D+FjnZsXsL)W90P&mMA<`cFDoXY{;K7_NCz5=bXFyYBLq%5&= zAmdiswaf1|EkjVc=ON^=6&F#xBE^RI3zR2K2aHZ{G1JdXr{9p79+>|be@7j)Kz3UD z@;PW}tbU``b8n|AheG_ERL2UkH$nAR1uujW3cgtbx5U0CmG$ zEJ=9ub@l+gd{DfcsrE@|>7;zDzS@t-K#_wugI_rb;dJR619A?34GsDn{4aRrF$7=4 zZE@^`=eTk^>Z0K1k-6p?2TA~rI0T(dsIO9VrJ#l0H>@Z~Vwe(gXE-9&zJ(Q)8<4cg z*60_vuSgvPM7BwUx^gHG4oApsEfhHw|M-36GYj|VXj>$Sx{+VYMY2$9AAmilwc?2? zSC@_Mxg>&K6Hs#PDe;E9EUdF@%5hdR1E|3WyL+lu-_P!rwEB~A|8p})U+B4pK$uT# zA)T)4cif*u%Y{GUV}0$60M8OHoN@mEZdZe-{~L8KjVaHu3oz?zB&}v9^Y?2tQKPTBUAbUe8M7!MXM>%)_OKR=-8`1G1UUB(%QR%k$%+9?fMhEVTj8mM<(y|?0t8M4HnrS))jx3Zcl{)lAUFowktkeydsnG=01c9d_83 z18^{KnR?L^il)N+jr$yy%v;E?{!R-z2pN$I&J21#G30{lBQPaz(u)>i8xB;|+T}cU zh^>>lhLukfg|IW%N{U099|1bET4J{ZFVSzuIn?2_D4uA3)UFqGd&uWW9S(3Uku+=( z{Se-j>CqGsc96U)?}_HCJij4sjYF)jS{l@MsQOG=x=_#pIZ7;=|XuAr9Vzp90 z^v6O1Ln^T-xx@YmRkBS(g1Zcz<#5kS%W;y;nEa9WxM|9Xxr85+pc#$*KWlmR9TPC1T*fjHoh6&U|F zSn9wEMAxMcy63LVWCh4k19EyMGw^|dtz0XqeRegO)$WMdzn*Zgf|z}i+F{RPhuX5x zoEQk&o_<>}z$fOV)zKw10!Z=4*5mG;;)T$gzSwE6grJ_B&barA7OaYo`;v zcb%X=S&n9->iQskHalFtzvp~bwRSfUrAP}VUS;j6XjasMXE8g>L+i*@Or#rWhAr2k zHs=%f2r8%@#lwGEhvMNM+lbaAa5Cdo%uTyJx=ycL^l{a1m9K`#1i5G`4wsVh;;}Rh z=lPH^-{E%#{R-A`CK(c+_4&PDViY9;2h$ajXl-IM*tqvMvw z+B?tue9yn(uGfB&K;$+5kr=!}7}s381<2Pw0`HEetN#d8kNI07Sq>yRjg?b|-x0%_ zII6mA`uz*&#}GaBN!|n1zMfFn)s;;b(70YBgj#RW-!&F4seg91;Q1HN9`T6{9C*~C z6i~8#=)ROq(U=Y|Q@x1UBx# zEIs{_&4GEM)}1rqhrcqOm>O3nDxLEC3+SvJ!~bhMVvtaC_7y^p2d;@k`2t`+b{1o< zvo6xKDCghxP~aMV*H{X8_^vTjM4s;OKuWqw;_ns0e>k1@+nAmiI zI!odP^`cdFs28)8>vr6G4Naola43k1p|TVGVHOJ~47gD)!uX6HU57lH->Kjhb9*=t zI%vLz}TGQ$Q%yr9#vqZAr~9s}~pO<-ji0f0OB zj0xmg%+C8@NFq9o(~Hm(OP7kp5OqdozCRyiWTP z?$5fM&xG}(eJ0fJ-huNo_PB7IaNcm3pniN>?JIQs@-%u&(CU-_PaP&;1OCSj6Yvae zWl~iY;&Bg`L+og>uJ>SM^QH%)D|TS72k;=%R>9E)f93rsM(`)Kl{~=wDd6pNlI130 z_gk^kLas*ZhgN7vr~pq6H8k{wYHpjcq-Mqp>P>VAwm2mymvdG2Y|`icIazij(fAJa ze3DvCimi3BC!`?nxegsQ+4H*PC)A6&+#YkTWAna+@ui`~v4`E>6X+MlJM7io_^+xp|e_RyVM30-`W7$VdFlW$>>P@V=B*3bR1N>ei5mL+IUnLIt+JbY( zZTr-2dzWP!vjln@VvudqAikQ8|8-eKvQy>z*}g6-`+!NnQUrRVSMgV&&zJT_J&`J0 z42>5Fa|3pubFi}lOH&W?bm`y@E7`~T{){|jFXkBBf<%E>FRre;(PE>0K)ulK`Ud*R zgN0C3go~y<72=yHgf^J2&K|@zzQzf;*54n5wY2hT({q+XQw9=sL4MmcVzB|?eFv*e z)oK2dzTP!ite5R)?E{&97w}H*`XU_bepHO*^NOe}FMa@!waOA`u0XqWs=Y4t!yyO+ z!{)jqijb z3=H}#3E)U>M&zWG1Gu&MW>JSvg7Tjnm)_M5OcWhWUz1CB9RoZ@McDa)vDl6sIJ~HA ze3gM%VXX>`>}=SBy>MKRd`iiKfhLIirOMSns#|N-K9~COP-t}e=3bOHNg?kre&Nc+ zY&t#-n-#GON4~ zFOb19na*tG`IaU`h3Q2%D@06(6S=JjvwYWGwY8+jn&sMczC14fXIFPibGu#LulIIf z-D0~g4U(gA{vHsUQ3<-siI@ug(VR0sZ+U9G>(_6vo+*caWj*#`54XkUIr^pI+RkIj zM{F^oJLDsBW}rCX=aBkBRgWUwweb#%@?pZ>mu0yNp>hMothfC2bH`gIb~jJyg$-Bu#ZdMBbuRC4 zqBzVYL-Qd&%$c5~1tM3hYJoPyq4yPeMrB?n#Qr%wirYG_4Nw~~Kd9O;KQviA_r@|?H((_fr>&-Ny}2t#$|$4}Mj-UD~c*Vj9Mpcu?Lca-%kYi@zA z(r48ng+?ZbMe`uYhL*B?e8yfcM;WqjXl>nYgwuooum&;D4E~9OC^e5r7Yn)h3GpNg z`ZFI3DW^9(@ju`pVxG+!m95>OI`G%d;?2E#P(_uOQ%*{$*rUZudV#0fL76e3w;Px4 za$LH9Na{KnERe^cc8OQhsW^J2eh7(riQnucDrc{O%6abi(z@PATLxz!kB_VxVGK|j ziW&4H^ncMo*isHgCBD*yD;@%e3W$PXLy0`Xx)TrjKfd@{S7yQI)||!} zfbJDG;^1FYu0%_uQr*b=Nh0uHQq#f9a zDz{T-`W*Oh%@_i*`A9#K_#jdTRqw7sbfn49Q%fWFVtgUS3o%Z8TS|MnTe(T2`k)m( z`DB$U@t>iSR2`er?v^EZ^Amj2%kMvj8zykrBvY7!X5;&uz3A2m`0AUCs9tmgdKu2_ z9Y~6!<1$nSZ$r8@pNR88N4{_<7O%SZg+BrxZ8%yFhJ-6$LBq4-K+z#DgL~bb-UCGH zSMxlZ0XkBC39T<*9j_I|)q2DozzE476fTizZw&Em295}vL2mx@v(O*p@WLJ0jw4bz zoF)ofolau1$`Dp4z;{#9+G!&8GZC99Vo!_MToL=Gh|LqRjUrYjVrxX~-b!pMK6n5h zMDzJkr=THN?Q(HckJBZ^<#YV*stBd4IBSlaN(4QB7Bd)E1gv%i5gl^9E>&!pCOcT& zG(ERs!%Pg##Lx^3&A?CjR<}^s(30Ng*zz{CWo+df{K>1Bqd;{JA!+h|0Uyb+ z8K_SHfI~~IeGPaN)z$E9c9KlOhFM|)0fPn!ih>pmXtoQQKsE$Ta6=#gAptGoy029X zGXyHZgh^s1*HP@Nt?g^66zyxPZK*#2tHy+25)}C_qS7{6sy8mhP%zm*V7_zC%qENW z`@Z-2o-eR7ch3F)JNKM>&pl^opp^1Ioq_E6UEk2=rL}@5@h6eFYDc$=YnGe(SQ{{v zi4nz5#a2i9IjX6|MQpg++WB^iJA|2tm!n$&$44>xbSzRwQqVJSItLEifNH0X26p3n z+iK))j|O(qhhlwfr;l~?q0Pb&!ZsXx%4lsC1`(7bZPq$+VBscjJ&xQg`fNRhF7(=Z z1YDi5752K3joBvs@_!o&nfJO_^cfkvW0982wU>aLvaX#>mT=`I71Do}>9rh(K^}cqZ#pL;Tcg3`jw{)l`EW`C=_lhOxoE z#i2yjPOPfd`VBNYCnejOX)3ps4Haj)e(NOCGZBta<7(!MIiUokGevMp!=*TuVU2T%e=FR-BuVMMP8t8Sj=#&Es+J+XG7bu=I zs}PBZSe^&8%vRiO0;V7qEe^MrhSF*VW+{%jtjl=V(KIR-$kBl*`;0uv(InOFQ9my+ zT<_pLA^zN;HMsThg|xGTWnaZ+U}~Y8f%;kJXmaOJ>`q7#K9wtAQm>-RGP)DGbRRp= z<#XXecs7hdhgUYR2XCpxSjSX#tXkTK7z_uD8Hwb^_UH zI+p|UKmt_O&9BISI+Jc|0%)ljKozeYv32L}L;EskVT5nR9ZqkjK4TfK9`Vp5?3fzE z{z^K^3^km!hqZGr?H~*?UwFxqwl87~R~*0ToQ1%xF*b=b@40Tp7!ZC0-IW?FSh6h# zQeC3Y${Rp(lD3nIi?=pH_JosXiODd>KF#X$wg+R%)$7fV@FZJtb;e>4+Df^?B9^r9 zIyHg4w+-Q;SV{qT*hjo)fRndkRju+|!8(+Y&i7EE>45e67n{|ULfZVNbd($n=lDxY zO7y(U=@5r|L&{C;Lmn6)LF+u=lO~pwEJ72OnGnkS2)7IPRu2#yK|y}HHGum+fM}#-#DLq7X;!Wy zi+X_hwjukiUJ(eRGTr6cB1?PamA-T5*_f*E&+>cqyd~`<7Rjl*X`c`O@e@wA=a{ zf!T1q*Nx;xT#gn_t~?FQO4}Ds?-K~qRY|VD5l!IQ`@$u1-M_5k@g#e5*fLLDJ1|H} zc1Z6=B2Qp)2Mj}f(O!XLen2&I_*~d2{UBp?rfUtmooa+XKP6Xp1V~&Tt5{PZj9BaYb;!nHTu)tR1!Gq3;FH zTFW2I`H8F<(`5UMVn@^1+`3QIfuJzueU!>9E`?FyhAvxLv8Vl#z4YrMd+8Gb*ixkH zaO(>fkb+x+%p2{g^T0*iKLjMw_wGyJr_KCEIgF96FvM?GgG6Z673Y8E@9(wEnHOEf}nRc1C>}t%jRX;MiI(YW*#o%xjeEkO5Sfa zbW_mf#8W0v`ILJgl+D0+)B`sTtri*z!T=Zkkh^uy$x5*R*Bw?p=8_cQ&+s=!@+jP}+ zM}_yVYhf{S7KN=?-lLEJK#qDpQ7TXaMPlJ6}>)G(n>@7ReXepcNazy=GEPwJfM3+56O{heMEQ!dP-s z>*npuOGpb{OM%?btWlwsi17U<`u@tOqjD#>VO7@S^t@@XmiL-~RQpkQ9|s!}=A<(! zDGiC*8Hn%++qZotI}2QIA*wGaHji5V6va+E!7tG#%W+$t+6#@CnGk_qESO_C3*0s9 z=Ll+ownDr}5N(}g!ny-fVYSOVN+5H!`_gkZ8ssdMhPYVM)*ZvTDBzSXqj1#8Vxu6X z*w61sLxxEL9BC$DcyBBQSu1Kklu~GR&>Vsg+YqkL!eTB(ovT*rNjRraOG2AE-N@7Z zWck=y`o6VG56kfKcFmfDG-K@q&{-PTor^olRum{Ka5C2H2Kp-BZHd7J#Q-Yjqcyb5 zI*vnMmzs(Lbt9nj`WrhY5R-^5Zb`EFq1SO*Z=MCH+JmP$(5!|pP)%yzJQPJL_j z0BgU$m8NsuG@Q;b5q#mh^c+dg5w%w7cJ*vfWao)=X!}xju6NNYZWjf&D1e^p`33T< zKNVI3+j34{G*~r(12*!lu@E67j#Wc@SQ@8{WXybmk29;-_EitU(!8 z{D{ST=BXdBMMyoyqCCHGrwgU1b0y<;lA_KPwUt})ge-He{`M9eI8FI;nz}Bw)wM!@ zHO`--Iuq83G}d5le${_yf?q;1$)a^p$eoZHX)!_twd|uQ#emqxw0$MB_rHbM&ayiP zwJ&<-c~2V~JcH~?y@)i4Jh2FT``R6HJ?d(8e(XIXKj|g)XM=46;yi8OHoYjkHZFME z5;RD)T=XuN)H&LKjpoMTbPF4W4#IPr5zk$1;khfdw(e-p=Qe)})!ivUYC1YZ_Nb(< zmspW|%05TYAo2_H6EEU?tR6(mVWxPeX5MBL-Z+R@Z#gSJYowpo%iVw{F@CvQUn1#u zh=^G3kl^WEBB^Cfh4Fw)E(2s@0y2pg*QD1}UxvtJe>5^N@;2wO{hUOGw`cQeS42#YhuG4HiHl_XuweKD9l-?x@^|^JYo|iUA1XN^r zr$G296sWb0(LU=ffi)UNW+~v9G8mp2#>`E6^DOd{8f!D!+ucn#n#1jk+X6B8E7I0l4>= zT!*qc`glrkj+?o)b0#1NC51gs6=EAU=S3pk%m_4bQ5gAfqacsnI8i-2;wV$ks$`4MD$@Uyw~djOe2 z?h6M*mN*5dqSKL4TNK`i0|mFv9XP&k7rnPj>N1#SG(xMdX8Upe3>q7H3%Sl9q9QV2ZcceV#zL7g*9MD3=P=oi8a+Dpy6ml!esh7!5cMp2NO0l z<{?P|L6U~YZNei+kr{6{+T)h!rNgHZZUOvOzegFNC+dZx5ElT7RC}EVak>NOCYbGK z@$|@8@6c~m$9c!&3alnWT3(_S)OefPMKgYqF`Eq2w$qs)3WCt(s#mt5P7R4CUo$L4 zfpl_zE{TU&I{9RjJOcvQt;g(iS_ds)$zY2mw%Ub4 zBR6<~=~pHj)7LWBYkFa(q!+lf4X=r4)scEQ?=^|%;J)R;*Q8MU$|q6KlvuKgrNBh5 zWF*Z}yI#bMR5vSju>~$qv82ZCw9b5r-$Je@lxREfCK(`?Iimg_t|dz&w*}~6T4EJa zU%OMieC5_O5_&;Fd%TYHF_5m6F7IM-O+1XzUQ(R6(WRkL5WpBce?_c&NM8htqqS)( zdEb{cT+p<2qM$fUpEO%*b$LHp+fCbDDJ(zi^$p6Ku0jQ+9kMnK`RnjSDBStlFNI#* z=&o ztg7`C-6hxG<{%@Y&bHcYzYoQE(B$K)+I49oAOhw;<>OV_x;R1JQIG;_Wt!YTnrm`h z-eZ+AE0&xGyq~Oz>&v~SMy(1u0y!o!eQC7oA=jI@*_4C@uiwKCZoJG8jY0VEWGm9` z8W-yiJ$knOka~SkUh4he(HQn|)}i`OHzXV4GgvJ)ZMOHYp3N?9Jf#h|tK)NZN(si? za3(#!z;nXZ(4+Nz@)J*CZsQRgDac_g#E$@Mx0G@NwW6`wtnb_4jsTtW*PpHLt9EN) zcXeFOHakQpMoG)s1L2@N29?L1>)i+CIk)jtqzs39#-ozzE|Vt4);yDrTV(6J7uj~& z8Uh|~>+>+Oh%{VPTkSGU#e;9bvBoX$@VQvh3*fzqiMgT4sFi$min&_EZM&cY@8<*^ ze2yE3beb*L=R`XfJBlD~>%_J_7I(d>_97%V+Db~^(IM{;bLAa{nXZX#746_@(p`^= zcD@nK{N${(PuybpkDYY#?<)24W!CvAokXsC$T$M_B z+G*T-^L3MkleL4|sRWcMax&FAInSis+in3bN=n0wLwYhP9_!#wLE`NY7}9Tc`dR_a~|)_I`=Sqa+#WIa-^`NdLL_gUYWBF~<-$ zdArt#;1vU1w@0oUjq#SC>0H!Ghx$CU^RcQ+yIaERvpoU<92Q}Hh7K_olPH@@&tJ@d z`V9jghDesBWoJGCVg8t*jl`3@`%V$zrIacHpT90GHm-?An3^UGUfK%DwF5s!Ks*3YKHFTo4A`B+OZ1J)Lh)E%Qic^?0u}2SNyd2Xwk2MR zh7il2iHufk4Ni(5csrHlEPtveTU~6OF{gtw%^SNN4};x)KJ_RhvUVolH42YySpKx( zAg|j&66_#36vSLRmG}SIf_(jF+_ho(Io{Y;Fz^)+c^pI@?dL~Om2iIE^@!8_yu%LY z_r`9(Vx>dCG|x^vGgcvoQe<`3`uQ&@SSkN0zL!_DgR7fV=FDH|O~QdL*CEA@<^q)O zvD~Rr-aapXiCg=Qn>vlZj(`77ydTAv>OR3(w+Oda~1j-S(qKBwX5 zw4u)&{LHaGSx%u@LxK$Lq(HbIDc4Y<1ri8O$2Hprw7ymf7p&QP;{M)S7Z70S7Pu>cj+jhd^-Cp>7`Q?|1v8_Fs5{tK@P#@O}3}>cJO(rF~ zEjX3r`Xu5n8tYJquNKRsPfP zag=ekdq%Fu8|2u@S~YhJb+k?`p^wK(%MB-qHa=zRz&DD%ZW>j0NUr-G?$|fynsW1@ zo~HyWl}HMPYeCy*BH-2E8b9lXA~ZSKnb5UOrH;Bo%GJ=na`QQFXH^Pt4NX7p0)J^U z)-T7~x%Qj<{H8eQ*~7?Rv;+A(C|0)N1`w90GZu#)=@!U>rZ)5=5SN{%Vff;UG$daP zEw>s=gsHmrY;JDNdK1RpJme7e7DmNAuJA=Q zxic2OEcu_wcp5cD3tzYtoQdEREj*~o!{Dv0Cf;e2ys_8}wlRVkD0-u-$G!cE=($yq z-$bhpy!fw(+br;-NPPe0g0&KRJJpBuTenir=8Idgj(Wbdm1>^v%4$W#5ss~PuVOAA z)_j#-nD5RBaq^jk)O2-HQzQ0oW8t*)oKTPDfpfds-9$sS@$qTn;WH=ng-(To72Z@+ zyyR9~r9AZj6a@v?yQ5H4H-F(EqNpU^joa<*8l8Uv1s}Y?w<6B#j4d2Gu14x30~>qB zL6U=#|Dd{bwVQ-ok%~T{UF@#7TQ86lvE0U(W&F-wY8?w_ z7L#JJ6ZMCbv8<>&tCgK23^aswfFAvRX=J0&z7KN%fRj9_BoOt})myBCM2C`j$;BciH89mP ze6Pq3oVc@j``y+TR?1Q-fj2X{Lz&EXl9A5G6SgQsZS{#UNDD|%4-z|rxsP?f5{qVE ze#QgE6(*iJt3M2Mc`*NJ$(Dh1x$ZxQ<(=O4ki1iU>oyFnYzVw!0RqqBd)rFW5_6&> z(QN_vQm+VX7>cu+#HIr)Ex@)1;B)H(7L`1c?yQU_ovbcWY3zVHueLnn`g|w`ZJn@+ zm5DV)$r+(*VMfjXml(Qo>q;x!X!C%jG;C|Y0>qXeWJsMAa6(vYn{UNG;7wg+NE)Ix zuhJ6sF;G4!{T)v0Vx?Oh0fRxVC!*_`rZ}y`(HO6FI?2tgSgNkp#0yY?1T{mM#2u{bW3)~Y z^ZezX%!?N{vN-1ft=G)j#YSr#;%@|pqgFW%Xm)B{pK?Y2F0_EHxbO|*Vz)jflvevW z-YW;!NN@?{5@G6KsxTBFUBm_PRvu~}R6?#t@tR1f`B}@xOx(`N9|PN>wMy;$vj}La z1#$t6^(DqZj$F#>^SZui{RrnrzIO5Y%G27wWtCTH1DRFh`R^fACte*Ffcw~rQC#2b zhM>As(Ox_7Hsa{i+5yzbRFy9S$Rop)V?}P{1KQX@XNULVTFD!h zH*IhXwQUNttoFH68;~lmJ@cZO`OLC6?hdlfKcT1ABUZY!Zl|-$%&cGiI;v7O9suvn z@a~1r%{B0N1%3zMH}POoTw{DwzN2xjqbWZIl5LzDqjfm7PD*_5P~yfsVJIwxa%def zT4xM~`t?w#%~lu~Fjzq7cJOVCPNM`~Iq=Jd-!%A5hF=E!(%|RDI^;cZLeG2h1iU%C zIlNE8`y{-3;oS@Gv+zC(?=ZZ>@E(NsATqJ==j?TcBduX#r4{(q!0%~<_#~9v-i#%T zc3ZW#AyCFkS_GOS64p>|9K_vwyALvl`ylDUnHL8k-*7YL+y61N^h?cD-$JtpS*#(bj@LLSOrhMnbgN<{Y+9_(iuc`H3jY=BJW``N>t5Xn?dZ95YhKQW$-gru_=MUWeb?@Y@Z)z3@8%zvJ-xx|#YW9ojk_-f8eogLewN zQ{e4}w;SFrc)Q>&!CQj22ygMyzOmX!+5!CyzYO?I-x1X}`A#TxRA12drTq{MyQJ@e znSo=t41KyMB3(U8L6m(Hs$ne+9PyCV-E7*uQ6zl^dWKSm#e5PwV-XaC;qWX4_eE* zWkL$qztA{)edM2Y;$@xV0z#n`Soty3L3Uidj2&kC_;r6q7V9{0nm^Ii17&3;rh5F_ zWx>6*7E+8dXyjcUW0&G@d+bucx_oJl4^fWYQ8`*$BSzunF}(H&W{CSJ59;a>y3an; zR;=3XG=YLLrpK?U1;%|LmKi;IZ`11^*GfSMo}F2Y8U)5Ab{Fy_(-eZ-pTHsdx8zm}Y6 zd5&K}PPz+x897n)9+$|8$1?oFZgk@6&;LbERKUZ(Bq!RC<;Tg1Cg=D;a-zLC-mx3= zo>~#<4`m^XV@a8xz}#~vvN!hZ$Ce2Hmff^-AliPpB6@~x&sy?aD{Upe)e`v47$m<^ zelPk}40reYmcs8yIxb8{_{2)bV`buwc)HP3v^~=;&yVl@ytNa6x;J9@?4u~S1c1NmiCENvB%q~VyHDLtJQD+;b|z~ z%$P(JUE1Z4Ulub%r}2v69uweNo1-a?ygD56HZgO}Db}X#&H(;9m>$Tu75Ts2xcBav z(S=xZ24c-Db8Zc5uXR)D7&#Yb?3E5?3fYhx8G$4>+uhhJuRkZiJgQ3?R44&$gjp?i?h56j` zYO)1I%JJ@3zk$)Hb(vGz9KMvTy^+!K37!RY%5{ev_GlTTCGdz|-KAIW^;BmJ4Va8F zTcs}ynCi?+226%MV1QpffE!72T{HODH+T&3W_!$xX&+k0h-(g|N5;p0w_4X+X@pcC zVVI1k{DeBraNW$`{E+r0Q78OzN)}ZB3NRi{Smg;ihDw0z=Ra^9l~~>u^^iv#C{zlW zP#nyCz9dn(-cz0~*X_XBQk^b8`FrAXP_g2-qxK-*3YCeW%G_pG=Js9RT9k(>^U1rz zi}G+~y4BH!>o$IJFD=S22y;4pdmWZ?uI_JV2|YZaqy!46iX|nXIICP3u!O2gWJ}n# z=-ti3EifoOd0eRpX$}SJ=N0C+Am$wskqOR@1Q%xtvE%H3PMdW zUSEb>H-N<}Gm27*EtNJIyvRXQMfV*8I_3zC2!EvDImy-#IF1Ov$;KIWYo)hYt#w>4 zf1B+?Gn|*Ai_pkO>pcg>&-xVG4yN#Rtmrs@^8?$8rw6{i8@1E7oA$rd<0Uj6jzyOT za0Q)i^@S!_jcE9e`>7GtR$e36^B&bP^#4_>-YqB-OZacz!M&z&5iOh1bf{HDt@;?z zH^=zKcj%Ixaqo6M_FZciq_{X3hw5PhA{xV1r4HXk!AzY=ol2tfKwpD5e+sYU)5Kql z6aSY~ZN2=2UVa1(gJnb4>E*}KmW9tH*VU84hPR9TYzA(?;x34ip;f=_fGOg8o4No& zNd$`T^c}Y>2p)$(K)i{pKa>o}AX<>wSnYrn0ngRCA)Go6Z6R87NgAHb-QF`wgt`%ne1rRo?QO?9t)v#D$}z} z2oojwpn2KimEQ4m#2U}P_XW10_DG6lXaQ$(y(P9h19$XMG)``ggY^xyl<2-exjEin zlFx5JUEsUjtc&>u=R(Vg-Ztf<lGs~vetTWv*{u@~2*}9e9S$2-^`~#(`wMQpA zAmNQ8gOb0DAEM-3p+t6Pf!r+SYTa}_B|mgbZXTJh4P4I-E>~i;fhnqpfUH(+VA_U6 zZNT$rtkyFvz632S3(c9n&kHM^!Yj>@fXt@@(FAGGXGz$<4mOP`cb)bRny?>E6K+Z6R4ZpSwZQ&fjIs$=DcUi;?mJyDn{k z6Q4t`D4C+4kEI#ZZfj373LLcq0ttpnRS9ff0m?sw7M8LDZRcQMt%th&t1qw0QM0_l zD*J`TMT3a(7l#rXeS=x89li@f4j{9KQ_P2<0wb~bD1gBoXR+YvsDofnyS&3Ua-z?@ zXBdN!WK&_LdqfxREUO7Pfcif}WqbXfv191lzcMq$X}Lag9$tznD!+?=irgdiC`Cwl zR=alOzIIo02GXThC!T1ESFQn^G!ZZo;-kUJxa{LqF)?3chrx9WTpiiF)e*RldoXJc zpsR#8@o>K~rvGDG55wL||4N}CDI;3d$yjJK>jAUmv|Z5Cte3SzaS`Qo;M;jHG#A`> zy=q~m3&R}jIr! zPk_OC@yyF_qEw2}k~s;rkLp?a_|=~Ry*ERFCu>*@ar6chrC|*UxqHdIm)s}Gy`9`= z$=yiqFuB)}dyw3_$t_Gm_fB$4Z&`3gOL&_w} z*s8tN_sA%=L&iTuEkSOR9a}pc0qp2Ewu=!zg|S; zeSS0b6+C;wvRI0gYdf&@*goDr18)E+@mkVe@N}SBfah?MIQO+VLE~d+Xds!{@RZanNftCVR^MEB!XqkQthD!LP z0a4JZT@F^A!g|#a?3Pl5CP3cxef9=ui6WKq-^~|T5ag8f;B>iO$iH%wyju%L8OUt0Z-{j82;%@~En1*KBc zKY4jY`(C3KAz6n!ZsiKkQxs~n=P8V*jAVlOM@*FgbFyG^yQO2BHN2gPxpp?7RwZc! z1iXwrfsN+pNq>tGv|ppYV1WYROotHIN0Ln${Mo<8po(=$KygJPodYN?HnP0`@~<|ksT zU=7j?7`ELgCfM?{BnUCeVi*g}SmRQjG!J^C09t%9>P6%OAH}4rC1JUe6nxlhM(n^xWeBLj)EdXy&c)bpio|M`fg=>hY8Jwqw6#*p zbd9!Vk>9e93xtzPP+i)u5srd!q47uo(T@z{qS*@hnKqpwvNqIFh>JmeE2XD59E*kA zd|C^sE>;%=Bp52e95eNGBKh?Oge&Pm2cGOXp!WD(+kwiBOZnE{ifEGK*O-P78eQ9g zo^-h|(Z&PX)zlT#6Ezr&W^%0pRcfdH(aCK=*F{0s4M8_VK{pIRYoeevL(sY?Xq^o$ z$%3k$_B3EVWq7?8FRU6rnF&Z{0U#X|$qV2mSiK>W@G9o4H%un?269g$cMZ9xlDm%F z(+T&UdD*;~|GH0vR$F5HB<~tQcnc}Ok_Cv<0yjAjr$LB1D?|wdnG89TXI8}XzCN1M zsH1AY*s*tXR4bmeT2cG&1K7cMDY6#FBA(HV!|SK1SleQ~7Dpw|pKFZ)w5$Ll#`xpY znRZfF0#ZozBUgJf3!ACWTd8KX)|<=aXMhhuUWC<#Gws2}>y|)E;z|mslWbCToL>7} zCM9pR^>agQP3OpsxbD-et9{{HK3KHj`H1Ti%*R-M_q_y$&MD;%(qgIHqP1AVe$QC{aL)HTrZQb?D_Atgy7NTDAqU%u>B!Gj@Lq z8kW*qo zF$vrr!O3WEkeIJwKnn@!ATmHlFi#=o$u5uE49NK*)z#TeMz7 zUBjp$)cJ{Qt7YSato*_F=7)bocmki35VA;^ zClm>H3-=2T3Uh=9z_ms|4M6`d@HxUm099&7^FKnMV65(IHB*ncao=+{nhVg&yE=V)r$Mg#%YIQ< zg?nju6N5FZM9sB7c>teJtcXFq`z3(ErW{zneiDGsDF+w$ivxm?oo_TugNf`96hI;+ zeAGWgD4d?3A=e>SQv&no+0kg?UKt5QuDh4CQ#=O{s{zz|sM;&2+JESwYTs$qrPFu7 zY3=)s`w;7MtkZYgs!z9Geu95?%Bl~K)aN9srPj-PJAG&Cus&m~`Y89{Zfd75jJnY} zsS`*q&U!JHdRMC+jIB(Jc(|>4W|+-&D4W|{gLmCa(C$EfN#G?&)^76aPEa))W`h5B z40eQjKDP{QgloSfLmT_a(8h8C^grZhU-gp48&>1QedIqz|mx5(hFlF<4_F7l$6wV;Bs2Z zX5^60fAc7erpaVh1o~s4wfQ_ZsvdDz{E++Gm0$)=ji7^vuY>jBJW%}+!1?PCbAL$O zkwMzy$RgxD+fWa<+ky5VQiRAl#oH>`}7uEa(QyUX?j|aLsR2{aQ#C+omFRA zA&A{;L6V;HTWI^rt+ya2Sjwl~NOmLXqIxi;#OtoaCbl5Q zQ!&iWSd3wVj8shQ7KrR=!9`xZA<&46qxOnvdOMdWW6b84urQ@k=>lkJ*2VvO6<}4s z+7{Ew=;`fL<1JfAi`WydAl`1oxng;;C$GX=b%L5m>GnM3zzIhzvn?u2_W8VjQ&P}URv$FNF*Sjfa6TH( zoY94*q1pKE(Wog6M|um+@Gy`5}4lCD_B!+Hymw8Vl~#kN7l7UD!P72A$ErcC`h!n+?}j-bPI zBW&4s!eNcy?nkRbfBM=qgAU^fT!;9MYa*TGMun>tHs|Cb`HPXH1J-z~3tG@C0k1t@ z^gfApSCm`WNFCKh=mny@d86-?&-W)*Fl4jLZ{wh)J z5z1EHu^FS4$~(4GywBYujxGqCJp%Y{JJQuzdvc4-?SnL0(~($z@|O{-8ikpnQH#4T zTDG7hYZ*c@?>$X2n?NP^k_oL#!lVCw8B_gA zqlG#y9#@k{$1U9t9d~63H0Xy}v{iEwQuAye+Gv zyn%PnTI2Nw4C>i(1iDliZ?xbx6Xh^8K(8$2NA7^h{xEB>xEE2$)xu6?CZi36SyCdz zob)DcBzW7@32c|Gbj}Hj3vfCkf{x-+{&Nqc@V%g8LFi1-;SZfMC@zy~2Pk?Hym2EU zwq`(5Vsx1J?EA(Z!%-LHx_2-VfKZe6mW4!rJ`L$1@;7fo zjfLfPl+zGj1dz`o=-YD}I5EMTTMQ zQIz$mXA3q>nKJE?w)rU?{(q}sUOWS|grk)I*Y}27#`y)c%z3$PyI_Z9Hut%k|5 z8|HmGnT6l`w=MI}_rBFKP>%nwTV~=JY?&RWsC#GIEt6k3)G{AH%V_0L^g!HqYro<- z9Kblg6dW1bPMUaogg9N8dBuDMC0ne-(|%AWmcM*~beUSpGPE}l?F;G*G|lHbi1>fiy7_zk zfpZictEDgMWs6XNhY~>*LW|t`qA>sYf8mvl!9A8Oywhg$5nL*sz|H1h3{QVvAR9M< zfZbxJPmB0@3ezRNb*MSc{G0^0t(_EHg_&;i?Qwc7uE*9M0Kr3Gx=aA8aTQHri{-_NbsQK6E*8|r`^3R`3^PR~)ET4chM1WzroYL1-t(f|%>cA8Ik zfs{fi?owFsSQieID_*cj3*5p&ibz?>+~BhSH>sDfClJIOray(z&N^P*0MZ&8!avjo zU;hm0nfp%COq&EKmDVM+^EyUb?}ifbCG!!_b=F`p5FIav(o${}fEU|ocb0O3DCwA6 z`p{>bwX$iy#&3Z&Q$zMC@!GF3Eo*;cc!%;dAb1&V_)_Aq094>I$QUYv*^E=b&;DJsb_u2#`3|qowPrls zoHie=y4lW(eigSE1!vve=7ehWYAeO%rDYQfWRRgJ`wY@DC}n``~*a zeBT39*}cLtpw0?}5~%V2H0;9vVc0u_JB0=R!?3pteqlZtR^yL-c}c6yeRuYWyMv+2 z-hB{Xu6KWquh@4xP9U=u{x7=dnwOcf#3(Smr`IHvp`OGPJ{W>_!L1P2aKl)X2KAH@ zA2CS;9c49MnNj~dYAGFHPtuwm6!`sZF+|qmJ>^oP{&AoV{YL#}eAyQA>eHw%cF?}~ zS8v83h`I;JogQmPE`OEw4uS+_CU`!3&hktlEo{oQ-i|espewCdXj#I11GBLM+6lKq zIVzxAm-CS`GHIngR~DXfOg>jn2Z*ckQxuhVktf< z<;g#A0CQ|Jh96l-l()k&;SDL7rTk8gB+?2x#6UfVrTk|=jD`|%C##gdg{?qzka>$m z0?9iXEUNN}D5`RwekK3a6ycI3O@;IyhGp$O8%Y7F=h9;r67)eq;dGP~71qTXLwUfO~sT&OI}wlox>u26#HOK?BC-g%G@ASDH{l zh8o;#ZuEH~+DNGXRJm!D<`tBwCA{TXoH+O86$uGJPhEKr4i(C@;ut^VT_F+efKcZFX3+l^;!uzvbAY^{~JUX@-a_CrRT#M&i^nL zxhv7em{O#L(X2FL&6v`xz9}7L`Ws;=zFdcLJOy$cO4bx8j}*xDRk)|PW46dtH=4WX zSSxqdW6)P~-M{R)3zf0Vj&sO$e$rEvSUZ46KE~{kkzns(Fg)HdX5QrOtQt4vfb*#L zU}bW#pVZEz^Xqy{vnQFh(=hyp7@q8GTHd$ynYLDo*~#p#kw#(KXm62Q_qpW9um|77 zTkqbFtJZtls?@C37Sivv&v<7Lk~;G;+hXN$k}ec!v@IfR3su z>~>Kbm|iu8&7L_6i(Hjd>NjTR_=~k&(t^`Eg`*2s!LZ-=Djc3)T#ab{BMT8jYe!K`Q1^(-{{Kb z#qzt3oM7V5D*7*0tkOpzw(I%kw>TRA_8WZ8eFdL?_#HkUxfP!pJx|kf)@_1i6I0&d zwv6>4>Pmx=b<}WWD|2pFGH+L6Z&xZp4?;(cn$o2WjHpaRGj2-{Lp$ZR1oFgRh89Hp z##nx9`oV8f%QE!48T_tCzl6%Gwa##vQ2=@6h{X`BBhx`d)`n#BwQLzC-(Sj+AZsat zcqEl!S)&79MBaf`gyzY0-yk_7*X_1mKcoAUPUZf2ig%up*aCC5rbi+J1lzW$4xtCljkUa(BmI($ArFNfqYcDWCS&m^=mHG-CIurp(=ZO7(M?% z&olV!gAs+)d1oAAD!jR{Z?k0&Br@Itt79w;J%O%Mz~Zc)4mfM|RQ}@Q!jRlbFt9J$ z>qo}$Xw}v&#Eq$fbYzv(#Gs>?&;1)rzDzuJ(t1`a@$=NQ-~*wU;14fNWQIZMTfMJw z0cgUBLQ^|iU!Ounr4AdqC@nsNZQ54TD99* zTBhW}JKhrGR_s)fzF(al`T?t!g7NrKmCgso*hVfEnpN3+qL+>_kj@Crk>B;DF;yb{ zJ!x&+Ex+3uwAkLTKX3%IUyIoTf)6qj_{OY)PE2=gI^Rm^E+-q(DTMEt56!e|JXWsz z6^y0plb{!rM>XzLR%tw4@fRos*Z+kM4+{#Quu94$GU%(*d;UnW?kV(@$ImShgq{}( zuY zp+Z)aW;a1wj~l3r82Q~jRTJu4*`gFRzJ8DD%sMoCL0}g(#7wIpiiaB_)^3Qr>#!kc z)LQKj4B?2bJ|YUy681nOTtp+b?x-+Jz7yt+NElncPx<<~ z4*cr$-NE3XpGyGJ^W6l^3~aQa|N0D}uA!L`y!X-}yQv9=6_lDzRRN<0jzs&eY#Npz z0QU85YQbriUqO>KW2|z{#1M#qWD2oeQ$yo6>=EShrwNK86>cL|YvI%}3)Zc%-t zNhWsL7~09+dogM^6$pwlpeW{z!s~T@Rv_u~(-=I`S;1s|eg-Qj)aPfy%B0Vq%nDrk z{Hd(KtT~GUS2h!f!1}%2RKBu;53TsX4hU2oWf4aT zL#jUSBHhv~2{hBNN#heE)l!L8 z9Ts)aRVR;jtsb;k{<;Q5h4HyyfhJ05AoqEL~a7dD83+?+47JJZ<# z?Q?m7`A3pDYD4d0)HZ=eHMQ;>zq}((~YA8rtd*KH*d>MW`E>y?}5kJJXPmY>{0 z+Urq)*SvYkU0TmrK3p1u8tH5#jMyj4x*XCH&pSPzXq0vsd%ev)2bnG0sl|n_d=<_uF9Jh4}mjzcR!f`@eRt4zXaf(qqM0Ffo9r) z%6R!V5c5;5=UQc*)*~u@DB)Bp*KaZG`O)&Gu}E#^%NcTg8VO`4L(A}+&H#bWpHKR_F?Y3AA#M8cok4A>`+lIR%AMnJOiIZx7N{m91wBNUgkR~?+~s9EZ#B2=kog8l`&a;^?h>vYd}o) zJa66bx-$<*-Je_TrRaXba{mzBn=CgIlYbdn502dc46O#o^XRw_9RG=q3UC}m$0Bfy z@PVTc97*+~ei@nrjzRSLKFX}r0pvz-oJ7cEaGXNOmEbszkkR1yD?*aMaTTP47Zj?; z0tJfpN3WdNa3`9WP}lch$ARG|2zW? z)1btdEBg6Enl%F|EkSx%_(QjV2m1h+2E9lMT^Do?6{gH8jKe5#dKbCb2gY0{1R?Ii zN4lw+#z2nRxe@YXc;IekK6A&w-N9m`AO^a(*pGL@3&sI;_Z!mwFh<^l1Ji;xpM+ul z6v0Qxn-YfL!7dnS8}RD)$O$lm)}t!}T@O(}9DNwDfZvF~5^Vq`$zSN=BfuU-SUwPW z@}@&W0kp&=S4i~7g(LK79CSy(@e6c(0FK|s!kFC!j&~69COEp#u^k*A zqvOB9@pp7=!4Zm%XTTAg501yd;X;Q7j?v)gL6t7x9*=Ikp0mII?%+S*cL9FSgsopP z{LVmUcv^ibVUVjhrp%!%>%Hmtd&(|6#(eB{dx3^z=YsU8TzL*aFR`dAU9 zdI0&g=1qVo-g^LBX%!pM_nt$!+9>GTi3^#xt1^al)$frTo<+k=UGig_;ccvudhkH0 z@4Xng?jWvrcSu=%S%=V4!lG7P?b6i^#vGS&EwIsx*hf(dl5@pHJR;WYL~?yS06d^V$i|5P^kAvPyn_VxM2kt=z{dnW!RntIDMg@ zwYcZFz;CV*`Lq87ocDVt)=ZS^UPQ}-B~UZ8@t|(k)t$QflCHj@tFP-SRCBkkz6~|i z)pc0enchzMF%(3xs~~TZ@k26Ji{5^{2mJ3`wxAU6A)K`Y{ zGSN`+kUS%_)W6FMH)Os%d`a@_1i9fTaVG1u))?A$kso_6Lf~GKqopN~Hj@B_=FC$E zSkXGBz8;-ZFvajK!~uWi1^&-9xW*_m2?pfLI>?sSSiozrW!I%Mb#HCwN@!d%Ouf4TE~j^8na_?celeK~!$*tkxxX+h;=l$_e>_0I3i8!(-NoV`3@m;sqh-W*8emMb8)c)3#Rv_}ul& z7&?UvJeMH=`y=tH=y(e@SZ9>M$-o)$Wzk;6KefH411rUIqrJ{OV|fLpqWp1w3ZEG5 z>%ZJ#`A$bs%=|PS8}0k-b#}7T^!#-GRYR25qtDu2DSCbe-yiMu{H=DHsD@O}&*XoM z_FeHaJK{_|e=`3`v{yob9TCxkoH_uZs3PSZ&MH<*y)9)_8)RE2?5^nblbq! z2v}wTQ*7WC0?xL8X*N(N;Pn0hrpj(z?nAiGXmCIz-$|sT!#e)!tbLz?kLo)2)0wIQO*gT_lvyZ3w&v zfq!%FRZ7;cQSSX=(Y;FL{XZaq_@aj%ykB{!GQaYnAC}$!;L3-pE`=?)_XkS!xBsF0 zA5<`&??Ls4dH1hb{lMMpZSOVFu)KTM-v5Jp*OXzNw*R~bS3UIY?_7Ztd}cZVK_v+$ z@Ax!uEk%J6;K{#+r9SYqcu#QKWPtKNy%Q0z`pK}`&lkYE%slFC-zH%ij|O%Q0bB@p zFtB$B;6^}s;P?MD&e#SDu8)r_!Bxp-KT)5#1EnKwm z8ZA6u0oR?1Yh#iYE`AiPHH0u*znPjhhDJ_SYv^C_`-Z`IxIGWAEh<@`UPh52ZV5E;c`QiqVB!_1U(~~X9VcavD%9mIvj*RFm!ODeh z@AJ8wN<0M)%_8__TTBfI6510=Er1+CNhr=mpEJjhKc<5)UTj*V1W8Hc%`5R2<}R^i z!=U&7Zr_q(s>{;Uge}OzS$n(#$`zg@>=AXec59$=R4~KHpX?8s{^DX=(MV@#ZEdxL zMJrM7N2{@Y-oGjgjE`nXlxdHNbrUn7;W8Q37^(V#=0<1&vLkE9rC z?~Cx4)t9e%1Nt1dz9zGBOfW-hpIj0&13B^c1W~}u&XUAdP)B{F-SRB)qO3kVFhH@m zTfiYJsnOf-{GHcDI=YFdTuEI9Wf=Ncf$axOycCN<9iC}QG7~JxuC&N$f)kbW6%E4T z$0sXzdYD4@c1fQ?3(6k~W$H-Qf=4rKi-LRe$w7fXc>#rpS(rCmK%Ez?0cF>N8M;s6 z3M#V}=X!k7npjpXg%X1qd%o ze0cX)NuCB2^;ml|qcckdDGy3OODKB- zWA$}3(4=Ha{l|h6^oGTFCu1vWmi)CJWev4oFT_{>F}-0~j4d-^8U1W{dicUel&sXm zzr%QpE9J~Yft_dx3qUZBLYX6?Y5xn<@~7RzO#pyHOQn4QU{uAm_TB6zSzvJ&+`wvs zL=B22*wh7OyPylnh9CqtEbIm$fC}kyO97L6G1dfwH(4_b8|{0PVoUSvukGVipVFrV ztTrZKS+G0%#L3M)qLf6ke^n}D|e|NdXh-MKS!XXehGIdkUBIp0y{ z$8u1@Lx=ex{pkqms;FPh+-r2NjCa0KWuHA;9m@lblq0dw&PV%4DPv*t&+Y98)jyL; zpuTh+&SX;MN&WYsHOh+Bt8arpRBcn(F%-zbVZL&Yu^Y>%IN9 zin(Ow2zgf3KLS@WaHK_+BxD^MPro2#4cfdXfV)sw-FrqsEm`w4HBYmxe~3>(bnn=G zjt691;FNFh>9o$)Lj)`q5VKIumjmIjaX9vEh~s^1;bB6GnjYIE@*oVk@>TifMTUCV z+Y?T-^nLQY97qKFV6yZfnq+-4xXxuUjEU`VmJOK z*1=|1?>k{bxSsZ&X1jm?!#35C%6;wIkh@+hepp(DR-1St*#E=nqz`d}WYUTX9LGWk zjt&e+jSp8gUU!DKoGYo*OIl8wlth^bwD!g{8pAXUgP;echkdd|cVb)`;w-ui6ew1kk{08LJ__)~UL%M03%=#*f=g!pEP#g3&$2y%Lo*PY^9aXy!{ z^p(_oz&lAfZf{AlI%2>V?XT1OLW24)TwtPkV3EoMm5l@%wJpz?( z8=T|*E-d8X@jQ-%!{58X&N?xay1BilWt{et?eySC-fKR(eeh92L4pbN?a$CtfiIX& z2463vgO8rE*hM!9sy3TdAK;zah%B+{!-Py0VZk?9%OU+NJbFH8&rv1{vahXtQ>tRY z1EMvMKX@3IOxY4)b%*qQLYd}ZMqhoZ0G}`#p^F^QxnX_fr!c3_K!kqpE}JyLFurbt z#J%rLm~`hO@;SUIg&W_?_#wH53kH7;R}ZG1V=9o}0oIaM?goNaex4}**CIw^ss0vP zKJ8bEFIyXKp@T8ti_}Aj7Gf!QOWJ#0km{0_GjdrdYN+S<^r^^zsAnSB*5k1PG_V2I z=Ug@_%w8rt?3c+7dkri(Vf_XmZV~ZjXzA-PULLB`NTgO!IMeJ}EsC1DpHfEMlg3&0 zXBj8t6lm~d-bs3?pIVgy?NgiL%FMH$UU=vY z@Z_lWHVUYyJDnh8+S|X0_JVlac5t7mO}WuP8-9MaQPq%d$c);IEjD{Uo`s{|TY?01xg-HW=ll=l3pAzFw+9ddpC z9wfkZ`w~HfbR+#b1A5^~|*gty<+K*0~M`O?B%c7TnH)&#>TgiMTrt$I%NY zqU(N!t~SY2w$U%kTtqGh~qc~`LCf@(;AIkxm4!}=xAz|PEy>-%gReWkyO%wMN(|XdTQtgHW2hghQ9rw(sD@W%TdfQO ztjbPcN^q@}SFm`9ZWq9Hk3?W2F^X76>BH}fO}_d8nZ;WvvI(xTBN3m5QwhE+5)*pS zT08nT#?TT76;Wt8gaQ;=0ijk3t;RRUqPi8lZf&+x*V46vVh~$`bxx&jcHJPlPrvS8 zU{|{fCvZLM?#8Z6#$SgY>rYuXTKclCS43nF{7fGSb9*>_T>78_6XQ7w?--7Ht=J{l zZhgTfA_lqgqqV6#(XpZ$Mkd9{cr#p!spYK@nna;C2whL14hY>qq0Qq_bvje_jaYV? znPq=FTXqx?Iv}U+eie3LLD(B~zkVO3nwY2o!Um+vuYdOr{c7C@f5I{NkgUBQ& z-lJheD)!xEeB4d?_1$D-+`WgcXpXdub@k9lJwUIqjXLtZVlg6tV|!^OlHfih!8rTB zd{#>m#!n#Y6$yS9fzRGX&(<78uFrvJGB&JI+u+Gj$Ltwq zvq-++drINPmiLC)awOFX+$nCXgYPZX-(Dg3ao|-kE%jf6mZxM)EKEAG7N(zWK?~DF zH<=(`W_$X3GiBflDZio=-~tI=T`6{(HW;(N36y$Cv4?e?EWQ#dW=t3|dSa_g+X>fe zbT(BYOhD9eK6*qgi0A{rfDEw^XoasP|FA9#^-QLp0S_E zF*ic^1y{fT{qkQav*xKLz7_AX2~OUhMAx}l{Hh=QV~(VKW~dW+r%RZ{qm9gL2X}1r zzoXdrHK`o$i2yvpCdjwfvlHmC9T(CF<-_^|DeTed~?zBBLv-FxhUN2aGj5q;+8S@!tQ?Ng@QHsntt zweE$oHLPz(->p3%0gIV<{u$WWE|iS~Co7{+h-vsSGElkdXxS3OEpb>s1sq`i(_|bb zyWV)^TG$}|6{X-mQHNn3c&pTUjpG+IwAYA>>_&7A^}0yrtQL(=7$qr-UX?5YbSh%J zj4?@#ULD%7Fjj!09=P;rvvBe=4L6Evk;rGVsn1dcSZ^-2t!e<@oNRvOoUs1%PUxQh zrk(Njji+~HcE+#~4YS~K?+IGE{0AaYR#)hJ;*VC;szb#F)XaHeG~Ld?HL|zL+4g;5 zQ4uGNK&!H(%Gv%ZOs0BYU6Zq|b~tJ)tmcGyfSBX6FoKLDVLIlct)wSa0F26erpfWm zn4Zmj&G4-5aQ{e5X=#SioV$~ZjGlS2S9kfA0&|BJSIYH>6fg~TAyHwCe>sOXZ26Fy zbFpT-kg+-2|7{o!M`WuA&V*#QT1!)oT7~cx({X=+hGI|u88#i10dYqn`ZcF<**OIR zt33sS(ar<5*cd!)uJN7-heb}@)`VfBO0XQ--ID5zB=gCl|9Kc@+Rb>@^fR1*&bHEF zR~U0oy3Ck+JaD^TV$J>3GMKezk&%$d+&T4oLv1$HCON0ymrtFKR@MhT&PWt_a2=~G zQcHOpB~-j~9c^kGa(FNAL;)A@CWN_xaw~`r@ZQukPSUKfzCg#Vd!vmfQ+Z*%67G2S z>S8g)@G0Fpm?0nb_r-7vYc%d#_0xYc4AwSM+Q2#6H3I)R9Wu9i$9V9ZKj?0@^I+N^^t5~Mr<`nm9#U$vH($-eWzE`)3QQ2(Q(zJL zS|@Bc#ea#aOudsvp%P)+3M)Tlg)lU*c({cD53lt=u(R zxoP%nW$bKa#B6mQC;3Y%kdd`a@BNdDkrXC%J11kwBmLF`uwf-pNO@{pCenMNq_;d} z*LsGhtXj``A)OHw^3JDd{PM%iIs8cb(H1<#$@BNZU2ppdkyBZ&b-zHe)~NTOKk58o zZ%OiL@7|KVvhC@`7d}fkelvh3*KS{X&-y7B{^P>?{35GfjVA-9q?q81F7ye2qfj(s zIf-IoYs>06>amEvtzYm7B*c+uWY}?J)aKIn@DWs&vwb#w#->RJNKbj6pq$?pKLPPG zO#D1U25PrK9~a=Z>`P2CpX8=VCVk8Pf3jpY!dN+uAF|*!4_th6T`%!9JpY97>c;ZgJ>)e{U1L zx5)|&!vQ=M6_`J^VtzC;HtrmX&zWuIAw(U^U~#q|f=7NqkDU8L6_Ym&=~|n!o!oB^ zWk7ImaWj_CL?xuZP{Lmrm2jDHvlYI-b!ZX&Gs(v@PVpF82=;f7x^A#ZOUIP)T6&GM z9X0e}-sj@@^&a$joLhRCy+6lFQ{H>oZ6+83fSKL{3ImuH@9{LJ;3Gw9ce9T6(b{ZXDusHI+2y)zq zi{CUMZ$(z`jsY|r79c`YOn>nJvRg=*z8n;fS1;$mLOeFPHG;<`D>7DL8&7)%g=evx z$50B2$EEsz{F4nIK7nA#G`(~NuUGsOWdJc2P^2p z3fO<+G0S0i|1gU`b3F;b;lbxbD2K&&P$(m`c>$k!tSN^?(q3NaL5QZWqxfJ7kTZ2z zqFuj4DmnN=0+-M$Hc9&>I_%DE2&76yL3-?QlHFY8+)WjXL?LbJD`w(%HA);kn20+> z49Z1`_)hr6_x)uLGO#F?0#e$E2cAwdnGF=mB#d`j&>xN)M?*EYewogf@JQi0U+l z1F%#5AERP&9A#R>@jrdmH08lV)jOzOTzk}8|K5gqz9z)(m{YmkN1JBV_xEx3bi4Ib#JZ#fB36SgXeJ{CSJ#x!a=$LRB^On4|l+hC?;L12maqd16;X5%lv0#kB zC@+5sOX=-*CFYJYSO*rALAkSYLZV|cR%daS4T8gK6C!$7at5KRDJ6nmw0{#)7~r?b3$I>h7n2FAK#qu_O%({UUF zzF^w9`DdhikoI@tSa3f1zlfUQi11YpI5(r8wlMG7L9VX`oKK>i2YUbEWBrGlANFs> zhaOwYXW4+Ii~09Gwn9{-?IC3!-hm8FFG{w9(BIa z!}58&l;URDE_{L!vuvWEC^fkUnru95LvWop@l<#5Qo=mLp64@YJsOVebuO+)_`&Tp z`U95)LLzYjwhSkb=_0hzq;uGCG|`S&*U(japyYa9=koS!+80Bcwh0!4Fq9}gqEEbp z62VRT-atd}=!Bfh5=X#KRP3*1w{{Yi)6GO9Htm~WyDZ~JpOeHA!2$PN3(Xp(j*$yC z{=p8J!r4r}L=oj;!p2%qEf6uph#;j4#33zKN8ov8lcOKWStOY!{0-b}k$7csy{~Ds z^ND@*dh#&+t)Budmxsl2ErjBa4Om+2++998VGAUdXk*ad7@8s*_3TlbQBa1=mz6zg z$C8Y|X#CM62mJ&b4w7}TmQ$?d3~M>fy2+_(#r2kKBQD+qji^IaOFyv48@`r8AIN-; z-MQPbv4+oq>0a-fHY4i%?%s`iaURW&=pzwN3XOQ}erxlQi0+30k}O9^T**`@%y{ns z3U(N{$|z6sjW|AFhTjepjSxPM@m3sY58K&yaDb)q*w66SpI!=4ua=6ajrh9^OPndq zlx9ftrE+O5{D$dVre+}?Qh)4QQ<#MMX!6(bN}K;zN(4s8Npb4%6=S`FttpJ{EPFs^ zYi#UARIJh;eby$WY-}~Uz!`_qAz<|s!YqcTa}fjes~h)|yfQBnaT|PNsAg&1B7y#P z+J%U28wz2YidM1-($F#|u?a67K)+1YXciqZ^mqi4hg)FxGd1mOt3mwTD8EZf2C{ZloLs9;AwxQ{5aOQ= zg5P+ppLn4>2Y1I|m+Ah^3kc$2pP_wfYd)J=Mo!PJ)~5YtCq$1{?oHa_FeIf^WkN(5 zce0iNAuBZQbnbc+MT2z5tL>X~o;1pOKeV&z!AOL)*wr)Q0M1fJJfNi!&Zqft-e}{G z+GUBUcGlt$NA=N2hy`6n!D^Ry+L>|d$(1V77`6nn%xmf?3N4xQ%W zvJm9);0JsKc?8(~6>N5qMn^^QM8$y#I3nQA1&MrI2ND}ZkeCtmHswb`7P#Oixr9HD(e9DH#*B=3)4~@C5;kPZ8o> zf;)L|Poiq7JRvtgXF5=^UUrXREP_mXAfKLyBb3Sxs>V=X!QXcc^#v-^P+3Q(u3FlE z-}kdQMi`Vq|F0cTHpLX0&+x1C(jO4??l688tRxGc#)l4x^+8fr5;Q6b9Je4MD@h)E zLUJr-wFxJKD}Ml!s2dZ|`B5CtpHg`|zIrfciJ8+sm{Yxq79V<#w=QK{ncM$HTD&{2 zEc71r?^SM-a~Ju0m78%K7R*P5Zd4cDiki>!VQpgb3bUe=*NLk`{MA8xryVA~)1NB` z@tuA&l_;8eO{^Gc&qIWh_bf)LdD;P_L&nJ;O%r*>#3o~&YLN#cRV%s>IeF+uflQ7H z%uyn81cu~*vHqh9k!ftK7Bl6EOc<%!5bLMTI7v|Zu|1gl>MX-Br^P9+;XTiO`5q8D z-}FHG8?v+gNfc;KZ#oP+V`uy0$OczIIsPORuHe)Ea?voJHKR~8dreffClUt`+Eunh zWB6dq1-zLOIc>e!Iw) z9|6h)?}z?+^#a@!oUi2jdG#s%kr{@ePk}ME&ubVz$HJrfiO+E)qvQIiP`5H7_U7HV z#IAz^d{gj~D!K4{YPv{Qhv|P2W*1kJ)4D0xPFCULL z?XwIZ&~L^0)thwxHD?>1OHKMUop*&1fG1~JNm41DbcS}wFdg$=m9dWjk$U{YlD)cQt2Pzk^SMlUvORroI26kweVd-2zGFQBoR8GeEA11Dp zraeBZP5|oQqYTc?KPN;*Mt8uilDm@_4C>S^Q~}E0eO;9G$xR|_mzfpME%b*kl1_k4 z953N^%Lt;Pdf;hnLRcanM4;pciUgdF*VJ;k%W_Q zO7ERXj3dr6Dx$=vo>Xq~si)N8V$Se1?04WDKZxk}K$9>fKPm{)zCjeVtDhisvoV(= zsr3&CB(=K!k6IA-yt$aBnu2y0_C)1WLeCEA&pdX?NafaR^;0F`OLG);(Fp8n(|;JP zJF+WQMejcYwR~yceNqs2btE#V`a1%#)e4K4NyEKBn0^!zH2vyWDL%amKH0M(O0gpw za`?(V`PUhuPt27=y$v-cPr>p{e!esP(uc}uhI$gH8;l!B$Pb&{0_}`pO}GB7cHaDj zc1E$C3o`9ofKOkA?G#Z;si96a)X9cgW~dOJXsE^HWc~{- z5ApYzsw9JMp#tq8^0n`CaSo3SipuqiWVh@>Cn>UnsfEd4(Mrg)KUi$rADjTcH^JY{ zsD|7!@%iT?@ZQyvBTOyZADjvqe31Bc`14DNmT8b|G{UBysTIj!)iw2>^hA`8K+TJU5k3WwTWPDNVbUg*886{UwSQ)`SQs?a>mHlMYJAk zXvj;>zjVb*&LB>iJ?chuZL&}MG6~xMZJgNC!J-2@IMj*d?+f;it1kZqXWRRPVDlJ$ zrgBFzxTB0l_6uTw@6_*lKxQqk2tRGCrAN(j2*V1|Xwy@jREJ4%&~p!bUxDr~BpTEU6QK*_ zJNa2*$u8~Wg8~z&mhN(uF`$M0cYDd3rhN3${0Qmc0-}ih4*U=FYHAJ1T#c|9k^+> zQLs?h%sgGPS6g{bLhPY53KTyr8F3_?D75n&D;LBHs;Xm2Pwgu*Y1K%(?5vR>IazM>@ zPZIKx@P*$;Gw}s42tjP6(Mew6-q!VtL_DU@dCGuTK7DmA#c6VAf?Z3YV8UeY1dTSm zr<$Jw&(_YObiGiWfMSRwQSgqd$>7I>fBGDpGJXEvt9QTxb`S6`A`foHv%QEc8rhd! z9fkkk^)h^?_e8n5BbPeF-T<0z{S%b9&(uSIAHBQQ{I;-IfALwHv}h4>0E2PAcrFu1 zo?2#1^!7yAjA?8}fX%4jpCXgHjW$Xry9qHoW2Io*(S== z5i`cF3^N|G)#z7EvShGVh1)Y<n7g@nd^bs_C)ngn9Wsa8F7CTGC(juL%gym31gb5%?C#xeh_HL$z<@9 zjn07WCSeNdtmU-MTZC7|Ga0Xn=a9^>mUJ>WPzc59z3m8^TLcZ_fnr!kLg;5I9E~Cg zsfbO5EU^`Ek!^Z@Bhisco9d9Qc!+=DabT-QiE)H}A#o6~rS@e*E%!ahtH3L5#4`|I zWhrNP2%--2%_}n<21ZIxRF<|M4M$t@`f}R>rjYqWa3FL4e%%1CENkz1KerX`favtS z)u#^hefWNz{X}J1_NjwFWljXsnfnt#M-5~=+xLg}>l`P7uD(O~(7yNUTqlBVN`SEY zw|(N@`$7BrFoeGftbjiM8JqMzJPi@NPcOu%yD7?rQHa5C4i-PXgyP(kEvHS zq$tgaR#TB#DFjNleH6L>vzc=DaCX)#W8?7o)F>bQs>8zJ4Cjx;AQBa4anzo4Nu^^t zYIv-7(DP>?7u(>-&SpDlJ={|iaqd3TtGn6{D&8o6m5#+Oh!OE{E^8=FS=qNs{k_ZJ zW@Z`O+(SZQqhaVgrct##OvB3UJ?e{0i^94!!G?oZyRi~HI;)) zHp0$~LSZ?o<>B3yQOM~$1AXb17Z_#wVU@P2G5Ba&lgFxBFVyuw8n5nQRRIdT&Z?$S z-~(2*gaUnZ%*3jI1#%lZagU?*OoifK2?Mhhh0%;I;-XQi4^NrA2a%!tZZAKZvU$(L z653Lz)J3zcPSyAp7V;?=M42)QFEQ;H)sorB4P3deE7*o=Jnw%33OrZ{BDl` zfM1Nzykae@a%-Nk9XL@j>Rr6D z%E>?!SmjjHFC2L)VI57RgUjr!%En-cft97o#j4z_qXMTu#}2xpHmh&s5}eez&*Bg3 zAZyr;SLjOCl^v*)muyAjN~9pHV>89RNmrUr9f#<8I5&fMepc(=OnR~-6Y-~Vi4)p_ z{;a296-(88Z2|@)Lfb-raPh;!scQ%P5N<-Eo7$JJ-`8pwH|8&6act?*K@S9W^a->M zy3=ly@lnR;j5qF@2qJ_ho}gM;FbxBfFdGXk>+SN@OZ)H6F(q_G%2$Z*!jb7R3fu&& z0bg%e|FuX9>fFvYC$em+$N!15(}r$H3fK4kA&0bI3KYujY(I?xKZ)J*%R2u z*8N)gy7l>TZvO!SFK$1-;Z|Pl_V%<+vq(x_KuhOuIEVX{ekWM}^>ta6zLSVT6oAzL#)P7#Hjs=UHon!Dx)t#6d7?yB6$*K$af!+^u6Ptag z+RdsRyxODfw==bvRS%$cL{aNJYpb@>1JiVaH!-V_1>NXI!JVi~hx8f+?du#UAu@s< zl*$F&4u7zy`GZt`YrXX`V~*o|rM1=B_8r;~!?roC?N9UckL!Q@TxfqFU(%oZ0nnXb zF_-wlLY4!Rhu^-)d+-9nD8m3AVD@?(%(Xa}73+-DNd9(j|Fsv6Xdha%gE{DX3hqZ~ zAG+`fmy`^Un1NM!l#%3#X2jbN9@bcF1dCvdaJ5+5>(F|N7*rN?X!{*T^#Hu8vmL#N z@p6ZS`Uy7ejfLuPJZSZ#ta9Gc#fA!_Y6rQEN7oKTrVdrad*1)HYL|!A_M=zHjlMOr zW98}@pXyR=a(=4c_fVmd>r)F;R-fvDs1d1SI8^y8hp851RdQupZA$g;#(En|!--{u zaz2hO{d_~FYaNx^K8MKB@DbE1f{PU=-`{&O*P8TopeJ<2CXYPCE?g+vB8naH z-Xr#u)ri1W1m@s!0_WoEOG9j;@vi@`>U)XZNR5W*p(J*{et87@Dtn2B^IC^#Fi2E( zL9sniRXBub4d< z!k#pGfU!|s&Ng&!1LMuv_7j|R(^2_EE|UYsasPf+4$)7NQk^>~;b`UM9-Kwx9vmID zZoFORfUE401FWjZI1WWBqfkJ0PFa+Ac{#QzopNGCTB%CBTtyLb-XfHBd5ub6i;F$# zW{oabOB+21kFpSzCt&_8bino@IKUotDOY(9`sTQu?Fjh`WCq{F4O={HfG z-{KD;-ew*DNBW9;OZNNsHr@++{xe9gY=Ok)YjE5p7HEZhhTUK8QE&40BxjHe-OzfcXQHzPHH#GL7(~P&}XExJARe8lh=|El6Vv(&FByo`bK85$8;&Z|KPs zCQCUvyMW%hnuSWa)!(b+L2)9ES>a=(UO6P(FY!hjtn8^q4Q4?Ok9gEkiJ2o|8lAU! zT9sTFLaEwll<$Q#z7QwZK2EdP_ei1am=AsTkjJ2D1${@8j3x=N%T*JVTsChau*Y-k zaN~amZXZI{xzQG4Q$=I_7gR>oDtYWt8++6)JkIrhXhE!`I_MzbnFgH&<^u6b!JZS* zV$KYKXWmFPtB$9yw!EV&xa z%a+*i=mT;DO?R5nZQyLO+0W>qo8`?j$W#_e&5a~09fU&BaCymNM9Jr8I9k=5Z24#8 zoGZ%jztJq8^pGtv8>AxI)J{tM^^L@e2~9O2X;^AQowFR|Y38{01oF^y5~kq8`P!VK z9ER`-1L(j6HTJX~d&t<;iUqwMkjQ<*TR7~>fguc4zztxDI~W>X0O-_9U6y6NsETA@-CbXDH-%9OIpBE70#;JVUd!?jGVH z-3Wh#8T7loHc9&l#o|e2VwN36Z~See(XMMSBHGX{V^0UO3~woSS<3B}ayRLgy0jjg_uN+IJ?ejpl@~p{ zh?kf8_o65zm*JAaLKFEDH2Xt^N+Ev(=e_@;a?AYr^Nq$rnF#4Rk8wOTmcP*^(nbzV zJ8tUB;eOag-h*wIjhmlcPgoKrt{=MVC4Sl_LH$*>l!J%ttY#u!?2olBX+1F$Pr z&qYndx~Yqyg~oAYZ)lc#BCwfGUFRD|8^LV9&se~DdPp?sc5k)XHd`GrCmZK8Rz4ugh4u&_u9_)7V&(R zI72!zX}H2hjdU7cM3n%|?>YH}Hfd9E1m{FQcJ+Lz3mr#|>9ZQW=tQD=X`yhT zgRXnD*N_30x~uZgS}F_0!8GEFDY4y99>tx(+l>nUIhK?4nIQCwDHBWwPTdQG1zC>1 zjUVEG(Owgi;p<#O8l*K90$22N`~Z=tJRH_`nd~R#Y>gh1#RxV3LVD!@E#-m>u~SA@ZEBoYvTgFP)L(`&79oAifZ!>e$FEvTGNh_q)65?+Dt$2hWYk<3T@YirfyzGf}pd4?^^@f2OxhDw>2PG&dk?(BI z6&6{Yt+~QhtFsLQ5~F26_SCXCvc9l)VBK>G4lD%M3ZT2m_yQa&6hhG zu-0;d9$P`r#Ng_p^wkjRqR=`B{U?PK2yMk@>ISkhm2GaJt;P2N*A_g@u}Q%X5XGLa z)Oqj&O!JiTRd57=0+&%aMu1I*lb)JRMxD()V1gv^4cAhE_! z`(^>D*tzzS5j(#O&p1z|u8Unb+j@#@AoOB|LZm{^~xCg;O z+Tv3Y?!=z39RQ}vjxc9+14co!kQcQ*OBU01yOYooox3}+3_iUHk`ry6RDz3d?!+<@ zjw8Nnlv>{+n-Vr8v$}*s`UO(GcRvb;O-*j+ON6YZ?R7g}+Cq((FDf>UqaET{^GUOT z{>_92*H9(rp!x1#zU%z^He73om)Q}CI-{a@lbUbVVrHeDs5huY)`d|S;9&d$1Pv_g z+FXdk54+lp`|)%jqCdXKCM_Le@yCxG>DNBAz}l#NWC1QH(NPQEk&oK{II@lsAGUvE z90S@jg~KH2M253YbmA?y?8s4awUeKtY4L@_h`eg-BJZ;+U&f|ZVX*Iy!eEdr9qsxr z4cY<_7v!Rm^PN-39fu&GQ^3x?bDC^f9Bkv69N`;PoI;{+-S76WjVE)m9#eUh8@MG; zvK5s@=%{7O1HwC`Dcy}rBha+lzb~rT@iaLnj6UF9BZPZ%2mBga?IQ?9Vz`Mp<_w8V zFzdo+3G@-Uo!@&UbDtuU(>xMgC*$YLikF%=mNi*8?@}C>>J(p>2l{ILqy&BV#MUD0 zIXnNl|DA>${tmNSIx%B80tfCb^;71C-xH^eYzQ44@0x}^`IE_FSMU)zmb0U-&Z1AA zuYVp0czrUEGZyt3oyay2gA9yKJ)2<@aXjFHdp08v^6n3eu)vS^=>EV}CBCgFu2b_N zqP6NK3y))4O5zwf9nl3IHdAtZTj?#XmkSq(7pdn{(LXtxcFjy^`ivQV%Fv*rcGo~X z-|Davo`k;>qn+9w!WVVn&=(WTsgbJW7Mf(daIe;T$2Sj_a>v&a(^}b*R~@`!uZ>l_ z>VnCMMTuv5%fMhhTPv^F=)m`?`1IDxvR#qKCGy+`Q;_l?|2JcFy&)Ntdlob}<(#Sg z1aG8zMor&n;Ojddzuh23NI55A`}|f)wumk@*0~3_B5CL)=We@fuL+qStKbe87Ts=Y z5?=k(v$E9SHg;7&290J=k)HerCi>N}ORBkD2;swz7i6~!htTE>=W!hKdp~aLK^rn> z$I~$Ehy=CoRox@@GD;R!U@YED-zUBeeB&!r*+ zjcX&~)_c;LU4={%%i8F3J9l^EomsfE4OPVxFCrP!T41X&BBB>wG;z{k1BE5N9o6d| z#o^z4AKDHeG^RQ(6hnEP47FIpi8vX!>(_=6jzdb_X}0B?J*E8hvI^)N4fxq{MnQl! zzsl8ka2Q?~io#@HK&ygk)2bx{8{lkz6hT+0X0w=3ME@}~$t1a$(WoeP(FgE;oN@-V zPNK{8jMBf@_s+-pCBsPNx6)^C{bB~?w)6A}Th$4^7ZI-0*^VyP7RGGrhmMTc)v%5J z0nH`);9ZF6Il+LkN4ApMiWmm;tzMvS#9JiqQJ%c;3GYNGQGaj47*5N}k$&e(zqa=J z(~UVi30)?hg7pcX@^|93F<%T*7pEWer2tPru)lZ1`Chv+4t5Hv$4{e89WEp4;b-u6 z!0gX_1V-*+(Kz78M^Mv5tCrR+BDyTbGs3WqLpAXez|DkEi}pIjnW(gdB8f^D^!B|q z@CKE3p9f;+Ich?Q%0h_sVQhS&6Y*@6f<$Mj6XEs}aXfg2tg=5?~*&^o;Nelsan&;o!F93|Wx~ z^klq1N8^*wTrbg$Dkzj8H)Q-f;%2^=i5O-Yow4z}vIy?;FvHR!;J1cRMNq-N^EftK zWd3(Xugc>A5j8UNJVhtE-NV16DIQ8H96qE@k;EtA`kClnF#L-4)m|RKJCSRoS*$y@ zWzh%4nQcdA$oX-|-O_gOk=t?D74Z%nr~Z!2;0x*P3-$$_#)wzP^Zt#!5y5RwJ&6!{idMvEX@VsU3f#UhlL zYbj;dutheu$Zn>U+H=vx+jRR#7)-zDe+kVbT#Nj@&h~9Y18e2+^=w`x>l~~+hy0pV zvC7&vP68KwU$Sz!l!mAcD_A5Z+UsnqAKI#9g=Mr$;xFQjY+c0WPIQYK2n}gk(n94t zVq-OC^O82Qh91(yf9)Se2dqwKyA{_FvwOazg=Y8sR{CN?{+~N&5BU-H9-S%bWn1ZM zZKc(bjKx?tX~8b7s%IN2p?;-m@Y6K^4?m6jvQLw!T<$$s&+LJ~jE$e-`q1zf7Mbk* zI4FqX4x6+6PsmW8{3q=|uAq#Gt;BSH9ld?Ct|r3$>2eTj@1m=luBCLHjLbIV-^O#o~=XF-VKl95&u$@c-jDfg+et;+1Z7B!W%i+|ln}Vi>S& zARJo%VX};IBL^542=g>|>Ek=w{*7Yr-E;R)Mr;&YQasriM-Tc z=ZG#o%l1oZ^dDhWb2?vo5sNDM)rG&B_>}h!@YTg`?}1<7A=Hg;eGTs6|DfdUy>YKM zh^zs>H|_s5Swv0t9=P!>?|}%bmh=mLXm3UFWFS40HCWnnv|rh@WT`(+ZGs{jHfGjB zK_YexYKlaliG{lJA$$eYGEwjFEiF~X3J+3Ypw9JG(Rp5(YY`h7n_Q><~Kj|0Ww9j zsk`}S*mm3=0WF^b%fkr7%U7=ohrJ(%gA1{M!|bb^$YWRrKEAk^N=Cg!m$4Ne6up^) zBwu^82ss1ov;(QMTQEWvXWO6g>4nHCJpT~7rore-8Af=A-Pwi^Jv#!296Ckhr&q7Z+OF-a9;%BBG|K`XIh$1SXsmOQg?a{(U|quC%Uj| zRwDFzqY-`i8N-;R?X&s2X}9!8F__qnSB7U;x+|GEQIt5+7gHGDas8?UfxU~#F&T5r z8u0%L*ZFtZ+JPac67aFzY$BiKhL~ZL>Sk+C^I0yGHjKy!Rqk~e^hWRpukIck`VIe_ z+fLe#lk5ca=zKPm*UzY1C%~!sD8Q1l0hU1!Q8phKtE6q0p ztEbwsA$zt}z?H>`E8F3Fk+?Fbt?IJc<_^|2gfDyd3Z6{dQf(Aioo~yAhSXN%k5`G> z)_9aEJ{^^JWxH`agj@f2p)WIL{c`S?MUMQENVdiUQxhV_WW*#}juI6`#ZR`zy{v9A z!tnm!&xWy7d()Be59T6y!cpH=oZ?EzBtJtG)uMcZOLieFJmS0etU$jL%W+g~@MQK4 zj2=dP{DtRObz1)#VY;rW!ENTjtX8KxYy!wc5!2IqA`wUVNV(A4Kf_wiv6eLATx_+C zz^#~C6eUeKlBS4B%{!4iv5mj8kic!wn^pgZ@K%TVzj_v~OQdRPmGq$0Agz@e;jdm& zq$Sb<(&+vcX>Z>zt(JYRhTa@6yAwT;@v4DNjJlCY#TAL9I?*1PE*8zZ^ zjQu58@J;^oIU)J>CzTu47Xhp0?_EC<_*K;{Y|v7p2N^7cgeN=xU6V=fKpR#4)qg`S zV?)IouA7k~jwCCmP9)b;m6dkl$u@-8h6VaeFNtRxGTad`X10lh0hQs?T$Uj>qwQbD zw0X=>v!yT_D!P)fg3!bveAH7B{c%4I(!6LiI4)vHlk~Xvpm1m>*3KD>;DB2@5UZ*vQTYHrQqNq0z|4&o1-EAG!cWKMP1gVE z<{WcG*Rze}0Nw0;^hJVfPnl}d=9L*j_E7Khyn)7>>fNDmI9Aw-IC=m40E)hwCuO7) zZo6SDN>ttIe}|FFlE$lJ!(o3PO|(^t3_F6C28(mHe~-GFDxGbQeJ-I^s-8F7M%aB= z!1{-(GC`%7({H`@Iu*7=8JSH}Po?q<3YmG>cFH5}VoRY7s8_G%BTq+|H$h^{weB9t?D*jKbc#(2leNw#966tSOtM$12$%f0ztJkJ3QRc|j z5JIn@$HF>0P#^u9DmkSy@CZ@%_?99fCpV&`=VAsr@lXa$Fp_wsqqS(rfeS)fX*a(hH#JqToNz8!Q;B{Oh4|Sna+gt%K_tbIq)P-v{Ad zh1k`!rVh1^`k&?()>P*Dh=YndWxGB(4lCo`e3l&uF2>!R2<{BAZfqle%pP0Qf~Sqw zmXp=vG~S8vEZE0_CzHVs?2kMsXKbiu+gb2*#))T|45q5}WN@Gh3ecYl*`#I3IF4vK zccC+{|7rV8k1jMVlp-F-rWot&v85ZJhIba)5Sh9N4-j>wUHEhPAJ>4|w+{XUy?nqP z4SCN;%>QCNP)kI=b2`xR{bV@a_9PAf1Av#SO|#dmQdZr+deyhlFdXj7*RENEuCFm1T)$HI zyoPYas>TO1NqE0tWy7~tt+`)WDP``PlzUYr8=kRdMQCj!#ZcV6_4SPpHVod+TK&kn z7~Vp7<|^e|_pi&;bN}kK-w@%@HI!)S7 z{4CFlz5W=m%Ih4)aeft>;ev=mLnGV}(Kj^00}-c&MifHCxuFq75MgT_5>X5huAvbV zA)w5rLr*lOba6(1@uJQ9CqZ8bquZ8WDhqrlAoP{0{VO?Nai5l|_mr zune*Gd=~U0&W8cTXg{c2#cSN{N0ofzYsN!W#?gJ;0wl%_Tq&fDq+x@9>#B?+WdCU) zk2+O_keW-e`?7IGL*gDJKUSz25`&pBR0BjO8 zv+XYgsiKDoSBT{~+Ys3?c77ww)X&3Y5{Y)q#45q7I?$Jqz}DHo^Y}P)!IKQ?tdNkb6qc+fe1kvm7 zfIu~3l-vcM@1l3Pn$NSBT*WILB`|EN-(Iwr~fTyJBkC* z*ghE~eL}u4&FAA(b;*R)auoTVATSedvX`p~3n*MPm^*`rLB<^dF_WxZ)1=`AtdE`S zT~(2&5qjTU)IshB$b}dY8W7Zm}CIL+Q{>iRx1|vL~cp z^dpFer=b8ov%p1wuSy2QI2@_GD3nD-$(f>tnMF;$tf-eRD=PGNi&~v2s{1Zc)YQw0 zT5(xX%daTP*oE&9*5A7>N0P@bV&vh=+mmRKaToq z$t#z#1_eTv%zuWl-W-(zaZr22jyUBrkj@X6bL50q7eHp_gt_O+F6kC2eD(2yN*Qc(fs!^ci~T&}APQ83KWXS$lv5 zKaeeA#shU(M+WfkMuC*jHBDD&0H3a)F{sC~xq!TZy64?#YCH4!VI zojSh6aY{ag$>Q!bPa}yt2IGw$OJnd9<#r(cEqbgzg@Cdri3&B1BAicX-Dwgsp{X%Z z*DwKys2@Pd7(9bzdnhBqi4JCALC;{W^cA`6u;_{SY?gDzapxOBxAP6y=wTtD8u}KQ zWcVhr{Zhx3PYsPeHyAwt(Q)a|S2orm>c}?IA(BE6=_2BLJezdpvchPoIER?2t%QGi zoK}c5?jw$)UMO}U1yACWA_(JvAcc>a-Jbs6;5FBae@Xy=Lrcwle_&MAmH*7VVe&`@ z-UA1X8Z}6CV}lhORN_Dlgh>K2Fd-y^^3xWkaf(XA3}7Xg)xdinQn|&O$P7j2-7+O z`!p-C-@2PX>3V3}GO|djLtXRo2iY;KNefOu@Ph7x>ANc*i)mR#dKk32L6L{pbqMo{ zE0~2!e%UyP_Vp0jWQ;&ySeh8rx(~=#=DW0{{uYgkjS=HutorqPpl@s5=lqm7VjrHt zc)oOf_Pvl)kO9wIAgK=le7&tX-WNmXbG+N`d;atp+9z!>F>81@WF+49kAb5daf9mq zEOqfsbgf`SUMAvW%jxwMuEfe&g#)ey=O?}Q4w~`qWZpNKuQn%|!*o=%HkhMXM6R%y?mnBJg_;;w$QMd(ClFQSLcoD z-?drM;VsFHO3K`Stgdv*+}6Mq9?Bu|y6-|umDtUmbL@2ZP7_}(z|%hTUIdPGWnFK0 zICBJ&wr*vHKa(9^xPa{%V43OSCkn@o56C@$Ki$up30}b|DI#KX=rg}ToE|jp{bP6u zbHKd$A!gOB@KMv0N2%8%DwInqEMZBPtBKoafklvAvH&%HIE7WUXdckUmUUQ;)n?sMR3IX8$5ps%j|vqja%T``sS~J5cRf& z?861~=XT8i8VSiDo6s8Uh$326epZ9C>n5yKIg_tUHVW+!*zBk{cnpyc?|&s(?Y?id0zn ztBa8eCm>Sc;sjFRVSIb>zZu3WJSsfwzlS571s{So{?2fOhyL|KI6}mLOrHeb{P63` zQ2hQcFQzybDK1Y?+=mqZW(!cvqryY~8**QPufY2MoypDq*GrHf$0N0wm!tN&Uw$ip zmnNvq!nf^6?b7eW-;-bcef(Yd+C}_D+o?*Y6|Z)#Q!3?a!w&d6Br*&)ZROusIP7~< zp4~E#4ju6fP?pSRB{(V}l3i~rI?8k#o=!E=C$0S*f!)rPYL}ByQ_e1_b|PWo4(C1| z75yry_DlG}t^b8=9}j9zr&rE=GG(sN`RJ&_xBl>e(yRZlf1m z`lCQf7n*epz7A(WlL$hk6lRPVgID(3M-x^_U+kgkt}74#!mo6V3XhvQHGE@r*AYU5aQDXiN!(ik zFz!L1+Je~Ke8YhT_qhGQ4XukW@u5NH)n<2W1X&82L}3Z~<}94V+RgowDG6RQ#-bLD z#yg+tLO6#fY@Z7UPh1A9U^7OCGWF*l2Cfy1W<^DaSz0um&;gxzFO4v0a|i})9>Jh3 zLKw6n!a+k|v@AxBL9S46>UHXWIs$aV6nyjvj=%ouZ}2%?KhcE9OW9h(s_W3Ee_1x0 zk)fv_$B$;KtDI~`w*E5@c7*c9|A>=$HX2c6>Cb&`80wla$`GW~#__87gPn`$*Nm}* zi+BtIKPgwylk%pQ zsRbE2oXcUNk6l4dsYV>5UFtEvz5oVnAOJzUY^C))@~1NWh4ZKdyu077jQTa9mrWjx z$41j!e!_C#S2ET?i(T$E z4u;qzr>E@8vi7|+M6ZR}&V%&y9;*q(S2Rll7T zi=K}khey>fvZ+qycY5}~;~urh8I#ZgDZt|BLQ^f07y9+WBNj5hGVzpLmheq@@2Ye` zKe<2bm>Rx%Y9v)zm2L?SQ5L0J{Hi}g|Kgb6>U)P-R1(K=o6G zgp;ENy)aIwd-hL14p|~OMspjrEo!1!^rzo|Wo6B1IpVBt&mfbqA-ctUS*#ke0?RN* zAx7nKBP%FQ`;>}HsiOEQV;hy4myYIodJ~jdH6((YQ?u{zj*|}45G=P7w5VzkQI1nyywy+;9;$~pzE5X3&9fUL580@ny)q|p!KjFGNC3^n#C z1?H*j2nEKe>=*^6sEl+gU?8&N0@ovA-4vLhvK|cNjaQYpKpFsF;gWam)axuCyUH?Z z+r=pB4ms{)=Soh!s(*b7g>h2MoK2dLY*@KqPWjafG^cE%pYCS*>1m^%csu>{?Smh6 zdAdG*3v|&Y?5UhLwgn64nrFh|Vjd-PyYO^`(-~LS3Y6g9sP01~P!R?6H5*WyP@`FG zB7NpntTI#R@Q3mUX^a$<+Yuh%nvk{pWB6`K$YwMlC-u8wvFfU&#XY00*EFFFk6?RA zIe^8JP(M&2WB4uBWXHdlEDT8Y#bF^I%)A-QmkFOL#x=boAE_Cz=_3y5@4cR=Yi4ew z4*_gMexRfiV1^|zHfV@iU|7JuE`s~If{ePhl0am5uh-Qk)&9WBjr~TV)xFmxO10>X z7<)XMFGsG!EuhlTt$+B1#qzyf4TUMejzYU^X)knGV@@1Dl`f^NNA=3pYgSog*ty;T zi@y?=!?zeK#%Scguh>`-_G_eR4L_*d=GQ%+2;9UFuN;D_=zGSB)saz%`XMzJrU<)8 z>jtW;)#LQxSLciR+%L!nbUn6_AH6-a*`dS_@hDqDIbWuwDfu-ZLI04Hz+ z1r^2w;EdANN6Ge>1D+uMB3Ss6#B?%s6B;VPoRK-8MPTlCQk!sWg4`JyB>|}xy?y?D zZ0tG2*@%Lp1RD`z0a`9sD~zjNXHf}iHhE=z$mgiPBSRZnfzeWP8!*gda=>J@H`4$jY?IkRD*HFkxvOJKW{uZ5^CI;$EAtqlupjnGez*ixen zDaqDz<~5`MpMj`moQm`hH<(Q3`Yy#d((zi5cOltmqNXVO1&KSapgzV6B7id1p;Bce^sf!<4Rt5l>a6d@hnvRq5)E zeGkGfM{a@err7o4OXUdsam8HYy>i$ANk(Moc&`hCFn{7<|6+8tfW|se^azK(Gr?Eg zZJS{8w!RI;!Rz0{_;=oizpn>h{}odx7TBe{XX6003K||L@$|?Q?zYBP_P|4+hRi7QGx9P9!38$SZdzwKFAKY>9%N0P(Bl+=2O^{ zj-;eTVaMR!-RK+Q{y1$P%q~%VNc1z&9fda_*&R*WrgXd<p=pJ=8?R0FSQVDzIk;*$yk*hGL)EseDe@Ohf5yDqO z7`3787?zs7BjDwf|g84k_mP@-}I)T7W_6ZSa2Lj*c1lFuh5crYb zBygvHAb~hjw|EgAfjzw`)k3-(h}meb2_o>=io5Wl1kS7x*gCl?g6#QiNW@!Pu&KOG zX~)T+nz1sdKD~|j=C|jTIxF@<*+FFy-Yd*EtwxHA$qjX%h0ob6{-A+UF>U5(ZCoCl z2k3O{%W!qf0rTSh1OBLwBdnl>QkFJwgIi2$T!sd+{)i`+`QFns0M)XtrNJ zbPXya%$Di`Ho}BZ-l8?JEOH-vnwIXJIbP_MYX)1rnYY05SSqt>TpA%ZFV~yCT2Q^| z>}gs&BN>?41(^q_rLLTAX!e|HTtKxcV+@E*wR*F1y5V388NF{xTfN%^@4F??*09cx zky;9evW0eO>n^432Ia^RX=|YvjSC*{XldIEd%}%~f~L$7OU1iF8^upefK6Y#y|FyrUInwN2Vb*rMeYdVx zg<97tsK7VFP<=q%UKR)9Dxs=bD|~hNI%0`;W#U&n|>PP-#aW&Mrrz7ea{LrPk9aSICbIH<~fk zw5lhgUb^k%+IHj|2NA_S{K@XoO8cEZ=^d@PtgLYYOszt<=2W9cZ2|TJHbt^~Y6x^D zLxL{1JWaD#sTpfw*v1^{3*#~2g)FpQtid;#Lt8D1ET#I-Xh5sp00q22hLrOpJG+xT zgW-j$Yb+w~4)DAEleW=9XBqo77Nk9$hXvWHKgS|G?F+(bOdW$!&L}L1VnX*FB{}{( z;mw~M7+u0LQW2F-h~{oXlEOdIoXwhxv1xWs1Aa5W?ha>a<5YD*lcyCU!h^MOJJjh- zaMDv7i1LWc8t`2;l~E4$XXd*q6}b@Ju&ZiV!8f+y8(0Ttf*PO$r!a(pC1yQ^6ql*I zMEZbx_jasM-8QUbKyAQUuDDKn)T-Xib8EBrh-@!w#q?3^_kD6j4wru9(Su zP7X{Xyw7r##aB5k^drL$dyez?Dtj`VaW^lBT|Mf&;T6@@SBTJym7OkL{fc)N@+Kfp zEbd-d>b?&R8;Bn1hyKC~WZ0xQwMXy#i7~paO|@UOFf10&(o>-x1zbJSMA9NNgqQHp zW_Dh88+$*mga_wMniN#d-W~ZmsJvUK(^1cwr@cwRAaexq93PxG&l0&csN9UO zDth)166mH60Q(B3DNm9O3r@?y4#zx8K>^;eNB+GZx{9x04ySHW72vK!P~=dzn$AtLZl7I7JOn)muQC$X~N zJYymMQx96gmWM14Se9A*q{qJ;Vi3=+-^y^hOsh;Cj(Kly zAjM6UL#Q~^4fq><4gaRHhU1VUdeo(^Yd{;EhVI1U6Zlv~7De=8^oUEXe@aY%`e+<+ zCs$lGni73E2gQNBYl{14@NWq&1RRxC(g7uhEPz^O$w*iAveI2P(i~heF z#w`(aXkBGss1H{C#S|AW(dxG$63sdU6bi77L{FtC#My)!)K$k55q%WFu8w|j1D|%% z&Z)VqGS1T}(eU=D`GJ~bvC!Mr{b5Sr)Hw=rgQ%j5gE-?ap6ZqH*#k7 z8i&6R;+99Gy-JWROAV@#lTu5sw6$q5p)QnmODzXfpDt}Z$%^aMM6VkYkap7tqD3aYBUYU>+mdH4ipo+paG#oEs*C8w(scXCFk_NT^aJRGw z#aESmE~&1JFzb7=QYKiXx~YWE>4oj3?<@9mz9PcvyffF^Ev-cjO|}!ZI5It6M=xeD z-!V^-Q>q(E#Oj_RS*o*CR3%0XrksTIvZ+vc|y^GDAGzr330d5M-8PLyXKGb<=MyfthTYvRy1aQ{`47kxb-|vuZJsa?67i9UMYm+xg}a*pTA6%^tZU-$1R*3 z1jbWe6xUc2hUsXjsXi-KS(D40;uY;mhpbeJ+0qjcn0uhVTjxe*Cu+KkYPx0$VcdE; zRwGnaJ>J^{w0acx`^)sF`8P*$^Wvb|`kFOiYaC?j-lM}z!)DZs1E%u3)nX3JtnhE3 zp=v4WU6rXzvz*9P+Zq&zF-DcR1Dh;BCKS-`tAB&)5FeMK4s1wV7zn6JI-1{)Kwa5# z%UH^!;Dwg)arsg^f6PjwN0g%AV+K7khQFTQt4d}XDo}okZ2g^7`w>p-Rx|;+}E-6@HM%wBiq8mb6>~z!>JupvN(YAa;ET>pndpeYyn1G z=a3p7t5huaSi9`aY@zE|@`xIakN~4 zkhT2o7T9qFTM|1C_aD`HS(&=!3+NcSxn;3eMUM>jmxnOtGs&F#r=MFbp~VXWoC6h42tq9MEJcP_T9r70UgjWXRt~+l=$rxDHD63 zbyhgk?fAMUCaptbu@c@@;A}M|%XGitPa67=EGqm+iP2oe-A9sAt0}D_y;dSc%g94V zM9IB1nn`X)L09E%ZrXRmY%u&|YsP3a zYcNs$<=fcDU=7)T6$`3QqgPyp^NC2$4JfdSWhV1KZ{}B@H#4fwVGig-@f=<6PUA4PTqj^5e<(;un;t?2>(vBicr~B_9y4 zZS1@xhKAihYHr2Bqiu8!$oYRLXGYq^?`B>SlXXdqd{H?ZmZq+4{#=uD(^He2gRS$x zhnELFyg2Y-)4+$#10PxkKD;~dp>5#9djlV~419QVz(aE*Btng^fw}qr`52TRPEpjdMwyE``x!~QV){|0$_f54PU!g^^ z%PkuQ_Y~qs3?pONIPM59(U;BpErM0#DJH5;r@?is2;+Emmfh2ceec?~o1T00+@e9{ z_4b!m6;b`G&*K4zR7~kuzK2!giMy`tQJ3e}nf#pwd}kHB6T9Lj5@&QnWGzOnhDbU= zOD%8&M?s+yAM`jDHmLP!NaJ!yl))BBwKZg&u(&8(P!!HC3a7Td2|4JZ2r}SxqNn=P zRQljdEc@5^!B8^kFi$GMq<_PtnaQMmJSl)lzr>_*$)t~X(p*e>6_c(`CVjw@7Gl!B zKvF^uLez#Q6otQE6wWLP4=*B<^gB=uvFbPqoWDoGZVcW)K^=qSW~1sD1_x8{2n6RR z?S#`=(dfF};b8{Hq~`y~k~m>UB$tp2f*aUO(esJ)DebexsH315cB+# zif5H@r6Py8RkvmwHu#p*G4EEO`Th-6$St6nGkh-$$E_(@d@@}wPw zc4>zs?O5o@iRP(rxZ6=^%Q;+@uj`u-eImCYD|{=Pk?xrxM{Y7!jMK`-&*G}kem`bK zt0D-b_>0T*dAec5{=sNQ3qWngc(ipY@n4jU%t{uKiBGzxK#q{YsEglVV@BT2A3(W2ITRDc#8y^?YRkTtLoz}yJ=vgyn6hcVbFDj@(xXgcs}9|JObJThqQJsHgywC zB|9|3s9s~o#tKUvb@=9@LASirg{BXl)6&|T5q$7`wSlTbQcb$eyk;p7gB^7}_!$8L zy%?~nb=~N5=(lI_?>o1o(d~O`qu<&nHk67DWk#dl)-dCIL#fU^W-eawDFmQycsjzv;Sd5` z)U-IH7KiKsW1qR_g*2@x8@IBnvfsiIPQB_jav#eIk7N0=r-R)w2VHy08pAxr<=kHg zoIvt3;MGf_HDVpwabxS>fy)x7h!-}oiVB17@Y`<6_pz}Y1|<|`x~l1q&cJBbCDAU3 zR{ChBM;z$>lqTA#!8@6kypw4h(&(a!uyG`hLO8w2Yht2Lb+`?!33YaIf3P||P@;c& z%rFW)KUmWfOXZ!X+?)Lp^Yt-$Kuf7-;l!GpOXg7rWu+PXE{%M&CzK#us06V|^|q?8 zTzcQcdudX8Krc8-zdi&ziH;rdz<<8_iz+f2C_*XDc|oeZhc0KrS1RYN;bF>oTiDs* zZ5`i{{Zf|?S8MN!Vc+ImySw`68?eS!M`ytztNL1{1_JMAxYc~HjSx}k{Hukn z_RtumV_fnW3}@`2>6Wf)%jF7so(jrL78LB5G!$LwU=zxbOtzlR)xv$KF->80n#?~2 zpNU<^UsWE+v?M~ZC6S!X2@GW-SxJgwzHcW)zNAJOi5kh(9ocpSs(m#nI2bCL2W690 z(3d;B+vu46Q?vYLDt}s{e6;Xj47d7lpwy;R+heyic=t5g8oZs2ldTQj_QuH&ey?$| z(BR$KIN9FdZEKu7sKL9vak8Vq`z{(&hGeaYL?W<=b>WRo5qOQTythDV=v=6$qwTPV=q$pBOARr;@j0m(6d`B4)CVmo;UiXxiYtL z#kJ>^7j2dcm6gf@?cQ#q-FpK5orHfqmUizq@UIvCorZsL_;&{Wowe+UlgVp?IYRT9 zw|k(H&PB>Oq+SCLX?tM|y1gezK}Tx#oq%zOx;fFb?wA(`p$E!gzHSAh_g5CL~IaVjakZw7ii;bR_c|PNzDvql%^ML{~wc#COB#n z5(|61<>~HT?VU~VP@vvr+T;v@*p3vejP}lEY=20|BTM_TGD;$Avx(?j+c?DC8=_k{ z@tWS${!vyW_Ehuvvfszj8O%tV2U-1XD-RkiNiq$64XKNy5ws$_F zztr=RFPD{-v@5tSSlVgAf}cH9$ZyX;ov=bv&^LBxI`5oC2$85Zp?ZVv`6qG?reE81 z-WYJ}Wx|yNtxfcs`W2E1<4>uH2Eje#Xx*EZN<@)dFa-?BSYQN)=_Pn8^DNZ8! zEO~2d^f}w}hFdB63LcGTiiV;q$^FPxm{PUqs=x9df#)FCZgZ~TpM!QA=#Zl?Btj)3 zqUnue?EzSbQLiYuBkXt6BBO#!-DYxcXjcD9^R;n%dDYpaRloA@s(OCIoHSnb@6(S& zr6`MJ3)NxxW$SQde;s!1haCn{i#h<8*291KdMy3$f4v@K{>Sw=w-4*#zid60UA`Wh ze*eE-kFo#bdbp_`%Py`5Y<2Luq&Lrw*NkMg6$sy}Y)24u%ZkZ(%PNmI-cY%JR1zoU|>1Cf0tYuEp zfmB}PhLELv%)2NArt?iFF1{SJ*s4GJ1`x28bVs(E>O1HjU2}CxThBmK#cp8@lv*nD z44P{{kb5B&oOePiN;HEkA3BB&ep0KZrBnsg$u_CwUO4gQr_v=RRfSEnyQ3uSaYs?r zV6wfjcu>{ZLE+o0&f4IR%i-&xcI;lKr*p;N4sYMxjoB~79zgxB3*7$2X0Q!BbE%Vy zk9Jb_D>3`+Qp;4qeIUq6Qmc<5Cuh-v2tSP*aQU1C$N1&W0B}}6cB7T{3g)$3Vn5+R zopC(BYA%Q8WPo(KR#>^OW+m>BYS2r48Ps3aI!z-`N+2!%ZD_kXLL|ukC(31P+KEsG*w{`*x zVk28$z@KYc*W=F>t&RBOZ2ckr3~DWfpTrF;+4Y@Cg^%vSk50so-Z)U{wzgpn*Sd8= z9&6;#qCp1qio{tETGmwsM|{LG)tqBgUpj7$chS~(B5jRbQp0U{+1l)LqKnKWaZ5=+ zyYF_?Ae}Hg`e(Z^U(D$c+UpLez8;kL)FZH43`TPguup21;p9IHB`^9c19<@FIq3!Mfa zeCPnSNw-=c(qkt)qSN1Qr7b0@3ozzT3~{7So#FK4+gBE#!`Mjr%0m3Whn~)gA6Q|O zk&|F=pN(!=OrtEr8$Y#4Y5_`)tCM7@#T&BN#qtB{gjrJNzL6#`|Z)s z?LtJXdNjqNM&jCiqEx>J?@s?yT6-_#%sHnRscL1nR5OtjB|K8|Bu4-Nc69x(oYQ^M z6L(Wuz61F1d`P_S^ck9l670~5QgeM!0zn^^**!a@wW#>1Id`xhXwE0G(5;7rG7(R0 z(vIaebu9d~t3S0%Ez2G1Phmb=E~-C8&Yk5rxXV+Me3Q}Ktp^cxf%thsDjH8o&3P%o zTx8#YaEkm0m1)&8SdEkvMeoCN#oefvMlIp;ZBu?pEy+onA#t_WjqYJnC=Vb`N( z;cP`lXScjwb5Ea>S^}ctb=st@J9*ta1@@J<0U6rrlvMceB>Hg0Td^FN7aOp#ZiGM$ z2B01LR+{bD_iM8q`+fm|gqBQFevFGESH^Cf<|rxC#@Rd{2c+hxwDu5+=9+(&rgS)S zPI^vDHSG}5ct2F;6dc{J75EVz_u%k@dJ8k8x?e$T)tO5UyVw;3LJBZXy6f=N+mIph zK;!*l!#t}s@h})3Z2Uo6ZM8Q}ORGAQp?c-WDv}W{bkH!IVsqkQ$DxI%We6v<$Ihbo zrjwLVghbq5%{W^!j-7)j@CPNmW*Z>o5egz$8q<&)c|h(cS} zA;dgC)3(A19DHUvOy=#jL@_WoRxho>nOwlSUb0<|6?HaJ<}z9Fq{#|k zf*D3uJUNgR^q|c%S&<$IqV9*b+zxZJ)I2@a$v%n396>hk{*0iypbwwy%AbWq#CeRc zB_gON!%BXAkWHTk$um%WU#S%3ieK~Zv`?`LRb5A|{k6UiYrW5!pjDkOniYrBc$d?9 zxoU1SF*iC{J;^wBV|5!ctXR={UQyA?LsU`G#vinKqP=l)+60$Wr&{>@p;csPmCjeS zd@DPp&X3>Xjpx90V#_(K>=M*Sk2=4bMP#Wte7lpKkACfFoHx<8Eh^2jIm1kR0-$PKP; zZDvU@L_~(Lb6v+_vNBmRP$B~?VH_?)b5^l>l*>eq+JGTEoEQY=18;frfpdF1iE>uw z+TCqvh0hbUDcCKX4Mjs6rwwT+ayCvI+EA3*I8ACO5*w$<4MmQ|X~Pax~s&Wj}Xu+i?MnHS!wf$u>&4`qBg| zCg9xk5~egxH863fayAu{o#_=1R-YyD{R5QmrNrwyHD|sMb?zpDh8cP)W1Nxdy zlI^=OxA_@oe$@ogf)NoZ86`x|TVg{7K8lDy0_%7*DdUGhSCa#iz0^Fzp{+%sHIqI2 z=dMBQ0ujrD?`6QbaUt?q-aQ@pEH9X!*q@~1RUwyCyL;V65v+uGZ#cFnd~;Dattc{) zF}&N3eV^_e8D4sm^+~n67q$ZhD1gLU@z_wt@TxrKVC=b6ejBPyh{EZkL|^)6sBN!Q zJCy)n zg?F>5FbTOPq1K-OR0Y z!CA0{%!ABCybLNaR%GDqAdgxh8!Ma$hql5_8o$qRne9~&#hyerDwsf7^+%49=kz{AUz zJy5aa;qc_8;iNq-NijmU@@GE%VW_O#y|C^_UH#7m9G8DZ-)5t`}-5?r=Tj>Zy-IlQdG$mQzgtpBH?$hn{uf> zm_yw-)DC(Li-$6#bz`jw2QJF0bU~_n0+EPeBYYjgMMrKfUjSd%x11IbP`n;J zSB8g|SNsV9r4M4vJcx-1YNZH;Mdp;(VD2?$ZgguIzNh>J%&l!-L~f_bU!&S!lA2;1 zRPKRFEyiI;TCdzHAFTKuTH3{b!g;_Qx(Dw1};=q zb8|&C^v1;Py^*LqB8rjY(&(QD^=q!}^Bht)pypC|BzxaHAPm%9<3@Wx(iFGBKgk3r zuu`OJ64U`wJ=(@RGrnJE5hAA#jHJoJlUvyrPNkzXsk-5Td~Z_IO;#H}OlZ1I;hJs- z5}IyBT+{6%(sZkCr~D4JmGV1+YU_bS;3I4QG-OZMWS}8Hq9(nZorFnivJ#=IVJ?Qg z+cnN=v2gomu1Z4p>r!nLLFThb6~p9PH=G`72U)qXe1V;LGfp3db1m~`dOA8BruQV+ zNJfUhlCzZT31$q9*@J4qP+;F0SzY5&*QBd!GSoGh>YA*`4-z*&awIb(%ux$uwIH*j zfYe_*3P|y_qkvRiV^=6~Y57oho3E>S4un3t~#v7d)!^Ao~3_~R}Nk|D-Jx z$yiWHS((0{j^p9m4LA2xsBI^=TT;m0LCAMxyGnHEUu`4^eJLd9e}>@PGTrt`5~*qm zB1;*$t>pXhy4+QxBk5X^n424RYkudfVy!5n*srfSY#6Z{DL!&-S>SENhnvMtmSGmn zpD_!vOagiqEHn{0!&x$VU`r>%v)uH+3R&Ag&IGTSr0leN#ERa~AdUQI&%em~uF_%m zMPdn$)YarR@$vH)ISvY{8`15we%13yx4Wzwjgj6)+oGI(%IYl9s?|7ewbTCrB zEPqjGmS4Z;Hp5Wflc95&kkI9Ro^UfIxOR#bzGR#*o8-BES9R{)o=;Q+Vw#dAL*qol z;Zp4la_8)`1j1KySG>7mSTddSmO@*54;e-%9X^zy)njA{OtF|PP+F!-ebj=Z*@|>` zo2NUWb{oEygDCsa1xj{_-*4Q-HwO6Kh4ay5ZoypTJ?E|ux{PCpvlja={QGa8)fHEn}GWQ@iSQuE_VCT6s6yg)-JFD#pTQM^>W4J<*CA%23L4 z>=TkHUXSsx=gzHkYT=>7E8dSeTkoAja>AlXBqyX@NJuV!3izkXFJ1-@b4c06c$n9c zb(3g}7&9DEy)T5j6rdbv%QybIvJWrznO^s#!>8-4^Y! z!Jf0Qt5qvyY3*dR4R1pbkDWOk9&e9SGe*DzSf53yj9XS9Xo=J^Uh&GdK$)J`|J`fI zofz&TwF!?$zpyD2QY_)If78o1e^jzkEVzj;J#L_EJ)Z0BtJuK2JxbePpv&_IY3(mi z!Rw%>G%nTr+}8i4spgm9L=n#UJ3f{GJa7@B!CyGO8@V6bmlY2u%@(=tN>@FgG+IEV#%iKP1=hL=iDz#%gY4_Hfss`=eVMe=G zHr}~Jkw8w|%EzN$4|bnP-pYR=@CUk;f1hsUhvBXK8L8Pf3~%MXz+3rv@>X7k6}JCY z9&ZWo#dDC2?H{!ZZ{^RX!C^1k#2EqSN zw4w%q34Gx_4o60HJE@Gg;Nb0)T8afmwgT$x@ph?Y>L9j(o~FxUEZ6jPnvrmSIxoeZ z42k@D8r{CVcx<5Cw?*smDC0uZ0})KY_j{0VIm4)mjdZ3@K=Lo-6kG^Xdg@p#9jln;>5!z4ZZYM92b*#iY zys-!j@*w${&e^XyVM27`l0j!<)_vhY+DaAhcwH;5g*PYRo42754g)ts;Cc*P7rB-U zL%RtcYQtA}aneUpu2a5?kUff%&?6{;LCTyCsilCL@&x)&kk+D+AzqR&KZfrxYc8XF>0l)#2xAGx15r(!WL{Oo>6@XGp)`%R{;{s~)8LIOt8 z0IH`pVVKlX<`CeZ5t)$db4Kn$=oUopjT;e}MWKEKXOa*zmz>(9|Ld2D0AKshn=raj1<+#++!G&^6RH7mxx-z0}JyEyE za{@(FYY*ZY_#xf)q0SLokF`WS28Oj1&LSwtYjhdl%-Js-QqDrg4fuSe@{lO1!&sSJ zEw;l5Qiv@gYa*V?sxQtMaqNueG@4$o4bYbapVPBPs+mUm>qU07IiFg$d(8~SNR)Pf zEfb|3D!dDFVfy=vK>fMyl~rI}@Kv zotz-eDSOVWl%QwibO<{=QAs&Y@`JujGqYdnT0=5Y9TqZZ(^=YtC=6d&U;X=Ji=$Hv zmZG$Ycyhg@586obO}+XwsaqyKO)Vzu$6Xv53|y7d3C*MI6tRVNahGc%(4;~;nXSu5 zjKo&jfrqIqK0s0_^R}^A6_b&vv6;C(==0B7E>qt~vc46e0R_cPk*A%vFa&P#i2_2N zDV3r{TDu<31ziupAG|L_Ip+fq*o%QV5cnMiWIWCM)b%%13Z{;nsy49pkZDNJ3lv*a+5DzB` zJB<}7t!c$j=O3~rq}}sjIHh$MMijGYBJAb(L@u20oL}kA*(=ac_jFeL11`dyP#3Mj zdEtb~t6HMp^H*Svvo*b#4yvbl4Y7KEY2ejMoDZFiek&=u?X+{}23m#~c6)ZM9L3&8 z-4Lnb8koI@ux_pL_^YqJ8hlmrOG;EyOP!lyMKET{;0s+p$7z%;OKT|oQfl!JR!hGL zGQSX1OTR{In9{G{X^_T+pP{KkZkiHL}DAhq~TNGDg) z_l)KVB%VM)enLDk{X+4?bbbKM-8hcAO*R1$?ql_%%{|ITb5wJI`Jkl3`vDhqdkii?>{A22TU7g?E;e}Q=UhB}T#hHVbTS`c zo?Xap6YOk22i}FNR{{eKN!v)Bc)l#v;t?iyBi1i60t*~aNwt0g6+u@LK3R39kfIWF zMY{V?r(Xrz!6HZUNo0N(TSpJGr3{1#N<6?Z&_A3%1>x};cy#tZy5MnW|KpWrkojeN zOqZJTtY%45Bxh_%lG$c}PWxs^Oop6XojY=8$wfo7T!DU;S=~;xazGPfNe(K-K_%c{ z=xnYIOFHmoE=dAL&N3wdG@7-gSpe032(4ix82? zyR5@|tYl@y6of+d^{AzB6#=KXsNQRb%A%TeScGLpt#rj4uvVz0uv)FgH4&)HKzMu~ z`j9|yCvP@W=8?_38UZ@9LXP{i$aJl8^r=_FGC8eWWJFdO`?`Kh`%}Ew3rUbg)GA+w ziOM$xh6Pg=({MS$6uO=B7BK~RBXqK2yRuVIKI>CUr?W|->h-fpPHF2-Y3n30steK2 zU`H@pEuF`vItkHeQF7bjofFQ60W#Z&EHg%o8;0OaFZ(rb5t?)8^93ucYIFFAh+UtU zlSW)JCrzkE(LVDoo~!(>eBcc|!b{7Lh{o@JoSULtot)#%J%yYS55G1UEd5)PuDWWFom1bOX^k>Urs|Kd*&RgP1vDL zc#F*xxkhxSS}87fGlc-F?45M<*PO#m3u)#{H?^`67gJF1W2&{wkGCgfdgWHw>#~8m z>=lD)pZ)0@uuUrz86)lRN|)x0suEPyh={^&R+`@7b#eW07a=}&N?Qp|L||Axfp?`Q z)x2FvCH5w+#QvimrEobErWbDZiNIV8^klBJ+J$;MKGtjHFG(@_ekM;6%# z0g683F0yk5?->hyI;E;8rHZ9M&m6S}NMmgxCrl{**nY>N~Nm~c#=H|-eCoBB6*G`l5$$x#3WLGkY$4V_z zZ49Pyn=@udF<(N>!}P!9>{m?TN-5DJq%oa#SZa2lf(o3ZxV4E)ki75*S14ydzr{#g zHIS<*__<`zkc)b+45B1Os

Jn*po=sgKgvzYJQ*QvKqHbE%(}BVODn9XGtwr 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 o#2uUwpmO16zoIou?p|+I$LE)~N!A|Nv(q^KOV + +<%@ Register src="../UserControls/MessageBox.ascx" tagname="MessageBox" tagprefix="wsp" %> + +<%@ Register src="../UserControls/SimpleMessageBox.ascx" tagname="SimpleMessageBox" tagprefix="uc1" %> + + + + + Test VPS2012 Summary Template + + + +

+
+

Test VPS2012 Summary Template +

+ + + +

+ Item ID:
+ +

+

+ Template:
+ +
+ +

+

+ Results: +
+

+

+
+ + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.cs new file mode 100644 index 00000000..479d409d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.cs @@ -0,0 +1,55 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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.Web; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class TestVirtualMachineTemplate : System.Web.UI.Page + { + public const string EVALUATE_VIRTUAL_MACHINE_TEMPLATE = "EVALUATE_VIRTUAL_MACHINE_TEMPLATE"; + + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnEvaluate_Click(object sender, EventArgs e) + { + try + { + litResults.Text = HttpUtility.HtmlEncode(ES.Services.VPS2012.EvaluateVirtualMachineTemplate(Utils.ParseInt(txtItemId.Text.Trim(), 0), txtTemplate.Text)); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage(EVALUATE_VIRTUAL_MACHINE_TEMPLATE, ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.designer.cs new file mode 100644 index 00000000..2cd00d39 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/TestVirtualMachineTemplate.aspx.designer.cs @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class TestVirtualMachineTemplate { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// txtItemId control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtItemId; + + /// + /// txtTemplate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtTemplate; + + /// + /// btnEvaluate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnEvaluate; + + /// + /// litResults control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litResults; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Breadcrumb.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Breadcrumb.ascx.resx new file mode 100644 index 00000000..5ea0895e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Breadcrumb.ascx.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/DynamicMemory.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/DynamicMemory.ascx.resx new file mode 100644 index 00000000..de7f7771 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/DynamicMemory.ascx.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Dymanic memory: + + + Dymanic memory + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Generation.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Generation.ascx.resx new file mode 100644 index 00000000..5b5b2e6f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Generation.ascx.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + First + + + Second + + + Generation: + + + Generation + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Menu.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Menu.ascx.resx new file mode 100644 index 00000000..a4af7bf0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/Menu.ascx.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Audit Log + + + External Network + + + Management Network + + + Private Network + + + User Permissions + + + Virtual Private Servers + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/ServerTabs.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/ServerTabs.ascx.resx new file mode 100644 index 00000000..eaf0db7c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/App_LocalResources/ServerTabs.ascx.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + return CancelOperation('Cancel current operation?', 'Cancelling operation...'); + + + Audit Log + + + Configuration + + + DVD + + + General + + + Help + + + Network + + + Permissions + + + Snapshots + + + Tools + + + Elapsed: + + + Started: + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx new file mode 100644 index 00000000..2dd3eb5c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx @@ -0,0 +1,4 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Breadcrumb.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb" %> + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.cs new file mode 100644 index 00000000..1bf7495d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.cs @@ -0,0 +1,50 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class Breadcrumb : System.Web.UI.UserControl + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // bind package name + PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); + litSpaceName.Text = package.PackageName; + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.designer.cs new file mode 100644 index 00000000..4231a1d5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Breadcrumb.ascx.designer.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class Breadcrumb { + + /// + /// litSpaceName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litSpaceName; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx new file mode 100644 index 00000000..acf4d304 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx @@ -0,0 +1,17 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DynamicMemory.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.UserControls.DynamicMemory" %> +<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../../UserControls/CollapsiblePanel.ascx" %> + + + + + + + + + +
+ + +
+
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.cs new file mode 100644 index 00000000..0ab36ea9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.cs @@ -0,0 +1,50 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class DynamicMemory : WebsitePanelControlBase, IVirtualMachineSettingsControl + { + protected void Page_Load(object sender, EventArgs e) + { + } + + public bool IsEditMode { get; set; } + + public void BindItem(VirtualMachine item) + { + } + + public void SaveItem(VirtualMachine item) + { + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.designer.cs new file mode 100644 index 00000000..5124bc48 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/DynamicMemory.ascx.designer.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class DynamicMemory { + + /// + /// secDymanicMemory control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secDymanicMemory; + + /// + /// DymanicMemoryPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel DymanicMemoryPanel; + + /// + /// locDymanicMemory control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDymanicMemory; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx new file mode 100644 index 00000000..4a361f2b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx @@ -0,0 +1,4 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FormTitle.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.UserControls.FormTitle" %> + +- + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.cs new file mode 100644 index 00000000..bc88fcea --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.cs @@ -0,0 +1,53 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class FormTitle : WebsitePanelControlBase + { + public string Text + { + get { return litTitle.Text; } + set { litTitle.Text = value; } + } + + protected void Page_Load(object sender, EventArgs e) + { + VirtualMachine vm = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + if (vm != null) + litServerName.Text = vm.Name; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.designer.cs new file mode 100644 index 00000000..e56c4e0e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/FormTitle.ascx.designer.cs @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class FormTitle { + + /// + /// litTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litTitle; + + /// + /// litServerName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litServerName; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx new file mode 100644 index 00000000..423a7077 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx @@ -0,0 +1,24 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Generation.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.UserControls.Generation" %> +<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../../UserControls/CollapsiblePanel.ascx" %> + + + + + + + + +
+ + + <% if (IsEditMode) + { %> + + 1 + 2 + + <% } else { %> + + <% } %> +
+
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.cs new file mode 100644 index 00000000..12299712 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.cs @@ -0,0 +1,54 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class Generation : WebsitePanelControlBase, IVirtualMachineSettingsControl + { + protected void Page_Load(object sender, EventArgs e) + { + } + + public bool IsEditMode { get; set; } + + public void BindItem(VirtualMachine item) + { + var generation = item.Generation > 1 ? item.Generation : 1; + ddlGeneration.SelectedValue = generation.ToString(); + lblGeneration.Text = generation.ToString(); + } + + public void SaveItem(VirtualMachine item) + { + item.Generation = Convert.ToInt32(ddlGeneration.SelectedValue); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.designer.cs new file mode 100644 index 00000000..7ae3a102 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Generation.ascx.designer.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class Generation { + + /// + /// secGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secGeneration; + + /// + /// GenerationPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel GenerationPanel; + + /// + /// locGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locGeneration; + + /// + /// ddlGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlGeneration; + + /// + /// lblGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblGeneration; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx new file mode 100644 index 00000000..10902dd6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx @@ -0,0 +1,18 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Menu.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.UserControls.Menu" %> + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.cs new file mode 100644 index 00000000..fe628e86 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.cs @@ -0,0 +1,129 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class Menu : WebsitePanelControlBase + { + public class MenuItem + { + private string url; + private string text; + private string key; + + public string Url + { + get { return url; } + set { url = value; } + } + + public string Text + { + get { return text; } + set { text = value; } + } + + public string Key + { + get { return key; } + set { key = value; } + } + } + + private string selectedItem; + public string SelectedItem + { + get { return selectedItem; } + set { selectedItem = value; } + } + + protected void Page_Load(object sender, EventArgs e) + { + BindMenu(); + } + + private void BindMenu() + { + bool isAdmin = (PanelSecurity.EffectiveUser.Role == UserRole.Administrator); + + // build the list of menu items + List items = new List(); + + // load package context + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + // add items + items.Add(CreateMenuItem("Vps", "")); + + if(cntx.Quotas.ContainsKey(Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED) + && !cntx.Quotas[Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED].QuotaExhausted + || (PanelSecurity.PackageId == 1 && isAdmin)) + items.Add(CreateMenuItem("ExternalNetwork", "vdc_external_network")); + + if (isAdmin) + items.Add(CreateMenuItem("ManagementNetwork", "vdc_management_network")); + + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_PRIVATE_NETWORK_ENABLED) + && !cntx.Quotas[Quotas.VPS2012_PRIVATE_NETWORK_ENABLED].QuotaExhausted) + items.Add(CreateMenuItem("PrivateNetwork", "vdc_private_network")); + + //items.Add(CreateMenuItem("UserPermissions", "vdc_permissions")); + items.Add(CreateMenuItem("AuditLog", "vdc_audit_log")); + + // selected menu item + for (int i = 0; i < items.Count; i++) + { + if (String.Compare(items[i].Key, SelectedItem, true) == 0) + { + MenuItems.SelectedIndex = i; + break; + } + } + + // bind items + MenuItems.DataSource = items; + MenuItems.DataBind(); + } + + private MenuItem CreateMenuItem(string text, string key) + { + MenuItem item = new MenuItem(); + item.Key = key; + item.Text = GetLocalizedString("Text." + text); + item.Url = HostModule.EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), key); + return item; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.designer.cs new file mode 100644 index 00000000..625e22b8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/Menu.ascx.designer.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class Menu { + + /// + /// MenuItems control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DataList MenuItems; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx new file mode 100644 index 00000000..d5a9c3ea --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx @@ -0,0 +1,75 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ServerTabs.ascx.cs" + Inherits="WebsitePanel.Portal.VPS2012.UserControls.ServerTabs" %> +<%@ Register Src="../../UserControls/Gauge.ascx" TagName="Gauge" TagPrefix="wsp" %> +<%@ Register Src="../../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> + + + + + + + + + + + + + + + + + + + + + + + +
+ +
 
+ + +
+ + +
 
+ + +
+ + +
+
+
+
+ + + + + +
+    + + + + + <%# Eval("Name") %> + + + + + + <%# Eval("Name") %> + + + +
+
+ + + +
+
\ No newline at end of file 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 new file mode 100644 index 00000000..f5b51d3a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.cs @@ -0,0 +1,230 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012.UserControls +{ + public partial class ServerTabs : WebsitePanelControlBase + { + class Tab + { + string id; + string name; + string url; + + public Tab(string id, string name, string url) + { + this.id = id; + this.name = name; + this.url = url; + } + + public string Id + { + get { return this.id; } + set { this.id = value; } + } + + public string Name + { + get { return this.name; } + set { this.name = value; } + } + + public string Url + { + get { return this.url; } + set { this.url = value; } + } + } + + private string selectedTab; + public string SelectedTab + { + get { return selectedTab; } + set { selectedTab = value; } + } + + private BackgroundTask task = null; + + protected void Page_Load(object sender, EventArgs e) + { + BindTabs(); + } + + private void BindTabs() + { + // load item + VirtualMachine vm = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + + if (!String.IsNullOrEmpty(vm.CurrentTaskId)) + { + // show panel + TaskTable.Visible = true; + + // bind task details + BindTask(vm); + + return; + } + + if (TaskTable.Visible) + Response.Redirect(Request.Url.ToString()); // refresh screen + + // show tabs + TabsTable.Visible = true; + + // disable timer + refreshTimer.Enabled = false; + + // check if VPS2012 created with error + bool createError = (vm.ProvisioningStatus == VirtualMachineProvisioningStatus.Error); + + // load package context + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + // build tabs list + List tabsList = new List(); + + tabsList.Add(CreateTab("vps_general", "Tab.General")); + + if (!createError) + tabsList.Add(CreateTab("vps_config", "Tab.Configuration")); + + if (vm.DvdDriveInstalled && !createError) + tabsList.Add(CreateTab("vps_dvd", "Tab.DVD")); + + if (vm.SnapshotsNumber > 0 && !createError) + tabsList.Add(CreateTab("vps_snapshots", "Tab.Snapshots")); + + if ((vm.ExternalNetworkEnabled || vm.PrivateNetworkEnabled) && !createError) + tabsList.Add(CreateTab("vps_network", "Tab.Network")); + + //tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions")); + //tabsList.Add(CreateTab("vps_tools", "Tab.Tools")); + tabsList.Add(CreateTab("vps_audit_log", "Tab.AuditLog")); + + if (!createError) + tabsList.Add(CreateTab("vps_help", "Tab.Help")); + + + // find selected menu item + int idx = 0; + foreach (Tab tab in tabsList) + { + if (String.Compare(tab.Id, SelectedTab, true) == 0) + break; + idx++; + } + dlTabs.SelectedIndex = idx; + + dlTabs.DataSource = tabsList; + dlTabs.DataBind(); + + // show provision error message + if(createError && idx == 0) + messageBox.ShowErrorMessage("VPS_PROVISION_ERROR"); + } + + private void BindTask(VirtualMachine vm) + { + task = ES.Services.Tasks.GetTaskWithLogRecords(vm.CurrentTaskId, DateTime.MinValue); + if (task == null) + return; + + // bind task details + litTaskName.Text = String.Format("{0} "{1}"", + GetAuditLogTaskName(task.Source, task.TaskName), + task.ItemName); + + // time + litStarted.Text = task.StartDate.ToString("T"); + TimeSpan d = (TimeSpan)(DateTime.Now - task.StartDate); + litElapsed.Text = new TimeSpan(d.Hours, d.Minutes, d.Seconds).ToString(); + + // bind records + repRecords.DataSource = task.GetLogs(); + repRecords.DataBind(); + } + + private Tab CreateTab(string id, string text) + { + return new Tab(id, GetLocalizedString(text), + HostModule.EditUrl("ItemID", PanelRequest.ItemID.ToString(), id, + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void repRecords_ItemDataBound(object sender, RepeaterItemEventArgs e) + { + BackgroundTaskLogRecord record = (BackgroundTaskLogRecord)e.Item.DataItem; + + Literal litRecord = (Literal)e.Item.FindControl("litRecord"); + Gauge gauge = (Gauge)e.Item.FindControl("gauge"); + + if (litRecord != null) + { + string text = record.Text; + + // localize text + string locText = GetSharedLocalizedString("TaskActivity." + text); + if (locText != null) + text = locText; + + // format parameters + if (record.TextParameters != null + && record.TextParameters.Length > 0 + && record.Severity == 0) + text = String.Format(text, record.TextParameters); + + litRecord.Text = text; + + // gauge + gauge.Visible = false; + if (e.Item.ItemIndex == task.GetLogs().Count - 1) + { + if (task.IndicatorCurrent == -1) + litRecord.Text += "..."; + else + { + gauge.Visible = true; + gauge.Total = task.IndicatorMaximum; + gauge.Progress = task.IndicatorCurrent; + } + } + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.designer.cs new file mode 100644 index 00000000..fd9d70f8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/UserControls/ServerTabs.ascx.designer.cs @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012.UserControls { + + + public partial class ServerTabs { + + /// + /// refreshTimer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.Timer refreshTimer; + + /// + /// TabsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel TabsPanel; + + /// + /// TaskTable control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable TaskTable; + + /// + /// litTaskName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litTaskName; + + /// + /// locStarted control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locStarted; + + /// + /// litStarted control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litStarted; + + /// + /// locElapsed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locElapsed; + + /// + /// litElapsed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litElapsed; + + /// + /// repRecords control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Repeater repRecords; + + /// + /// TabsTable control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable TabsTable; + + /// + /// dlTabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DataList dlTabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx new file mode 100644 index 00000000..b589e4ec --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx @@ -0,0 +1,39 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcAddExternalAddress.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcAddExternalAddress" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/AllocatePackageIPAddresses.ascx" TagName="AllocatePackageIPAddresses" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + +
+
+
+ +
+
+ diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.cs new file mode 100644 index 00000000..38ee774d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.cs @@ -0,0 +1,43 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcAddExternalAddress : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.designer.cs new file mode 100644 index 00000000..37393f5f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAddExternalAddress.ascx.designer.cs @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcAddExternalAddress { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// allocateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.AllocatePackageIPAddresses allocateAddresses; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx new file mode 100644 index 00000000..3df88dc9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx @@ -0,0 +1,34 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcAuditLog.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcAuditLog" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PopupHeader.ascx" TagName="PopupHeader" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/AuditLogControl.ascx" TagName="AuditLogControl" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.cs new file mode 100644 index 00000000..f2fea5eb --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.cs @@ -0,0 +1,44 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcAuditLog : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.designer.cs new file mode 100644 index 00000000..8b560f54 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcAuditLog.ascx.designer.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcAuditLog { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// auditLog control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.AuditLogControl auditLog; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx new file mode 100644 index 00000000..6a22866b --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx @@ -0,0 +1,570 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcCreateServer.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcCreate" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CheckBoxOption.ascx" TagName="CheckBoxOption" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> +<%@ Register TagPrefix="wsp" TagName="Generation" Src="UserControls/Generation.ascx" %> +<%@ Register TagPrefix="wsp" TagName="DynamicMemory" Src="UserControls/DynamicMemory.ascx" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + * + + + + . + + + * + + +
 
+ + + * +
 
+ + + +
 
+ + + + * +
+
+ +
+ + +

+
+ + + + + + + + + + +
+ + +
+ + + + + + +
+ + * +
+ + + + + + +
+ + * +
+
+ + + + + + + + + + + + + +
+ + + * +
+
+ + + + + + + + +
+ +
+
+ + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+
+
+ +
+ + + + +

+
+ +

+ +

+ +
+ +
+ + + + + + + + + + + + + + +
+ +
+ + + + + * + + +
+ +
+ +
+ +
+
+
+ + + + +

+
+ +

+ +

+ + + + + + + + + + + + + + + +
+ +
+ + + + + * + + +
+ +
+ +
+ +
+
+ + + + + + + + + + +
+ +
+ +
+ + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
 
+ +
 
+ +
 
+ +
+
+
+
+ + +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.cs new file mode 100644 index 00000000..8a0f8508 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.cs @@ -0,0 +1,375 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcCreate : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindFormControls(); + } + + // remove non-required steps + ToggleWizardSteps(); + + // toggle + ToggleControls(); + } + + private void ToggleWizardSteps() + { + // external network + if (!PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED)) + { + wizard.WizardSteps.Remove(stepExternalNetwork); + chkExternalNetworkEnabled.Checked = false; + } + + // private network + if (!PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED)) + { + wizard.WizardSteps.Remove(stepPrivateNetwork); + chkPrivateNetworkEnabled.Checked = false; + } + } + + private void BindFormControls() + { + // bind password policy + password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.VPS_POLICY, "AdministratorPasswordPolicy"); + + // OS templates + listOperatingSystems.DataSource = ES.Services.VPS2012.GetOperatingSystemTemplates(PanelSecurity.PackageId); + listOperatingSystems.DataBind(); + listOperatingSystems.Items.Insert(0, new ListItem(GetLocalizedString("SelectOsTemplate.Text"), "")); + + // summary letter e-mail + PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); + if (package != null) + { + UserInfo user = ES.Services.Users.GetUserById(package.UserId); + if (user != null) + { + chkSendSummary.Checked = true; + txtSummaryEmail.Text = user.Email; + } + } + + // load package context + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + // bind CPU cores + int maxCores = ES.Services.VPS2012.GetMaximumCpuCoresNumber(PanelSecurity.PackageId); + + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_CPU_NUMBER)) + { + QuotaValueInfo cpuQuota = cntx.Quotas[Quotas.VPS2012_CPU_NUMBER]; + + if (cpuQuota.QuotaAllocatedValue != -1 + && maxCores > cpuQuota.QuotaAllocatedValue) + maxCores = cpuQuota.QuotaAllocatedValue; + } + + for (int i = 1; i < maxCores + 1; i++) + ddlCpu.Items.Add(i.ToString()); + + ddlCpu.SelectedIndex = ddlCpu.Items.Count - 1; // select last (maximum) item + + // the user controls + GenerationSetting.BindItem(new VirtualMachine()); + DynamicMemorySetting.BindItem(new VirtualMachine()); + + // external network details + if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED)) + { + // bind list + PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.VpsExternalNetwork); + foreach (PackageIPAddress ip in ips) + { + string txt = ip.ExternalIP; + if (!String.IsNullOrEmpty(ip.DefaultGateway)) + txt += "/" + ip.DefaultGateway; + listExternalAddresses.Items.Add(new ListItem(txt, ip.PackageAddressID.ToString())); + } + + // toggle controls + int maxAddresses = listExternalAddresses.Items.Count; + litMaxExternalAddresses.Text = String.Format(GetLocalizedString("litMaxExternalAddresses.Text"), maxAddresses); + if (maxAddresses > 0) + txtExternalAddressesNumber.Text = "1"; + } + + // private network + if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED)) + { + NetworkAdapterDetails nic = ES.Services.VPS2012.GetPrivateNetworkDetails(PanelSecurity.PackageId); + litPrivateNetworkFormat.Text = nic.NetworkFormat; + litPrivateSubnetMask.Text = nic.SubnetMask; + + // set max number + QuotaValueInfo privQuota = cntx.Quotas[Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER]; + int maxPrivate = privQuota.QuotaAllocatedValue; + if (maxPrivate == -1) + maxPrivate = 10; + + // handle DHCP mode + if (nic.IsDHCP) + { + maxPrivate = 0; + ViewState["DHCP"] = true; + } + + txtPrivateAddressesNumber.Text = "1"; + litMaxPrivateAddresses.Text = String.Format(GetLocalizedString("litMaxPrivateAddresses.Text"), maxPrivate); + } + + // RAM size + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_RAM)) + { + QuotaValueInfo ramQuota = cntx.Quotas[Quotas.VPS2012_RAM]; + if (ramQuota.QuotaAllocatedValue == -1) + { + // unlimited RAM + txtRam.Text = ""; + } + else + { + int availSize = ramQuota.QuotaAllocatedValue - ramQuota.QuotaUsedValue; + txtRam.Text = availSize < 0 ? "" : availSize.ToString(); + } + } + + // HDD size + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_HDD)) + { + QuotaValueInfo hddQuota = cntx.Quotas[Quotas.VPS2012_HDD]; + if (hddQuota.QuotaAllocatedValue == -1) + { + // unlimited HDD + txtHdd.Text = ""; + } + else + { + int availSize = hddQuota.QuotaAllocatedValue - hddQuota.QuotaUsedValue; + txtHdd.Text = availSize < 0 ? "" : availSize.ToString(); + } + } + + // snapshots number + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_SNAPSHOTS_NUMBER)) + { + int snapsNumber = cntx.Quotas[Quotas.VPS2012_SNAPSHOTS_NUMBER].QuotaAllocatedValue; + txtSnapshots.Text = (snapsNumber != -1) ? snapsNumber.ToString() : ""; + txtSnapshots.Enabled = (snapsNumber != 0); + } + + // toggle controls + BindCheckboxOption(chkDvdInstalled, Quotas.VPS2012_DVD_ENABLED); + chkBootFromCd.Enabled = PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_BOOT_CD_ALLOWED); + + BindCheckboxOption(chkStartShutdown, Quotas.VPS2012_START_SHUTDOWN_ALLOWED); + BindCheckboxOption(chkPauseResume, Quotas.VPS2012_PAUSE_RESUME_ALLOWED); + BindCheckboxOption(chkReset, Quotas.VPS2012_RESET_ALOWED); + BindCheckboxOption(chkReboot, Quotas.VPS2012_REBOOT_ALLOWED); + BindCheckboxOption(chkReinstall, Quotas.VPS2012_REINSTALL_ALLOWED); + } + + private void BindCheckboxOption(CheckBox chk, string quotaName) + { + chk.Enabled = PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, quotaName); + chk.Checked = chk.Enabled; + } + + private void ToggleControls() + { + // send letter + txtSummaryEmail.Enabled = chkSendSummary.Checked; + SummaryEmailValidator.Enabled = chkSendSummary.Checked; + + // external network + bool emptyIps = listExternalAddresses.Items.Count == 0; + EmptyExternalAddressesMessage.Visible = emptyIps; + tableExternalNetwork.Visible = chkExternalNetworkEnabled.Checked && !emptyIps; + chkExternalNetworkEnabled.Enabled = !emptyIps; + chkExternalNetworkEnabled.Checked = chkExternalNetworkEnabled.Checked && !emptyIps; + ExternalAddressesNumberRow.Visible = radioExternalRandom.Checked; + ExternalAddressesListRow.Visible = radioExternalSelected.Checked; + + // private network + tablePrivateNetwork.Visible = chkPrivateNetworkEnabled.Checked && (ViewState["DHCP"] == null); + PrivateAddressesNumberRow.Visible = radioPrivateRandom.Checked; + PrivateAddressesListRow.Visible = radioPrivateSelected.Checked; + } + + private void BindSummary() + { + //VirtualMachine virtualMachine = new VirtualMachine(); + + //// the user controls + //GenerationSetting.SaveItem(virtualMachine); + //DynamicMemorySetting.BindItem(virtualMachine); + + // general + litHostname.Text = PortalAntiXSS.Encode(String.Format("{0}.{1}", txtHostname.Text.Trim(), txtDomain.Text.Trim())); + litOperatingSystem.Text = listOperatingSystems.SelectedItem.Text; + + litSummaryEmail.Text = PortalAntiXSS.Encode(txtSummaryEmail.Text.Trim()); + SummSummaryEmailRow.Visible = chkSendSummary.Checked; + + // config + litCpu.Text = PortalAntiXSS.Encode(ddlCpu.SelectedValue); + litRam.Text = PortalAntiXSS.Encode(txtRam.Text.Trim()); + //litGeneration.Text = CreareSettingsProviderControl != null ? PortalAntiXSS.Encode(virtualMachine.Generation.ToString()) : "1"; + litHdd.Text = PortalAntiXSS.Encode(txtHdd.Text.Trim()); + litSnapshots.Text = PortalAntiXSS.Encode(txtSnapshots.Text.Trim()); + optionDvdInstalled.Value = chkDvdInstalled.Checked; + optionBootFromCd.Value = chkBootFromCd.Checked; + optionNumLock.Value = chkNumLock.Checked; + optionStartShutdown.Value = chkStartShutdown.Checked; + optionPauseResume.Value = chkPauseResume.Checked; + optionReboot.Value = chkReboot.Checked; + optionReset.Value = chkReset.Checked; + optionReinstall.Value = chkReinstall.Checked; + + // external network + optionExternalNetwork.Value = chkExternalNetworkEnabled.Checked; + SummExternalAddressesNumberRow.Visible = radioExternalRandom.Checked && chkExternalNetworkEnabled.Checked; + litExternalAddressesNumber.Text = PortalAntiXSS.Encode(txtExternalAddressesNumber.Text.Trim()); + SummExternalAddressesListRow.Visible = radioExternalSelected.Checked && chkExternalNetworkEnabled.Checked; + + List ipAddresses = new List(); + foreach (ListItem li in listExternalAddresses.Items) + if (li.Selected) + ipAddresses.Add(li.Text); + litExternalAddresses.Text = PortalAntiXSS.Encode(String.Join(", ", ipAddresses.ToArray())); + + // private network + optionPrivateNetwork.Value = chkPrivateNetworkEnabled.Checked; + SummPrivateAddressesNumberRow.Visible = radioPrivateRandom.Checked && chkPrivateNetworkEnabled.Checked && (ViewState["DHCP"] == null); + litPrivateAddressesNumber.Text = PortalAntiXSS.Encode(txtPrivateAddressesNumber.Text.Trim()); + SummPrivateAddressesListRow.Visible = radioPrivateSelected.Checked && chkPrivateNetworkEnabled.Checked && (ViewState["DHCP"] == null); + + string[] privIps = Utils.ParseDelimitedString(txtPrivateAddressesList.Text, '\n', '\r', ' ', '\t'); + litPrivateAddressesList.Text = PortalAntiXSS.Encode(String.Join(", ", privIps)); + } + + protected void wizard_FinishButtonClick(object sender, WizardNavigationEventArgs e) + { + if (!Page.IsValid) + return; + + try + { + VirtualMachine virtualMachine = new VirtualMachine(); + + // the user controls + GenerationSetting.BindItem(virtualMachine); + DynamicMemorySetting.BindItem(virtualMachine); + + // collect and prepare data + string hostname = String.Format("{0}.{1}", txtHostname.Text.Trim(), txtDomain.Text.Trim()); + + string adminPassword = (string)ViewState["Password"]; + + // external IPs + List extIps = new List(); + foreach (ListItem li in listExternalAddresses.Items) + if (li.Selected) extIps.Add(Utils.ParseInt(li.Value)); + + // private IPs + string[] privIps = Utils.ParseDelimitedString(txtPrivateAddressesList.Text, '\n', '\r', ' ', '\t'); + + string summaryEmail = chkSendSummary.Checked ? txtSummaryEmail.Text.Trim() : null; + + // create virtual machine + IntResult res = ES.Services.VPS2012.CreateVirtualMachine(PanelSecurity.PackageId, + hostname, listOperatingSystems.SelectedValue, adminPassword, summaryEmail, + virtualMachine.Generation, Utils.ParseInt(ddlCpu.SelectedValue), Utils.ParseInt(txtRam.Text.Trim()), + Utils.ParseInt(txtHdd.Text.Trim()), Utils.ParseInt(txtSnapshots.Text.Trim()), + chkDvdInstalled.Checked, chkBootFromCd.Checked, chkNumLock.Checked, + chkStartShutdown.Checked, chkPauseResume.Checked, chkReboot.Checked, chkReset.Checked, chkReinstall.Checked, + chkExternalNetworkEnabled.Checked, Utils.ParseInt(txtExternalAddressesNumber.Text.Trim()), radioExternalRandom.Checked, extIps.ToArray(), + chkPrivateNetworkEnabled.Checked, Utils.ParseInt(txtPrivateAddressesNumber.Text.Trim()), radioPrivateRandom.Checked, privIps); + + if (res.IsSuccess) + { + Response.Redirect(EditUrl("ItemID", res.Value.ToString(), "vps_general", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_CREATE", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_CREATE", ex); + } + } + + protected void wizard_SideBarButtonClick(object sender, WizardNavigationEventArgs e) + { + if (e.NextStepIndex < e.CurrentStepIndex) + return; + + // save password + if (wizard.ActiveStepIndex == 0) + ViewState["Password"] = password.Password; + + Page.Validate("VpsWizard"); + + if (!Page.IsValid) + e.Cancel = true; + } + + protected void wizard_ActiveStepChanged(object sender, EventArgs e) + { + BindSummary(); + } + + protected void wizard_NextButtonClick(object sender, WizardNavigationEventArgs e) + { + // save password + if (wizard.ActiveStepIndex == 0) + ViewState["Password"] = password.Password; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.designer.cs new file mode 100644 index 00000000..51cbe0be --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcCreateServer.ascx.designer.cs @@ -0,0 +1,1365 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcCreate { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// wizard control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Wizard wizard; + + /// + /// stepName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.WizardStep stepName; + + /// + /// locNameStepTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNameStepTitle; + + /// + /// locHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHostname; + + /// + /// txtHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtHostname; + + /// + /// HostnameValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator HostnameValidator; + + /// + /// valCorrectHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectHostname; + + /// + /// txtDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtDomain; + + /// + /// DomainValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainValidator; + + /// + /// valNewDomainFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator valNewDomainFormat; + + /// + /// locOperatingSystem control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOperatingSystem; + + /// + /// listOperatingSystems control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList listOperatingSystems; + + /// + /// OperatingSystemValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator OperatingSystemValidator; + + /// + /// locAdminPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAdminPassword; + + /// + /// password control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.PasswordControl password; + + /// + /// chkSendSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkSendSummary; + + /// + /// txtSummaryEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSummaryEmail; + + /// + /// SummaryEmailValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator SummaryEmailValidator; + + /// + /// stepConfig control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.WizardStep stepConfig; + + /// + /// locConfigStepTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locConfigStepTitle; + + /// + /// secResources control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secResources; + + /// + /// ResourcesPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ResourcesPanel; + + /// + /// lblCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblCpu; + + /// + /// ddlCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlCpu; + + /// + /// locCores control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCores; + + /// + /// lblRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblRam; + + /// + /// txtRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtRam; + + /// + /// RequireRamValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequireRamValidator; + + /// + /// locMB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMB; + + /// + /// lblHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblHdd; + + /// + /// txtHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtHdd; + + /// + /// RequireHddValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequireHddValidator; + + /// + /// locGB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locGB; + + /// + /// GenerationSetting control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Generation GenerationSetting; + + /// + /// DynamicMemorySetting control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.DynamicMemory DynamicMemorySetting; + + /// + /// secSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secSnapshots; + + /// + /// SnapshotsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SnapshotsPanel; + + /// + /// locSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSnapshots; + + /// + /// txtSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSnapshots; + + /// + /// SnapshotsValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator SnapshotsValidator; + + /// + /// secDvd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secDvd; + + /// + /// DvdPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel DvdPanel; + + /// + /// chkDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkDvdInstalled; + + /// + /// secBios control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secBios; + + /// + /// BiosPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel BiosPanel; + + /// + /// chkBootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkBootFromCd; + + /// + /// chkNumLock control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkNumLock; + + /// + /// secActions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secActions; + + /// + /// ActionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ActionsPanel; + + /// + /// chkStartShutdown control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkStartShutdown; + + /// + /// chkReset control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReset; + + /// + /// chkPauseResume control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkPauseResume; + + /// + /// chkReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReinstall; + + /// + /// chkReboot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReboot; + + /// + /// stepExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.WizardStep stepExternalNetwork; + + /// + /// locExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalNetwork; + + /// + /// chkExternalNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkExternalNetworkEnabled; + + /// + /// EmptyExternalAddressesMessage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl EmptyExternalAddressesMessage; + + /// + /// locNotEnoughExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNotEnoughExternalAddresses; + + /// + /// tableExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable tableExternalNetwork; + + /// + /// radioExternalRandom control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioExternalRandom; + + /// + /// ExternalAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ExternalAddressesNumberRow; + + /// + /// locExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAddresses; + + /// + /// txtExternalAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtExternalAddressesNumber; + + /// + /// ExternalAddressesValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator ExternalAddressesValidator; + + /// + /// litMaxExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litMaxExternalAddresses; + + /// + /// radioExternalSelected control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioExternalSelected; + + /// + /// ExternalAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ExternalAddressesListRow; + + /// + /// listExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ListBox listExternalAddresses; + + /// + /// locHoldCtrl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHoldCtrl; + + /// + /// stepPrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.WizardStep stepPrivateNetwork; + + /// + /// locPrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateNetwork; + + /// + /// chkPrivateNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkPrivateNetworkEnabled; + + /// + /// tablePrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable tablePrivateNetwork; + + /// + /// radioPrivateRandom control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioPrivateRandom; + + /// + /// PrivateAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow PrivateAddressesNumberRow; + + /// + /// locPrivateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateAddresses; + + /// + /// txtPrivateAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPrivateAddressesNumber; + + /// + /// PrivateAddressesValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator PrivateAddressesValidator; + + /// + /// litMaxPrivateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litMaxPrivateAddresses; + + /// + /// radioPrivateSelected control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioPrivateSelected; + + /// + /// PrivateAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow PrivateAddressesListRow; + + /// + /// txtPrivateAddressesList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPrivateAddressesList; + + /// + /// locOnePerLine control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOnePerLine; + + /// + /// locPrivateNetworkFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateNetworkFormat; + + /// + /// litPrivateNetworkFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivateNetworkFormat; + + /// + /// locPrivateSubnetMask control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateSubnetMask; + + /// + /// litPrivateSubnetMask control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivateSubnetMask; + + /// + /// stepSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.WizardStep stepSummary; + + /// + /// locSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSummary; + + /// + /// locNameStepTitle2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNameStepTitle2; + + /// + /// Localize1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize Localize1; + + /// + /// litHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHostname; + + /// + /// Localize2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize Localize2; + + /// + /// litOperatingSystem control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litOperatingSystem; + + /// + /// SummSummaryEmailRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow SummSummaryEmailRow; + + /// + /// locSendSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSendSummary; + + /// + /// litSummaryEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litSummaryEmail; + + /// + /// locConfig2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locConfig2; + + /// + /// locCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCpu; + + /// + /// litCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCpu; + + /// + /// locRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRam; + + /// + /// litRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litRam; + + /// + /// locGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locGeneration; + + /// + /// litGeneration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litGeneration; + + /// + /// locHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHdd; + + /// + /// litHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHdd; + + /// + /// locSnapshots2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSnapshots2; + + /// + /// litSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litSnapshots; + + /// + /// locDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDvdInstalled; + + /// + /// optionDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionDvdInstalled; + + /// + /// locBootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locBootFromCd; + + /// + /// optionBootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionBootFromCd; + + /// + /// locNumLock control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNumLock; + + /// + /// optionNumLock control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionNumLock; + + /// + /// locStartShutdownAllowed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locStartShutdownAllowed; + + /// + /// optionStartShutdown control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionStartShutdown; + + /// + /// locPauseResumeAllowed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPauseResumeAllowed; + + /// + /// optionPauseResume control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionPauseResume; + + /// + /// locRebootAllowed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRebootAllowed; + + /// + /// optionReboot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReboot; + + /// + /// locResetAllowed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locResetAllowed; + + /// + /// optionReset control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReset; + + /// + /// locReinstallAllowed control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locReinstallAllowed; + + /// + /// optionReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReinstall; + + /// + /// locExternalNetwork2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalNetwork2; + + /// + /// locExternalNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalNetworkEnabled; + + /// + /// optionExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionExternalNetwork; + + /// + /// SummExternalAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow SummExternalAddressesNumberRow; + + /// + /// locExternalAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAddressesNumber; + + /// + /// litExternalAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litExternalAddressesNumber; + + /// + /// SummExternalAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow SummExternalAddressesListRow; + + /// + /// locExternalAddressesList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAddressesList; + + /// + /// litExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litExternalAddresses; + + /// + /// locPrivateNetwork2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateNetwork2; + + /// + /// locPrivateNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateNetworkEnabled; + + /// + /// optionPrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionPrivateNetwork; + + /// + /// SummPrivateAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow SummPrivateAddressesNumberRow; + + /// + /// locPrivateAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateAddressesNumber; + + /// + /// litPrivateAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivateAddressesNumber; + + /// + /// SummPrivateAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow SummPrivateAddressesListRow; + + /// + /// locPrivateAddressesList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateAddressesList; + + /// + /// litPrivateAddressesList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivateAddressesList; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx new file mode 100644 index 00000000..7d150f05 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx @@ -0,0 +1,61 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcExternalNetwork.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcExternalNetwork" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/Quota.ascx" TagName="Quota" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %> + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.cs new file mode 100644 index 00000000..e8b3ec31 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.cs @@ -0,0 +1,45 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.WebPortal; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcExternalNetwork : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + packageAddresses.ManageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.designer.cs new file mode 100644 index 00000000..c31d05c7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcExternalNetwork.ascx.designer.cs @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcExternalNetwork { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// packageAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.PackageIPAddresses packageAddresses; + + /// + /// secQuotas control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secQuotas; + + /// + /// QuotasPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel QuotasPanel; + + /// + /// locIPQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locIPQuota; + + /// + /// addressesQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota addressesQuota; + + /// + /// locBandwidthQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locBandwidthQuota; + + /// + /// bandwidthQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota bandwidthQuota; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx new file mode 100644 index 00000000..8e1fbfce --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx @@ -0,0 +1,139 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcHome.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcHome" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/Quota.ascx" TagName="Quota" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SearchBox.ascx" TagName="SearchBox" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + +
+
+ + +
+
+ +
+
+ + + + + + + + + <%# Eval("ItemName") %> + + + + + + + + + <%# Eval("PackageName") %> + + + + + + + <%# Eval("UserName") %> + + + + + + + + + + + +   + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs new file mode 100644 index 00000000..b1adc433 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.cs @@ -0,0 +1,138 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcHome : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + searchBox.AddCriteria("ItemName", GetLocalizedString("SearchField.ItemName")); + searchBox.AddCriteria("Username", GetLocalizedString("SearchField.Username")); + searchBox.AddCriteria("ExternalIP", GetLocalizedString("SearchField.ExternalIP")); + searchBox.AddCriteria("IPAddress", GetLocalizedString("SearchField.IPAddress")); + } + + // toggle columns + bool isUserSelected = PanelSecurity.SelectedUser.Role == WebsitePanel.EnterpriseServer.UserRole.User; + gvServers.Columns[3].Visible = !isUserSelected; + gvServers.Columns[4].Visible = !isUserSelected; + + // check package quotas + bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + + btnCreate.Visible = manageAllowed; + btnImport.Visible = (PanelSecurity.EffectiveUser.Role == UserRole.Administrator); + gvServers.Columns[5].Visible = manageAllowed; // delete column + + // admin operations column + gvServers.Columns[6].Visible = (PanelSecurity.EffectiveUser.Role == UserRole.Administrator); + } + + public string GetServerEditUrl(string itemID) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vps_general", + "ItemID=" + itemID); + } + + public string GetSpaceHomeUrl(string spaceId) + { + return EditUrl("SpaceID", spaceId, ""); + } + + public string GetUserHomeUrl(int userId) + { + return PortalUtils.GetUserHomePageUrl(userId); + } + + protected void odsServersPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOXES", e.Exception); + e.ExceptionHandled = true; + } + } + + protected void btnCreate_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vdc_create_server")); + } + + protected void btnImport_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vdc_import_server")); + } + + protected void gvServers_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + // get server ID + int itemId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + // go to delete page + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vps_tools_delete", + "ItemID=" + itemId)); + } + else if (e.CommandName == "Detach") + { + // remove item from meta base + int itemId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + int result = ES.Services.Packages.DetachPackageItem(itemId); + if (result < 0) + { + ShowResultMessage(result); + return; + } + + // refresh the list + gvServers.DataBind(); + } + else if (e.CommandName == "Move") + { + // get server ID + int itemId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + // go to delete page + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vps_tools_move", + "ItemID=" + itemId)); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.designer.cs new file mode 100644 index 00000000..0425a5ad --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcHome.ascx.designer.cs @@ -0,0 +1,177 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcHome { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnCreate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreate; + + /// + /// btnImport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnImport; + + /// + /// searchBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.SearchBox searchBox; + + /// + /// gvServers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvServers; + + /// + /// odsServersPaged control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsServersPaged; + + /// + /// secQuotas control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secQuotas; + + /// + /// QuotasPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel QuotasPanel; + + /// + /// locVpsQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locVpsQuota; + + /// + /// vpsQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota vpsQuota; + + /// + /// locRamQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRamQuota; + + /// + /// ramQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota ramQuota; + + /// + /// locHddQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHddQuota; + + /// + /// hddQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota hddQuota; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx new file mode 100644 index 00000000..c9e4f6e5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx @@ -0,0 +1,283 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcImportServer.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcImportServer" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CheckBoxOption.ascx" TagName="CheckBoxOption" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + +
 
+ +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+
+ + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + +
+ + + +
+ + + +
+
+ + + + + + + + + + + + + +
+ + + +
+ + + + + +
+
+ + + + + + + + + + + + + +
+ + + +
+ + + + + +
+
+
+ +

+ + +

+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.cs new file mode 100644 index 00000000..11a4c795 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.cs @@ -0,0 +1,231 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Data; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcImportServer : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + // bind hyper-V services + BindHyperVServices(); + + // bind virtual machines + BindVirtualMachines(); + + // bind OS templates + BindOsTemplates(); + + // bind IP addresses + BindExternalAddresses(); + BindManagementAddresses(); + } + + ToggleControls(); + } + + private void ToggleControls() + { + AdminPasswordPanel.Visible = EnableRemoteDesktop.Checked; + RequiredAdminPassword.Enabled = EnableRemoteDesktop.Checked; + VirtualMachinePanel.Visible = (VirtualMachines.SelectedValue != ""); + ExternalAddressesRow.Visible = (ExternalAdapters.SelectedIndex != 0); + ManagementAddressesRow.Visible = (ManagementAdapters.SelectedIndex != 0); + } + + public void BindHyperVServices() + { + // bind + HyperVServices.DataSource = ES.Services.Servers.GetRawServicesByGroupName(ResourceGroups.VPS2012).Tables[0].DefaultView; + HyperVServices.DataBind(); + + // add select value + HyperVServices.Items.Insert(0, new ListItem(GetLocalizedString("SelectHyperVService.Text"), "")); + } + + public void BindVirtualMachines() + { + // clear list + VirtualMachines.Items.Clear(); + + // bind + int serviceId = Utils.ParseInt(HyperVServices.SelectedValue, 0); + if (serviceId > 0) + { + VirtualMachines.DataSource = ES.Services.VPS2012.GetVirtualMachinesByServiceId(serviceId); + VirtualMachines.DataBind(); + } + + // add select value + VirtualMachines.Items.Insert(0, new ListItem(GetLocalizedString("SelectVirtualMachine.Text"), "")); + } + + public void BindOsTemplates() + { + // clear list + OsTemplates.Items.Clear(); + + int serviceId = Utils.ParseInt(HyperVServices.SelectedValue, 0); + if (serviceId > 0) + { + OsTemplates.DataSource = ES.Services.VPS2012.GetOperatingSystemTemplatesByServiceId(serviceId); + OsTemplates.DataBind(); + } + OsTemplates.Items.Insert(0, new ListItem(GetLocalizedString("SelectOsTemplate.Text"), "")); + } + + public void BindVirtualMachineDetails() + { + int serviceId = Utils.ParseInt(HyperVServices.SelectedValue, 0); + string vmId = VirtualMachines.SelectedValue; + if (serviceId > 0 && vmId != "") + { + VirtualMachine vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(serviceId, vmId); + if (vm != null) + { + // bind VM + CpuCores.Text = vm.CpuCores.ToString(); + RamSize.Text = vm.RamSize.ToString(); + HddSize.Text = vm.HddSize.ToString(); + VhdPath.Text = vm.VirtualHardDrivePath; + + // other settings + NumLockEnabled.Value = vm.NumLockEnabled; + BootFromCd.Value = vm.BootFromCD; + DvdInstalled.Value = vm.DvdDriveInstalled; + + // network adapters + ExternalAdapters.DataSource = vm.Adapters; + ExternalAdapters.DataBind(); + ExternalAdapters.Items.Insert(0, new ListItem(GetLocalizedString("SelectNetworkAdapter.Text"), "")); + + ManagementAdapters.DataSource = vm.Adapters; + ManagementAdapters.DataBind(); + ManagementAdapters.Items.Insert(0, new ListItem(GetLocalizedString("SelectNetworkAdapter.Text"), "")); + } + } + } + + public void BindExternalAddresses() + { + BindAddresses(ExternalAddresses, IPAddressPool.VpsExternalNetwork); + } + + public void BindManagementAddresses() + { + BindAddresses(ManagementAddresses, IPAddressPool.VpsManagementNetwork); + } + + public void BindAddresses(ListBox list, IPAddressPool pool) + { + IPAddressInfo[] ips = ES.Services.Servers.GetUnallottedIPAddresses(PanelSecurity.PackageId, ResourceGroups.VPS2012, pool); + foreach (IPAddressInfo ip in ips) + { + string txt = ip.ExternalIP; + if (!String.IsNullOrEmpty(ip.DefaultGateway)) + txt += "/" + ip.DefaultGateway; + list.Items.Add(new ListItem(txt, ip.AddressId.ToString())); + } + } + + protected void btnImport_Click(object sender, EventArgs e) + { + try + { + // external IPs + List extIps = new List(); + foreach (ListItem li in ExternalAddresses.Items) + if (li.Selected) extIps.Add(Utils.ParseInt(li.Value)); + + // management IPs + int manIp = 0; + foreach (ListItem li in ManagementAddresses.Items) + if (li.Selected) + { + manIp = Utils.ParseInt(li.Value); + break; + } + + // create virtual machine + IntResult res = ES.Services.VPS2012.ImportVirtualMachine(PanelSecurity.PackageId, + Utils.ParseInt(HyperVServices.SelectedValue), + VirtualMachines.SelectedValue, + OsTemplates.SelectedValue, adminPassword.Text, + AllowStartShutdown.Checked, AllowPause.Checked, AllowReboot.Checked, AllowReset.Checked, false, + ExternalAdapters.SelectedValue, extIps.ToArray(), + ManagementAdapters.SelectedValue, manIp); + + if (res.IsSuccess) + { + Response.Redirect(EditUrl("ItemID", res.Value.ToString(), "vps_general", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_IMPORT", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_IMPORT", ex); + } + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "")); + } + + protected void HyperVServices_SelectedIndexChanged(object sender, EventArgs e) + { + // bind VMs + BindVirtualMachines(); + + // bind OS templates + BindOsTemplates(); + } + + protected void VirtualMachines_SelectedIndexChanged(object sender, EventArgs e) + { + BindVirtualMachineDetails(); + ToggleControls(); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.designer.cs new file mode 100644 index 00000000..6b29702f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcImportServer.ascx.designer.cs @@ -0,0 +1,627 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcImportServer { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locHyperVService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHyperVService; + + /// + /// HyperVServices control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList HyperVServices; + + /// + /// RequireHyperVService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequireHyperVService; + + /// + /// locVirtualMachine control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locVirtualMachine; + + /// + /// VirtualMachines control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList VirtualMachines; + + /// + /// RequiredVirtualMachine control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredVirtualMachine; + + /// + /// secOsTemplate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secOsTemplate; + + /// + /// OsTemplatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel OsTemplatePanel; + + /// + /// locOsTemplate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOsTemplate; + + /// + /// OsTemplates control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList OsTemplates; + + /// + /// RequiredOsTemplate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredOsTemplate; + + /// + /// EnableRemoteDesktop control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox EnableRemoteDesktop; + + /// + /// AdminPasswordPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow AdminPasswordPanel; + + /// + /// locAdminPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAdminPassword; + + /// + /// adminPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox adminPassword; + + /// + /// RequiredAdminPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredAdminPassword; + + /// + /// VirtualMachinePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel VirtualMachinePanel; + + /// + /// secConfiguration control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secConfiguration; + + /// + /// ConfigurationPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ConfigurationPanel; + + /// + /// locCPU control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCPU; + + /// + /// CpuCores control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal CpuCores; + + /// + /// locRAM control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRAM; + + /// + /// RamSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal RamSize; + + /// + /// locHDD control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHDD; + + /// + /// HddSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal HddSize; + + /// + /// locVhdPath control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locVhdPath; + + /// + /// VhdPath control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal VhdPath; + + /// + /// secBios control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secBios; + + /// + /// BiosPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel BiosPanel; + + /// + /// BootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption BootFromCd; + + /// + /// locBootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locBootFromCd; + + /// + /// NumLockEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption NumLockEnabled; + + /// + /// locNumLockEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNumLockEnabled; + + /// + /// secDvd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secDvd; + + /// + /// DvdPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel DvdPanel; + + /// + /// DvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption DvdInstalled; + + /// + /// locDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDvdInstalled; + + /// + /// secAllowedActions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secAllowedActions; + + /// + /// AllowedActionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel AllowedActionsPanel; + + /// + /// AllowStartShutdown control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox AllowStartShutdown; + + /// + /// AllowReboot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox AllowReboot; + + /// + /// AllowPause control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox AllowPause; + + /// + /// AllowReset control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox AllowReset; + + /// + /// secExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secExternalNetwork; + + /// + /// ExternalNetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ExternalNetworkPanel; + + /// + /// locExternalAdapter control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAdapter; + + /// + /// ExternalAdapters control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ExternalAdapters; + + /// + /// ExternalAddressesRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ExternalAddressesRow; + + /// + /// locExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAddresses; + + /// + /// ExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ListBox ExternalAddresses; + + /// + /// RequiredExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredExternalAddresses; + + /// + /// secManagementNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secManagementNetwork; + + /// + /// ManagementNetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ManagementNetworkPanel; + + /// + /// locManagementAdapter control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locManagementAdapter; + + /// + /// ManagementAdapters control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ManagementAdapters; + + /// + /// ManagementAddressesRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ManagementAddressesRow; + + /// + /// locManagementAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locManagementAddresses; + + /// + /// ManagementAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ListBox ManagementAddresses; + + /// + /// RequiredManagementAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredManagementAddresses; + + /// + /// btnImport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnImport; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx new file mode 100644 index 00000000..60247599 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx @@ -0,0 +1,39 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcManagementNetwork.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcManagementNetwork" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %> + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.cs new file mode 100644 index 00000000..121d9c43 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.cs @@ -0,0 +1,44 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcManagementNetwork : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.designer.cs new file mode 100644 index 00000000..55cc9f69 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcManagementNetwork.ascx.designer.cs @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcManagementNetwork { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// packageAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.PackageIPAddresses packageAddresses; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx new file mode 100644 index 00000000..5e4cbd79 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx @@ -0,0 +1,121 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcPermissions.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcPermissions" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.cs new file mode 100644 index 00000000..b36dba6d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.cs @@ -0,0 +1,56 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcPermissions : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnUpdateVdcPermissions_Click(object sender, EventArgs e) + { + System.Threading.Thread.Sleep(5000); + messageBox.ShowSuccessMessage("VDC_PERMISSIONS_VDC_UPDATED"); + } + + protected void btnUpdateVpsPermissions_Click(object sender, EventArgs e) + { + System.Threading.Thread.Sleep(5000); + messageBox.ShowSuccessMessage("VDC_PERMISSIONS_VPS_UPDATED"); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.designer.cs new file mode 100644 index 00000000..48ccd1ab --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPermissions.ascx.designer.cs @@ -0,0 +1,141 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcPermissions { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secVdcPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secVdcPermissions; + + /// + /// VdcPermissionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel VdcPermissionsPanel; + + /// + /// gvVdcPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvVdcPermissions; + + /// + /// btnUpdateVdcPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnUpdateVdcPermissions; + + /// + /// secVpsPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secVpsPermissions; + + /// + /// VpsPermissionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel VpsPermissionsPanel; + + /// + /// gvVpsPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvVpsPermissions; + + /// + /// btnUpdateVpsPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnUpdateVpsPermissions; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx new file mode 100644 index 00000000..694c1296 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx @@ -0,0 +1,98 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VdcPrivateNetwork.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VdcPrivateNetwork" %> +<%@ Import Namespace="WebsitePanel.Portal" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/SearchBox.ascx" TagName="SearchBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/Quota.ascx" TagName="Quota" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + +
+
+
+
+ +
+
+ + + + + + + + + <%# Eval("ItemName") %> + + + + + + +   + + + + + + + + + + + +
+ + + + + + + + + + +
+ + +
+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.cs new file mode 100644 index 00000000..62f0076e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.WebPortal; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VdcPrivateNetwork : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + searchBox.AddCriteria("IPAddress", GetLocalizedString("SearchField.IPAddress")); + searchBox.AddCriteria("ItemName", GetLocalizedString("SearchField.ItemName")); + } + } + + public string GetServerEditUrl(string itemID) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "vps_general", + "ItemID=" + itemID); + } + + protected void odsPrivateAddressesPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_MAILBOXES", e.Exception); + e.ExceptionHandled = true; + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.designer.cs new file mode 100644 index 00000000..94d7c078 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VdcPrivateNetwork.ascx.designer.cs @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VdcPrivateNetwork { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// searchBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.SearchBox searchBox; + + /// + /// gvAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvAddresses; + + /// + /// odsPrivateAddressesPaged control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsPrivateAddressesPaged; + + /// + /// secQuotas control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secQuotas; + + /// + /// QuotasPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel QuotasPanel; + + /// + /// locVpsAddressesQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locVpsAddressesQuota; + + /// + /// addressesPerVps control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Quota addressesPerVps; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx new file mode 100644 index 00000000..2151135a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="VirtualMachineImage.ashx.cs" Class="WebsitePanel.Portal.VPS2012.VirtualMachineImage" %> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx.cs new file mode 100644 index 00000000..4b09917e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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.Text; +using System.Web; +using System.Web.Services; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.VPS2012 +{ + /// + /// Summary description for $codebehindclassname$ + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + public class VirtualMachineImage : IHttpHandler + { + + public void ProcessRequest(HttpContext context) + { + context.Response.Clear(); + context.Response.ContentType = "image/png"; + + int itemId = Utils.ParseInt(context.Request.QueryString["ItemID"]); + byte[] buffer = ES.Services.VPS2012.GetVirtualMachineThumbnail(itemId, + WebsitePanel.Providers.Virtualization.ThumbnailSize.Medium160x120); + if (buffer != null) + { + context.Response.OutputStream.Write(buffer, 0, buffer.Length); + } + } + + public bool IsReusable + { + get + { + return false; + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx new file mode 100644 index 00000000..4ce22da5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="VirtualMachineSnapshotImage.ashx.cs" Class="WebsitePanel.Portal.VPS2012.VirtualMachineSnapshotImage" %> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx.cs new file mode 100644 index 00000000..12ad091c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx.cs @@ -0,0 +1,71 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.Services; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.VPS2012 +{ + /// + /// Summary description for $codebehindclassname$ + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + public class VirtualMachineSnapshotImage : IHttpHandler + { + + public void ProcessRequest(HttpContext context) + { + context.Response.Clear(); + context.Response.ContentType = "image/png"; + + HttpRequest req = context.Request; + + int itemId = Utils.ParseInt(req["ItemID"]); + string snapshotId = req["SnapshotID"]; + + byte[] res = ES.Services.VPS2012.GetSnapshotThumbnail(itemId, snapshotId, + WebsitePanel.Providers.Virtualization.ThumbnailSize.Medium160x120); + if (res != null) + { + context.Response.OutputStream.Write(res, 0, res.Length); + } + } + + public bool IsReusable + { + get + { + return false; + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx new file mode 100644 index 00000000..84bcae9d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx @@ -0,0 +1,101 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsAddExternalAddress.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsAddExternalAddress" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + +

+ +

+ +
+ +
+ + + + + + + + + + + + + + +
+ +
+ + + + + * + + +
+ +
+ +
+ +
+ +

+ + +

+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.cs new file mode 100644 index 00000000..3cfabfb0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.cs @@ -0,0 +1,119 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsAddExternalAddress : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + ToggleControls(); + + if (!IsPostBack) + { + BindExternalIPAddresses(); + } + } + + private void BindExternalIPAddresses() + { + PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.VpsExternalNetwork); + foreach (PackageIPAddress ip in ips) + { + string txt = ip.ExternalIP; + if (!String.IsNullOrEmpty(ip.DefaultGateway)) + txt += "/" + ip.DefaultGateway; + listExternalAddresses.Items.Add(new ListItem(txt, ip.PackageAddressID.ToString())); + } + + // toggle controls + int maxAddresses = listExternalAddresses.Items.Count; + litMaxExternalAddresses.Text = String.Format(GetLocalizedString("litMaxExternalAddresses.Text"), maxAddresses); + + bool empty = maxAddresses == 0; + EmptyExternalAddressesMessage.Visible = empty; + ExternalAddressesTable.Visible = !empty; + btnAdd.Enabled = !empty; + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + RedirectBack(); + } + + private void RedirectBack() + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_network", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + private void ToggleControls() + { + // external network + ExternalAddressesNumberRow.Visible = radioExternalRandom.Checked; + ExternalAddressesListRow.Visible = radioExternalSelected.Checked; + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + int number = Utils.ParseInt(txtExternalAddressesNumber.Text.Trim(), 0); + List addressIds = new List(); + foreach (ListItem li in listExternalAddresses.Items) + if (li.Selected) + addressIds.Add(Utils.ParseInt(li.Value, 0)); + + try + { + ResultObject res = ES.Services.VPS2012.AddVirtualMachineExternalIPAddresses(PanelRequest.ItemID, + radioExternalRandom.Checked, number, addressIds.ToArray()); + + if (res.IsSuccess) + { + RedirectBack(); + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_ADDING_IP_ADDRESS", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_ADDING_IP_ADDRESS", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.designer.cs new file mode 100644 index 00000000..3608ce14 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx.designer.cs @@ -0,0 +1,231 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsAddExternalAddress { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// EmptyExternalAddressesMessage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl EmptyExternalAddressesMessage; + + /// + /// locNotEnoughExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNotEnoughExternalAddresses; + + /// + /// ExternalAddressesTable control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable ExternalAddressesTable; + + /// + /// radioExternalRandom control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioExternalRandom; + + /// + /// ExternalAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ExternalAddressesNumberRow; + + /// + /// locExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExternalAddresses; + + /// + /// txtExternalAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtExternalAddressesNumber; + + /// + /// ExternalAddressesValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator ExternalAddressesValidator; + + /// + /// litMaxExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litMaxExternalAddresses; + + /// + /// radioExternalSelected control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioExternalSelected; + + /// + /// ExternalAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow ExternalAddressesListRow; + + /// + /// listExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ListBox listExternalAddresses; + + /// + /// locHoldCtrl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHoldCtrl; + + /// + /// btnAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAdd; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx new file mode 100644 index 00000000..868b526e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx @@ -0,0 +1,96 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsAddPrivateAddress.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsAddPrivateAddress" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + +

+ +

+ + + + + + + + + + + + + + +
+ +
+ + + + + * + + +
+ +
+ +
+ +
+ +

+ + +

+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.cs new file mode 100644 index 00000000..76f01916 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.cs @@ -0,0 +1,118 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsAddPrivateAddress : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindControls(); + } + + ToggleControls(); + } + + private void BindControls() + { + // load adapter details + NetworkAdapterDetails nic = ES.Services.VPS2012.GetPrivateNetworkAdapterDetails(PanelRequest.ItemID); + + // load package context + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER)) + { + // set max number + QuotaValueInfo privQuota = cntx.Quotas[Quotas.VPS2012_PRIVATE_IP_ADDRESSES_NUMBER]; + int maxPrivate = privQuota.QuotaAllocatedValue; + if (maxPrivate == -1) + maxPrivate = 10; + + maxPrivate -= nic.IPAddresses.Length; + + txtPrivateAddressesNumber.Text = maxPrivate.ToString(); + litMaxPrivateAddresses.Text = String.Format(GetLocalizedString("litMaxPrivateAddresses.Text"), maxPrivate); + btnAdd.Enabled = maxPrivate > 0; + } + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + int number = Utils.ParseInt(txtPrivateAddressesNumber.Text.Trim(), 0); + string[] privIps = Utils.ParseDelimitedString(txtPrivateAddressesList.Text, '\n', '\r', ' ', '\t'); + + try + { + ResultObject res = ES.Services.VPS2012.AddVirtualMachinePrivateIPAddresses(PanelRequest.ItemID, + radioPrivateRandom.Checked, number, privIps); + + if (res.IsSuccess) + { + RedirectBack(); + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_ADDING_IP_ADDRESS", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_ADDING_IP_ADDRESS", ex); + } + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + RedirectBack(); + } + + private void RedirectBack() + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_network", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + private void ToggleControls() + { + // private network + PrivateAddressesNumberRow.Visible = radioPrivateRandom.Checked; + PrivateAddressesListRow.Visible = radioPrivateSelected.Checked; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.designer.cs new file mode 100644 index 00000000..3ebff9d0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx.designer.cs @@ -0,0 +1,213 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsAddPrivateAddress { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// tablePrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable tablePrivateNetwork; + + /// + /// radioPrivateRandom control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioPrivateRandom; + + /// + /// PrivateAddressesNumberRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow PrivateAddressesNumberRow; + + /// + /// locPrivateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivateAddresses; + + /// + /// txtPrivateAddressesNumber control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPrivateAddressesNumber; + + /// + /// PrivateAddressesValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator PrivateAddressesValidator; + + /// + /// litMaxPrivateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litMaxPrivateAddresses; + + /// + /// radioPrivateSelected control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton radioPrivateSelected; + + /// + /// PrivateAddressesListRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow PrivateAddressesListRow; + + /// + /// txtPrivateAddressesList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPrivateAddressesList; + + /// + /// locOnePerLine control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOnePerLine; + + /// + /// btnAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAdd; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx new file mode 100644 index 00000000..f5036c28 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx @@ -0,0 +1,37 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsAuditLog.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsAuditLog" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/AuditLogControl.ascx" TagName="AuditLogControl" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.cs new file mode 100644 index 00000000..47d49b34 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.cs @@ -0,0 +1,44 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsAuditLog : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.designer.cs new file mode 100644 index 00000000..d629a48c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx.designer.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsAuditLog { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// auditLog control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.AuditLogControl auditLog; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx new file mode 100644 index 00000000..2dbb9845 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx @@ -0,0 +1,257 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsConfiguration.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsConfiguration" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CheckBoxOption.ascx" TagName="CheckBoxOption" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ +
+ ******** + +
+
+ + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + +
+ +
+
+ + + + + + + + + +
+ +
+
+ + + + + + + + +
+ +
+
+ + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+
+ + + + + + + + + + + +
+
+
+
+ +

+ +

+ + +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.cs new file mode 100644 index 00000000..18ec2f17 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.cs @@ -0,0 +1,132 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsConfiguration : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack && Request["action"] == "changed") + messageBox.ShowSuccessMessage("VPS_CHANGE_VM_CONFIGURATION"); + + if (!IsPostBack) + { + // config + BindConfiguration(); + + // bind password policy + password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.VPS_POLICY, "AdministratorPasswordPolicy"); + } + } + + private void BindConfiguration() + { + VirtualMachine vm = null; + + try + { + // load machine + vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); + + if (vm == null) + { + messageBox.ShowErrorMessage("VPS_LOAD_VM_META_ITEM"); + return; + } + + // bind item + litOperatingSystem.Text = vm.OperatingSystemTemplate; + + litCpu.Text = String.Format(GetLocalizedString("CpuCores.Text"), vm.CpuCores); + litRam.Text = String.Format(GetLocalizedString("Ram.Text"), vm.RamSize); + litHdd.Text = String.Format(GetLocalizedString("Hdd.Text"), vm.HddSize); + litSnapshots.Text = vm.SnapshotsNumber.ToString(); + + optionDvdInstalled.Value = vm.DvdDriveInstalled; + optionBootFromCD.Value = vm.BootFromCD; + optionNumLock.Value = vm.NumLockEnabled; + + optionStartShutdown.Value = vm.StartTurnOffAllowed; + optionPauseResume.Value = vm.PauseResumeAllowed; + optionReset.Value = vm.ResetAllowed; + optionReboot.Value = vm.RebootAllowed; + optionReinstall.Value = vm.ReinstallAllowed; + + optionExternalNetwork.Value = vm.ExternalNetworkEnabled; + optionPrivateNetwork.Value = vm.PrivateNetworkEnabled; + + // toggle buttons + bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + btnEdit.Visible = manageAllowed; + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_LOAD_VM_META_ITEM", ex); + } + } + + protected void btnChangePassword_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.ChangeAdministratorPassword(PanelRequest.ItemID, password.Password); + + if (res.IsSuccess) + { + // show success message + messageBox.ShowSuccessMessage("VPS_CHANGE_ADMIN_PASSWORD"); + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_CHANGE_ADMIN_PASSWORD", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_CHANGE_ADMIN_PASSWORD", ex); + } + } + + protected void btnEdit_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_edit_config", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.designer.cs new file mode 100644 index 00000000..ba604a17 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx.designer.cs @@ -0,0 +1,474 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsConfiguration { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secSoftware control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secSoftware; + + /// + /// SoftwarePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SoftwarePanel; + + /// + /// locOperatingSystem control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locOperatingSystem; + + /// + /// litOperatingSystem control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litOperatingSystem; + + /// + /// locAdministratorPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAdministratorPassword; + + /// + /// btnChangePasswordPopup control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnChangePasswordPopup; + + /// + /// secResources control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secResources; + + /// + /// ResourcesPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ResourcesPanel; + + /// + /// lblCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize lblCpu; + + /// + /// litCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCpu; + + /// + /// lblRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize lblRam; + + /// + /// litRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litRam; + + /// + /// lblHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize lblHdd; + + /// + /// litHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHdd; + + /// + /// secSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secSnapshots; + + /// + /// SnapshotsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SnapshotsPanel; + + /// + /// locSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSnapshots; + + /// + /// litSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litSnapshots; + + /// + /// secDvd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secDvd; + + /// + /// DvdPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel DvdPanel; + + /// + /// optionDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionDvdInstalled; + + /// + /// secBios control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secBios; + + /// + /// BiosPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel BiosPanel; + + /// + /// optionBootFromCD control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionBootFromCD; + + /// + /// optionNumLock control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionNumLock; + + /// + /// secActions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secActions; + + /// + /// ActionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ActionsPanel; + + /// + /// optionStartShutdown control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionStartShutdown; + + /// + /// optionReset control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReset; + + /// + /// optionPauseResume control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionPauseResume; + + /// + /// optionReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReinstall; + + /// + /// optionReboot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionReboot; + + /// + /// secNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secNetwork; + + /// + /// NetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel NetworkPanel; + + /// + /// optionExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionExternalNetwork; + + /// + /// optionPrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.CheckBoxOption optionPrivateNetwork; + + /// + /// btnEdit control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnEdit; + + /// + /// ChangePasswordPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ChangePasswordPanel; + + /// + /// locChangePassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locChangePassword; + + /// + /// locNewPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNewPassword; + + /// + /// password control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.PasswordControl password; + + /// + /// btnChangePassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnChangePassword; + + /// + /// btnCancelChangePassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancelChangePassword; + + /// + /// ChangePasswordModal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ModalPopupExtender ChangePasswordModal; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx new file mode 100644 index 00000000..024aeec9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx @@ -0,0 +1,62 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsDvd.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsDvd" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.cs new file mode 100644 index 00000000..d8be6bad --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.cs @@ -0,0 +1,101 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.Common; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsDvd : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack && Request["action"] == "inserted") + messageBox.ShowSuccessMessage("VPS_DVD_INSERTED"); + + if (!IsPostBack) + { + BindDvdDisk(); + } + } + + private void BindDvdDisk() + { + LibraryItem disk = ES.Services.VPS2012.GetInsertedDvdDisk(PanelRequest.ItemID); + + if (disk != null) + { + txtInsertedDisk.Text = disk.Name; + btnInsertDisk.Enabled = false; + btnEjectDisk.Enabled = true; + } + else + { + txtInsertedDisk.Text = GetLocalizedString("NoDisk.Text"); + btnInsertDisk.Enabled = true; + btnEjectDisk.Enabled = false; + } + } + + protected void btnInsertDisk_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_insert_dvd", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void btnEjectDisk_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.EjectDvdDisk(PanelRequest.ItemID); + + if (res.IsSuccess) + { + // re-bind + messageBox.ShowSuccessMessage("VPS_DVD_EJECTED"); + BindDvdDisk(); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_EJECT_DVD_DISK", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_EJECT_DVD_DISK", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.designer.cs new file mode 100644 index 00000000..a53e046c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsDvd.ascx.designer.cs @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsDvd { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locDvdDrive control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDvdDrive; + + /// + /// txtInsertedDisk control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtInsertedDisk; + + /// + /// btnInsertDisk control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnInsertDisk; + + /// + /// btnEjectDisk control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnEjectDisk; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx new file mode 100644 index 00000000..6db26b25 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx @@ -0,0 +1,201 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsEditConfiguration.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsEditConfiguration" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + +

+ +

+ + + + + + + + + + + + +
+ + +
+ + + + + + +
+ + * +
+ + + + + + +
+ + * +
+
+ + <%-- Additional Custom Settings. Provider Control --%> + + + + + + + + + + +
+ + + * +
+
+ + + + + + + + +
+ +
+
+ + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+
+ + + + + + + + + + + +
+ +
+ +
+
+ +

+ + +

+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.cs new file mode 100644 index 00000000..8d5c08be --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.cs @@ -0,0 +1,209 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.Common; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsEditConfiguration : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + LoadCustomProviderControls(); + + if (!IsPostBack) + { + BindConfiguration(); + } + } + + private void LoadCustomProviderControls() + { + try + { + LoadProviderControl(PanelSecurity.PackageId, "VPS2012", editSettingsProviderControl, "Edit.ascx"); + } + catch { /* skip */ } + } + + private IVirtualMachineSettingsControl EditSettingsProviderControl + { + get + { + if (editSettingsProviderControl.Controls.Count == 0) + return null; + + return (IVirtualMachineSettingsControl)editSettingsProviderControl.Controls[0]; + } + } + + private void BindConfiguration() + { + VirtualMachine vm = null; + + try + { + // load machine + vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); + + if (vm == null) + { + messageBox.ShowErrorMessage("VPS_LOAD_VM_META_ITEM"); + return; + } + + // bind CPU cores + int maxCores = ES.Services.VPS2012.GetMaximumCpuCoresNumber(vm.PackageId); + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + if (cntx.Quotas.ContainsKey(Quotas.VPS2012_CPU_NUMBER)) + { + QuotaValueInfo cpuQuota = cntx.Quotas[Quotas.VPS2012_CPU_NUMBER]; + + if (cpuQuota.QuotaAllocatedValue != -1 + && maxCores > cpuQuota.QuotaAllocatedValue) + maxCores = cpuQuota.QuotaAllocatedValue; + } + + for (int i = 1; i < maxCores + 1; i++) + ddlCpu.Items.Add(i.ToString()); + + // bind item + ddlCpu.SelectedValue = vm.CpuCores.ToString(); + txtRam.Text = vm.RamSize.ToString(); + txtHdd.Text = vm.HddSize.ToString(); + txtSnapshots.Text = vm.SnapshotsNumber.ToString(); + + chkDvdInstalled.Checked = vm.DvdDriveInstalled; + chkBootFromCd.Checked = vm.BootFromCD; + chkNumLock.Checked = vm.NumLockEnabled; + + chkStartShutdown.Checked = vm.StartTurnOffAllowed; + chkPauseResume.Checked = vm.PauseResumeAllowed; + chkReset.Checked = vm.ResetAllowed; + chkReboot.Checked = vm.RebootAllowed; + chkReinstall.Checked = vm.ReinstallAllowed; + + chkExternalNetworkEnabled.Checked = vm.ExternalNetworkEnabled; + chkPrivateNetworkEnabled.Checked = vm.PrivateNetworkEnabled; + + // the custom provider control + if (EditSettingsProviderControl != null) EditSettingsProviderControl.BindItem(vm); + + // other quotas + BindCheckboxOption(chkDvdInstalled, Quotas.VPS2012_DVD_ENABLED); + chkBootFromCd.Enabled = PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS2012_BOOT_CD_ALLOWED); + + BindCheckboxOption(chkStartShutdown, Quotas.VPS2012_START_SHUTDOWN_ALLOWED); + BindCheckboxOption(chkPauseResume, Quotas.VPS2012_PAUSE_RESUME_ALLOWED); + BindCheckboxOption(chkReset, Quotas.VPS2012_RESET_ALOWED); + BindCheckboxOption(chkReboot, Quotas.VPS2012_REBOOT_ALLOWED); + BindCheckboxOption(chkReinstall, Quotas.VPS2012_REINSTALL_ALLOWED); + + BindCheckboxOption(chkExternalNetworkEnabled, Quotas.VPS2012_EXTERNAL_NETWORK_ENABLED); + BindCheckboxOption(chkPrivateNetworkEnabled, Quotas.VPS2012_PRIVATE_NETWORK_ENABLED); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_LOAD_VM_META_ITEM", ex); + } + } + + private void BindCheckboxOption(CheckBox chk, string quotaName) + { + chk.Enabled = PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, quotaName); + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + RedirectBack("cancel"); + } + + private void RedirectBack(string action) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_config", + "SpaceID=" + PanelSecurity.PackageId.ToString(), + "action=" + action)); + } + + protected void btnUpdate_Click(object sender, EventArgs e) + { + try + { + // check rights + bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + if (!manageAllowed) + { + return; + } + + VirtualMachine virtualMachine = new VirtualMachine(); + + // the custom provider control + if (EditSettingsProviderControl != null) EditSettingsProviderControl.SaveItem(virtualMachine); + + ResultObject res = ES.Services.VPS2012.UpdateVirtualMachineConfiguration(PanelRequest.ItemID, + Utils.ParseInt(ddlCpu.SelectedValue), + Utils.ParseInt(txtRam.Text.Trim()), + Utils.ParseInt(txtHdd.Text.Trim()), + Utils.ParseInt(txtSnapshots.Text.Trim()), + chkDvdInstalled.Checked, + chkBootFromCd.Checked, + chkNumLock.Checked, + chkStartShutdown.Checked, + chkPauseResume.Checked, + chkReboot.Checked, + chkReset.Checked, + chkReinstall.Checked, + chkExternalNetworkEnabled.Checked, + chkPrivateNetworkEnabled.Checked); + + if (res.IsSuccess) + { + // redirect back + RedirectBack("changed"); + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_CHANGE_VM_CONFIGURATION", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_CHANGE_VM_CONFIGURATION", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.designer.cs new file mode 100644 index 00000000..e8e223a8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx.designer.cs @@ -0,0 +1,447 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsEditConfiguration { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// secResources control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secResources; + + /// + /// ResourcesPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ResourcesPanel; + + /// + /// lblCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblCpu; + + /// + /// ddlCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlCpu; + + /// + /// locCores control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCores; + + /// + /// lblRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblRam; + + /// + /// txtRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtRam; + + /// + /// RequireRamValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequireRamValidator; + + /// + /// locMB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMB; + + /// + /// lblHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblHdd; + + /// + /// txtHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtHdd; + + /// + /// RequireHddValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequireHddValidator; + + /// + /// locGB control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locGB; + + /// + /// editSettingsProviderControl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder editSettingsProviderControl; + + /// + /// secSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secSnapshots; + + /// + /// SnapshotsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SnapshotsPanel; + + /// + /// locSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSnapshots; + + /// + /// txtSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSnapshots; + + /// + /// SnapshotsValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator SnapshotsValidator; + + /// + /// secDvd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secDvd; + + /// + /// DvdPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel DvdPanel; + + /// + /// chkDvdInstalled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkDvdInstalled; + + /// + /// secBios control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secBios; + + /// + /// BiosPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel BiosPanel; + + /// + /// chkBootFromCd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkBootFromCd; + + /// + /// chkNumLock control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkNumLock; + + /// + /// secActions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secActions; + + /// + /// ActionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ActionsPanel; + + /// + /// chkStartShutdown control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkStartShutdown; + + /// + /// chkReset control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReset; + + /// + /// chkPauseResume control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkPauseResume; + + /// + /// chkReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReinstall; + + /// + /// chkReboot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkReboot; + + /// + /// secNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secNetwork; + + /// + /// NetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel NetworkPanel; + + /// + /// chkExternalNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkExternalNetworkEnabled; + + /// + /// chkPrivateNetworkEnabled control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkPrivateNetworkEnabled; + + /// + /// btnUpdate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnUpdate; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx new file mode 100644 index 00000000..ef3ec791 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx @@ -0,0 +1,295 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsGeneral.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsGeneral" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/Gauge.ascx" TagName="Gauge" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + + + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + +
+ + + + + + + + + + +
+ +   + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + +
    + + +
  • + +
  • +
    +
    +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ +
+
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.cs new file mode 100644 index 00000000..48c6fa40 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.cs @@ -0,0 +1,299 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 WebsitePanel.Providers.Common; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Virtualization; +using System.Collections.Generic; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsGeneral : WebsitePanelModuleBase + { + private class ActionButton + { + public string Text { get; set; } + public string Command { get; set; } + public string Style { get; set; } + public string OnClientClick { get; set; } + } + + protected void Page_Load(object sender, EventArgs e) + { + BindGeneralDetails(); + } + + private void BindGeneralDetails() + { + VirtualMachine item = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + if (!String.IsNullOrEmpty(item.CurrentTaskId) + || item.ProvisioningStatus == VirtualMachineProvisioningStatus.Error) + { + DetailsTable.Visible = false; + return; + } + + VirtualMachine vm = null; + try + { + vm = ES.Services.VPS2012.GetVirtualMachineGeneralDetails(PanelRequest.ItemID); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_GET_VM_DETAILS", ex); + } + + if (vm != null) + { + bool displayRDP = (Request.Browser.Browser == "IE" + && Request.Browser.ActiveXControls + && Request.Browser.VBScript + && vm.State != VirtualMachineState.Off + && vm.State != VirtualMachineState.Paused + && vm.State != VirtualMachineState.Saved + && item.RemoteDesktopEnabled); + lnkHostname.Text = item.Hostname.ToUpper(); + lnkHostname.Visible = displayRDP; + + litHostname.Text = item.Hostname.ToUpper(); + litHostname.Visible = !displayRDP; + + litDomain.Text = item.Domain; + + if (!IsPostBack) + { + // set host name change form + txtHostname.Text = item.Hostname; + txtDomain.Text = item.Domain; + } + + litRdpPageUrl.Text = Page.ResolveUrl("~/DesktopModules/WebsitePanel/VPS2012/RemoteDesktop/Connect.aspx?ItemID=" + PanelRequest.ItemID + "&Resolution="); + + TimeSpan uptime = TimeSpan.FromMilliseconds(vm.Uptime); + uptime = uptime.Subtract(TimeSpan.FromMilliseconds(uptime.Milliseconds)); + litUptime.Text = uptime.ToString(); + litStatus.Text = GetLocalizedString("State." + vm.State); + litCreated.Text = vm.CreatedDate.ToString(); + litHeartbeat.Text = GetLocalizedString("Heartbeat." + vm.Heartbeat); + + // CPU + cpuGauge.Progress = vm.CpuUsage; + litCpuPercentage.Text = String.Format(GetLocalizedString("CpuPercentage.Text"), vm.CpuUsage); + + // RAM + if (vm.RamSize > 0) + { + int ramPercent = Convert.ToInt32((float)vm.RamUsage / (float)vm.RamSize * 100); + ramGauge.Total = vm.RamSize; + ramGauge.Progress = vm.RamUsage; + litRamPercentage.Text = String.Format(GetLocalizedString("MemoryPercentage.Text"), ramPercent); + litRamUsage.Text = String.Format(GetLocalizedString("MemoryUsage.Text"), vm.RamUsage, vm.RamSize); + } + + // HDD + if (vm.HddLogicalDisks != null && vm.HddLogicalDisks.Length > 0) + { + HddRow.Visible = true; + + int freeHdd = 0; + int sizeHdd = 0; + + foreach (LogicalDisk disk in vm.HddLogicalDisks) + { + freeHdd += disk.FreeSpace; + sizeHdd += disk.Size; + } + + int usedHdd = sizeHdd - freeHdd; + + int hddPercent = Convert.ToInt32((float)usedHdd / (float)sizeHdd * 100); + hddGauge.Total = sizeHdd; + hddGauge.Progress = usedHdd; + litHddPercentage.Text = String.Format(GetLocalizedString("HddPercentage.Text"), hddPercent); + litHddUsage.Text = String.Format(GetLocalizedString("HddUsage.Text"), freeHdd, sizeHdd, vm.HddLogicalDisks.Length); + } + + // update image + imgThumbnail.ImageUrl = + String.Format("~/DesktopModules/WebsitePanel/VPS2012/VirtualMachineImage.ashx?ItemID={0}&rnd={1}", + PanelRequest.ItemID, DateTime.Now.Ticks); + + // load virtual machine meta item + VirtualMachine vmi = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + + // draw buttons + List buttons = new List(); + + if (vmi.StartTurnOffAllowed + && (vm.State == VirtualMachineState.Off + || vm.State == VirtualMachineState.Saved)) + buttons.Add(CreateActionButton("Start", "start.png")); + + if (vm.State == VirtualMachineState.Running) + { + if(vmi.RebootAllowed) + buttons.Add(CreateActionButton("Reboot", "reboot.png")); + + if(vmi.StartTurnOffAllowed) + buttons.Add(CreateActionButton("ShutDown", "shutdown.png")); + } + + if (vmi.StartTurnOffAllowed + && (vm.State == VirtualMachineState.Running + || vm.State == VirtualMachineState.Paused)) + buttons.Add(CreateActionButton("TurnOff", "turnoff.png")); + + if (vmi.PauseResumeAllowed + && vm.State == VirtualMachineState.Running) + buttons.Add(CreateActionButton("Pause", "pause.png")); + + if (vmi.PauseResumeAllowed + && vm.State == VirtualMachineState.Paused) + buttons.Add(CreateActionButton("Resume", "start2.png")); + + if (vmi.ResetAllowed + && (vm.State == VirtualMachineState.Running + || vm.State == VirtualMachineState.Paused)) + buttons.Add(CreateActionButton("Reset", "reset2.png")); + + repButtons.DataSource = buttons; + repButtons.DataBind(); + + // other actions + bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + btnChangeHostnamePopup.Visible = manageAllowed; + } + else + { + DetailsTable.Visible = false; + messageBox.ShowErrorMessage("VPS_LOAD_VM_ITEM"); + } + } + + private ActionButton CreateActionButton(string command, string icon) + { + ActionButton btn = new ActionButton(); + btn.Command = command; + btn.Style = String.Format( + "background: transparent url({0}) left center no-repeat;", + PortalUtils.GetThemedImage(String.Format("VPS/{0}", icon))); + + string localizedText = GetLocalizedString("Command." + command); + btn.Text = localizedText != null ? localizedText : command; + + btn.OnClientClick = GetLocalizedString("OnClientClick." + command); + + return btn; + } + + protected void repButtons_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) + { + try + { + ResultObject res = null; + + string command = e.CommandName; + if (command == "Snapshot") + { + res = ES.Services.VPS2012.CreateSnapshot(PanelRequest.ItemID); + } + else + { + // parse command + VirtualMachineRequestedState state = (VirtualMachineRequestedState)Enum.Parse( + typeof(VirtualMachineRequestedState), command, true); + + // call services + res = ES.Services.VPS2012.ChangeVirtualMachineState(PanelRequest.ItemID, state); + } + + // check results + if (res.IsSuccess) + { + if (command == "Snapshot") + { + // go to snapshots screen + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_snapshots", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + else + { + // return + BindGeneralDetails(); + return; + } + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_CHANGE_VM_STATE", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_CHANGE_VM_STATE", ex); + } + } + + protected void btnChangeHostname_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + return; + + try + { + string hostname = String.Format("{0}.{1}", txtHostname.Text.Trim(), txtDomain.Text.Trim()); + + ResultObject res = ES.Services.VPS2012.UpdateVirtualMachineHostName(PanelRequest.ItemID, + hostname, chkUpdateComputerName.Checked); + + if (res.IsSuccess) + { + // show success message + messageBox.ShowSuccessMessage("VPS_CHANGE_VM_HOSTNAME"); + BindGeneralDetails(); + + // clear fields + //txtHostname.Text = ""; + //txtDomain.Text = ""; + chkUpdateComputerName.Checked = false; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_CHANGE_VM_HOSTNAME", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_CHANGE_VM_HOSTNAME", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.designer.cs new file mode 100644 index 00000000..11517fb3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsGeneral.ascx.designer.cs @@ -0,0 +1,609 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsGeneral { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// operationTimer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.Timer operationTimer; + + /// + /// litRdpPageUrl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litRdpPageUrl; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// DetailsTable control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable DetailsTable; + + /// + /// locHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHostname; + + /// + /// lnkHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkHostname; + + /// + /// litHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHostname; + + /// + /// btnChangeHostnamePopup control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnChangeHostnamePopup; + + /// + /// RdpPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel RdpPanel; + + /// + /// imgRdc control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgRdc; + + /// + /// locRdpText control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRdpText; + + /// + /// lnkRdpFull control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkRdpFull; + + /// + /// lnkRdp800 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkRdp800; + + /// + /// lnkRdp1024 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkRdp1024; + + /// + /// lnkRdp1280 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkRdp1280; + + /// + /// RdpPopup control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.PopupControlExtender RdpPopup; + + /// + /// RdpShadow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.DropShadowExtender RdpShadow; + + /// + /// locDomainTop control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDomainTop; + + /// + /// litDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litDomain; + + /// + /// UpdatePanel2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel UpdatePanel2; + + /// + /// locStatus control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locStatus; + + /// + /// litStatus control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litStatus; + + /// + /// locUptime control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locUptime; + + /// + /// litUptime control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litUptime; + + /// + /// locHeartbeat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHeartbeat; + + /// + /// litHeartbeat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHeartbeat; + + /// + /// locCreated control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCreated; + + /// + /// litCreated control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCreated; + + /// + /// UpdatePanel1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel UpdatePanel1; + + /// + /// imgThumbnail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgThumbnail; + + /// + /// repButtons control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Repeater repButtons; + + /// + /// UpdatePanel3 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel UpdatePanel3; + + /// + /// locCpu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCpu; + + /// + /// cpuGauge control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Gauge cpuGauge; + + /// + /// litCpuPercentage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCpuPercentage; + + /// + /// litCpuUsage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCpuUsage; + + /// + /// locRam control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRam; + + /// + /// ramGauge control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Gauge ramGauge; + + /// + /// litRamPercentage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litRamPercentage; + + /// + /// litRamUsage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litRamUsage; + + /// + /// HddRow control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow HddRow; + + /// + /// locHdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHdd; + + /// + /// hddGauge control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.Gauge hddGauge; + + /// + /// litHddPercentage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHddPercentage; + + /// + /// litHddUsage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litHddUsage; + + /// + /// ChangeHostnamePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ChangeHostnamePanel; + + /// + /// locChangeHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locChangeHostname; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locHostname1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locHostname1; + + /// + /// txtHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtHostname; + + /// + /// HostnameValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator HostnameValidator; + + /// + /// valCorrectHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectHostname; + + /// + /// locDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDomain; + + /// + /// txtDomain control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtDomain; + + /// + /// DomainValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainValidator; + + /// + /// valNewDomainFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RegularExpressionValidator valNewDomainFormat; + + /// + /// chkUpdateComputerName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkUpdateComputerName; + + /// + /// btnChangeHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnChangeHostname; + + /// + /// btnCancelHostname control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancelHostname; + + /// + /// ChangeHostnameModal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ModalPopupExtender ChangeHostnameModal; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx new file mode 100644 index 00000000..096a9f3c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx @@ -0,0 +1,76 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsHelp.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsHelp" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+
+
+
+ + +
+ +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.cs new file mode 100644 index 00000000..1a91d5ee --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.cs @@ -0,0 +1,93 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Common; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsHelp : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindSummaryInfo(); + } + } + + private void BindSummaryInfo() + { + // bind user details + PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); + if (package != null) + { + UserInfo user = ES.Services.Users.GetUserById(package.UserId); + if (user != null) + { + txtTo.Text = user.Email; + } + } + + // load template + string content = ES.Services.VPS2012.GetVirtualMachineSummaryText(PanelRequest.ItemID); + if (content != null) + litContent.Text = content; + } + + protected void btnSend_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.SendVirtualMachineSummaryLetter( + PanelRequest.ItemID, txtTo.Text.Trim(), txtBCC.Text.Trim()); + + if (res.IsSuccess) + { + // bind tree + messageBox.ShowSuccessMessage("VPS_ERROR_SEND_SUMMARY_LETTER"); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "ERROR_SEND_SUMMARY_LETTER", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_SEND_SUMMARY_LETTER", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.designer.cs new file mode 100644 index 00000000..1016a4c5 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsHelp.ascx.designer.cs @@ -0,0 +1,168 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsHelp { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secEmail; + + /// + /// EmailPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel EmailPanel; + + /// + /// tblEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable tblEmail; + + /// + /// lblTo control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTo; + + /// + /// txtTo control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtTo; + + /// + /// valRequireEmail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireEmail; + + /// + /// lblBCC control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblBCC; + + /// + /// txtBCC control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtBCC; + + /// + /// btnSend control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSend; + + /// + /// litContent control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litContent; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx new file mode 100644 index 00000000..7e329730 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx @@ -0,0 +1,71 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsInsertDvd.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsInsertDvd" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + +

+ +

+ + + + + + +
+ <%# Eval("Name") %> +
+
+ <%# Eval("Description") %> +
+
+
+ + + + + + +
+
+
+ + +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.cs new file mode 100644 index 00000000..ccb35e77 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.cs @@ -0,0 +1,95 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsInsertDvd : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindDisks(); + } + } + + private void BindDisks() + { + gvDisks.DataSource = ES.Services.VPS2012.GetLibraryDisks(PanelRequest.ItemID); + gvDisks.DataBind(); + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + RedirectBack("cancel"); + } + + protected void gvDisks_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "insert") + { + string path = e.CommandArgument.ToString(); + + try + { + ResultObject res = ES.Services.VPS2012.InsertDvdDisk(PanelRequest.ItemID, path); + + if (res.IsSuccess) + { + // return + RedirectBack("inserted"); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_INSERT_DVD_DISK", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_INSERT_DVD_DISK", ex); + } + } + } + + private void RedirectBack(string action) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_dvd", + "SpaceID=" + PanelSecurity.PackageId.ToString(), + "action=" + action)); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.designer.cs new file mode 100644 index 00000000..52f9dfb6 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx.designer.cs @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsInsertDvd { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// gvDisks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvDisks; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx new file mode 100644 index 00000000..83e4b413 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx @@ -0,0 +1,200 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsNetwork.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsNetwork" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+   + +
+
+
+
+
+
+ +
+ + + +
+ +
+ + 0 +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + <%# Eval("IPAddress")%> + + + + +
+   + +
+
+
+
+
+
+ +
+ + + +
+ +
+ + 0 +
+ +
+
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.cs new file mode 100644 index 00000000..c8b86a8e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.cs @@ -0,0 +1,296 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Common; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsNetwork : WebsitePanelModuleBase + { + VirtualMachine vm = null; + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindVirtualMachine(); + BindExternalAddresses(); + BindPrivateAddresses(); + ToggleButtons(); + } + } + + private void BindVirtualMachine() + { + vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); + + // external network + if (!vm.ExternalNetworkEnabled) + { + secExternalNetwork.Visible = false; + ExternalNetworkPanel.Visible = false; + } + + // private network + if (!vm.PrivateNetworkEnabled) + { + secPrivateNetwork.Visible = false; + PrivateNetworkPanel.Visible = false; + } + } + + private void BindExternalAddresses() + { + // load details + NetworkAdapterDetails nic = ES.Services.VPS2012.GetExternalNetworkAdapterDetails(PanelRequest.ItemID); + + // bind details + foreach (NetworkAdapterIPAddress ip in nic.IPAddresses) + { + if (ip.IsPrimary) + { + litExtAddress.Text = ip.IPAddress; + litExtSubnet.Text = ip.SubnetMask; + litExtGateway.Text = ip.DefaultGateway; + break; + } + } + lblTotalExternal.Text = nic.IPAddresses.Length.ToString(); + + // bind IP addresses + gvExternalAddresses.DataSource = nic.IPAddresses; + gvExternalAddresses.DataBind(); + } + + private void BindPrivateAddresses() + { + // load details + NetworkAdapterDetails nic = ES.Services.VPS2012.GetPrivateNetworkAdapterDetails(PanelRequest.ItemID); + + // bind details + foreach (NetworkAdapterIPAddress ip in nic.IPAddresses) + { + if (ip.IsPrimary) + { + litPrivAddress.Text = ip.IPAddress; + break; + } + } + litPrivSubnet.Text = nic.SubnetMask; + litPrivFormat.Text = nic.NetworkFormat; + lblTotalPrivate.Text = nic.IPAddresses.Length.ToString(); + + // bind IP addresses + gvPrivateAddresses.DataSource = nic.IPAddresses; + gvPrivateAddresses.DataBind(); + + if (nic.IsDHCP) + { + PrivateAddressesPanel.Visible = false; + litPrivAddress.Text = GetLocalizedString("Automatic.Text"); + } + } + + private void ToggleButtons() + { + bool manageAllowed = VirtualMachines2012Helper.IsVirtualMachineManagementAllowed(PanelSecurity.PackageId); + + btnAddExternalAddress.Visible = manageAllowed; + btnSetPrimaryExternal.Visible = manageAllowed; + btnDeleteExternal.Visible = manageAllowed; + gvExternalAddresses.Columns[0].Visible = manageAllowed; + + btnAddPrivateAddress.Visible = manageAllowed; + btnSetPrimaryPrivate.Visible = manageAllowed; + btnDeletePrivate.Visible = manageAllowed; + gvPrivateAddresses.Columns[0].Visible = manageAllowed; + } + + protected void btnAddExternalAddress_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_add_external_ip", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void btnAddPrivateAddress_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_add_private_ip", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void btnSetPrimaryPrivate_Click(object sender, EventArgs e) + { + int[] addressIds = GetSelectedItems(gvPrivateAddresses); + + // check if at least one is selected + if (addressIds.Length == 0) + { + messageBox.ShowWarningMessage("IP_ADDRESS_NOT_SELECTED"); + return; + } + + try + { + ResultObject res = ES.Services.VPS2012.SetVirtualMachinePrimaryPrivateIPAddress(PanelRequest.ItemID, addressIds[0]); + + if (res.IsSuccess) + { + BindPrivateAddresses(); + return; + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_SETTING_PRIMARY_IP", "VPS"); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_SETTING_PRIMARY_IP", ex); + } + } + + protected void btnDeletePrivate_Click(object sender, EventArgs e) + { + int[] addressIds = GetSelectedItems(gvPrivateAddresses); + + // check if at least one is selected + if (addressIds.Length == 0) + { + messageBox.ShowWarningMessage("IP_ADDRESS_NOT_SELECTED"); + return; + } + + try + { + ResultObject res = ES.Services.VPS2012.DeleteVirtualMachinePrivateIPAddresses(PanelRequest.ItemID, addressIds); + + if (res.IsSuccess) + { + BindPrivateAddresses(); + return; + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_DELETING_IP_ADDRESS", "VPS"); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_DELETING_IP_ADDRESS", ex); + } + } + + protected void btnSetPrimaryExternal_Click(object sender, EventArgs e) + { + int[] addressIds = GetSelectedItems(gvExternalAddresses); + + // check if at least one is selected + if (addressIds.Length == 0) + { + messageBox.ShowWarningMessage("IP_ADDRESS_NOT_SELECTED"); + return; + } + + try + { + ResultObject res = ES.Services.VPS2012.SetVirtualMachinePrimaryExternalIPAddress(PanelRequest.ItemID, addressIds[0]); + + if (res.IsSuccess) + { + BindExternalAddresses(); + return; + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_SETTING_PRIMARY_IP", "VPS"); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_SETTING_PRIMARY_IP", ex); + } + } + + protected void btnDeleteExternal_Click(object sender, EventArgs e) + { + int[] addressIds = GetSelectedItems(gvExternalAddresses); + + // check if at least one is selected + if (addressIds.Length == 0) + { + messageBox.ShowWarningMessage("IP_ADDRESS_NOT_SELECTED"); + return; + } + + try + { + ResultObject res = ES.Services.VPS2012.DeleteVirtualMachineExternalIPAddresses(PanelRequest.ItemID, addressIds); + + if (res.IsSuccess) + { + BindExternalAddresses(); + return; + } + else + { + messageBox.ShowMessage(res, "VPS_ERROR_DELETING_IP_ADDRESS", "VPS"); + return; + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_DELETING_IP_ADDRESS", ex); + } + } + + private int[] GetSelectedItems(GridView gv) + { + List items = new List(); + + for (int i = 0; i < gv.Rows.Count; i++) + { + GridViewRow row = gv.Rows[i]; + CheckBox chkSelect = (CheckBox)row.FindControl("chkSelect"); + if (chkSelect.Checked) + items.Add((int)gv.DataKeys[i].Value); + } + + return items.ToArray(); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.designer.cs new file mode 100644 index 00000000..942ea529 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsNetwork.ascx.designer.cs @@ -0,0 +1,339 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsNetwork { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// secExternalNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secExternalNetwork; + + /// + /// ExternalNetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ExternalNetworkPanel; + + /// + /// locExtAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExtAddress; + + /// + /// litExtAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litExtAddress; + + /// + /// locExtSubnet control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExtSubnet; + + /// + /// litExtSubnet control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litExtSubnet; + + /// + /// locExtGateway control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locExtGateway; + + /// + /// litExtGateway control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litExtGateway; + + /// + /// gvExternalAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvExternalAddresses; + + /// + /// btnAddExternalAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddExternalAddress; + + /// + /// btnSetPrimaryExternal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSetPrimaryExternal; + + /// + /// btnDeleteExternal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDeleteExternal; + + /// + /// locTotalExternal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTotalExternal; + + /// + /// lblTotalExternal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTotalExternal; + + /// + /// secPrivateNetwork control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secPrivateNetwork; + + /// + /// PrivateNetworkPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel PrivateNetworkPanel; + + /// + /// locPrivAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivAddress; + + /// + /// litPrivAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivAddress; + + /// + /// locPrivFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivFormat; + + /// + /// litPrivFormat control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivFormat; + + /// + /// locPrivSubnet control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPrivSubnet; + + /// + /// litPrivSubnet control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litPrivSubnet; + + /// + /// PrivateAddressesPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel PrivateAddressesPanel; + + /// + /// gvPrivateAddresses control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvPrivateAddresses; + + /// + /// btnAddPrivateAddress control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddPrivateAddress; + + /// + /// btnSetPrimaryPrivate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSetPrimaryPrivate; + + /// + /// btnDeletePrivate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDeletePrivate; + + /// + /// locTotalPrivate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTotalPrivate; + + /// + /// lblTotalPrivate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblTotalPrivate; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx new file mode 100644 index 00000000..d95158a7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx @@ -0,0 +1,75 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsPermissions.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsPermissions" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.cs new file mode 100644 index 00000000..56fd13fc --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.cs @@ -0,0 +1,44 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsPermissions : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.designer.cs new file mode 100644 index 00000000..095004cc --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsPermissions.ascx.designer.cs @@ -0,0 +1,96 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsPermissions { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// chkOverride control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkOverride; + + /// + /// gvVpsPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvVpsPermissions; + + /// + /// btnUpdateVpsPermissions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnUpdateVpsPermissions; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx new file mode 100644 index 00000000..c345ce97 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx @@ -0,0 +1,146 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsSnapshots.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsSnapshots" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+ +
+
+ +     + + +
+ +

+ + +

+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+ +
+
+ +
+ +
+
+ + + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.cs new file mode 100644 index 00000000..26a0cfae --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.cs @@ -0,0 +1,262 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsSnapshots : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindSnapshotsTree(); + } + } + + private void BindSnapshotsTree() + { + VirtualMachineSnapshot[] snapshots = ES.Services.VPS2012.GetVirtualMachineSnapshots(PanelRequest.ItemID); + + // clear tree + SnapshotsTree.Nodes.Clear(); + + // fill tree by root nodes + AddChildNodes(SnapshotsTree.Nodes, null, snapshots); + + // select first node + if (SnapshotsTree.Nodes.Count > 0) + { + SnapshotsTree.Nodes[0].Selected = true; + } + + // refresh + BindSelectedNode(); + + // quotas + VirtualMachine vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); + snapshotsQuota.QuotaUsedValue = snapshots.Length; + snapshotsQuota.QuotaValue = vm.SnapshotsNumber; + btnTakeSnapshot.Enabled = snapshots.Length < vm.SnapshotsNumber; + } + + private void BindSelectedNode() + { + TreeNode node = SnapshotsTree.SelectedNode; + + btnApply.Enabled = + btnRename.Enabled = + btnDelete.Enabled = + btnDeleteSubtree.Enabled = + SnapshotDetailsPanel.Visible = (node != null); + + NoSnapshotsPanel.Visible = (SnapshotsTree.Nodes.Count == 0); + + if (node != null) + { + // set name + txtSnapshotName.Text = node.Text; + + // load snapshot details + VirtualMachineSnapshot snapshot = ES.Services.VPS2012.GetSnapshot(PanelRequest.ItemID, node.Value); + if (snapshot != null) + litCreated.Text = snapshot.Created.ToString(); + + // set image + imgThumbnail.ImageUrl = + string.Format("~/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx?ItemID={0}&SnapshotID={1}&rnd={2}", + PanelRequest.ItemID, HttpUtility.UrlEncode(node.Value), DateTime.Now.Ticks); + } + } + + private void AddChildNodes(TreeNodeCollection parent, string parentId, VirtualMachineSnapshot[] snapshots) + { + foreach (VirtualMachineSnapshot snapshot in snapshots) + { + if (snapshot.ParentId == parentId) + { + // add node + TreeNode node = new TreeNode(snapshot.Name, snapshot.Id); + node.Expanded = true; + node.ImageUrl = PortalUtils.GetThemedImage("VPS/snapshot.png"); + parent.Add(node); + + // check if the current + if (snapshot.IsCurrent) + { + TreeNode nowNode = new TreeNode(GetLocalizedString("Now.Text"), ""); + nowNode.ImageUrl = PortalUtils.GetThemedImage("VPS/start2.png"); + nowNode.SelectAction = TreeNodeSelectAction.None; + node.ChildNodes.Add(nowNode); + } + + // fill children + AddChildNodes(node.ChildNodes, snapshot.Id, snapshots); + } + } + } + + protected void btnTakeSnapshot_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.CreateSnapshot(PanelRequest.ItemID); + + if (res.IsSuccess) + { + // bind tree + BindSnapshotsTree(); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_TAKE_SNAPSHOT", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_TAKE_SNAPSHOT", ex); + } + } + + protected void btnApply_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.ApplySnapshot(PanelRequest.ItemID, GetSelectedSnapshot()); + + if (res.IsSuccess) + { + // bind tree + BindSnapshotsTree(); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_APPLY_SNAPSHOT", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_APPLY_SNAPSHOT", ex); + } + } + + protected void btnRenameSnapshot_Click(object sender, EventArgs e) + { + try + { + string newName = txtSnapshotName.Text.Trim(); + ResultObject res = ES.Services.VPS2012.RenameSnapshot(PanelRequest.ItemID, GetSelectedSnapshot(), newName); + + if (res.IsSuccess) + { + // bind tree + SnapshotsTree.SelectedNode.Text = newName; + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_RENAME_SNAPSHOT", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_RENAME_SNAPSHOT", ex); + } + } + + protected void btnDelete_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.DeleteSnapshot(PanelRequest.ItemID, GetSelectedSnapshot()); + + if (res.IsSuccess) + { + // bind tree + BindSnapshotsTree(); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_DELETE_SNAPSHOT", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_DELETE_SNAPSHOT", ex); + } + } + + protected void btnDeleteSubtree_Click(object sender, EventArgs e) + { + try + { + ResultObject res = ES.Services.VPS2012.DeleteSnapshotSubtree(PanelRequest.ItemID, GetSelectedSnapshot()); + + if (res.IsSuccess) + { + // bind tree + BindSnapshotsTree(); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_DELETE_SNAPSHOT_SUBTREE", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_DELETE_SNAPSHOT_SUBTREE", ex); + } + } + + private string GetSelectedSnapshot() + { + return SnapshotsTree.SelectedNode.Value; + } + + protected void SnapshotsTree_SelectedNodeChanged(object sender, EventArgs e) + { + BindSelectedNode(); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.designer.cs new file mode 100644 index 00000000..7b57c599 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx.designer.cs @@ -0,0 +1,267 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsSnapshots { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnTakeSnapshot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnTakeSnapshot; + + /// + /// SnapshotsTree control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TreeView SnapshotsTree; + + /// + /// NoSnapshotsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl NoSnapshotsPanel; + + /// + /// locNoSnapshots control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNoSnapshots; + + /// + /// locQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locQuota; + + /// + /// snapshotsQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer snapshotsQuota; + + /// + /// SnapshotDetailsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableCell SnapshotDetailsPanel; + + /// + /// imgThumbnail control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgThumbnail; + + /// + /// locCreated control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCreated; + + /// + /// litCreated control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litCreated; + + /// + /// btnApply control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnApply; + + /// + /// btnRename control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnRename; + + /// + /// btnDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnDelete; + + /// + /// btnDeleteSubtree control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.LinkButton btnDeleteSubtree; + + /// + /// RenamePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel RenamePanel; + + /// + /// locRenameSnapshot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locRenameSnapshot; + + /// + /// txtSnapshotName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSnapshotName; + + /// + /// SnapshotNameValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator SnapshotNameValidator; + + /// + /// btnRenameSnapshot control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnRenameSnapshot; + + /// + /// btnCancelRename control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancelRename; + + /// + /// RenameSnapshotModal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ModalPopupExtender RenameSnapshotModal; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx new file mode 100644 index 00000000..3ec46195 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx @@ -0,0 +1,56 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsDetailsTools.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsDetailsTools" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + <%-- + + + --%> + + + + +
+ + + +
+ + + +
+
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.cs new file mode 100644 index 00000000..18d5fff1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.cs @@ -0,0 +1,56 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsDetailsTools : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnReinstall_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_tools_reinstall", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void btnDelete_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_tools_delete", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.designer.cs new file mode 100644 index 00000000..bd6726f8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsDetailsTools.ascx.designer.cs @@ -0,0 +1,87 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsDetailsTools { + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDelete; + + /// + /// locDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDelete; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx new file mode 100644 index 00000000..88a8006a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx @@ -0,0 +1,75 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsMoveServer.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsMoveServer" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/CheckBoxOption.ascx" TagName="CheckBoxOption" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +

+ + +

+ +
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.cs new file mode 100644 index 00000000..a5a2b367 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.cs @@ -0,0 +1,112 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Data; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Virtualization; +using WebsitePanel.Providers.ResultObjects; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsMoveServer : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindHyperVServices(); + BindSourceService(); + } + } + + public void BindHyperVServices() + { + // bind + HyperVServices.DataSource = ES.Services.Servers.GetRawServicesByGroupName(ResourceGroups.VPS2012).Tables[0].DefaultView; + HyperVServices.DataBind(); + + // add select value + HyperVServices.Items.Insert(0, new ListItem(GetLocalizedString("SelectHyperVService.Text"), "")); + } + + private void BindSourceService() + { + VirtualMachine vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); + if (vm == null) + ReturnBack(); + + ListItem sourceItem = null; + foreach (ListItem item in HyperVServices.Items) + { + if (item.Value == vm.ServiceId.ToString()) + { + sourceItem = item; + SourceHyperVService.Text = item.Text; + break; + } + } + + if (sourceItem != null) + HyperVServices.Items.Remove(sourceItem); + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + ReturnBack(); + } + + private void ReturnBack() + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "")); + } + + protected void btnMove_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + return; + + // move item + int destinationServiceId = Utils.ParseInt(HyperVServices.SelectedValue); + int result = ES.Services.Packages.MovePackageItem(PanelRequest.ItemID, destinationServiceId); + if (result < 0) + { + ShowResultMessage(result); + return; + } + + // redirect to properties screen + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_general", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.designer.cs new file mode 100644 index 00000000..9ce6aa99 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsMoveServer.ascx.designer.cs @@ -0,0 +1,141 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsMoveServer { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locSourceService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSourceService; + + /// + /// SourceHyperVService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal SourceHyperVService; + + /// + /// locDestinationService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDestinationService; + + /// + /// HyperVServices control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList HyperVServices; + + /// + /// RequiredHyperVService control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredHyperVService; + + /// + /// btnMove control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnMove; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx new file mode 100644 index 00000000..b0ed67de --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx @@ -0,0 +1,92 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsToolsDeleteServer.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsToolsDeleteServer" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + +

+ +

+

+ +

+

+ +

+ +
+ + + + + + + + + + + + + + +
+ +
+ +
+ + + * +
+
+ +

+ + +

+
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.cs new file mode 100644 index 00000000..d8715d75 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.cs @@ -0,0 +1,116 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.Common; +using WebsitePanel.Providers.Virtualization; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsToolsDeleteServer : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindFormDetails(); + } + + ToogleControls(); + } + + private void ToogleControls() + { + txtExportPath.Visible = chkExport.Checked; + ExportPathValidator.Enabled = chkExport.Checked; + } + + private void BindFormDetails() + { + // load VM item + VirtualMachine vm = VirtualMachines2012Helper.GetCachedVirtualMachine(PanelRequest.ItemID); + if (!String.IsNullOrEmpty(vm.CurrentTaskId)) + { + messageBox.ShowWarningMessage("VPS_PROVISIONING_PROCESS"); + btnDelete.Enabled = false; + return; + } + + // load export settings + if (PanelSecurity.EffectiveUser.Role == WebsitePanel.EnterpriseServer.UserRole.Administrator) + { + txtExportPath.Text = ES.Services.VPS2012.GetDefaultExportPath(PanelRequest.ItemID); + } + else + { + AdminOptionsPanel.Visible = false; + } + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "")); + } + + protected void btnDelete_Click(object sender, EventArgs e) + { + if (!chkConfirmDelete.Checked) + { + messageBox.ShowWarningMessage("VPS_DELETE_CONFIRM"); + return; + } + + // delete machine + try + { + ResultObject res = ES.Services.VPS2012.DeleteVirtualMachine(PanelRequest.ItemID, + chkSaveFiles.Checked, chkExport.Checked, txtExportPath.Text.Trim()); + + if (res.IsSuccess) + { + // return to the list + Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "")); + return; + } + else + { + // show error + messageBox.ShowMessage(res, "VPS_ERROR_DELETE", "VPS"); + } + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("VPS_ERROR_DELETE", ex); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.designer.cs new file mode 100644 index 00000000..4186b99a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx.designer.cs @@ -0,0 +1,186 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsToolsDeleteServer { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// locDescription control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDescription; + + /// + /// chkConfirmDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkConfirmDelete; + + /// + /// AdminOptionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlGenericControl AdminOptionsPanel; + + /// + /// locAdminOptions control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAdminOptions; + + /// + /// chkSaveFiles control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkSaveFiles; + + /// + /// chkExport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkExport; + + /// + /// txtExportPath control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtExportPath; + + /// + /// ExportPathValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator ExportPathValidator; + + /// + /// btnDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDelete; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx new file mode 100644 index 00000000..fa853be3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx @@ -0,0 +1,109 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="VpsToolsReinstallServer.ascx.cs" Inherits="WebsitePanel.Portal.VPS2012.VpsToolsReinstallServer" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/ServerTabs.ascx" TagName="ServerTabs" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/PasswordControl.ascx" TagName="PasswordControl" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + +

+ +

+

+ +

+

+ +

+ + + + + + + + + +
+ + + +
+ +
       + +
+
+ + + + + + + + + + +
+ +
+ +
+ + + * +
+ +

+ + + +

+
+
+
+ +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.cs new file mode 100644 index 00000000..c0efc5f2 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2015, Outercurve Foundation. +// 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. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.VPS2012 +{ + public partial class VpsToolsReinstallServer : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnCancel_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "vps_tools", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + protected void btnUpdate_Click(object sender, EventArgs e) + { + if (!chkConfirmReinstall.Checked) + { + messageBox.ShowWarningMessage("VPS_REINSTALL_CONFIRM"); + } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.designer.cs new file mode 100644 index 00000000..2c8b35d1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx.designer.cs @@ -0,0 +1,213 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.VPS2012 { + + + public partial class VpsToolsReinstallServer { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu; + + /// + /// imgIcon control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgIcon; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.FormTitle locTitle; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.VPS2012.UserControls.ServerTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// validatorsSummary control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary; + + /// + /// locSubTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSubTitle; + + /// + /// locDescription control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDescription; + + /// + /// chkConfirmReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkConfirmReinstall; + + /// + /// locPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPassword; + + /// + /// password control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.PasswordControl password; + + /// + /// chkPreserveExistingFiles control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkPreserveExistingFiles; + + /// + /// locPreserveHelp control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locPreserveHelp; + + /// + /// AdminOptionsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTable AdminOptionsPanel; + + /// + /// chkSaveVhd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkSaveVhd; + + /// + /// chkExport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkExport; + + /// + /// txtExportPath control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtExportPath; + + /// + /// ExportPathValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator ExportPathValidator; + + /// + /// btnReinstall control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnReinstall; + + /// + /// btnCancel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancel; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 4e2ba11d..423c3b49 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -189,6 +189,7 @@ + @@ -265,19 +266,242 @@ HyperV2012R2_Settings.ascx - - HyperV2012R2_Edit.ascx + + Connect.aspx ASPXCodeBehind - - HyperV2012R2_Edit.ascx + + Connect.aspx - - HyperV2012R2_Create.ascx + + TestVirtualMachineTemplate.aspx ASPXCodeBehind - - HyperV2012R2_Create.ascx + + TestVirtualMachineTemplate.aspx + + + Breadcrumb.ascx + ASPXCodeBehind + + + Breadcrumb.ascx + + + DynamicMemory.ascx + ASPXCodeBehind + + + DynamicMemory.ascx + + + FormTitle.ascx + ASPXCodeBehind + + + FormTitle.ascx + + + Generation.ascx + ASPXCodeBehind + + + Generation.ascx + + + Menu.ascx + ASPXCodeBehind + + + Menu.ascx + + + ServerTabs.ascx + ASPXCodeBehind + + + ServerTabs.ascx + + + VdcAddExternalAddress.ascx + ASPXCodeBehind + + + VdcAddExternalAddress.ascx + + + VdcAuditLog.ascx + ASPXCodeBehind + + + VdcAuditLog.ascx + + + VdcCreateServer.ascx + ASPXCodeBehind + + + VdcCreateServer.ascx + + + VdcExternalNetwork.ascx + ASPXCodeBehind + + + VdcExternalNetwork.ascx + + + VdcHome.ascx + ASPXCodeBehind + + + VdcHome.ascx + + + VdcImportServer.ascx + ASPXCodeBehind + + + VdcImportServer.ascx + + + VdcManagementNetwork.ascx + ASPXCodeBehind + + + VdcManagementNetwork.ascx + + + VdcPermissions.ascx + ASPXCodeBehind + + + VdcPermissions.ascx + + + VdcPrivateNetwork.ascx + ASPXCodeBehind + + + VdcPrivateNetwork.ascx + + + VirtualMachineImage.ashx + + + VirtualMachineSnapshotImage.ashx + + + VpsDetailsAddExternalAddress.ascx + ASPXCodeBehind + + + VpsDetailsAddExternalAddress.ascx + + + VpsDetailsAddPrivateAddress.ascx + ASPXCodeBehind + + + VpsDetailsAddPrivateAddress.ascx + + + VpsDetailsAuditLog.ascx + ASPXCodeBehind + + + VpsDetailsAuditLog.ascx + + + VpsDetailsConfiguration.ascx + ASPXCodeBehind + + + VpsDetailsConfiguration.ascx + + + VpsDetailsDvd.ascx + ASPXCodeBehind + + + VpsDetailsDvd.ascx + + + VpsDetailsEditConfiguration.ascx + ASPXCodeBehind + + + VpsDetailsEditConfiguration.ascx + + + VpsDetailsGeneral.ascx + ASPXCodeBehind + + + VpsDetailsGeneral.ascx + + + VpsDetailsHelp.ascx + ASPXCodeBehind + + + VpsDetailsHelp.ascx + + + VpsDetailsInsertDvd.ascx + ASPXCodeBehind + + + VpsDetailsInsertDvd.ascx + + + VpsDetailsNetwork.ascx + ASPXCodeBehind + + + VpsDetailsNetwork.ascx + + + VpsDetailsPermissions.ascx + ASPXCodeBehind + + + VpsDetailsPermissions.ascx + + + VpsDetailsSnapshots.ascx + ASPXCodeBehind + + + VpsDetailsSnapshots.ascx + + + VpsDetailsTools.ascx + ASPXCodeBehind + + + VpsDetailsTools.ascx + + + VpsMoveServer.ascx + ASPXCodeBehind + + + VpsMoveServer.ascx + + + VpsToolsDeleteServer.ascx + ASPXCodeBehind + + + VpsToolsDeleteServer.ascx + + + VpsToolsReinstallServer.ascx + ASPXCodeBehind + + + VpsToolsReinstallServer.ascx SmarterMail100_EditAccount.ascx @@ -4069,20 +4293,6 @@ VpsEventsLog.ascx - - DynamicMemory.ascx - ASPXCodeBehind - - - DynamicMemory.ascx - - - Generation.ascx - ASPXCodeBehind - - - Generation.ascx - VpsMoveServer.ascx ASPXCodeBehind @@ -4560,8 +4770,40 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4612,9 +4854,6 @@ - - Designer - Designer @@ -4803,8 +5042,6 @@ - - @@ -4822,7 +5059,97 @@ Designer - + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + + Designer + + Designer @@ -6973,6 +7300,8 @@ + + Designer diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj index 4b3119cd..b3fee22f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/WebsitePanel.WebPortal.csproj @@ -105,6 +105,7 @@ + diff --git a/WebsitePanel/Sources/generate_es_proxies.bat b/WebsitePanel/Sources/generate_es_proxies.bat index 4f45afb7..51ae347e 100644 --- a/WebsitePanel/Sources/generate_es_proxies.bat +++ b/WebsitePanel/Sources/generate_es_proxies.bat @@ -35,8 +35,8 @@ REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ecStorefrontProxy.cs REM %WSDL% %SERVER_URL%/ecStorehouse.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ecStorehouseProxy.cs /namespace:WebsitePanel.Ecommerce.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ecStorehouseProxy.cs -%WSDL% %SERVER_URL%/esExchangeServer.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient -%WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs +REM %WSDL% %SERVER_URL%/esExchangeServer.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient +REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ExchangeServerProxy.cs REM %WSDL% %SERVER_URL%/esExchangeHostedEdition.asmx /out:.\WebsitePanel.EnterpriseServer.Client\ExchangeHostedEditionProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\ExchangeHostedEditionProxy.cs @@ -56,8 +56,8 @@ REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\OCSProxy.cs REM %WSDL% %SERVER_URL%/esOperatingSystems.asmx /out:.\WebsitePanel.EnterpriseServer.Client\OperatingSystemsProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\OperatingSystemsProxy.cs -%WSDL% %SERVER_URL%/esOrganizations.asmx /out:.\WebsitePanel.EnterpriseServer.Client\OrganizationProxy.cs /namespace:WebsitePanel.EnterpriseServer.HostedSolution /type:webClient -%WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\OrganizationProxy.cs +REM %WSDL% %SERVER_URL%/esOrganizations.asmx /out:.\WebsitePanel.EnterpriseServer.Client\OrganizationProxy.cs /namespace:WebsitePanel.EnterpriseServer.HostedSolution /type:webClient +REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\OrganizationProxy.cs REM %WSDL% %SERVER_URL%/esPackages.asmx /out:.\WebsitePanel.EnterpriseServer.Client\PackagesProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\PackagesProxy.cs @@ -83,6 +83,9 @@ REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\UsersProxy.cs REM %WSDL% %SERVER_URL%/esVirtualizationServer.asmx /out:.\WebsitePanel.EnterpriseServer.Client\VirtualizationServerProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\VirtualizationServerProxy.cs +REM %WSDL% %SERVER_URL%/esVirtualizationServer2012.asmx /out:.\WebsitePanel.EnterpriseServer.Client\VirtualizationServerProxy2012.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient +REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\VirtualizationServerProxy2012.cs + REM %WSDL% %SERVER_URL%/esWebApplicationGallery.asmx /out:.\WebsitePanel.EnterpriseServer.Client\WebApplicationGalleryProxy.cs /namespace:WebsitePanel.EnterpriseServer /type:webClient REM %WSE_CLEAN% .\WebsitePanel.EnterpriseServer.Client\WebApplicationGalleryProxy.cs