wsp-10329 Adding hyper-v replica to HyperV Provider. WebPortal Part 4.

This commit is contained in:
Alexander Trofimov 2015-04-23 16:01:00 +03:00
parent f6ffbc7513
commit 249e077bb5
6 changed files with 72 additions and 38 deletions

View file

@ -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;
} }

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);
} }
} }

View file

@ -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>