wsp-10329 Adding hyper-v replica to HyperV Provider. Enterprise Part 3.
This commit is contained in:
parent
27155ddc5e
commit
019ad51eae
5 changed files with 175 additions and 17 deletions
|
@ -3736,6 +3736,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
|
||||
vs.SetReplicaServer(remoteServer, thumbprint, storagePath);
|
||||
result.IsSuccess = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
@ -408,7 +408,7 @@ The following substitution variables can be used in the pattern:<br/>
|
|||
<value>Enter the thumbnail of a SSL certificate</value>
|
||||
</data>
|
||||
<data name="locCertThumbnail.Text" xml:space="preserve">
|
||||
<value>SSL Certificate Thumbnail:</value>
|
||||
<value>SSL Certificate Thumbprint:</value>
|
||||
</data>
|
||||
<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>
|
||||
|
@ -416,9 +416,6 @@ The following substitution variables can be used in the pattern:<br/>
|
|||
<data name="locReplicaPath.Text" xml:space="preserve">
|
||||
<value>Path for Replications:</value>
|
||||
</data>
|
||||
<data name="locReplicaServer.Text" xml:space="preserve">
|
||||
<value>Replica Server:</value>
|
||||
</data>
|
||||
<data name="locReplication.Text" xml:space="preserve">
|
||||
<value>Replication</value>
|
||||
</data>
|
||||
|
@ -426,7 +423,7 @@ The following substitution variables can be used in the pattern:<br/>
|
|||
<value>Enter path to replication virtual machines</value>
|
||||
</data>
|
||||
<data name="ReplicaServerValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Enter a replication server name</value>
|
||||
<value>Enter a replication server</value>
|
||||
</data>
|
||||
<data name="ReplicationModeDisabled.Text" xml:space="preserve">
|
||||
<value>No Hyper-v Replication</value>
|
||||
|
@ -437,7 +434,13 @@ The following substitution variables can be used in the pattern:<br/>
|
|||
<data name="ReplicationModeIsReplicaServer.Text" xml:space="preserve">
|
||||
<value>This is a Replica Server</value>
|
||||
</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">
|
||||
<value>Please enter replication path</value>
|
||||
</data>
|
||||
<data name="locReplicaServer.Text" xml:space="preserve">
|
||||
<value>Replication Server:</value>
|
||||
</data>
|
||||
</root>
|
|
@ -152,18 +152,40 @@
|
|||
<asp:Localize ID="locReplication" runat="server" meta:resourcekey="locReplication" Text="Replication"></asp:Localize>
|
||||
</legend>
|
||||
<table cellpadding="2" cellspacing="0" width="100%" style="margin: 10px;">
|
||||
<table cellpadding="2" cellspacing="0" style="margin: 10px;">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<asp:RadioButtonList ID="ReplicationModeList" runat="server" AutoPostBack="true"
|
||||
onselectedindexchanged="radioServer_SelectedIndexChanged">
|
||||
<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="IsReplicaServer" meta:resourcekey="ReplicationModeIsReplicaServer">This is a Replica Server</asp:ListItem>
|
||||
</asp:RadioButtonList>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="IsReplicaServerRow" runat="server">
|
||||
<table cellpadding="2" cellspacing="0" style="margin: 10px;">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<asp:RadioButtonList ID="ReplicationModeList" runat="server" AutoPostBack="true"
|
||||
OnSelectedIndexChanged="radioServer_SelectedIndexChanged">
|
||||
<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="IsReplicaServer" meta:resourcekey="ReplicationModeIsReplicaServer">This is a Replica Server</asp:ListItem>
|
||||
</asp:RadioButtonList>
|
||||
</td>
|
||||
</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">
|
||||
<td class="SubHead" style="padding-left: 20px;" colspan="2">
|
||||
<table cellpadding="2" cellspacing="0" style="margin: 10px;">
|
||||
<tr>
|
||||
|
@ -180,6 +202,8 @@
|
|||
|
||||
<asp:RequiredFieldValidator ID="CertificateThumbnailValidator" runat="server" ControlToValidate="txtCertThumbnail"
|
||||
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>
|
||||
</tr>
|
||||
<tr id="ReplicaPathErrorTr" runat="server" Visible="False">
|
||||
|
|
|
@ -27,9 +27,12 @@
|
|||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Web.UI.WebControls;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers.Virtualization;
|
||||
|
||||
|
@ -45,6 +48,8 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
public string RemoteServerName { get { return IsRemoteServer ? txtServerName.Text.Trim() : ""; } }
|
||||
public string CertificateThumbprint { get { return IsRemoteServer ? txtCertThumbnail.Text.Trim() : ddlCertThumbnail.SelectedValue; } }
|
||||
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)
|
||||
{
|
||||
|
@ -103,6 +108,7 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
// replica
|
||||
ReplicationModeList.SelectedValue = settings["ReplicaMode"] ?? "Disabled";
|
||||
txtReplicaPath.Text = settings["ReplicaServerPath"];
|
||||
ReplicaServerId = settings["ReplicaServerId"];
|
||||
|
||||
ToggleControls();
|
||||
|
||||
|
@ -171,6 +177,7 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
|
||||
// replication
|
||||
settings["ReplicaMode"] = ReplicationModeList.SelectedValue;
|
||||
settings["ReplicaServerId"] = ddlReplicaServer.SelectedValue;
|
||||
settings["ReplicaServerPath"] = txtReplicaPath.Text;
|
||||
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()
|
||||
{
|
||||
ServerNameRow.Visible = (radioServer.SelectedIndex == 1);
|
||||
|
@ -230,11 +295,13 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
|
||||
// Replica
|
||||
IsReplicaServerRow.Visible = IsReplicaServer;
|
||||
EnableReplicaRow.Visible = EnabledReplica;
|
||||
ddlCertThumbnail.Visible = !IsRemoteServer;
|
||||
txtCertThumbnail.Visible = CertificateThumbnailValidator.Visible = IsRemoteServer;
|
||||
IsReplicaServerRow.Visible = IsReplicaServer;
|
||||
ReplicaPathErrorTr.Visible = ReplicaErrorTr.Visible = false;
|
||||
if (IsReplicaServer) BindCertificates();
|
||||
if (EnabledReplica) BindReplicaServices();
|
||||
}
|
||||
|
||||
protected void radioServer_SelectedIndexChanged(object sender, EventArgs e)
|
||||
|
|
|
@ -363,6 +363,60 @@ namespace WebsitePanel.Portal.ProviderControls {
|
|||
/// </remarks>
|
||||
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>
|
||||
/// IsReplicaServerRow control.
|
||||
/// </summary>
|
||||
|
@ -417,6 +471,15 @@ namespace WebsitePanel.Portal.ProviderControls {
|
|||
/// </remarks>
|
||||
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>
|
||||
/// ReplicaPathErrorTr control.
|
||||
/// </summary>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue