wsp-10329 Adding hyper-v replica to HyperV Provider. WebPortal Part 4.
This commit is contained in:
parent
f6ffbc7513
commit
249e077bb5
6 changed files with 72 additions and 38 deletions
|
@ -3787,6 +3787,8 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
public static ResultObject SetVmReplication(int itemId, VmReplication replication)
|
public static ResultObject SetVmReplication(int itemId, VmReplication replication)
|
||||||
{
|
{
|
||||||
|
TaskManager.StartTask("VPS2012", "SetVmReplication");
|
||||||
|
|
||||||
ResultObject result = new ResultObject();
|
ResultObject result = new ResultObject();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -3813,8 +3815,13 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
result.AddError(VirtualizationErrorCodes.SET_REPLICATION_ERROR, ex);
|
throw TaskManager.WriteError(ex);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TaskManager.CompleteTask();
|
||||||
|
}
|
||||||
|
TaskManager.WriteWarning("Organization with itemId '{0}' not found", itemId.ToString());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4097,15 +4097,30 @@
|
||||||
<data name="Error.VPS_SET_REPLICATION_ERROR" xml:space="preserve">
|
<data name="Error.VPS_SET_REPLICATION_ERROR" xml:space="preserve">
|
||||||
<value>Cannot enable\set replication for the virtual machine</value>
|
<value>Cannot enable\set replication for the virtual machine</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Success.VPS_SET_REPLICATION_ERROR" xml:space="preserve">
|
||||||
|
<value>Replication set\enabled for the virtual machine</value>
|
||||||
|
</data>
|
||||||
<data name="Error.VPS_DISABLE_REPLICATION_ERROR" xml:space="preserve">
|
<data name="Error.VPS_DISABLE_REPLICATION_ERROR" xml:space="preserve">
|
||||||
<value>Cannot disable replication for the virtual machine</value>
|
<value>Cannot disable replication for the virtual machine</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Success.VPS_DISABLE_REPLICATION_ERROR" xml:space="preserve">
|
||||||
|
<value>Replication disabled for the virtual machine</value>
|
||||||
|
</data>
|
||||||
<data name="Error.VPS_PAUSE_REPLICATION_ERROR" xml:space="preserve">
|
<data name="Error.VPS_PAUSE_REPLICATION_ERROR" xml:space="preserve">
|
||||||
<value>Cannot pause replication for the virtual machine</value>
|
<value>Cannot pause replication for the virtual machine</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Success.VPS_PAUSE_REPLICATION_ERROR" xml:space="preserve">
|
||||||
|
<value>Replication paused for the virtual machine</value>
|
||||||
|
</data>
|
||||||
<data name="Error.VPS_RESUME_REPLICATION_ERROR" xml:space="preserve">
|
<data name="Error.VPS_RESUME_REPLICATION_ERROR" xml:space="preserve">
|
||||||
<value>Cannot resume replication for the virtual machine</value>
|
<value>Cannot resume replication for the virtual machine</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Success.VPS_RESUME_REPLICATION_ERROR" xml:space="preserve">
|
||||||
|
<value>Replication resumed for the virtual machine</value>
|
||||||
|
</data>
|
||||||
|
<data name="Error.VPS_REQUIRED" xml:space="preserve">
|
||||||
|
<value>Please fill required fields</value>
|
||||||
|
</data>
|
||||||
|
|
||||||
<data name="VPS.VPS_JOB_FAILED_ERROR" xml:space="preserve">
|
<data name="VPS.VPS_JOB_FAILED_ERROR" xml:space="preserve">
|
||||||
<value>Job execution failed with the following code: {1}</value>
|
<value>Job execution failed with the following code: {1}</value>
|
||||||
|
|
|
@ -117,12 +117,6 @@
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="btnDetailInfo.OnClientClick" xml:space="preserve">
|
|
||||||
<value>ShowProgressDialog('Gathering detailed information...', 'DetailModal');</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnUpdate.OnClientClick" xml:space="preserve">
|
|
||||||
<value>ShowProgressDialog('Updating VM replication...');</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnPause.OnClientClick" xml:space="preserve">
|
<data name="btnPause.OnClientClick" xml:space="preserve">
|
||||||
<value>ShowProgressDialog('Pausing VM replication...');</value>
|
<value>ShowProgressDialog('Pausing VM replication...');</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -270,4 +264,7 @@
|
||||||
<data name="valVHDs.ErrorMessage" xml:space="preserve">
|
<data name="valVHDs.ErrorMessage" xml:space="preserve">
|
||||||
<value>Please select at least one VHD</value>
|
<value>Please select at least one VHD</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="btnUpdate.OnClientClick" xml:space="preserve">
|
||||||
|
<value>ShowProgressDialog('Updating VM replication...');</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function ValidateCheckBoxList(sender, args) {
|
function ValidateCheckBoxList(sender, args) {
|
||||||
var checkBoxList = document.getElementById("vhdContainer");
|
var checkBoxList = document.getElementsByClassName("vhdContainer");
|
||||||
var checkboxes = checkBoxList.getElementsByTagName("input");
|
var checkboxes = checkBoxList.getElementsByTagName("input");
|
||||||
var isValid = false;
|
var isValid = false;
|
||||||
for (var i = 0; i < checkboxes.length; i++) {
|
for (var i = 0; i < checkboxes.length; i++) {
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
TargetControlID="ReplicationPanel" meta:ResourceKey="secReplication" Text="Replication Configuration">
|
TargetControlID="ReplicationPanel" meta:ResourceKey="secReplication" Text="Replication Configuration">
|
||||||
</wsp:CollapsiblePanel>
|
</wsp:CollapsiblePanel>
|
||||||
<asp:Panel ID="ReplicationPanel" runat="server" Height="0" Style="overflow: hidden; padding: 10px; width: 750px;">
|
<asp:Panel ID="ReplicationPanel" runat="server" Height="0" Style="overflow: hidden; padding: 10px; width: 750px;">
|
||||||
<div class="FormButtonsBarClean">
|
<div class="FormButtonsBarClean" onclick="ShowProgressDialog('Prepare UI...');">
|
||||||
<asp:CheckBox ID="chbEnable" runat="server" meta:resourcekey="chbEnable" Text="Enable replication" AutoPostBack="True" />
|
<asp:CheckBox ID="chbEnable" runat="server" meta:resourcekey="chbEnable" Text="Enable replication" AutoPostBack="True" />
|
||||||
</div>
|
</div>
|
||||||
<table runat="server" id="ReplicaTable" class="ReplicaTable" style="margin: 10px; width: 100%;">
|
<table runat="server" id="ReplicaTable" class="ReplicaTable" style="margin: 10px; width: 100%;">
|
||||||
|
@ -105,8 +105,8 @@
|
||||||
<td>
|
<td>
|
||||||
<asp:Localize ID="locVHDs" runat="server" meta:resourcekey="locVHDs" Text="Choose Replication VHDs:"></asp:Localize>
|
<asp:Localize ID="locVHDs" runat="server" meta:resourcekey="locVHDs" Text="Choose Replication VHDs:"></asp:Localize>
|
||||||
</td>
|
</td>
|
||||||
<td id="vhdContainer">
|
<td>
|
||||||
<asp:CheckBoxList runat="server" ID="chlVHDs" />
|
<asp:CheckBoxList runat="server" ID="chlVHDs" class="vhdContainer"/>
|
||||||
<asp:CustomValidator ID="valVHDs" ErrorMessage="Please select at least one VHD" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
|
<asp:CustomValidator ID="valVHDs" ErrorMessage="Please select at least one VHD" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
|
||||||
ForeColor="Red" ClientValidationFunction="ValidateCheckBoxList" runat="server" />
|
ForeColor="Red" ClientValidationFunction="ValidateCheckBoxList" runat="server" />
|
||||||
</td>
|
</td>
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
|
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
|
||||||
</div>
|
</div>
|
||||||
<div runat="server" ID="txtCeritficateDiv">
|
<div runat="server" ID="txtCeritficateDiv">
|
||||||
<asp:TextBox runat="server" ID="txtCeritficate" />
|
<asp:TextBox runat="server" ID="txtCeritficate" Width="350px"/>
|
||||||
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtCeritficate" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
|
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtCeritficate" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
|
||||||
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
|
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -41,6 +41,8 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
public partial class VpsDetailsReplications : WebsitePanelModuleBase
|
public partial class VpsDetailsReplications : WebsitePanelModuleBase
|
||||||
{
|
{
|
||||||
private const string DateFormat = "MM/dd/yyyy h:mm:ss tt";
|
private const string DateFormat = "MM/dd/yyyy h:mm:ss tt";
|
||||||
|
private const string na = "n/a";
|
||||||
|
private const string cyclesTemplate = "{0} out of {1} ({2}%)";
|
||||||
|
|
||||||
protected void Page_Load(object sender, EventArgs e)
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
@ -72,7 +74,6 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const string na = "n/a";
|
|
||||||
|
|
||||||
var packageVm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
|
var packageVm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
|
||||||
var vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(packageVm.ServiceId, packageVm.VirtualMachineId);
|
var vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(packageVm.ServiceId, packageVm.VirtualMachineId);
|
||||||
|
@ -92,7 +93,7 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
// General labels
|
// General labels
|
||||||
labPrimaryServer.Text = vmReplicaInfo.PrimaryServerName;
|
labPrimaryServer.Text = vmReplicaInfo.PrimaryServerName;
|
||||||
labReplicaServer.Text = vmReplicaInfo.ReplicaServerName;
|
labReplicaServer.Text = vmReplicaInfo.ReplicaServerName;
|
||||||
labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
|
labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt == DateTime.MinValue ? na : vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
|
||||||
|
|
||||||
// Details
|
// Details
|
||||||
labHealth.Text = vmReplicaInfo.Health.ToString();
|
labHealth.Text = vmReplicaInfo.Health.ToString();
|
||||||
|
@ -104,20 +105,24 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
}
|
}
|
||||||
|
|
||||||
// Certificates list
|
// Certificates list
|
||||||
|
ddlCeritficate.Items.Clear();
|
||||||
var certificates = ES.Services.VPS2012.GetCertificates(packageVm.ServiceId, computerName);
|
var certificates = ES.Services.VPS2012.GetCertificates(packageVm.ServiceId, computerName);
|
||||||
foreach (var cert in certificates)
|
if (certificates != null)
|
||||||
{
|
{
|
||||||
ddlCeritficate.Items.Add(new ListItem(cert.Title, cert.Thumbprint));
|
foreach (var cert in certificates)
|
||||||
|
{
|
||||||
|
ddlCeritficate.Items.Add(new ListItem(cert.Title, cert.Thumbprint));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrEmpty(computerName))
|
if (string.IsNullOrEmpty(computerName))
|
||||||
{
|
{
|
||||||
ddlCeritficateDiv.Visible = true;
|
ddlCeritficateDiv.Visible = true;
|
||||||
txtCeritficateDiv.Visible = false;
|
txtCeritficateDiv.Visible = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ddlCeritficateDiv.Visible = true;
|
ddlCeritficateDiv.Visible = false;
|
||||||
txtCeritficateDiv.Visible = false;
|
txtCeritficateDiv.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VHDs editable
|
// VHDs editable
|
||||||
|
@ -211,20 +216,27 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
labMaximumSize.Text = vmReplicaInfo.MaximumSize;
|
labMaximumSize.Text = vmReplicaInfo.MaximumSize;
|
||||||
labAverageLatency.Text = vmReplicaInfo.AverageLatency.ToString("c");
|
labAverageLatency.Text = vmReplicaInfo.AverageLatency.ToString("c");
|
||||||
labErrorsEncountered.Text = vmReplicaInfo.Errors.ToString();
|
labErrorsEncountered.Text = vmReplicaInfo.Errors.ToString();
|
||||||
labSuccessfulReplicationCycles.Text = string.Format("{0} out of {1} ({2}%)",
|
|
||||||
vmReplicaInfo.SuccessfulReplications,
|
var totalCycles = vmReplicaInfo.SuccessfulReplications + vmReplicaInfo.MissedReplicationCount;
|
||||||
vmReplicaInfo.SuccessfulReplications + vmReplicaInfo.MissedReplicationCount,
|
if (totalCycles > 0)
|
||||||
Convert.ToInt32(100*vmReplicaInfo.SuccessfulReplications/vmReplicaInfo.MissedReplicationCount));
|
labSuccessfulReplicationCycles.Text = string.Format(cyclesTemplate,
|
||||||
|
vmReplicaInfo.SuccessfulReplications, totalCycles,
|
||||||
|
Convert.ToInt32(100*vmReplicaInfo.SuccessfulReplications/totalCycles));
|
||||||
|
else
|
||||||
|
labSuccessfulReplicationCycles.Text = na;
|
||||||
|
|
||||||
// pending replication
|
// pending replication
|
||||||
labSizeData.Text = vmReplicaInfo.PendingSize;
|
labSizeData.Text = vmReplicaInfo.PendingSize;
|
||||||
labLastSyncro.Text = vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
|
labLastSyncro.Text = vmReplicaInfo.LastSynhronizedAt == DateTime.MinValue ? na : vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void btnUpdate_Click(object sender, EventArgs e)
|
protected void btnUpdate_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!Page.IsValid)
|
if (!Page.IsValid)
|
||||||
|
{
|
||||||
|
ShowErrorMessage("VPS_REQUIRED");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (chbEnable.Checked)
|
if (chbEnable.Checked)
|
||||||
SetReplication();
|
SetReplication();
|
||||||
|
@ -251,13 +263,16 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
ResultObject res = ES.Services.VPS2012.SetVmReplication(PanelRequest.ItemID, vmReplica);
|
ResultObject res = ES.Services.VPS2012.SetVmReplication(PanelRequest.ItemID, vmReplica);
|
||||||
|
|
||||||
if (res.IsSuccess)
|
if (res.IsSuccess)
|
||||||
|
{
|
||||||
Bind();
|
Bind();
|
||||||
|
ShowSuccessMessage("VPS_SET_REPLICATION_ERROR");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
messageBox.ShowMessage(res, "VPS_SET_REPLICA_SERVER_ERROR", "VPS");
|
messageBox.ShowMessage(res, "VPS_SET_REPLICATION_ERROR", "VPS");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
messageBox.ShowErrorMessage("VPS_SET_REPLICA_SERVER_ERROR", ex);
|
ShowErrorMessage("VPS_SET_REPLICATION_ERROR", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,13 +283,16 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
ResultObject res = ES.Services.VPS2012.DisableVmReplication(PanelRequest.ItemID);
|
ResultObject res = ES.Services.VPS2012.DisableVmReplication(PanelRequest.ItemID);
|
||||||
|
|
||||||
if (res.IsSuccess)
|
if (res.IsSuccess)
|
||||||
|
{
|
||||||
Bind();
|
Bind();
|
||||||
|
ShowSuccessMessage("VPS_DISABLE_REPLICATION_ERROR");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
messageBox.ShowMessage(res, "VPS_DISABLE_REPLICATION_ERROR", "VPS");
|
messageBox.ShowMessage(res, "VPS_DISABLE_REPLICATION_ERROR", "VPS");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
messageBox.ShowErrorMessage("VPS_DISABLE_REPLICATION_ERROR", ex);
|
ShowErrorMessage("VPS_DISABLE_REPLICATION_ERROR", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,13 +303,16 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
ResultObject res = ES.Services.VPS2012.PauseReplication(PanelRequest.ItemID);
|
ResultObject res = ES.Services.VPS2012.PauseReplication(PanelRequest.ItemID);
|
||||||
|
|
||||||
if (res.IsSuccess)
|
if (res.IsSuccess)
|
||||||
|
{
|
||||||
Bind();
|
Bind();
|
||||||
|
ShowSuccessMessage("VPS_PAUSE_REPLICATION_ERROR");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
messageBox.ShowMessage(res, "VPS_PAUSE_REPLICATION_ERROR", "VPS");
|
messageBox.ShowMessage(res, "VPS_PAUSE_REPLICATION_ERROR", "VPS");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
messageBox.ShowErrorMessage("VPS_PAUSE_REPLICATION_ERROR", ex);
|
ShowErrorMessage("VPS_PAUSE_REPLICATION_ERROR", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,13 +323,16 @@ namespace WebsitePanel.Portal.VPS2012
|
||||||
ResultObject res = ES.Services.VPS2012.ResumeReplication(PanelRequest.ItemID);
|
ResultObject res = ES.Services.VPS2012.ResumeReplication(PanelRequest.ItemID);
|
||||||
|
|
||||||
if (res.IsSuccess)
|
if (res.IsSuccess)
|
||||||
|
{
|
||||||
Bind();
|
Bind();
|
||||||
|
ShowSuccessMessage("VPS_RESUME_REPLICATION_ERROR");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
messageBox.ShowMessage(res, "VPS_RESUME_REPLICATION_ERROR", "VPS");
|
messageBox.ShowMessage(res, "VPS_RESUME_REPLICATION_ERROR", "VPS");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
messageBox.ShowErrorMessage("VPS_RESUME_REPLICATION_ERROR", ex);
|
ShowErrorMessage("VPS_RESUME_REPLICATION_ERROR", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -255,15 +255,6 @@ namespace WebsitePanel.Portal.VPS2012 {
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.Localize locVHDs;
|
protected global::System.Web.UI.WebControls.Localize locVHDs;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// vhdContainer 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.HtmlTableCell vhdContainer;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// chlVHDs control.
|
/// chlVHDs control.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue