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)
{
TaskManager.StartTask("VPS2012", "SetVmReplication");
ResultObject result = new ResultObject();
try
{
@ -3813,8 +3815,13 @@ namespace WebsitePanel.EnterpriseServer
}
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;
}

View file

@ -4097,15 +4097,30 @@
<data name="Error.VPS_SET_REPLICATION_ERROR" xml:space="preserve">
<value>Cannot enable\set replication for the virtual machine</value>
</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">
<value>Cannot disable replication for the virtual machine</value>
</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">
<value>Cannot pause replication for the virtual machine</value>
</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">
<value>Cannot resume replication for the virtual machine</value>
</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">
<value>Job execution failed with the following code: {1}</value>

View file

@ -117,12 +117,6 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</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">
<value>ShowProgressDialog('Pausing VM replication...');</value>
</data>
@ -270,4 +264,7 @@
<data name="valVHDs.ErrorMessage" xml:space="preserve">
<value>Please select at least one VHD</value>
</data>
<data name="btnUpdate.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating VM replication...');</value>
</data>
</root>

View file

@ -11,7 +11,7 @@
<script type="text/javascript">
function ValidateCheckBoxList(sender, args) {
var checkBoxList = document.getElementById("vhdContainer");
var checkBoxList = document.getElementsByClassName("vhdContainer");
var checkboxes = checkBoxList.getElementsByTagName("input");
var isValid = false;
for (var i = 0; i < checkboxes.length; i++) {
@ -73,7 +73,7 @@
TargetControlID="ReplicationPanel" meta:ResourceKey="secReplication" Text="Replication Configuration">
</wsp:CollapsiblePanel>
<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" />
</div>
<table runat="server" id="ReplicaTable" class="ReplicaTable" style="margin: 10px; width: 100%;">
@ -105,8 +105,8 @@
<td>
<asp:Localize ID="locVHDs" runat="server" meta:resourcekey="locVHDs" Text="Choose Replication VHDs:"></asp:Localize>
</td>
<td id="vhdContainer">
<asp:CheckBoxList runat="server" ID="chlVHDs" />
<td>
<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"
ForeColor="Red" ClientValidationFunction="ValidateCheckBoxList" runat="server" />
</td>
@ -130,7 +130,7 @@
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
</div>
<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"
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
</div>

View file

@ -41,6 +41,8 @@ namespace WebsitePanel.Portal.VPS2012
public partial class VpsDetailsReplications : WebsitePanelModuleBase
{
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)
{
@ -72,7 +74,6 @@ namespace WebsitePanel.Portal.VPS2012
{
try
{
const string na = "n/a";
var packageVm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
var vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(packageVm.ServiceId, packageVm.VirtualMachineId);
@ -92,7 +93,7 @@ namespace WebsitePanel.Portal.VPS2012
// General labels
labPrimaryServer.Text = vmReplicaInfo.PrimaryServerName;
labReplicaServer.Text = vmReplicaInfo.ReplicaServerName;
labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt == DateTime.MinValue ? na : vmReplicaInfo.LastSynhronizedAt.ToString(DateFormat);
// Details
labHealth.Text = vmReplicaInfo.Health.ToString();
@ -104,20 +105,24 @@ namespace WebsitePanel.Portal.VPS2012
}
// Certificates list
ddlCeritficate.Items.Clear();
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;
txtCeritficateDiv.Visible = false;
}
else
{
ddlCeritficateDiv.Visible = true;
txtCeritficateDiv.Visible = false;
ddlCeritficateDiv.Visible = false;
txtCeritficateDiv.Visible = true;
}
// VHDs editable
@ -211,20 +216,27 @@ namespace WebsitePanel.Portal.VPS2012
labMaximumSize.Text = vmReplicaInfo.MaximumSize;
labAverageLatency.Text = vmReplicaInfo.AverageLatency.ToString("c");
labErrorsEncountered.Text = vmReplicaInfo.Errors.ToString();
labSuccessfulReplicationCycles.Text = string.Format("{0} out of {1} ({2}%)",
vmReplicaInfo.SuccessfulReplications,
vmReplicaInfo.SuccessfulReplications + vmReplicaInfo.MissedReplicationCount,
Convert.ToInt32(100*vmReplicaInfo.SuccessfulReplications/vmReplicaInfo.MissedReplicationCount));
var totalCycles = vmReplicaInfo.SuccessfulReplications + vmReplicaInfo.MissedReplicationCount;
if (totalCycles > 0)
labSuccessfulReplicationCycles.Text = string.Format(cyclesTemplate,
vmReplicaInfo.SuccessfulReplications, totalCycles,
Convert.ToInt32(100*vmReplicaInfo.SuccessfulReplications/totalCycles));
else
labSuccessfulReplicationCycles.Text = na;
// pending replication
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)
{
if (!Page.IsValid)
{
ShowErrorMessage("VPS_REQUIRED");
return;
}
if (chbEnable.Checked)
SetReplication();
@ -251,13 +263,16 @@ namespace WebsitePanel.Portal.VPS2012
ResultObject res = ES.Services.VPS2012.SetVmReplication(PanelRequest.ItemID, vmReplica);
if (res.IsSuccess)
{
Bind();
ShowSuccessMessage("VPS_SET_REPLICATION_ERROR");
}
else
messageBox.ShowMessage(res, "VPS_SET_REPLICA_SERVER_ERROR", "VPS");
messageBox.ShowMessage(res, "VPS_SET_REPLICATION_ERROR", "VPS");
}
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);
if (res.IsSuccess)
{
Bind();
ShowSuccessMessage("VPS_DISABLE_REPLICATION_ERROR");
}
else
messageBox.ShowMessage(res, "VPS_DISABLE_REPLICATION_ERROR", "VPS");
}
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);
if (res.IsSuccess)
{
Bind();
ShowSuccessMessage("VPS_PAUSE_REPLICATION_ERROR");
}
else
messageBox.ShowMessage(res, "VPS_PAUSE_REPLICATION_ERROR", "VPS");
}
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);
if (res.IsSuccess)
{
Bind();
ShowSuccessMessage("VPS_RESUME_REPLICATION_ERROR");
}
else
messageBox.ShowMessage(res, "VPS_RESUME_REPLICATION_ERROR", "VPS");
}
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>
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>
/// chlVHDs control.
/// </summary>