wsp-10323 Step 10 final

This commit is contained in:
me 2015-03-25 20:46:35 +04:00
parent 477b82e69c
commit 9fcad0455d
10 changed files with 2270 additions and 319 deletions

View file

@ -34,6 +34,7 @@ namespace WebsitePanel.Providers.Virtualization
{
public class MountedDiskInfo
{
public int DiskNumber { get; set; }
public string DiskAddress { get; set; }
public string[] DiskVolumes { get; set; }
}

View file

@ -0,0 +1,73 @@
using System;
using System.Text.RegularExpressions;
namespace WebsitePanel.Providers.Virtualization.Extensions
{
public static class StringExtensions
{
public static string[] ParseExact(
this string data,
string format)
{
return ParseExact(data, format, false);
}
public static string[] ParseExact(
this string data,
string format,
bool ignoreCase)
{
string[] values;
if (TryParseExact(data, format, out values, ignoreCase))
return values;
else
throw new ArgumentException("Format not compatible with value.");
}
public static bool TryExtract(
this string data,
string format,
out string[] values)
{
return TryParseExact(data, format, out values, false);
}
public static bool TryParseExact(
this string data,
string format,
out string[] values,
bool ignoreCase)
{
int tokenCount = 0;
format = Regex.Escape(format).Replace("\\{", "{");
for (tokenCount = 0; ; tokenCount++)
{
string token = string.Format("{{{0}}}", tokenCount);
if (!format.Contains(token)) break;
format = format.Replace(token,
string.Format("(?'group{0}'.*)", tokenCount));
}
RegexOptions options =
ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
Match match = new Regex(format, options).Match(data);
if (tokenCount != (match.Groups.Count - 1))
{
values = new string[] { };
return false;
}
else
{
values = new string[tokenCount];
for (int index = 0; index < tokenCount; index++)
values[index] =
match.Groups[string.Format("group{0}", index)].Value;
return true;
}
}
}
}

View file

@ -0,0 +1,294 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Management;
using System.Threading;
using Microsoft.Storage.Vds;
using Microsoft.Storage.Vds.Advanced;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.Virtualization.Extensions;
using Path = System.IO.Path;
namespace WebsitePanel.Providers.Virtualization
{
public static class VdsHelper
{
public static MountedDiskInfo GetMountedDiskInfo(string serverName, int driveNumber)
{
MountedDiskInfo diskInfo = new MountedDiskInfo { DiskNumber = driveNumber };
// find mounted disk using VDS
AdvancedDisk advancedDisk = null;
Pack diskPack = null;
// first attempt
Thread.Sleep(3000);
HostedSolutionLog.LogInfo("Trying to find mounted disk - first attempt");
FindVdsDisk(serverName, diskInfo.DiskNumber, out advancedDisk, out diskPack);
// second attempt
if (advancedDisk == null)
{
Thread.Sleep(20000);
HostedSolutionLog.LogInfo("Trying to find mounted disk - second attempt");
FindVdsDisk(serverName, diskInfo.DiskNumber, out advancedDisk, out diskPack);
}
if (advancedDisk == null)
throw new Exception("Could not find mounted disk");
// Set disk address
diskInfo.DiskAddress = advancedDisk.DiskAddress;
var addressParts = diskInfo.DiskAddress.ParseExact("Port{0}Path{1}Target{2}Lun{3}");
var portNumber = addressParts[0];
var targetId = addressParts[2];
var lun = addressParts[3];
// check if DiskPart must be used to bring disk online and clear read-only flag
bool useDiskPartToClearReadOnly = false;
if (ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG] != null)
useDiskPartToClearReadOnly = Boolean.Parse(ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG]);
// determine disk index for DiskPart
Wmi cimv2 = new Wmi(serverName, Constants.WMI_CIMV2_NAMESPACE);
ManagementObject objDisk = cimv2.GetWmiObject("win32_diskdrive",
"Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and scsiPort={2}",
targetId, lun, portNumber);
if (useDiskPartToClearReadOnly)
{
// *** Clear Read-Only and bring disk online with DiskPart ***
HostedSolutionLog.LogInfo("Clearing disk Read-only flag and bringing disk online");
if (objDisk != null)
{
// disk found
// run DiskPart
string diskPartResult = RunDiskPart(serverName, String.Format(@"select disk {0}
attributes disk clear readonly
online disk
exit", Convert.ToInt32(objDisk["Index"])));
HostedSolutionLog.LogInfo("DiskPart Result: " + diskPartResult);
}
}
else
{
// *** Clear Read-Only and bring disk online with VDS ***
// clear Read-Only
if ((advancedDisk.Flags & DiskFlags.ReadOnly) == DiskFlags.ReadOnly)
{
HostedSolutionLog.LogInfo("Clearing disk Read-only flag");
advancedDisk.ClearFlags(DiskFlags.ReadOnly);
while ((advancedDisk.Flags & DiskFlags.ReadOnly) == DiskFlags.ReadOnly)
{
Thread.Sleep(100);
advancedDisk.Refresh();
}
}
// bring disk ONLINE
if (advancedDisk.Status == DiskStatus.Offline)
{
HostedSolutionLog.LogInfo("Bringing disk online");
advancedDisk.Online();
while (advancedDisk.Status == DiskStatus.Offline)
{
Thread.Sleep(100);
advancedDisk.Refresh();
}
}
}
// small pause after getting disk online
Thread.Sleep(3000);
// get disk again
FindVdsDisk(serverName, diskInfo.DiskNumber, out advancedDisk, out diskPack);
// find volumes using VDS
List<string> volumes = new List<string>();
HostedSolutionLog.LogInfo("Querying disk volumes with VDS");
foreach (Volume volume in diskPack.Volumes)
{
string letter = volume.DriveLetter.ToString();
if (letter != "")
volumes.Add(letter);
}
// find volumes using WMI
if (volumes.Count == 0 && objDisk != null)
{
HostedSolutionLog.LogInfo("Querying disk volumes with WMI");
foreach (ManagementObject objPartition in objDisk.GetRelated("Win32_DiskPartition"))
{
foreach (ManagementObject objVolume in objPartition.GetRelated("Win32_LogicalDisk"))
{
volumes.Add(objVolume["Name"].ToString().TrimEnd(':'));
}
}
}
HostedSolutionLog.LogInfo("Volumes found: " + volumes.Count);
// Set volumes
diskInfo.DiskVolumes = volumes.ToArray();
return diskInfo;
}
public static void FindVdsDisk(string serverName, int driveNumber, out AdvancedDisk advancedDisk, out Pack diskPack)
{
Func<Disk, bool> compareFunc = disk => disk.Name.EndsWith("PhysicalDrive" + driveNumber);
FindVdsDisk(serverName, compareFunc, out advancedDisk, out diskPack);
}
public static void FindVdsDisk(string serverName, string diskAddress, out AdvancedDisk advancedDisk, out Pack diskPack)
{
Func<Disk, bool> compareFunc = disk => disk.DiskAddress == diskAddress;
FindVdsDisk(serverName, compareFunc, out advancedDisk, out diskPack);
}
private static void FindVdsDisk(string serverName, Func<Disk, bool> compareFunc, out AdvancedDisk advancedDisk, out Pack diskPack)
{
advancedDisk = null;
diskPack = null;
ServiceLoader serviceLoader = new ServiceLoader();
Service vds = serviceLoader.LoadService(serverName);
vds.WaitForServiceReady();
foreach (Disk disk in vds.UnallocatedDisks)
{
if (compareFunc(disk))
{
advancedDisk = (AdvancedDisk) disk;
break;
}
}
if (advancedDisk == null)
{
vds.HardwareProvider = false;
vds.SoftwareProvider = true;
foreach (SoftwareProvider provider in vds.Providers)
foreach (Pack pack in provider.Packs)
foreach (Disk disk in pack.Disks)
if (compareFunc(disk))
{
diskPack = pack;
advancedDisk = (AdvancedDisk) disk;
break;
}
}
}
// obsolete and currently is not used
private static string RunDiskPart(string serverName, string script)
{
// create temp script file name
string localPath = Path.Combine(GetTempRemoteFolder(serverName), Guid.NewGuid().ToString("N"));
// save script to remote temp file
string remotePath = ConvertToUNC(serverName, localPath);
File.AppendAllText(remotePath, script);
// run diskpart
ExecuteRemoteProcess(serverName, "DiskPart /s " + localPath);
// delete temp script
try
{
File.Delete(remotePath);
}
catch
{
// TODO
}
return "";
}
public static string ConvertToUNC(string serverName, string path)
{
if (String.IsNullOrEmpty(serverName)
|| path.StartsWith(@"\\"))
return path;
return String.Format(@"\\{0}\{1}", serverName, path.Replace(":", "$"));
}
public static string GetTempRemoteFolder(string serverName)
{
Wmi cimv2 = new Wmi(serverName, "root\\cimv2");
ManagementObject objOS = cimv2.GetWmiObject("win32_OperatingSystem");
string sysPath = (string)objOS["SystemDirectory"];
// remove trailing slash
if (sysPath.EndsWith("\\"))
sysPath = sysPath.Substring(0, sysPath.Length - 1);
sysPath = sysPath.Substring(0, sysPath.LastIndexOf("\\") + 1) + "Temp";
return sysPath;
}
public static void ExecuteRemoteProcess(string serverName, string command)
{
Wmi cimv2 = new Wmi(serverName, "root\\cimv2");
ManagementClass objProcess = cimv2.GetWmiClass("Win32_Process");
// run process
object[] methodArgs = { command, null, null, 0 };
objProcess.InvokeMethod("Create", methodArgs);
// process ID
int processId = Convert.ToInt32(methodArgs[3]);
// wait until finished
// Create event query to be notified within 1 second of
// a change in a service
WqlEventQuery query =
new WqlEventQuery("__InstanceDeletionEvent",
new TimeSpan(0, 0, 1),
"TargetInstance isa \"Win32_Process\"");
// Initialize an event watcher and subscribe to events
// that match this query
ManagementEventWatcher watcher = new ManagementEventWatcher(cimv2.GetScope(), query);
// times out watcher.WaitForNextEvent in 20 seconds
watcher.Options.Timeout = new TimeSpan(0, 0, 20);
// Block until the next event occurs
// Note: this can be done in a loop if waiting for
// more than one occurrence
while (true)
{
ManagementBaseObject e = null;
try
{
// wait untill next process finish
e = watcher.WaitForNextEvent();
}
catch
{
// nothing has been finished in timeout period
return; // exit
}
// check process id
int pid = Convert.ToInt32(((ManagementBaseObject)e["TargetInstance"])["ProcessID"]);
if (pid == processId)
{
//Cancel the subscription
watcher.Stop();
// exit
return;
}
}
}
}
}

View file

@ -52,6 +52,7 @@ using WebsitePanel.Server.Utils;
using Vds = Microsoft.Storage.Vds;
using System.Configuration;
using System.Linq;
using WebsitePanel.Providers.Virtualization.Extensions;
namespace WebsitePanel.Providers.Virtualization
{
@ -855,7 +856,7 @@ namespace WebsitePanel.Providers.Virtualization
Command cmd = new Command("Remove-VMSwitch");
cmd.Parameters.Add("Name", switchId);
cmd.Parameters.Add("Force");
PowerShell.Execute(cmd, true);
PowerShell.Execute(cmd, true, false);
}
catch (Exception ex)
{
@ -874,7 +875,7 @@ namespace WebsitePanel.Providers.Virtualization
path = Path.Combine(FileUtils.EvaluateSystemVariables(path), Constants.LIBRARY_INDEX_FILE_NAME);
// convert to UNC if it is a remote computer
path = ConvertToUNC(path);
path = VdsHelper.ConvertToUNC(ServerNameSettings, path);
if (!File.Exists(path))
{
@ -1176,184 +1177,27 @@ namespace WebsitePanel.Providers.Virtualization
public MountedDiskInfo MountVirtualHardDisk(string vhdPath)
{
//MountedDiskInfo diskInfo = new MountedDiskInfo();
//vhdPath = FileUtils.EvaluateSystemVariables(vhdPath);
vhdPath = FileUtils.EvaluateSystemVariables(vhdPath);
//// Mount disk
//Command cmd = new Command("Mount-VHD");
// Mount disk
Command cmd = new Command("Mount-VHD");
//cmd.Parameters.Add("Path", vhdPath);
//cmd.Parameters.Add("PassThru");
cmd.Parameters.Add("Path", vhdPath);
cmd.Parameters.Add("PassThru");
//// Get disk address
//var result = PowerShell.Execute(cmd, true);
//try
//{
// if (result == null || result.Count == 0)
// throw new Exception("Failed to mount disk");
// diskInfo.DiskAddress = result[0].GetString("DiskNumber");
// // Get disk volumes
//}
//catch (Exception ex)
//{
// // unmount disk
// UnmountVirtualHardDisk(vhdPath);
// // throw error
// throw ex;
//}
//return diskInfo;
ManagementObject objImgSvc = GetImageManagementService();
// get method params
ManagementBaseObject inParams = objImgSvc.GetMethodParameters("Mount");
inParams["Path"] = FileUtils.EvaluateSystemVariables(vhdPath);
ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("Mount", inParams, null);
JobResult result = CreateJobResultFromWmiMethodResults(outParams);
// load storage job
if (result.ReturnValue != ReturnCode.JobStarted)
throw new Exception("Failed to start Mount job with the following error: " + result.ReturnValue); ;
ManagementObject objJob = wmi.GetWmiObject("msvm_StorageJob", "InstanceID = '{0}'", result.Job.Id);
if (!JobCompleted(result.Job))
throw new Exception("Failed to complete Mount job with the following error: " + result.Job.ErrorDescription);
// Get mounted disk
var result = PowerShell.Execute(cmd, true, true);
try
{
List<string> volumes = new List<string>();
if (result == null || result.Count == 0)
throw new Exception("Failed to mount disk");
// load output data
ManagementObject objImage = wmi.GetRelatedWmiObject(objJob, "Msvm_MountedStorageImage");
var diskNumber = result[0].GetInt("DiskNumber");
int pathId = Convert.ToInt32(objImage["PathId"]);
int portNumber = Convert.ToInt32(objImage["PortNumber"]);
int targetId = Convert.ToInt32(objImage["TargetId"]);
int lun = Convert.ToInt32(objImage["Lun"]);
string diskAddress = String.Format("Port{0}Path{1}Target{2}Lun{3}", portNumber, pathId, targetId, lun);
HostedSolutionLog.LogInfo("Disk address: " + diskAddress);
// find mounted disk using VDS
Vds.Advanced.AdvancedDisk advancedDisk = null;
Vds.Pack diskPack = null;
// first attempt
System.Threading.Thread.Sleep(3000);
HostedSolutionLog.LogInfo("Trying to find mounted disk - first attempt");
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
// second attempt
if (advancedDisk == null)
{
System.Threading.Thread.Sleep(20000);
HostedSolutionLog.LogInfo("Trying to find mounted disk - second attempt");
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
}
if (advancedDisk == null)
throw new Exception("Could not find mounted disk");
// check if DiskPart must be used to bring disk online and clear read-only flag
bool useDiskPartToClearReadOnly = false;
if (ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG] != null)
useDiskPartToClearReadOnly = Boolean.Parse(ConfigurationManager.AppSettings[Constants.CONFIG_USE_DISKPART_TO_CLEAR_READONLY_FLAG]);
// determine disk index for DiskPart
Wmi cimv2 = new Wmi(ServerNameSettings, Constants.WMI_CIMV2_NAMESPACE);
ManagementObject objDisk = cimv2.GetWmiObject("win32_diskdrive",
"Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and scsiPort={2}",
targetId, lun, portNumber);
if (useDiskPartToClearReadOnly)
{
// *** Clear Read-Only and bring disk online with DiskPart ***
HostedSolutionLog.LogInfo("Clearing disk Read-only flag and bringing disk online");
if (objDisk != null)
{
// disk found
// run DiskPart
string diskPartResult = RunDiskPart(String.Format(@"select disk {0}
attributes disk clear readonly
online disk
exit", Convert.ToInt32(objDisk["Index"])));
HostedSolutionLog.LogInfo("DiskPart Result: " + diskPartResult);
}
}
else
{
// *** Clear Read-Only and bring disk online with VDS ***
// clear Read-Only
if ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly)
{
HostedSolutionLog.LogInfo("Clearing disk Read-only flag");
advancedDisk.ClearFlags(Vds.DiskFlags.ReadOnly);
while ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly)
{
System.Threading.Thread.Sleep(100);
advancedDisk.Refresh();
}
}
// bring disk ONLINE
if (advancedDisk.Status == Vds.DiskStatus.Offline)
{
HostedSolutionLog.LogInfo("Bringing disk online");
advancedDisk.Online();
while (advancedDisk.Status == Vds.DiskStatus.Offline)
{
System.Threading.Thread.Sleep(100);
advancedDisk.Refresh();
}
}
}
// small pause after getting disk online
System.Threading.Thread.Sleep(3000);
// get disk again
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
// find volumes using VDS
HostedSolutionLog.LogInfo("Querying disk volumes with VDS");
foreach (Vds.Volume volume in diskPack.Volumes)
{
string letter = volume.DriveLetter.ToString();
if (letter != "")
volumes.Add(letter);
}
// find volumes using WMI
if (volumes.Count == 0 && objDisk != null)
{
HostedSolutionLog.LogInfo("Querying disk volumes with WMI");
foreach (ManagementObject objPartition in objDisk.GetRelated("Win32_DiskPartition"))
{
foreach (ManagementObject objVolume in objPartition.GetRelated("Win32_LogicalDisk"))
{
volumes.Add(objVolume["Name"].ToString().TrimEnd(':'));
}
}
}
HostedSolutionLog.LogInfo("Volumes found: " + volumes.Count);
// info object
MountedDiskInfo info = new MountedDiskInfo();
info.DiskAddress = diskAddress;
info.DiskVolumes = volumes.ToArray();
return info;
var diskInfo = VdsHelper.GetMountedDiskInfo(ServerNameSettings, diskNumber);
return diskInfo;
}
catch (Exception ex)
{
@ -1365,41 +1209,6 @@ exit", Convert.ToInt32(objDisk["Index"])));
}
}
private void FindVdsDisk(string diskAddress, out Vds.Advanced.AdvancedDisk advancedDisk, out Vds.Pack diskPack)
{
advancedDisk = null;
diskPack = null;
Vds.ServiceLoader serviceLoader = new Vds.ServiceLoader();
Vds.Service vds = serviceLoader.LoadService(ServerNameSettings);
vds.WaitForServiceReady();
foreach (Vds.Disk disk in vds.UnallocatedDisks)
{
if (disk.DiskAddress == diskAddress)
{
advancedDisk = (Vds.Advanced.AdvancedDisk)disk;
break;
}
}
if (advancedDisk == null)
{
vds.HardwareProvider = false;
vds.SoftwareProvider = true;
foreach (Vds.SoftwareProvider provider in vds.Providers)
foreach (Vds.Pack pack in provider.Packs)
foreach (Vds.Disk disk in pack.Disks)
if (disk.DiskAddress == diskAddress)
{
diskPack = pack;
advancedDisk = (Vds.Advanced.AdvancedDisk)disk;
break;
}
}
}
public ReturnCode UnmountVirtualHardDisk(string vhdPath)
{
Command cmd = new Command("Dismount-VHD");
@ -1417,7 +1226,7 @@ exit", Convert.ToInt32(objDisk["Index"])));
cmd.Parameters.Add("Path", FileUtils.EvaluateSystemVariables(vhdPath));
cmd.Parameters.Add("SizeBytes", sizeGB * Constants.Size1G);
PowerShell.Execute(cmd, true);
PowerShell.Execute(cmd, true, true);
return JobHelper.CreateSuccessResult(ReturnCode.JobStarted);
}
@ -1443,7 +1252,7 @@ exit", Convert.ToInt32(objDisk["Index"])));
cmd.Parameters.Add("DestinationPath", destinationPath);
cmd.Parameters.Add("VHDType", diskType.ToString());
PowerShell.Execute(cmd, true);
PowerShell.Execute(cmd, true, true);
return JobHelper.CreateSuccessResult(ReturnCode.JobStarted);
}
catch (Exception ex)
@ -1467,7 +1276,7 @@ exit", Convert.ToInt32(objDisk["Index"])));
Vds.Advanced.AdvancedDisk advancedDisk = null;
Vds.Pack diskPack = null;
FindVdsDisk(diskAddress, out advancedDisk, out diskPack);
VdsHelper.FindVdsDisk(ServerNameSettings, diskAddress, out advancedDisk, out diskPack);
if (advancedDisk == null)
throw new Exception("Could not find mounted disk");
@ -1522,36 +1331,11 @@ exit", Convert.ToInt32(objDisk["Index"])));
diskVolume.EndExtend(extendEvent);
}
// obsolete and currently is not used
private string RunDiskPart(string script)
{
// create temp script file name
string localPath = Path.Combine(GetTempRemoteFolder(), Guid.NewGuid().ToString("N"));
// save script to remote temp file
string remotePath = ConvertToUNC(localPath);
File.AppendAllText(remotePath, script);
// run diskpart
ExecuteRemoteProcess("DiskPart /s " + localPath);
// delete temp script
try
{
File.Delete(remotePath);
}
catch
{
// TODO
}
return "";
}
public string ReadRemoteFile(string path)
{
// temp file name on "system" drive available through hidden share
string tempPath = Path.Combine(GetTempRemoteFolder(), Guid.NewGuid().ToString("N"));
string tempPath = Path.Combine(VdsHelper.GetTempRemoteFolder(ServerNameSettings), Guid.NewGuid().ToString("N"));
HostedSolutionLog.LogInfo("Read remote file: " + path);
HostedSolutionLog.LogInfo("Local file temp path: " + tempPath);
@ -1561,7 +1345,7 @@ exit", Convert.ToInt32(objDisk["Index"])));
return null;
// read content of temp file
string remoteTempPath = ConvertToUNC(tempPath);
string remoteTempPath = VdsHelper.ConvertToUNC(ServerNameSettings, tempPath);
HostedSolutionLog.LogInfo("Remote file temp path: " + remoteTempPath);
string content = File.ReadAllText(remoteTempPath);
@ -1575,10 +1359,10 @@ exit", Convert.ToInt32(objDisk["Index"])));
public void WriteRemoteFile(string path, string content)
{
// temp file name on "system" drive available through hidden share
string tempPath = Path.Combine(GetTempRemoteFolder(), Guid.NewGuid().ToString("N"));
string tempPath = Path.Combine(VdsHelper.GetTempRemoteFolder(ServerNameSettings), Guid.NewGuid().ToString("N"));
// write to temp file
string remoteTempPath = ConvertToUNC(tempPath);
string remoteTempPath = VdsHelper.ConvertToUNC(ServerNameSettings, tempPath);
File.WriteAllText(remoteTempPath, content);
// delete file (WMI)
@ -1925,14 +1709,6 @@ exit", Convert.ToInt32(objDisk["Index"])));
wmi.GetWmiObject("Msvm_VirtualSystemSettingData", "InstanceID = '{0}'", "Microsoft:" + snapshotId);
}
private string ConvertToUNC(string path)
{
if (String.IsNullOrEmpty(ServerNameSettings)
|| path.StartsWith(@"\\"))
return path;
return String.Format(@"\\{0}\{1}", ServerNameSettings, path.Replace(":", "$"));
}
private ConcreteJob CreateJobFromWmiObject(ManagementBaseObject objJob)
{
@ -2136,80 +1912,10 @@ exit", Convert.ToInt32(objDisk["Index"])));
public void CreateFolder(string path)
{
ExecuteRemoteProcess(String.Format("cmd.exe /c md \"{0}\"", path));
VdsHelper.ExecuteRemoteProcess(ServerNameSettings, String.Format("cmd.exe /c md \"{0}\"", path));
}
public void ExecuteRemoteProcess(string command)
{
Wmi cimv2 = new Wmi(ServerNameSettings, "root\\cimv2");
ManagementClass objProcess = cimv2.GetWmiClass("Win32_Process");
// run process
object[] methodArgs = { command, null, null, 0 };
objProcess.InvokeMethod("Create", methodArgs);
// process ID
int processId = Convert.ToInt32(methodArgs[3]);
// wait until finished
// Create event query to be notified within 1 second of
// a change in a service
WqlEventQuery query =
new WqlEventQuery("__InstanceDeletionEvent",
new TimeSpan(0, 0, 1),
"TargetInstance isa \"Win32_Process\"");
// Initialize an event watcher and subscribe to events
// that match this query
ManagementEventWatcher watcher = new ManagementEventWatcher(cimv2.GetScope(), query);
// times out watcher.WaitForNextEvent in 20 seconds
watcher.Options.Timeout = new TimeSpan(0, 0, 20);
// Block until the next event occurs
// Note: this can be done in a loop if waiting for
// more than one occurrence
while (true)
{
ManagementBaseObject e = null;
try
{
// wait untill next process finish
e = watcher.WaitForNextEvent();
}
catch
{
// nothing has been finished in timeout period
return; // exit
}
// check process id
int pid = Convert.ToInt32(((ManagementBaseObject)e["TargetInstance"])["ProcessID"]);
if (pid == processId)
{
//Cancel the subscription
watcher.Stop();
// exit
return;
}
}
}
public string GetTempRemoteFolder()
{
Wmi cimv2 = new Wmi(ServerNameSettings, "root\\cimv2");
ManagementObject objOS = cimv2.GetWmiObject("win32_OperatingSystem");
string sysPath = (string)objOS["SystemDirectory"];
// remove trailing slash
if (sysPath.EndsWith("\\"))
sysPath = sysPath.Substring(0, sysPath.Length - 1);
sysPath = sysPath.Substring(0, sysPath.LastIndexOf("\\") + 1) + "Temp";
return sysPath;
}
#endregion
#region Hyper-V Cloud

View file

@ -55,7 +55,9 @@
</Compile>
<Compile Include="Constants.cs" />
<Compile Include="Extensions\PSObjectExtension.cs" />
<Compile Include="Extensions\StringExtensions.cs" />
<Compile Include="Helpers\BiosHelper.cs" />
<Compile Include="Helpers\VdsHelper.cs" />
<Compile Include="Helpers\HardDriveHelper.cs" />
<Compile Include="Helpers\NetworkAdapterHelper.cs" />
<Compile Include="Helpers\DvdDriveHelper.cs" />

View file

@ -0,0 +1,404 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="chkVpsFolderIncludesUsername.Text" xml:space="preserve">
<value>User name</value>
</data>
<data name="ComparePasswordsValidator.ErrorMessage" xml:space="preserve">
<value>Both reseller account passwords should match</value>
</data>
<data name="DefaultGatewayValidator.ErrorMessage" xml:space="preserve">
<value>Enter default gateway IP</value>
</data>
<data name="DvdLibraryPathValidator.ErrorMessage" xml:space="preserve">
<value>Enter DVD library folder</value>
</data>
<data name="ExportedVpsPathValidator.ErrorMessage" xml:space="preserve">
<value>Enter path for storing exported VPS</value>
</data>
<data name="HostnamePatternValidator.ErrorMessage" xml:space="preserve">
<value>Enter host name pattern</value>
</data>
<data name="locAlternateNameServer.Text" xml:space="preserve">
<value>Alternate Name Server:</value>
</data>
<data name="locDefaultGateway.Text" xml:space="preserve">
<value>Default Gateway:</value>
</data>
<data name="locDiskType.Text" xml:space="preserve">
<value>Disk Type:</value>
</data>
<data name="locWspResellerAccount.Text" xml:space="preserve">
<value>WebsitePanel Reseller Account</value>
</data>
<data name="locDvdIsoPath.Text" xml:space="preserve">
<value>DVD Library path:</value>
</data>
<data name="locExistingPassword.Text" xml:space="preserve">
<value>Existing password:</value>
</data>
<data name="locExportedVpsPath.Text" xml:space="preserve">
<value>Exported VPS path:</value>
</data>
<data name="locExternalNetwork.Text" xml:space="preserve">
<value>External Network</value>
</data>
<data name="locExternalNetworkName.Text" xml:space="preserve">
<value>Connect to Network:</value>
</data>
<data name="locGeneralSettings.Text" xml:space="preserve">
<value>General Settings</value>
</data>
<data name="locHostname.Text" xml:space="preserve">
<value>VPS Host name</value>
</data>
<data name="locHostnamePattern.Text" xml:space="preserve">
<value>Host name pattern:</value>
</data>
<data name="locIPFormat.Text" xml:space="preserve">
<value>IP Addresses Format:</value>
</data>
<data name="locMediaLibrary.Text" xml:space="preserve">
<value>DVD Media Library</value>
</data>
<data name="locNetworkAdapter.Text" xml:space="preserve">
<value>Network Adapter</value>
</data>
<data name="locOSTemplatesPath.Text" xml:space="preserve">
<value>OS Templates path:</value>
</data>
<data name="locPatternText.Text" xml:space="preserve">
<value>When user is not allowed to specify their custom host name the system will generate the host name for new VPS based on this pattern.&lt;br/&gt;&lt;br/&gt;
The following substitution variables can be used in the pattern:&lt;br/&gt;
[USERNAME], [USER_ID], [SPACE_ID]</value>
</data>
<data name="locPreferredNameServer.Text" xml:space="preserve">
<value>Preferred Name Server:</value>
</data>
<data name="locPrivateNetwork.Text" xml:space="preserve">
<value>Private Network</value>
</data>
<data name="locResellerAccountText.Text" xml:space="preserve">
<value>For automatic provisioning of WebsitePanel control panel inside VPS please enter WebsitePanel reseller account details below:</value>
</data>
<data name="locResellerConfirmPassword.Text" xml:space="preserve">
<value>Confirm password:</value>
</data>
<data name="locResellerPassword.Text" xml:space="preserve">
<value>Password:</value>
</data>
<data name="locResellerUsername.Text" xml:space="preserve">
<value>Username:</value>
</data>
<data name="locSeconds.Text" xml:space="preserve">
<value>seconds</value>
</data>
<data name="locStartAction.Text" xml:space="preserve">
<value>Automatic Start Action</value>
</data>
<data name="locStartOptionsText.Text" xml:space="preserve">
<value>What do you want VPS to do when the physical computer starts?</value>
</data>
<data name="locStartupDelay.Text" xml:space="preserve">
<value>Startup delay:</value>
</data>
<data name="locStartupDelayText.Text" xml:space="preserve">
<value>Specify a startup delay to reduce resource contention between virtual machines.</value>
</data>
<data name="locStopAction.Text" xml:space="preserve">
<value>Automatic Stop Action</value>
</data>
<data name="locStopActionText.Text" xml:space="preserve">
<value>What do you want VPS to do when the physical shuts down?</value>
</data>
<data name="locSubnetMask.Text" xml:space="preserve">
<value>Subnet Mask:</value>
</data>
<data name="locVhd.Text" xml:space="preserve">
<value>Virtual Hard Drive</value>
</data>
<data name="locVpsFolderIncludes.Text" xml:space="preserve">
<value>VPS folder includes:</value>
</data>
<data name="locVpsRootFolder.Text" xml:space="preserve">
<value>VPS root folder:</value>
</data>
<data name="ddlPrivateNetworkFormat10.Text" xml:space="preserve">
<value>10.0.0.1/8</value>
</data>
<data name="ddlPrivateNetworkFormat172.Text" xml:space="preserve">
<value>172.16.0.1/12</value>
</data>
<data name="ddlPrivateNetworkFormat192.Text" xml:space="preserve">
<value>192.168.0.1/16</value>
</data>
<data name="radioStartActionAlwaysStart.Text" xml:space="preserve">
<value>Always start VPS automatically</value>
</data>
<data name="radioStartActionNothing.Text" xml:space="preserve">
<value>Nothing</value>
</data>
<data name="radioStartActionStart.Text" xml:space="preserve">
<value>Automatically start if it was running when the service stopped</value>
</data>
<data name="radioStopActionSave.Text" xml:space="preserve">
<value>Save VPS state</value>
</data>
<data name="radioStopActionShutDown.Text" xml:space="preserve">
<value>Shut down VPS operating system</value>
</data>
<data name="radioStopActionTurnOff.Text" xml:space="preserve">
<value>Turn off VPS</value>
</data>
<data name="radioVirtualDiskTypeDynamic.Text" xml:space="preserve">
<value>Dynamically expanding</value>
</data>
<data name="radioVirtualDiskTypeFixed.Text" xml:space="preserve">
<value>Fixed size</value>
</data>
<data name="radioVpsFolderIncludesID.Text" xml:space="preserve">
<value>VPS identifier, for example "843FA-A0B2-34404"</value>
</data>
<data name="radioVpsFolderIncludesName.Text" xml:space="preserve">
<value>VPS host name, for example "vps1.domain.com"</value>
</data>
<data name="RootFolderValidator.ErrorMessage" xml:space="preserve">
<value>Enter VPS root folder</value>
</data>
<data name="StartupDelayValidator.ErrorMessage" xml:space="preserve">
<value>Startup delay could not be blank</value>
</data>
<data name="SubnetMaskValidator.ErrorMessage" xml:space="preserve">
<value>Enter subnet mask</value>
</data>
<data name="TemplatesPathValidator.ErrorMessage" xml:space="preserve">
<value>Enter OS templates folder</value>
</data>
<data name="CpuLimitValidator.ErrorMessage" xml:space="preserve">
<value>Enter processor limit per VPS</value>
</data>
<data name="CpuReserveValidator.ErrorMessage" xml:space="preserve">
<value>Enter processor reserve per VPS</value>
</data>
<data name="CpuWeightValidator.ErrorMessage" xml:space="preserve">
<value>Enter relative processor weight per VPS</value>
</data>
<data name="locCpuLimit.Text" xml:space="preserve">
<value>Virtual machine limit:</value>
</data>
<data name="locCpuReserve.Text" xml:space="preserve">
<value>Virtual machine reserve:</value>
</data>
<data name="locCpuWeight.Text" xml:space="preserve">
<value>Relative weight:</value>
</data>
<data name="locFolderVariables.Text" xml:space="preserve">
<value>The following variables are supported: [VPS_HOSTNAME], [USERNAME], [USER_ID], [SPACE_ID]</value>
</data>
<data name="locProcessorSettings.Text" xml:space="preserve">
<value>Processor Resource Settings</value>
</data>
<data name="btnConnect.Text" xml:space="preserve">
<value>Connect</value>
</data>
<data name="ErrorReadingNetworksList.Text" xml:space="preserve">
<value>&lt;Cannot read networks list&gt;</value>
</data>
<data name="locErrorReadingNetworksList.Text" xml:space="preserve">
<value>&lt;br/&gt;&lt;b&gt;Unable to connect to Hyper-V server&lt;/b&gt;&lt;br/&gt;&lt;br/&gt;Possible reasons:&lt;ol&gt;&lt;li&gt;You are going to manage remote Hyper-V server (either Server Core or Hyper-V Server 2008 machine) where WebsitePanel Server is not installed. Type the correct server name at the top of this form and then click "Connect" button.&lt;/li&gt;&lt;li&gt;WebsitePanel Server has insufficient permissions to connect remote Hyper-V server. Please refer administrator guide for client and server setup instructions.&lt;/li&gt;&lt;li&gt;Lost connectivity with WebsitePanel Server installed on Hyper-V virtualization server. Check connectivity and open service properties page once again.&lt;/li&gt;&lt;/ol&gt;</value>
</data>
<data name="locHyperVServer.Text" xml:space="preserve">
<value>Hyper-V Server</value>
</data>
<data name="locServerName.Text" xml:space="preserve">
<value>Server name:</value>
</data>
<data name="radioServerLocal.Text" xml:space="preserve">
<value>&lt;b&gt;Local&lt;/b&gt; - Hyper-V role is installed on this server</value>
</data>
<data name="radioServerRemote.Text" xml:space="preserve">
<value>&lt;b&gt;Remote&lt;/b&gt; - Remote Windows 2008 Server Core or Hyper-V Server 2008</value>
</data>
<data name="ServerNameValidator.ErrorMessage" xml:space="preserve">
<value>Enter server name</value>
</data>
<data name="ddlManagementNetworks.Text" xml:space="preserve">
<value>&lt;Do not connect VPS to Management Network&gt;</value>
</data>
<data name="locManagementNetwork.Text" xml:space="preserve">
<value>Management Network</value>
</data>
<data name="locManagementNetworkName.Text" xml:space="preserve">
<value>Connect to Network:</value>
</data>
<data name="ddlManageNicConfigDhcp.Text" xml:space="preserve">
<value>DHCP</value>
</data>
<data name="ddlManageNicConfigPool.Text" xml:space="preserve">
<value>IP Addresses Pool</value>
</data>
<data name="ddlPrivateNetworkFormatCustom.Text" xml:space="preserve">
<value>Custom</value>
</data>
<data name="locManageNicConfig.Text" xml:space="preserve">
<value>Network Card Configuration:</value>
</data>
<data name="locPrivCustomFormat.Text" xml:space="preserve">
<value>IP Address / CIDR:</value>
</data>
<data name="privateSubnetMaskValidator.ErrorMessage" xml:space="preserve">
<value>Enter subnet mask in CIDR format</value>
</data>
<data name="chkAssignIPAutomatically.Text" xml:space="preserve">
<value>Automatically assign IP addresses to the space on creation</value>
</data>
<data name="lblCoreSvcEndpoint.Text" xml:space="preserve">
<value>Core Svc Endpoint</value>
</data>
<data name="lblSCCMEndPoint.Text" xml:space="preserve">
<value>SCCM Endpoint</value>
</data>
<data name="lblSCCMServer.Text" xml:space="preserve">
<value>SCCM Server</value>
</data>
<data name="lblSCDPMEndPoint.Text" xml:space="preserve">
<value>SCDPM Endpoint</value>
</data>
<data name="lblSCDPMServer.Text" xml:space="preserve">
<value>SCDPM Server</value>
</data>
<data name="lblSCOMEndPoint.Text" xml:space="preserve">
<value>SCOM Endpoint</value>
</data>
<data name="lblSCOMServer.Text" xml:space="preserve">
<value>SCOM Server</value>
</data>
<data name="lblSCVMMEndPoint.Text" xml:space="preserve">
<value>SCVMM Endpoint</value>
</data>
<data name="lblSCVMMServer.Text" xml:space="preserve">
<value>SCVMM Server</value>
</data>
<data name="lblStorageEndPoint.Text" xml:space="preserve">
<value>Storage Endpoint</value>
</data>
<data name="locHyperVCloud.Text" xml:space="preserve">
<value>Hyper-V Cloud</value>
</data>
</root>

View file

@ -0,0 +1,408 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HyperV2012R2_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.HyperV2012R2_Settings" %>
<%@ Register Src="../UserControls/EditIPAddressControl.ascx" TagName="EditIPAddressControl" TagPrefix="wsp" %>
<asp:ValidationSummary ID="ValidationSummary" runat="server" ShowMessageBox="true" ShowSummary="false" />
<fieldset>
<legend>
<asp:Localize ID="locHyperVServer" runat="server" meta:resourcekey="locHyperVServer" Text="Hyper-V Server"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" style="margin: 10px;">
<tr>
<td colspan="2">
<asp:RadioButtonList ID="radioServer" runat="server" AutoPostBack="true"
onselectedindexchanged="radioServer_SelectedIndexChanged">
<asp:ListItem Value="local" meta:resourcekey="radioServerLocal" Selected="True">Local</asp:ListItem>
<asp:ListItem Value="remote" meta:resourcekey="radioServerRemote">Remote</asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr id="ServerNameRow" runat="server">
<td class="SubHead" style="padding-left:30px;" colspan="2">
<asp:Localize ID="locServerName" runat="server" meta:resourcekey="locServerName" Text="Server name:"></asp:Localize>
<asp:TextBox Width="200px" CssClass="NormalTextBox" Runat="server" ID="txtServerName"></asp:TextBox>
<asp:Button ID="btnConnect" runat="server" meta:resourcekey="btnConnect"
CssClass="Button1" Text="Connect" CausesValidation="false"
onclick="btnConnect_Click" />
<asp:RequiredFieldValidator ID="ServerNameValidator" runat="server" ControlToValidate="txtServerName"
Text="*" meta:resourcekey="ServerNameValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr id="ServerErrorRow" runat="server">
<td colspan="2">
<asp:Label ID="locErrorReadingNetworksList" runat="server"
meta:resourcekey="locErrorReadingNetworksList" ForeColor="Red"></asp:Label>
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locGeneralSettings" runat="server" meta:resourcekey="locGeneralSettings" Text="General Settings"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locVpsRootFolder" runat="server" meta:resourcekey="locVpsRootFolder" Text="VPS root folder:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="400px" CssClass="NormalTextBox" Runat="server" ID="txtVpsRootFolder"></asp:TextBox>
<asp:RequiredFieldValidator ID="RootFolderValidator" runat="server" ControlToValidate="txtVpsRootFolder"
Text="*" meta:resourcekey="RootFolderValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr>
<td></td>
<td>
<asp:Localize ID="locFolderVariables" runat="server" meta:resourcekey="locFolderVariables" Text="The following variables..."></asp:Localize>
<br />
<br />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locOSTemplatesPath" runat="server" meta:resourcekey="locOSTemplatesPath" Text="OS Templates path:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="300px" CssClass="NormalTextBox" Runat="server" ID="txtOSTemplatesPath"></asp:TextBox>
<asp:RequiredFieldValidator ID="TemplatesPathValidator" runat="server" ControlToValidate="txtOSTemplatesPath"
Text="*" meta:resourcekey="TemplatesPathValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locExportedVpsPath" runat="server" meta:resourcekey="locExportedVpsPath" Text="Exported VPS path:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="300px" CssClass="NormalTextBox" Runat="server" ID="txtExportedVpsPath"></asp:TextBox>
<asp:RequiredFieldValidator ID="ExportedVpsPathValidator" runat="server" ControlToValidate="txtExportedVpsPath"
Text="*" meta:resourcekey="ExportedVpsPathValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locProcessorSettings" runat="server" meta:resourcekey="locProcessorSettings" Text="Processor Resource Settings"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locCpuReserve" runat="server" meta:resourcekey="locCpuReserve" Text="Virtual machine reserve:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="50px" CssClass="NormalTextBox" Runat="server" ID="txtCpuReserve"></asp:TextBox>
%
<asp:RequiredFieldValidator ID="CpuReserveValidator" runat="server" ControlToValidate="txtCpuReserve"
Text="*" meta:resourcekey="CpuReserveValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locCpuLimit" runat="server" meta:resourcekey="locCpuLimit" Text="Virtual machine limit:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="50px" CssClass="NormalTextBox" Runat="server" ID="txtCpuLimit"></asp:TextBox>
%
<asp:RequiredFieldValidator ID="CpuLimitValidator" runat="server" ControlToValidate="txtCpuLimit"
Text="*" meta:resourcekey="CpuLimitValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locCpuWeight" runat="server" meta:resourcekey="locCpuWeight" Text="Relative weight:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="50px" CssClass="NormalTextBox" Runat="server" ID="txtCpuWeight"></asp:TextBox>
<asp:RequiredFieldValidator ID="CpuWeightValidator" runat="server" ControlToValidate="txtCpuWeight"
Text="*" meta:resourcekey="CpuWeightValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locMediaLibrary" runat="server" meta:resourcekey="locMediaLibrary" Text="DVD Media Library"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locDvdIsoPath" runat="server" meta:resourcekey="locDvdIsoPath" Text="Path to DVD ISO files:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="300px" CssClass="NormalTextBox" Runat="server" ID="txtDvdLibraryPath"></asp:TextBox>
<asp:RequiredFieldValidator ID="DvdLibraryPathValidator" runat="server" ControlToValidate="txtDvdLibraryPath"
Text="*" meta:resourcekey="DvdLibraryPathValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locVhd" runat="server" meta:resourcekey="locVhd" Text="Virtual Hard Drive"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;" valign="top">
<asp:Localize ID="locDiskType" runat="server" meta:resourcekey="locDiskType" Text="Disk Type:"></asp:Localize>
</td>
<td>
<asp:RadioButtonList ID="radioVirtualDiskType" runat="server">
<asp:ListItem Value="dynamic" meta:resourcekey="radioVirtualDiskTypeDynamic" Selected="True">Dynamic</asp:ListItem>
<asp:ListItem Value="fixed" meta:resourcekey="radioVirtualDiskTypeFixed">Fixed</asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locExternalNetwork" runat="server" meta:resourcekey="locExternalNetwork" Text="External Network"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locExternalNetworkName" runat="server" meta:resourcekey="locExternalNetworkName" Text="Connect to Network:"></asp:Localize>
</td>
<td>
<asp:DropDownList ID="ddlExternalNetworks" runat="server" CssClass="NormalTextBox" Width="450"
DataValueField="SwitchId" DataTextField="Name"></asp:DropDownList>
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locPreferredNameServer" runat="server" meta:resourcekey="locPreferredNameServer" Text="Preferred Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="externalPreferredNameServer" runat="server" Required="true" />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locAlternateNameServer" runat="server" meta:resourcekey="locAlternateNameServer" Text="Alternate Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="externalAlternateNameServer" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:CheckBox ID="chkAssignIPAutomatically" runat="server" meta:resourcekey="chkAssignIPAutomatically" Text="Assign IP addresses to the space on creation" />
</td>
</tr>
</table>
</fieldset>
<br />
<asp:UpdatePanel ID="ManageUpdatePanel" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<fieldset>
<legend>
<asp:Localize ID="locManagementNetwork" runat="server" meta:resourcekey="locManagementNetwork" Text="Management Network"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td style="width:200px;">
<asp:Localize ID="locManagementNetworkName" runat="server" meta:resourcekey="locManagementNetworkName" Text="Connect to Network:"></asp:Localize>
</td>
<td>
<asp:DropDownList ID="ddlManagementNetworks" runat="server"
CssClass="NormalTextBox" Width="450"
DataValueField="SwitchId" DataTextField="Name" AutoPostBack="true"
onselectedindexchanged="ddlManagementNetworks_SelectedIndexChanged"></asp:DropDownList>
</td>
</tr>
<tr id="ManageNicConfigRow" runat="server">
<td>
<asp:Localize ID="locManageNicConfig" runat="server" meta:resourcekey="locManageNicConfig" Text="Network Adapter Configuration:"></asp:Localize>
</td>
<td>
<asp:DropDownList ID="ddlManageNicConfig" runat="server" AutoPostBack="true"
onselectedindexchanged="ddlManageNicConfig_SelectedIndexChanged">
<asp:ListItem Value="Pool" meta:resourcekey="ddlManageNicConfigPool" Selected="True">POOL</asp:ListItem>
<asp:ListItem Value="DHCP" meta:resourcekey="ddlManageNicConfigDhcp">DHCP</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr id="ManagePreferredNameServerRow" runat="server">
<td>
<asp:Localize ID="locManagePreferredNameServer" runat="server" meta:resourcekey="locPreferredNameServer" Text="Preferred Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="managePreferredNameServer" runat="server" Required="true" />
</td>
</tr>
<tr id="ManageAlternateNameServerRow" runat="server">
<td>
<asp:Localize ID="locManageAlternateNameServer" runat="server" meta:resourcekey="locAlternateNameServer" Text="Alternate Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="manageAlternateNameServer" runat="server" />
</td>
</tr>
</table>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:UpdatePanel ID="PrivUpdatePanel" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<fieldset>
<legend>
<asp:Localize ID="locPrivateNetwork" runat="server" meta:resourcekey="locPrivateNetwork" Text="Private Network"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locIPFormat" runat="server" meta:resourcekey="locIPFormat" Text="IP addresses format:"></asp:Localize>
</td>
<td>
<asp:DropDownList ID="ddlPrivateNetworkFormat" runat="server"
AutoPostBack="true" onselectedindexchanged="ddlPrivateNetworkFormat_SelectedIndexChanged">
<asp:ListItem Value="" meta:resourcekey="ddlPrivateNetworkFormatCustom">Custom</asp:ListItem>
<asp:ListItem Value="192.168.0.1/16" meta:resourcekey="ddlPrivateNetworkFormat192" Selected="True">192.168.0.1</asp:ListItem>
<asp:ListItem Value="172.16.0.1/12" meta:resourcekey="ddlPrivateNetworkFormat172">172.16.0.1</asp:ListItem>
<asp:ListItem Value="10.0.0.1/8" meta:resourcekey="ddlPrivateNetworkFormat10">10.0.0.1</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr id="PrivCustomFormatRow" runat="server">
<td class="SubHead">
<asp:Localize ID="locPrivCustomFormat" runat="server" meta:resourcekey="locPrivCustomFormat" Text="Start IP Address:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="privateIPAddress" runat="server" Required="true" />
/
<asp:TextBox ID="privateSubnetMask" runat="server" MaxLength="3" Width="40px" CssClass="NormalTextBox"></asp:TextBox>
<asp:RequiredFieldValidator ID="privateSubnetMaskValidator" runat="server" ControlToValidate="privateSubnetMask"
Text="*" meta:resourcekey="privateSubnetMaskValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locPrivDefaultGateway" runat="server" meta:resourcekey="locDefaultGateway" Text="Default Gateway:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="privateDefaultGateway" runat="server" />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locPrivPreferredNameServer" runat="server" meta:resourcekey="locPreferredNameServer" Text="Preferred Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="privatePreferredNameServer" runat="server" />
</td>
</tr>
<tr>
<td class="SubHead">
<asp:Localize ID="locPrivAlternateNameServer" runat="server" meta:resourcekey="locAlternateNameServer" Text="Alternate Name Server:"></asp:Localize>
</td>
<td>
<wsp:EditIPAddressControl id="privateAlternateNameServer" runat="server" />
</td>
</tr>
</table>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<fieldset>
<legend>
<asp:Localize ID="locHostname" runat="server" meta:resourcekey="locHostname" Text="Host name"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td class="SubHead" style="width:200px;">
<asp:Localize ID="locHostnamePattern" runat="server" meta:resourcekey="locHostnamePattern" Text="VPS host name pattern:"></asp:Localize>
</td>
<td>
<asp:TextBox Width="200px" CssClass="NormalTextBox" Runat="server" ID="txtHostnamePattern"></asp:TextBox>
<asp:RequiredFieldValidator ID="HostnamePatternValidator" runat="server" ControlToValidate="txtHostnamePattern"
Text="*" meta:resourcekey="HostnamePatternValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
</table>
<p style="margin: 10px;">
<asp:Localize ID="locPatternText" runat="server" meta:resourcekey="locPatternText" Text="Help text goes here..."></asp:Localize>
</p>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locStartAction" runat="server" meta:resourcekey="locStartAction" Text="Automatic Start Action"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td>
<asp:Localize ID="locStartOptionsText" runat="server" meta:resourcekey="locStartOptionsText" Text="What do you want VPS to do when the physical computer starts?"></asp:Localize>
</td>
</tr>
<tr>
<td>
<asp:RadioButtonList ID="radioStartAction" runat="server">
<asp:ListItem Value="0" meta:resourcekey="radioStartActionNothing">Nothing</asp:ListItem>
<asp:ListItem Value="1" meta:resourcekey="radioStartActionStart" Selected="True">Start</asp:ListItem>
<asp:ListItem Value="2" meta:resourcekey="radioStartActionAlwaysStart">AlwaysStart</asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locStartupDelayText" runat="server" meta:resourcekey="locStartupDelayText" Text="Specify a startup delay to reduce resource contention between virtual machines."></asp:Localize>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locStartupDelay" runat="server" meta:resourcekey="locStartupDelay" Text="Startup delay:"></asp:Localize>
<asp:TextBox ID="txtStartupDelay" runat="server" Width="30px"></asp:TextBox>
<asp:Localize ID="locSeconds" runat="server" meta:resourcekey="locSeconds" Text="seconds"></asp:Localize>
<asp:RequiredFieldValidator ID="StartupDelayValidator" runat="server" ControlToValidate="txtStartupDelay"
Text="*" meta:resourcekey="StartupDelayValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
</table>
</fieldset>
<br />
<fieldset>
<legend>
<asp:Localize ID="locStopAction" runat="server" meta:resourcekey="locStopAction" Text="Automatic Stop Action"></asp:Localize>
</legend>
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
<tr>
<td>
<asp:Localize ID="locStopActionText" runat="server" meta:resourcekey="locStopActionText" Text="What do you want VPS to do when the physical shuts down?"></asp:Localize>
</td>
</tr>
<tr>
<td>
<asp:RadioButtonList ID="radioStopAction" runat="server">
<asp:ListItem Value="1" meta:resourcekey="radioStopActionSave">Save</asp:ListItem>
<asp:ListItem Value="0" meta:resourcekey="radioStopActionTurnOff">TurnOff</asp:ListItem>
<asp:ListItem Value="2" meta:resourcekey="radioStopActionShutDown" Selected="True">ShutDown</asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
</table>
</fieldset>
<br />

View file

@ -0,0 +1,227 @@
// 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;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Specialized;
using WebsitePanel.Providers.Virtualization;
using WebsitePanel.EnterpriseServer;
using System.Web.UI.MobileControls;
using System.Collections.Generic;
namespace WebsitePanel.Portal.ProviderControls
{
public partial class HyperV2012R2_Settings : WebsitePanelControlBase, IHostingServiceProviderSettings
{
protected void Page_Load(object sender, EventArgs e)
{
}
void IHostingServiceProviderSettings.BindSettings(StringDictionary settings)
{
txtServerName.Text = settings["ServerName"];
radioServer.SelectedIndex = (txtServerName.Text == "") ? 0 : 1;
// bind networks
BindNetworksList();
// general settings
txtVpsRootFolder.Text = settings["RootFolder"];
txtOSTemplatesPath.Text = settings["OsTemplatesPath"];
txtExportedVpsPath.Text = settings["ExportedVpsPath"];
// CPU
txtCpuLimit.Text = settings["CpuLimit"];
txtCpuReserve.Text = settings["CpuReserve"];
txtCpuWeight.Text = settings["CpuWeight"];
// DVD library
txtDvdLibraryPath.Text = settings["DvdLibraryPath"];
// VHD type
radioVirtualDiskType.SelectedValue = settings["VirtualDiskType"];
// External network
ddlExternalNetworks.SelectedValue = settings["ExternalNetworkId"];
externalPreferredNameServer.Text = settings["ExternalPreferredNameServer"];
externalAlternateNameServer.Text = settings["ExternalAlternateNameServer"];
chkAssignIPAutomatically.Checked = Utils.ParseBool(settings["AutoAssignExternalIP"], true);
// Private network
ddlPrivateNetworkFormat.SelectedValue = settings["PrivateNetworkFormat"];
privateIPAddress.Text = settings["PrivateIPAddress"];
privateSubnetMask.Text = settings["PrivateSubnetMask"];
privateDefaultGateway.Text = settings["PrivateDefaultGateway"];
privatePreferredNameServer.Text = settings["PrivatePreferredNameServer"];
privateAlternateNameServer.Text = settings["PrivateAlternateNameServer"];
// Management network
ddlManagementNetworks.SelectedValue = settings["ManagementNetworkId"];
ddlManageNicConfig.SelectedValue = settings["ManagementNicConfig"];
managePreferredNameServer.Text = settings["ManagementPreferredNameServer"];
manageAlternateNameServer.Text = settings["ManagementAlternateNameServer"];
// host name
txtHostnamePattern.Text = settings["HostnamePattern"];
// start action
radioStartAction.SelectedValue = settings["StartAction"];
txtStartupDelay.Text = settings["StartupDelay"];
// stop
radioStopAction.SelectedValue = settings["StopAction"];
ToggleControls();
}
void IHostingServiceProviderSettings.SaveSettings(StringDictionary settings)
{
settings["ServerName"] = txtServerName.Text.Trim();
// general settings
settings["RootFolder"] = txtVpsRootFolder.Text.Trim();
settings["OsTemplatesPath"] = txtOSTemplatesPath.Text.Trim();
settings["ExportedVpsPath"] = txtExportedVpsPath.Text.Trim();
// CPU
settings["CpuLimit"] = txtCpuLimit.Text.Trim();
settings["CpuReserve"] = txtCpuReserve.Text.Trim();
settings["CpuWeight"] = txtCpuWeight.Text.Trim();
// DVD library
settings["DvdLibraryPath"] = txtDvdLibraryPath.Text.Trim();
// VHD type
settings["VirtualDiskType"] = radioVirtualDiskType.SelectedValue;
// External network
settings["ExternalNetworkId"] = ddlExternalNetworks.SelectedValue;
settings["ExternalPreferredNameServer"] = externalPreferredNameServer.Text;
settings["ExternalAlternateNameServer"] = externalAlternateNameServer.Text;
settings["AutoAssignExternalIP"] = chkAssignIPAutomatically.Checked.ToString();
// Private network
settings["PrivateNetworkFormat"] = ddlPrivateNetworkFormat.SelectedValue;
settings["PrivateIPAddress"] = ddlPrivateNetworkFormat.SelectedIndex == 0 ? privateIPAddress.Text : "";
settings["PrivateSubnetMask"] = ddlPrivateNetworkFormat.SelectedIndex == 0 ? privateSubnetMask.Text : "";
settings["PrivateDefaultGateway"] = privateDefaultGateway.Text;
settings["PrivatePreferredNameServer"] = privatePreferredNameServer.Text;
settings["PrivateAlternateNameServer"] = privateAlternateNameServer.Text;
// Management network
settings["ManagementNetworkId"] = ddlManagementNetworks.SelectedValue;
settings["ManagementNicConfig"] = ddlManageNicConfig.SelectedValue;
settings["ManagementPreferredNameServer"] = ddlManageNicConfig.SelectedIndex == 0 ? managePreferredNameServer.Text : "";
settings["ManagementAlternateNameServer"] = ddlManageNicConfig.SelectedIndex == 0 ? manageAlternateNameServer.Text : "";
// host name
settings["HostnamePattern"] = txtHostnamePattern.Text.Trim();
// start action
settings["StartAction"] = radioStartAction.SelectedValue;
settings["StartupDelay"] = Utils.ParseInt(txtStartupDelay.Text.Trim(), 0).ToString();
// stop
settings["StopAction"] = radioStopAction.SelectedValue;
}
private void BindNetworksList()
{
try
{
VirtualSwitch[] switches = ES.Services.VPS.GetExternalSwitches(PanelRequest.ServiceId, txtServerName.Text.Trim());
ddlExternalNetworks.DataSource = switches;
ddlExternalNetworks.DataBind();
ddlManagementNetworks.DataSource = switches;
ddlManagementNetworks.DataBind();
ddlManagementNetworks.Items.Insert(0, new ListItem(GetLocalizedString("ddlManagementNetworks.Text"), ""));
locErrorReadingNetworksList.Visible = false;
}
catch
{
ddlExternalNetworks.Items.Add(new ListItem(GetLocalizedString("ErrorReadingNetworksList.Text"), ""));
ddlManagementNetworks.Items.Add(new ListItem(GetLocalizedString("ErrorReadingNetworksList.Text"), ""));
locErrorReadingNetworksList.Visible = true;
}
}
private void ToggleControls()
{
ServerNameRow.Visible = (radioServer.SelectedIndex == 1);
if (radioServer.SelectedIndex == 0)
{
txtServerName.Text = "";
}
// private network
PrivCustomFormatRow.Visible = (ddlPrivateNetworkFormat.SelectedIndex == 0);
// management network
ManageNicConfigRow.Visible = (ddlManagementNetworks.SelectedIndex > 0);
ManageAlternateNameServerRow.Visible = ManageNicConfigRow.Visible && (ddlManageNicConfig.SelectedIndex == 0);
ManagePreferredNameServerRow.Visible = ManageNicConfigRow.Visible && (ddlManageNicConfig.SelectedIndex == 0);
}
protected void radioServer_SelectedIndexChanged(object sender, EventArgs e)
{
ToggleControls();
}
protected void btnConnect_Click(object sender, EventArgs e)
{
BindNetworksList();
}
protected void ddlPrivateNetworkFormat_SelectedIndexChanged(object sender, EventArgs e)
{
ToggleControls();
}
protected void ddlManageNicConfig_SelectedIndexChanged(object sender, EventArgs e)
{
ToggleControls();
}
protected void ddlManagementNetworks_SelectedIndexChanged(object sender, EventArgs e)
{
ToggleControls();
}
}
}

View file

@ -0,0 +1,825 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebsitePanel.Portal.ProviderControls {
public partial class HyperV2012R2_Settings {
/// <summary>
/// ValidationSummary control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary;
/// <summary>
/// locHyperVServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locHyperVServer;
/// <summary>
/// radioServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButtonList radioServer;
/// <summary>
/// ServerNameRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow ServerNameRow;
/// <summary>
/// locServerName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locServerName;
/// <summary>
/// txtServerName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtServerName;
/// <summary>
/// btnConnect control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnConnect;
/// <summary>
/// ServerNameValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator ServerNameValidator;
/// <summary>
/// ServerErrorRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow ServerErrorRow;
/// <summary>
/// locErrorReadingNetworksList control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label locErrorReadingNetworksList;
/// <summary>
/// locGeneralSettings control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locGeneralSettings;
/// <summary>
/// locVpsRootFolder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locVpsRootFolder;
/// <summary>
/// txtVpsRootFolder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtVpsRootFolder;
/// <summary>
/// RootFolderValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator RootFolderValidator;
/// <summary>
/// locFolderVariables control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locFolderVariables;
/// <summary>
/// locOSTemplatesPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locOSTemplatesPath;
/// <summary>
/// txtOSTemplatesPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtOSTemplatesPath;
/// <summary>
/// TemplatesPathValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator TemplatesPathValidator;
/// <summary>
/// locExportedVpsPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locExportedVpsPath;
/// <summary>
/// txtExportedVpsPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtExportedVpsPath;
/// <summary>
/// ExportedVpsPathValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator ExportedVpsPathValidator;
/// <summary>
/// locProcessorSettings control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locProcessorSettings;
/// <summary>
/// locCpuReserve control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locCpuReserve;
/// <summary>
/// txtCpuReserve control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtCpuReserve;
/// <summary>
/// CpuReserveValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator CpuReserveValidator;
/// <summary>
/// locCpuLimit control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locCpuLimit;
/// <summary>
/// txtCpuLimit control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtCpuLimit;
/// <summary>
/// CpuLimitValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator CpuLimitValidator;
/// <summary>
/// locCpuWeight control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locCpuWeight;
/// <summary>
/// txtCpuWeight control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtCpuWeight;
/// <summary>
/// CpuWeightValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator CpuWeightValidator;
/// <summary>
/// locMediaLibrary control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locMediaLibrary;
/// <summary>
/// locDvdIsoPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locDvdIsoPath;
/// <summary>
/// txtDvdLibraryPath control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtDvdLibraryPath;
/// <summary>
/// DvdLibraryPathValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator DvdLibraryPathValidator;
/// <summary>
/// locVhd control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locVhd;
/// <summary>
/// locDiskType control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locDiskType;
/// <summary>
/// radioVirtualDiskType control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButtonList radioVirtualDiskType;
/// <summary>
/// locExternalNetwork control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locExternalNetwork;
/// <summary>
/// locExternalNetworkName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locExternalNetworkName;
/// <summary>
/// ddlExternalNetworks control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlExternalNetworks;
/// <summary>
/// locPreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPreferredNameServer;
/// <summary>
/// externalPreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl externalPreferredNameServer;
/// <summary>
/// locAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locAlternateNameServer;
/// <summary>
/// externalAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl externalAlternateNameServer;
/// <summary>
/// chkAssignIPAutomatically control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox chkAssignIPAutomatically;
/// <summary>
/// ManageUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel ManageUpdatePanel;
/// <summary>
/// locManagementNetwork control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locManagementNetwork;
/// <summary>
/// locManagementNetworkName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locManagementNetworkName;
/// <summary>
/// ddlManagementNetworks control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlManagementNetworks;
/// <summary>
/// ManageNicConfigRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow ManageNicConfigRow;
/// <summary>
/// locManageNicConfig control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locManageNicConfig;
/// <summary>
/// ddlManageNicConfig control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlManageNicConfig;
/// <summary>
/// ManagePreferredNameServerRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow ManagePreferredNameServerRow;
/// <summary>
/// locManagePreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locManagePreferredNameServer;
/// <summary>
/// managePreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl managePreferredNameServer;
/// <summary>
/// ManageAlternateNameServerRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow ManageAlternateNameServerRow;
/// <summary>
/// locManageAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locManageAlternateNameServer;
/// <summary>
/// manageAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl manageAlternateNameServer;
/// <summary>
/// PrivUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel PrivUpdatePanel;
/// <summary>
/// locPrivateNetwork control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPrivateNetwork;
/// <summary>
/// locIPFormat control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locIPFormat;
/// <summary>
/// ddlPrivateNetworkFormat control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlPrivateNetworkFormat;
/// <summary>
/// PrivCustomFormatRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow PrivCustomFormatRow;
/// <summary>
/// locPrivCustomFormat control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPrivCustomFormat;
/// <summary>
/// privateIPAddress control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl privateIPAddress;
/// <summary>
/// privateSubnetMask control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox privateSubnetMask;
/// <summary>
/// privateSubnetMaskValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator privateSubnetMaskValidator;
/// <summary>
/// locPrivDefaultGateway control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPrivDefaultGateway;
/// <summary>
/// privateDefaultGateway control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl privateDefaultGateway;
/// <summary>
/// locPrivPreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPrivPreferredNameServer;
/// <summary>
/// privatePreferredNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl privatePreferredNameServer;
/// <summary>
/// locPrivAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPrivAlternateNameServer;
/// <summary>
/// privateAlternateNameServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.EditIPAddressControl privateAlternateNameServer;
/// <summary>
/// locHostname control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locHostname;
/// <summary>
/// locHostnamePattern control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locHostnamePattern;
/// <summary>
/// txtHostnamePattern control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtHostnamePattern;
/// <summary>
/// HostnamePatternValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator HostnamePatternValidator;
/// <summary>
/// locPatternText control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locPatternText;
/// <summary>
/// locStartAction control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStartAction;
/// <summary>
/// locStartOptionsText control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStartOptionsText;
/// <summary>
/// radioStartAction control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButtonList radioStartAction;
/// <summary>
/// locStartupDelayText control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStartupDelayText;
/// <summary>
/// locStartupDelay control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStartupDelay;
/// <summary>
/// txtStartupDelay control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtStartupDelay;
/// <summary>
/// locSeconds control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locSeconds;
/// <summary>
/// StartupDelayValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator StartupDelayValidator;
/// <summary>
/// locStopAction control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStopAction;
/// <summary>
/// locStopActionText control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locStopActionText;
/// <summary>
/// radioStopAction control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButtonList radioStopAction;
}
}

View file

@ -258,6 +258,13 @@
<Compile Include="ExchangeServer\UserControls\EnterpriseStorageOwaUsersList.ascx.designer.cs">
<DependentUpon>EnterpriseStorageOwaUsersList.ascx</DependentUpon>
</Compile>
<Compile Include="ProviderControls\HyperV2012R2_Settings.ascx.cs">
<DependentUpon>HyperV2012R2_Settings.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="ProviderControls\HyperV2012R2_Settings.ascx.designer.cs">
<DependentUpon>HyperV2012R2_Settings.ascx</DependentUpon>
</Compile>
<Compile Include="VPS\ProviderControls\HyperV2012R2_Create.ascx.cs">
<DependentUpon>HyperV2012R2_Create.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
@ -4517,6 +4524,7 @@
<Content Include="ExchangeServer\ExchangeCheckDomainName.ascx" />
<Content Include="ExchangeServer\UserControls\EnterpriseStorageEditFolderTabs.ascx" />
<Content Include="ExchangeServer\UserControls\EnterpriseStorageOwaUsersList.ascx" />
<Content Include="ProviderControls\HyperV2012R2_Settings.ascx" />
<Content Include="VPS\ProviderControls\HyperV2012R2_Create.ascx" />
<Content Include="ProviderControls\SmarterMail100_EditAccount.ascx" />
<Content Include="ProviderControls\SmarterMail100_EditDomain.ascx" />
@ -4570,6 +4578,9 @@
<Content Include="VPS\ProviderControls\App_LocalResources\HyperV2012R2_Create.ascx.resx">
<SubType>Designer</SubType>
</Content>
<Content Include="ProviderControls\App_LocalResources\HyperV2012R2_Settings.ascx.resx">
<SubType>Designer</SubType>
</Content>
<EmbeddedResource Include="RDS\App_LocalResources\RDSEditCollectionSettings.ascx.resx" />
<Content Include="RDSServersEditServer.ascx" />
<Content Include="RDS\AssignedRDSServers.ascx" />