wsp-10329 Adding hyper-v replica to HyperV Provider. Enterprise Part 3.

This commit is contained in:
Alexander Trofimov 2015-04-17 19:18:49 +03:00
parent 27155ddc5e
commit 019ad51eae
5 changed files with 175 additions and 17 deletions

View file

@ -3736,6 +3736,7 @@ namespace WebsitePanel.EnterpriseServer
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId); VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
vs.SetReplicaServer(remoteServer, thumbprint, storagePath); vs.SetReplicaServer(remoteServer, thumbprint, storagePath);
result.IsSuccess = true;
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -408,7 +408,7 @@ The following substitution variables can be used in the pattern:<br/>
<value>Enter the thumbnail of a SSL certificate</value> <value>Enter the thumbnail of a SSL certificate</value>
</data> </data>
<data name="locCertThumbnail.Text" xml:space="preserve"> <data name="locCertThumbnail.Text" xml:space="preserve">
<value>SSL Certificate Thumbnail:</value> <value>SSL Certificate Thumbprint:</value>
</data> </data>
<data name="locErrorSetReplica.Text" xml:space="preserve"> <data name="locErrorSetReplica.Text" xml:space="preserve">
<value>Can not to set server as a replication server with the entered server name, replication path and SSL certificate</value> <value>Can not to set server as a replication server with the entered server name, replication path and SSL certificate</value>
@ -416,9 +416,6 @@ The following substitution variables can be used in the pattern:&lt;br/&gt;
<data name="locReplicaPath.Text" xml:space="preserve"> <data name="locReplicaPath.Text" xml:space="preserve">
<value>Path for Replications:</value> <value>Path for Replications:</value>
</data> </data>
<data name="locReplicaServer.Text" xml:space="preserve">
<value>Replica Server:</value>
</data>
<data name="locReplication.Text" xml:space="preserve"> <data name="locReplication.Text" xml:space="preserve">
<value>Replication</value> <value>Replication</value>
</data> </data>
@ -426,7 +423,7 @@ The following substitution variables can be used in the pattern:&lt;br/&gt;
<value>Enter path to replication virtual machines</value> <value>Enter path to replication virtual machines</value>
</data> </data>
<data name="ReplicaServerValidator.ErrorMessage" xml:space="preserve"> <data name="ReplicaServerValidator.ErrorMessage" xml:space="preserve">
<value>Enter a replication server name</value> <value>Enter a replication server</value>
</data> </data>
<data name="ReplicationModeDisabled.Text" xml:space="preserve"> <data name="ReplicationModeDisabled.Text" xml:space="preserve">
<value>No Hyper-v Replication</value> <value>No Hyper-v Replication</value>
@ -437,7 +434,13 @@ The following substitution variables can be used in the pattern:&lt;br/&gt;
<data name="ReplicationModeIsReplicaServer.Text" xml:space="preserve"> <data name="ReplicationModeIsReplicaServer.Text" xml:space="preserve">
<value>This is a Replica Server</value> <value>This is a Replica Server</value>
</data> </data>
<data name="locEnableReplicaError.Text" xml:space="preserve">
<value>Please add a server with the enabled replication and select it from list</value>
</data>
<data name="locErrorPathReplica.Text" xml:space="preserve"> <data name="locErrorPathReplica.Text" xml:space="preserve">
<value>Please enter replication path</value> <value>Please enter replication path</value>
</data> </data>
<data name="locReplicaServer.Text" xml:space="preserve">
<value>Replication Server:</value>
</data>
</root> </root>

View file

@ -156,13 +156,35 @@
<tr> <tr>
<td colspan="2"> <td colspan="2">
<asp:RadioButtonList ID="ReplicationModeList" runat="server" AutoPostBack="true" <asp:RadioButtonList ID="ReplicationModeList" runat="server" AutoPostBack="true"
onselectedindexchanged="radioServer_SelectedIndexChanged"> OnSelectedIndexChanged="radioServer_SelectedIndexChanged">
<asp:ListItem Value="Disable" meta:resourcekey="ReplicationModeDisabled" Selected="True">No Hyper-v Replication</asp:ListItem> <asp:ListItem Value="Disable" meta:resourcekey="ReplicationModeDisabled" Selected="True">No Hyper-v Replication</asp:ListItem>
<asp:ListItem Value="Enable" meta:resourcekey="ReplicationModeEnabled">Enable Hyper-V Replication</asp:ListItem> <asp:ListItem Value="Enable" meta:resourcekey="ReplicationModeEnabled">Enable Hyper-V Replication</asp:ListItem>
<asp:ListItem Value="IsReplicaServer" meta:resourcekey="ReplicationModeIsReplicaServer">This is a Replica Server</asp:ListItem> <asp:ListItem Value="IsReplicaServer" meta:resourcekey="ReplicationModeIsReplicaServer">This is a Replica Server</asp:ListItem>
</asp:RadioButtonList> </asp:RadioButtonList>
</td> </td>
</tr> </tr>
<tr id="EnableReplicaRow" runat="server">
<td class="SubHead" style="padding-left: 20px;" colspan="2">
<table cellpadding="2" cellspacing="0" style="margin: 10px;">
<tr>
<td style="width: 180px">
<asp:Localize ID="locReplicaServer" runat="server" meta:resourcekey="locReplicaServer" Text="Replication Server:"></asp:Localize>
</td>
<td>
<asp:DropDownList ID="ddlReplicaServer" runat="server" Width="300px"></asp:DropDownList>
<asp:RequiredFieldValidator ID="ReplicaServerValidator" runat="server" ControlToValidate="ddlReplicaServer"
Text="*" meta:resourcekey="ReplicaServerValidator" Display="Dynamic" SetFocusOnError="true" />
</td>
</tr>
<tr id="EnableReplicaErrorTr" runat="server" visible="False">
<td colspan="2">
<asp:Label ID="locEnableReplicaError" runat="server" meta:resourcekey="locEnableReplicaError" ForeColor="Red"></asp:Label>
</td>
</tr>
</table>
</td>
</tr>
<tr id="IsReplicaServerRow" runat="server"> <tr id="IsReplicaServerRow" runat="server">
<td class="SubHead" style="padding-left: 20px;" colspan="2"> <td class="SubHead" style="padding-left: 20px;" colspan="2">
<table cellpadding="2" cellspacing="0" style="margin: 10px;"> <table cellpadding="2" cellspacing="0" style="margin: 10px;">
@ -180,6 +202,8 @@
<asp:RequiredFieldValidator ID="CertificateThumbnailValidator" runat="server" ControlToValidate="txtCertThumbnail" <asp:RequiredFieldValidator ID="CertificateThumbnailValidator" runat="server" ControlToValidate="txtCertThumbnail"
Text="*" meta:resourcekey="CertificateThumbnailValidator" Display="Dynamic" SetFocusOnError="true" /> Text="*" meta:resourcekey="CertificateThumbnailValidator" Display="Dynamic" SetFocusOnError="true" />
<asp:RequiredFieldValidator ID="CertificateDdlThumbnailValidator" runat="server" ControlToValidate="ddlCertThumbnail"
Text="*" meta:resourcekey="CertificateThumbnailValidator" Display="Dynamic" SetFocusOnError="true" />
</td> </td>
</tr> </tr>
<tr id="ReplicaPathErrorTr" runat="server" Visible="False"> <tr id="ReplicaPathErrorTr" runat="server" Visible="False">

View file

@ -27,9 +27,12 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System; using System;
using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Data;
using System.Linq; using System.Linq;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.Virtualization; using WebsitePanel.Providers.Virtualization;
@ -45,6 +48,8 @@ namespace WebsitePanel.Portal.ProviderControls
public string RemoteServerName { get { return IsRemoteServer ? txtServerName.Text.Trim() : ""; } } public string RemoteServerName { get { return IsRemoteServer ? txtServerName.Text.Trim() : ""; } }
public string CertificateThumbprint { get { return IsRemoteServer ? txtCertThumbnail.Text.Trim() : ddlCertThumbnail.SelectedValue; } } public string CertificateThumbprint { get { return IsRemoteServer ? txtCertThumbnail.Text.Trim() : ddlCertThumbnail.SelectedValue; } }
public bool IsReplicaServer { get { return ReplicationModeList.SelectedValue == "IsReplicaServer"; } } public bool IsReplicaServer { get { return ReplicationModeList.SelectedValue == "IsReplicaServer"; } }
public bool EnabledReplica { get { return ReplicationModeList.SelectedValue == "Enable"; } }
public string ReplicaServerId { get; set; }
void IHostingServiceProviderSettings.BindSettings(StringDictionary settings) void IHostingServiceProviderSettings.BindSettings(StringDictionary settings)
{ {
@ -103,6 +108,7 @@ namespace WebsitePanel.Portal.ProviderControls
// replica // replica
ReplicationModeList.SelectedValue = settings["ReplicaMode"] ?? "Disabled"; ReplicationModeList.SelectedValue = settings["ReplicaMode"] ?? "Disabled";
txtReplicaPath.Text = settings["ReplicaServerPath"]; txtReplicaPath.Text = settings["ReplicaServerPath"];
ReplicaServerId = settings["ReplicaServerId"];
ToggleControls(); ToggleControls();
@ -171,6 +177,7 @@ namespace WebsitePanel.Portal.ProviderControls
// replication // replication
settings["ReplicaMode"] = ReplicationModeList.SelectedValue; settings["ReplicaMode"] = ReplicationModeList.SelectedValue;
settings["ReplicaServerId"] = ddlReplicaServer.SelectedValue;
settings["ReplicaServerPath"] = txtReplicaPath.Text; settings["ReplicaServerPath"] = txtReplicaPath.Text;
settings["ReplicaServerThumbprint"] = CertificateThumbprint; settings["ReplicaServerThumbprint"] = CertificateThumbprint;
@ -211,6 +218,64 @@ namespace WebsitePanel.Portal.ProviderControls
} }
} }
private void BindReplicaServices()
{
ddlReplicaServer.Items.Clear();
ServiceInfo serviceInfo = ES.Services.Servers.GetServiceInfo(PanelRequest.ServiceId);
DataView dvServices = ES.Services.Servers.GetRawServicesByGroupName(ResourceGroups.VPS2012).Tables[0].DefaultView;
List<ServiceInfo> services = GetServices(ReplicaServerId);
foreach (DataRowView dr in dvServices)
{
int serviceId = (int)dr["ServiceID"];
ServiceInfo currentServiceInfo = ES.Services.Servers.GetServiceInfo(serviceId);
if (currentServiceInfo == null || currentServiceInfo.ProviderId != serviceInfo.ProviderId)
continue;
var currentServiceSettings = ConvertArrayToDictionary(ES.Services.Servers.GetServiceSettings(serviceId));
if (currentServiceSettings["ReplicaMode"] == ReplicaMode.IsReplicaServer.ToString())
continue;
var exists = false;
if (services != null)
exists = services.Any(current => current != null && current.ServiceId == serviceId);
var listItem = new ListItem(dr["FullServiceName"].ToString(), serviceId.ToString()) {Selected = exists};
ddlReplicaServer.Items.Add(listItem);
}
}
private List<ServiceInfo> GetServices(string data)
{
if (string.IsNullOrEmpty(data))
return null;
List<ServiceInfo> list = new List<ServiceInfo>();
string[] servicesIds = data.Split(',');
foreach (string current in servicesIds)
{
ServiceInfo serviceInfo = ES.Services.Servers.GetServiceInfo(Utils.ParseInt(current));
list.Add(serviceInfo);
}
return list;
}
private StringDictionary ConvertArrayToDictionary(string[] settings)
{
StringDictionary r = new StringDictionary();
foreach (string setting in settings)
{
int idx = setting.IndexOf('=');
r.Add(setting.Substring(0, idx), setting.Substring(idx + 1));
}
return r;
}
private void ToggleControls() private void ToggleControls()
{ {
ServerNameRow.Visible = (radioServer.SelectedIndex == 1); ServerNameRow.Visible = (radioServer.SelectedIndex == 1);
@ -230,11 +295,13 @@ namespace WebsitePanel.Portal.ProviderControls
// Replica // Replica
IsReplicaServerRow.Visible = IsReplicaServer; IsReplicaServerRow.Visible = IsReplicaServer;
EnableReplicaRow.Visible = EnabledReplica;
ddlCertThumbnail.Visible = !IsRemoteServer; ddlCertThumbnail.Visible = !IsRemoteServer;
txtCertThumbnail.Visible = CertificateThumbnailValidator.Visible = IsRemoteServer; txtCertThumbnail.Visible = CertificateThumbnailValidator.Visible = IsRemoteServer;
IsReplicaServerRow.Visible = IsReplicaServer; IsReplicaServerRow.Visible = IsReplicaServer;
ReplicaPathErrorTr.Visible = ReplicaErrorTr.Visible = false; ReplicaPathErrorTr.Visible = ReplicaErrorTr.Visible = false;
if (IsReplicaServer) BindCertificates(); if (IsReplicaServer) BindCertificates();
if (EnabledReplica) BindReplicaServices();
} }
protected void radioServer_SelectedIndexChanged(object sender, EventArgs e) protected void radioServer_SelectedIndexChanged(object sender, EventArgs e)

View file

@ -363,6 +363,60 @@ namespace WebsitePanel.Portal.ProviderControls {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RadioButtonList ReplicationModeList; protected global::System.Web.UI.WebControls.RadioButtonList ReplicationModeList;
/// <summary>
/// EnableReplicaRow 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 EnableReplicaRow;
/// <summary>
/// locReplicaServer 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 locReplicaServer;
/// <summary>
/// ddlReplicaServer 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 ddlReplicaServer;
/// <summary>
/// ReplicaServerValidator 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 ReplicaServerValidator;
/// <summary>
/// EnableReplicaErrorTr 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 EnableReplicaErrorTr;
/// <summary>
/// locEnableReplicaError 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 locEnableReplicaError;
/// <summary> /// <summary>
/// IsReplicaServerRow control. /// IsReplicaServerRow control.
/// </summary> /// </summary>
@ -417,6 +471,15 @@ namespace WebsitePanel.Portal.ProviderControls {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator CertificateThumbnailValidator; protected global::System.Web.UI.WebControls.RequiredFieldValidator CertificateThumbnailValidator;
/// <summary>
/// CertificateDdlThumbnailValidator 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 CertificateDdlThumbnailValidator;
/// <summary> /// <summary>
/// ReplicaPathErrorTr control. /// ReplicaPathErrorTr control.
/// </summary> /// </summary>