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

This commit is contained in:
Alexander Trofimov 2015-04-22 08:54:45 +03:00
parent b5d2bf04a2
commit e8495ac0c6
14 changed files with 1472 additions and 391 deletions

View file

@ -114,9 +114,13 @@
public const string EJECT_DVD_DISK_ERROR = "VPS_EJECT_DVD_DISK_ERROR"; public const string EJECT_DVD_DISK_ERROR = "VPS_EJECT_DVD_DISK_ERROR";
// Replication // Replication
public const string SET_REPLICA_SERVER_ERROR = "SET_REPLICA_SERVER_ERROR"; public const string SET_REPLICA_SERVER_ERROR = "VPS_SET_REPLICA_SERVER_ERROR";
public const string SET_NO_REPLICA_SERVER_ERROR = "SET_NO_REPLICA_SERVER_ERROR"; public const string UNSET_REPLICA_SERVER_ERROR = "VPS_UNSET_REPLICA_SERVER_ERROR";
public const string SET_SET_REPLICATION_ERROR = "SET_SET_REPLICATION_ERROR"; public const string NO_REPLICA_SERVER_ERROR = "VPS_NO_REPLICA_SERVER_ERROR";
public const string SET_REPLICATION_ERROR = "VPS_SET_REPLICATION_ERROR";
public const string DISABLE_REPLICATION_ERROR = "VPS_DISABLE_REPLICATION_ERROR";
public const string PAUSE_REPLICATION_ERROR = "VPS_PAUSE_REPLICATION_ERROR";
public const string RESUME_REPLICATION_ERROR = "VPS_RESUME_REPLICATION_ERROR";
public const string HOST_NAMER_IS_ALREADY_USED = "HOST_NAMER_IS_ALREADY_USED"; public const string HOST_NAMER_IS_ALREADY_USED = "HOST_NAMER_IS_ALREADY_USED";

View file

@ -148,7 +148,21 @@ namespace WebsitePanel.EnterpriseServer {
private System.Threading.SendOrPostCallback SetReplicaServerOperationCompleted; private System.Threading.SendOrPostCallback SetReplicaServerOperationCompleted;
private System.Threading.SendOrPostCallback IsReplicaServerOperationCompleted; private System.Threading.SendOrPostCallback UnsetReplicaServerOperationCompleted;
private System.Threading.SendOrPostCallback GetReplicaServerOperationCompleted;
private System.Threading.SendOrPostCallback GetReplicationOperationCompleted;
private System.Threading.SendOrPostCallback GetReplicationInfoOperationCompleted;
private System.Threading.SendOrPostCallback SetVmReplicationOperationCompleted;
private System.Threading.SendOrPostCallback DisableVmReplicationOperationCompleted;
private System.Threading.SendOrPostCallback PauseReplicationOperationCompleted;
private System.Threading.SendOrPostCallback ResumeReplicationOperationCompleted;
/// <remarks/> /// <remarks/>
public esVirtualizationServer2012() { public esVirtualizationServer2012() {
@ -327,7 +341,28 @@ namespace WebsitePanel.EnterpriseServer {
public event SetReplicaServerCompletedEventHandler SetReplicaServerCompleted; public event SetReplicaServerCompletedEventHandler SetReplicaServerCompleted;
/// <remarks/> /// <remarks/>
public event IsReplicaServerCompletedEventHandler IsReplicaServerCompleted; public event UnsetReplicaServerCompletedEventHandler UnsetReplicaServerCompleted;
/// <remarks/>
public event GetReplicaServerCompletedEventHandler GetReplicaServerCompleted;
/// <remarks/>
public event GetReplicationCompletedEventHandler GetReplicationCompleted;
/// <remarks/>
public event GetReplicationInfoCompletedEventHandler GetReplicationInfoCompleted;
/// <remarks/>
public event SetVmReplicationCompletedEventHandler SetVmReplicationCompleted;
/// <remarks/>
public event DisableVmReplicationCompletedEventHandler DisableVmReplicationCompleted;
/// <remarks/>
public event PauseReplicationCompletedEventHandler PauseReplicationCompleted;
/// <remarks/>
public event ResumeReplicationCompletedEventHandler ResumeReplicationCompleted;
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachines", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetVirtualMachines", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
@ -3234,46 +3269,339 @@ namespace WebsitePanel.EnterpriseServer {
} }
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/IsReplicaServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/UnsetReplicaServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public bool IsReplicaServer(int serviceId, string remoteServer) { public ResultObject UnsetReplicaServer(int serviceId, string remoteServer) {
object[] results = this.Invoke("IsReplicaServer", new object[] { object[] results = this.Invoke("UnsetReplicaServer", new object[] {
serviceId, serviceId,
remoteServer}); remoteServer});
return ((bool)(results[0])); return ((ResultObject)(results[0]));
} }
/// <remarks/> /// <remarks/>
public System.IAsyncResult BeginIsReplicaServer(int serviceId, string remoteServer, System.AsyncCallback callback, object asyncState) { public System.IAsyncResult BeginUnsetReplicaServer(int serviceId, string remoteServer, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("IsReplicaServer", new object[] { return this.BeginInvoke("UnsetReplicaServer", new object[] {
serviceId, serviceId,
remoteServer}, callback, asyncState); remoteServer}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
public bool EndIsReplicaServer(System.IAsyncResult asyncResult) { public ResultObject EndUnsetReplicaServer(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult); object[] results = this.EndInvoke(asyncResult);
return ((bool)(results[0])); return ((ResultObject)(results[0]));
} }
/// <remarks/> /// <remarks/>
public void IsReplicaServerAsync(int serviceId, string remoteServer) { public void UnsetReplicaServerAsync(int serviceId, string remoteServer) {
this.IsReplicaServerAsync(serviceId, remoteServer, null); this.UnsetReplicaServerAsync(serviceId, remoteServer, null);
} }
/// <remarks/> /// <remarks/>
public void IsReplicaServerAsync(int serviceId, string remoteServer, object userState) { public void UnsetReplicaServerAsync(int serviceId, string remoteServer, object userState) {
if ((this.IsReplicaServerOperationCompleted == null)) { if ((this.UnsetReplicaServerOperationCompleted == null)) {
this.IsReplicaServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnIsReplicaServerOperationCompleted); this.UnsetReplicaServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUnsetReplicaServerOperationCompleted);
} }
this.InvokeAsync("IsReplicaServer", new object[] { this.InvokeAsync("UnsetReplicaServer", new object[] {
serviceId, serviceId,
remoteServer}, this.IsReplicaServerOperationCompleted, userState); remoteServer}, this.UnsetReplicaServerOperationCompleted, userState);
} }
private void OnIsReplicaServerOperationCompleted(object arg) { private void OnUnsetReplicaServerOperationCompleted(object arg) {
if ((this.IsReplicaServerCompleted != null)) { if ((this.UnsetReplicaServerCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.IsReplicaServerCompleted(this, new IsReplicaServerCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); this.UnsetReplicaServerCompleted(this, new UnsetReplicaServerCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetReplicaServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ReplicationServerInfo GetReplicaServer(int serviceId, string remoteServer) {
object[] results = this.Invoke("GetReplicaServer", new object[] {
serviceId,
remoteServer});
return ((ReplicationServerInfo)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginGetReplicaServer(int serviceId, string remoteServer, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetReplicaServer", new object[] {
serviceId,
remoteServer}, callback, asyncState);
}
/// <remarks/>
public ReplicationServerInfo EndGetReplicaServer(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ReplicationServerInfo)(results[0]));
}
/// <remarks/>
public void GetReplicaServerAsync(int serviceId, string remoteServer) {
this.GetReplicaServerAsync(serviceId, remoteServer, null);
}
/// <remarks/>
public void GetReplicaServerAsync(int serviceId, string remoteServer, object userState) {
if ((this.GetReplicaServerOperationCompleted == null)) {
this.GetReplicaServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetReplicaServerOperationCompleted);
}
this.InvokeAsync("GetReplicaServer", new object[] {
serviceId,
remoteServer}, this.GetReplicaServerOperationCompleted, userState);
}
private void OnGetReplicaServerOperationCompleted(object arg) {
if ((this.GetReplicaServerCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetReplicaServerCompleted(this, new GetReplicaServerCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetReplication", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public VmReplication GetReplication(int itemId) {
object[] results = this.Invoke("GetReplication", new object[] {
itemId});
return ((VmReplication)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginGetReplication(int itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetReplication", new object[] {
itemId}, callback, asyncState);
}
/// <remarks/>
public VmReplication EndGetReplication(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((VmReplication)(results[0]));
}
/// <remarks/>
public void GetReplicationAsync(int itemId) {
this.GetReplicationAsync(itemId, null);
}
/// <remarks/>
public void GetReplicationAsync(int itemId, object userState) {
if ((this.GetReplicationOperationCompleted == null)) {
this.GetReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetReplicationOperationCompleted);
}
this.InvokeAsync("GetReplication", new object[] {
itemId}, this.GetReplicationOperationCompleted, userState);
}
private void OnGetReplicationOperationCompleted(object arg) {
if ((this.GetReplicationCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetReplicationCompleted(this, new GetReplicationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetReplicationInfo", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ReplicationDetailInfo GetReplicationInfo(int itemId) {
object[] results = this.Invoke("GetReplicationInfo", new object[] {
itemId});
return ((ReplicationDetailInfo)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginGetReplicationInfo(int itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetReplicationInfo", new object[] {
itemId}, callback, asyncState);
}
/// <remarks/>
public ReplicationDetailInfo EndGetReplicationInfo(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ReplicationDetailInfo)(results[0]));
}
/// <remarks/>
public void GetReplicationInfoAsync(int itemId) {
this.GetReplicationInfoAsync(itemId, null);
}
/// <remarks/>
public void GetReplicationInfoAsync(int itemId, object userState) {
if ((this.GetReplicationInfoOperationCompleted == null)) {
this.GetReplicationInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetReplicationInfoOperationCompleted);
}
this.InvokeAsync("GetReplicationInfo", new object[] {
itemId}, this.GetReplicationInfoOperationCompleted, userState);
}
private void OnGetReplicationInfoOperationCompleted(object arg) {
if ((this.GetReplicationInfoCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetReplicationInfoCompleted(this, new GetReplicationInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SetVmReplication", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject SetVmReplication(int itemId, VmReplication replication) {
object[] results = this.Invoke("SetVmReplication", new object[] {
itemId,
replication});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSetVmReplication(int itemId, VmReplication replication, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SetVmReplication", new object[] {
itemId,
replication}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndSetVmReplication(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void SetVmReplicationAsync(int itemId, VmReplication replication) {
this.SetVmReplicationAsync(itemId, replication, null);
}
/// <remarks/>
public void SetVmReplicationAsync(int itemId, VmReplication replication, object userState) {
if ((this.SetVmReplicationOperationCompleted == null)) {
this.SetVmReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetVmReplicationOperationCompleted);
}
this.InvokeAsync("SetVmReplication", new object[] {
itemId,
replication}, this.SetVmReplicationOperationCompleted, userState);
}
private void OnSetVmReplicationOperationCompleted(object arg) {
if ((this.SetVmReplicationCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SetVmReplicationCompleted(this, new SetVmReplicationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/DisableVmReplication", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject DisableVmReplication(int itemId) {
object[] results = this.Invoke("DisableVmReplication", new object[] {
itemId});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginDisableVmReplication(int itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("DisableVmReplication", new object[] {
itemId}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndDisableVmReplication(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void DisableVmReplicationAsync(int itemId) {
this.DisableVmReplicationAsync(itemId, null);
}
/// <remarks/>
public void DisableVmReplicationAsync(int itemId, object userState) {
if ((this.DisableVmReplicationOperationCompleted == null)) {
this.DisableVmReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDisableVmReplicationOperationCompleted);
}
this.InvokeAsync("DisableVmReplication", new object[] {
itemId}, this.DisableVmReplicationOperationCompleted, userState);
}
private void OnDisableVmReplicationOperationCompleted(object arg) {
if ((this.DisableVmReplicationCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.DisableVmReplicationCompleted(this, new DisableVmReplicationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/PauseReplication", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject PauseReplication(int itemId) {
object[] results = this.Invoke("PauseReplication", new object[] {
itemId});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginPauseReplication(int itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("PauseReplication", new object[] {
itemId}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndPauseReplication(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void PauseReplicationAsync(int itemId) {
this.PauseReplicationAsync(itemId, null);
}
/// <remarks/>
public void PauseReplicationAsync(int itemId, object userState) {
if ((this.PauseReplicationOperationCompleted == null)) {
this.PauseReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnPauseReplicationOperationCompleted);
}
this.InvokeAsync("PauseReplication", new object[] {
itemId}, this.PauseReplicationOperationCompleted, userState);
}
private void OnPauseReplicationOperationCompleted(object arg) {
if ((this.PauseReplicationCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.PauseReplicationCompleted(this, new PauseReplicationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ResumeReplication", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject ResumeReplication(int itemId) {
object[] results = this.Invoke("ResumeReplication", new object[] {
itemId});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginResumeReplication(int itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("ResumeReplication", new object[] {
itemId}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndResumeReplication(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void ResumeReplicationAsync(int itemId) {
this.ResumeReplicationAsync(itemId, null);
}
/// <remarks/>
public void ResumeReplicationAsync(int itemId, object userState) {
if ((this.ResumeReplicationOperationCompleted == null)) {
this.ResumeReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnResumeReplicationOperationCompleted);
}
this.InvokeAsync("ResumeReplication", new object[] {
itemId}, this.ResumeReplicationOperationCompleted, userState);
}
private void OnResumeReplicationOperationCompleted(object arg) {
if ((this.ResumeReplicationCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.ResumeReplicationCompleted(this, new ResumeReplicationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
} }
} }
@ -4767,26 +5095,208 @@ namespace WebsitePanel.EnterpriseServer {
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void IsReplicaServerCompletedEventHandler(object sender, IsReplicaServerCompletedEventArgs e); public delegate void UnsetReplicaServerCompletedEventHandler(object sender, UnsetReplicaServerCompletedEventArgs e);
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class IsReplicaServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { public partial class UnsetReplicaServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results; private object[] results;
internal IsReplicaServerCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : internal UnsetReplicaServerCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) { base(exception, cancelled, userState) {
this.results = results; this.results = results;
} }
/// <remarks/> /// <remarks/>
public bool Result { public ResultObject Result {
get { get {
this.RaiseExceptionIfNecessary(); this.RaiseExceptionIfNecessary();
return ((bool)(this.results[0])); return ((ResultObject)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void GetReplicaServerCompletedEventHandler(object sender, GetReplicaServerCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetReplicaServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetReplicaServerCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ReplicationServerInfo Result {
get {
this.RaiseExceptionIfNecessary();
return ((ReplicationServerInfo)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void GetReplicationCompletedEventHandler(object sender, GetReplicationCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetReplicationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetReplicationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public VmReplication Result {
get {
this.RaiseExceptionIfNecessary();
return ((VmReplication)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void GetReplicationInfoCompletedEventHandler(object sender, GetReplicationInfoCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetReplicationInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetReplicationInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ReplicationDetailInfo Result {
get {
this.RaiseExceptionIfNecessary();
return ((ReplicationDetailInfo)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void SetVmReplicationCompletedEventHandler(object sender, SetVmReplicationCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SetVmReplicationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SetVmReplicationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void DisableVmReplicationCompletedEventHandler(object sender, DisableVmReplicationCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class DisableVmReplicationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal DisableVmReplicationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void PauseReplicationCompletedEventHandler(object sender, PauseReplicationCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class PauseReplicationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal PauseReplicationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
public delegate void ResumeReplicationCompletedEventHandler(object sender, ResumeReplicationCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class ResumeReplicationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal ResumeReplicationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
} }
} }
} }

View file

@ -3720,6 +3720,8 @@ namespace WebsitePanel.EnterpriseServer
#region Replication #region Replication
#region IsReplicaServer Part
public static CertificateInfo[] GetCertificates(int serviceId, string remoteServer) public static CertificateInfo[] GetCertificates(int serviceId, string remoteServer)
{ {
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId); VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
@ -3745,12 +3747,30 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
public static bool IsReplicaServer(int serviceId, string remoteServer) public static ResultObject UnsetReplicaServer(int serviceId, string remoteServer)
{
ResultObject result = new ResultObject();
try
{
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
vs.UnsetReplicaServer(remoteServer);
result.IsSuccess = true;
}
catch (Exception ex)
{
result.AddError(VirtualizationErrorCodes.UNSET_REPLICA_SERVER_ERROR, ex);
}
return result;
}
public static ReplicationServerInfo GetReplicaServer(int serviceId, string remoteServer)
{ {
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId); VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
return vs.IsReplicaServer(remoteServer); return vs.GetReplicaServer(remoteServer);
} }
#endregion
public static VmReplication GetReplication(int itemId) public static VmReplication GetReplication(int itemId)
{ {
VirtualMachine vm = GetVirtualMachineByItemId(itemId); VirtualMachine vm = GetVirtualMachineByItemId(itemId);
@ -3758,7 +3778,14 @@ namespace WebsitePanel.EnterpriseServer
return vs.GetReplication(vm.VirtualMachineId); return vs.GetReplication(vm.VirtualMachineId);
} }
public static ResultObject SetVmReplication(int itemId, string replicaServer, VmReplication replication) public static ReplicationDetailInfo GetReplicationInfo(int itemId)
{
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
return vs.GetReplicationInfo(vm.VirtualMachineId);
}
public static ResultObject SetVmReplication(int itemId, VmReplication replication)
{ {
ResultObject result = new ResultObject(); ResultObject result = new ResultObject();
try try
@ -3766,35 +3793,156 @@ namespace WebsitePanel.EnterpriseServer
VirtualMachine vm = GetVirtualMachineByItemId(itemId); VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId); VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
// Get replica server name // Get replica server
StringDictionary vsSesstings = ServerController.GetServiceSettings(vm.ServiceId); var replicaServerInfo = GetReplicaInfoForService(vm.ServiceId, ref result);
string replicaServiceId = vsSesstings["ReplicaServerId"]; if (result.ErrorCodes.Count > 0)
if (string.IsNullOrEmpty(replicaServiceId))
{
result.ErrorCodes.Add(VirtualizationErrorCodes.SET_NO_REPLICA_SERVER_ERROR);
return result; return result;
// We should use enable replication or set replication?
var vmReplica = vs.GetReplication(vm.VirtualMachineId);
if (vmReplica == null) // need enable
{
vs.EnableVmReplication(vm.VirtualMachineId, replicaServerInfo.ComputerName, replication);
vs.StartInitialReplication(vm.VirtualMachineId);
}
else // need set
{
vs.SetVmReplication(vm.VirtualMachineId, replicaServerInfo.ComputerName, replication);
} }
//StringDictionary vsSesstings = ServerController.GetServiceSettings(vm.replicaServiceId);
//string replicaServiceId = vsSesstings["ReplicaServerId"];
//if (string.IsNullOrEmpty(replicaServiceId))
//{
// result.ErrorCodes.Add(VirtualizationErrorCodes.SET_NO_REPLICA_SERVER_ERROR);
// return result;
//}
vs.SetVmReplication(vm.VirtualMachineId, replicaServer, replication);
result.IsSuccess = true; result.IsSuccess = true;
} }
catch (Exception ex) catch (Exception ex)
{ {
result.AddError(VirtualizationErrorCodes.SET_SET_REPLICATION_ERROR, ex); result.AddError(VirtualizationErrorCodes.SET_REPLICATION_ERROR, ex);
} }
return result; return result;
} }
public static ResultObject DisableVmReplication(int itemId)
{
ResultObject result = new ResultObject();
try
{
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
vs.DisableVmReplication(vm.VirtualMachineId, null);
CleanUpReplicaServer(vm);
result.IsSuccess = true;
}
catch (Exception ex)
{
result.AddError(VirtualizationErrorCodes.DISABLE_REPLICATION_ERROR, ex);
}
return result;
}
public static ResultObject PauseReplication(int itemId)
{
ResultObject result = new ResultObject();
try
{
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
vs.PauseReplication(vm.VirtualMachineId);
result.IsSuccess = true;
}
catch (Exception ex)
{
result.AddError(VirtualizationErrorCodes.PAUSE_REPLICATION_ERROR, ex);
}
return result;
}
public static ResultObject ResumeReplication(int itemId)
{
ResultObject result = new ResultObject();
try
{
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
vs.ResumeReplication(vm.VirtualMachineId);
result.IsSuccess = true;
}
catch (Exception ex)
{
result.AddError(VirtualizationErrorCodes.RESUME_REPLICATION_ERROR, ex);
}
return result;
}
#region Private methods
private static void CleanUpReplicaServer(VirtualMachine originalVm)
{
try
{
ResultObject result = new ResultObject();
// Get replica server
var replicaServer = GetReplicaForService(originalVm.ServiceId, ref result);
// Clean up replica server
var replicaVm = replicaServer.GetVirtualMachines().FirstOrDefault(m => m.Name == originalVm.Name);
if (replicaVm != null)
{
replicaServer.DisableVmReplication(replicaVm.VirtualMachineId, null);
replicaServer.ShutDownVirtualMachine(replicaVm.VirtualMachineId, true, "ReplicaDelete");
replicaServer.DeleteVirtualMachine(replicaVm.VirtualMachineId);
}
}
catch { /* skip */ }
}
private static ReplicationServerInfo GetReplicaInfoForService(int serviceId, ref ResultObject result)
{
// Get service id of replica server
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
string replicaServiceId = vsSesstings["ReplicaServerId"];
if (string.IsNullOrEmpty(replicaServiceId))
{
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
return null;
}
// get replica server info for replica service id
VirtualizationServer2012 vsReplica = GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
StringDictionary vsReplicaSesstings = ServerController.GetServiceSettings(Convert.ToInt32(replicaServiceId));
string computerName = vsReplicaSesstings["ServerName"];
var replicaServerInfo = vsReplica.GetReplicaServer(computerName);
if (!replicaServerInfo.Enabled)
{
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
return null;
}
return replicaServerInfo;
}
private static VirtualizationServer2012 GetReplicaForService(int serviceId, ref ResultObject result)
{
// Get service id of replica server
StringDictionary vsSesstings = ServerController.GetServiceSettings(serviceId);
string replicaServiceId = vsSesstings["ReplicaServerId"];
if (string.IsNullOrEmpty(replicaServiceId))
{
result.ErrorCodes.Add(VirtualizationErrorCodes.NO_REPLICA_SERVER_ERROR);
return null;
}
// get replica server for replica service id
return GetVirtualizationProxy(Convert.ToInt32(replicaServiceId));
}
#endregion
#endregion #endregion
} }
} }

View file

@ -488,12 +488,54 @@ namespace WebsitePanel.EnterpriseServer
} }
[WebMethod] [WebMethod]
public bool IsReplicaServer(int serviceId, string remoteServer) public ResultObject UnsetReplicaServer(int serviceId, string remoteServer)
{ {
return VirtualizationServerController2012.IsReplicaServer(serviceId, remoteServer); return VirtualizationServerController2012.UnsetReplicaServer(serviceId, remoteServer);
}
[WebMethod]
public ReplicationServerInfo GetReplicaServer(int serviceId, string remoteServer)
{
return VirtualizationServerController2012.GetReplicaServer(serviceId, remoteServer);
}
[WebMethod]
public VmReplication GetReplication(int itemId)
{
return VirtualizationServerController2012.GetReplication(itemId);
}
[WebMethod]
public ReplicationDetailInfo GetReplicationInfo(int itemId)
{
return VirtualizationServerController2012.GetReplicationInfo(itemId);
}
[WebMethod]
public ResultObject SetVmReplication(int itemId, VmReplication replication)
{
return VirtualizationServerController2012.SetVmReplication(itemId, replication);
}
[WebMethod]
public ResultObject DisableVmReplication(int itemId)
{
return VirtualizationServerController2012.DisableVmReplication(itemId);
}
[WebMethod]
public ResultObject PauseReplication(int itemId)
{
return VirtualizationServerController2012.PauseReplication(itemId);
}
[WebMethod]
public ResultObject ResumeReplication(int itemId)
{
return VirtualizationServerController2012.PauseReplication(itemId);
} }
#endregion #endregion
} }
} }

View file

@ -4073,6 +4073,38 @@
<data name="Error.VPS_ERROR_TAKE_SNAPSHOT" xml:space="preserve"> <data name="Error.VPS_ERROR_TAKE_SNAPSHOT" xml:space="preserve">
<value>Cannot take virtual machine snapshot</value> <value>Cannot take virtual machine snapshot</value>
</data> </data>
<data name="Error.VPS_ERROR_SET_VM_REPLICATION" xml:space="preserve">
<value>Cannot enable/set replication for the virtual machine</value>
</data>
<data name="Error.VPS_ERROR_DISABLE_VM_REPLICATION" xml:space="preserve">
<value>Cannot disable replication for the virtual machine</value>
</data>
<data name="Error.VPS_ERROR_GET_VM_REPLICATION" xml:space="preserve">
<value>Cannot get replication for the virtual machine</value>
</data>
<data name="Error.VPS_SET_REPLICA_SERVER_ERROR" xml:space="preserve">
<value>Cannot set replication for the server</value>
</data>
<data name="Error.VPS_UNSET_REPLICA_SERVER_ERROR" xml:space="preserve">
<value>Cannot unset replication for the server</value>
</data>
<data name="Error.VPS_NO_REPLICA_SERVER_ERROR" xml:space="preserve">
<value>Cannot find replication server</value>
</data>
<data name="Error.VPS_SET_REPLICATION_ERROR" xml:space="preserve">
<value>Cannot enable\set replication 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="Error.VPS_PAUSE_REPLICATION_ERROR" xml:space="preserve">
<value>Cannot pause replication 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="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>
</data> </data>

View file

@ -157,8 +157,8 @@
<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="None" 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="ReplicationEnabled" 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>

View file

@ -47,8 +47,8 @@ namespace WebsitePanel.Portal.ProviderControls
public bool IsRemoteServer { get { return radioServer.SelectedIndex > 0; } } public bool IsRemoteServer { get { return radioServer.SelectedIndex > 0; } }
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 == ReplicaMode.IsReplicaServer.ToString(); } }
public bool EnabledReplica { get { return ReplicationModeList.SelectedValue == "Enable"; } } public bool EnabledReplica { get { return ReplicationModeList.SelectedValue == ReplicaMode.ReplicationEnabled.ToString(); } }
public string ReplicaServerId { get; set; } public string ReplicaServerId { get; set; }
void IHostingServiceProviderSettings.BindSettings(StringDictionary settings) void IHostingServiceProviderSettings.BindSettings(StringDictionary settings)
@ -106,7 +106,7 @@ namespace WebsitePanel.Portal.ProviderControls
radioStopAction.SelectedValue = settings["StopAction"]; radioStopAction.SelectedValue = settings["StopAction"];
// replica // replica
ReplicationModeList.SelectedValue = settings["ReplicaMode"] ?? "Disabled"; ReplicationModeList.SelectedValue = settings["ReplicaMode"] ?? ReplicaMode.None.ToString();
txtReplicaPath.Text = settings["ReplicaServerPath"]; txtReplicaPath.Text = settings["ReplicaServerPath"];
ReplicaServerId = settings["ReplicaServerId"]; ReplicaServerId = settings["ReplicaServerId"];
@ -115,12 +115,13 @@ namespace WebsitePanel.Portal.ProviderControls
// replica // replica
txtCertThumbnail.Text = settings["ReplicaServerThumbprint"]; txtCertThumbnail.Text = settings["ReplicaServerThumbprint"];
ddlCertThumbnail.SelectedValue = settings["ReplicaServerThumbprint"]; ddlCertThumbnail.SelectedValue = settings["ReplicaServerThumbprint"];
ddlReplicaServer.SelectedValue = settings["ReplicaServerId"];
if (IsReplicaServer) if (IsReplicaServer)
{ {
var serverIsRealReplica = ES.Services.VPS2012.IsReplicaServer(PanelRequest.ServiceId, RemoteServerName); var realReplica = ES.Services.VPS2012.GetReplicaServer(PanelRequest.ServiceId, RemoteServerName);
if (!serverIsRealReplica) if (realReplica == null)
ReplicaErrorTr.Visible = true; ReplicaErrorTr.Visible = true;
} }
} }
@ -181,7 +182,7 @@ namespace WebsitePanel.Portal.ProviderControls
settings["ReplicaServerPath"] = txtReplicaPath.Text; settings["ReplicaServerPath"] = txtReplicaPath.Text;
settings["ReplicaServerThumbprint"] = CertificateThumbprint; settings["ReplicaServerThumbprint"] = CertificateThumbprint;
SetReplication(); SetUnsetReplication();
} }
private void BindNetworksList() private void BindNetworksList()
@ -261,7 +262,6 @@ namespace WebsitePanel.Portal.ProviderControls
list.Add(serviceInfo); list.Add(serviceInfo);
} }
return list; return list;
} }
@ -331,13 +331,16 @@ namespace WebsitePanel.Portal.ProviderControls
protected void btnSetReplicaServer_Click(object sender, EventArgs e) protected void btnSetReplicaServer_Click(object sender, EventArgs e)
{ {
ToggleControls(); ToggleControls();
SetReplication(); SetUnsetReplication();
} }
private void SetReplication() private void SetUnsetReplication()
{ {
if (!IsReplicaServer) if (!IsReplicaServer)
{
ES.Services.VPS2012.UnsetReplicaServer(PanelRequest.ServiceId, RemoteServerName);
return; return;
}
if (txtReplicaPath.Text == "") if (txtReplicaPath.Text == "")
{ {

View file

@ -112,63 +112,93 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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="btnApply.OnClientClick" xml:space="preserve"> <data name="btnDetailInfo.OnClientClick" xml:space="preserve">
<value>if(this.disabled) return false;if(!confirm('Do you want to apply selected snapshot to VPS?')) return false;ShowProgressDialog('Applying snapshot...');</value> <value>ShowProgressDialog('Gathering detailed information...', 'DetailModal');</value>
</data> </data>
<data name="btnDelete.OnClientClick" xml:space="preserve"> <data name="btnUpdate.OnClientClick" xml:space="preserve">
<value>if(this.disabled) return false;if(!confirm('Do you want to completely delete selected snapshot?')) return false;ShowProgressDialog('Deleting snapshot...');</value> <value>ShowProgressDialog('Updating VM replication...');</value>
</data>
<data name="btnDeleteSubtree.OnClientClick" xml:space="preserve">
<value>if(!confirm('Do you want to completely delete selected snapshot and all its sub-tree?')) return false;ShowProgressDialog('Deleting snapshot sub-tree...');</value>
</data>
<data name="btnRenameSnapshot.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Renaming snapshot...', 'RenameSnapshotModal');</value>
</data>
<data name="btnTakeSnapshot.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Taking snapshot...');</value>
</data>
<data name="Now.Text" xml:space="preserve">
<value>Now</value>
</data>
<data name="locNoSnapshots.Text" xml:space="preserve">
<value>This virtual server has no snapshots.</value>
</data>
<data name="btnApply.Text" xml:space="preserve">
<value>Apply</value>
</data>
<data name="btnCancelRename.Text" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="btnDelete.Text" xml:space="preserve">
<value>Delete</value>
</data>
<data name="btnDeleteSubtree.Text" xml:space="preserve">
<value>Delete Subtree</value>
</data>
<data name="btnRename.Text" xml:space="preserve">
<value>Rename</value>
</data>
<data name="btnRenameSnapshot.Text" xml:space="preserve">
<value>Rename</value>
</data>
<data name="FormComments.Text" xml:space="preserve">
<value>&lt;p&gt;To take a &lt;b&gt;snapshot&lt;/b&gt; is much like to take a picture of current VPS state: its configuration, memory and hard disk.&lt;/p&gt;&lt;p&gt;Snapshots maybe used as backup/restore points when installing new software or using VPS for development or testing purposes. If something has gone wrong there is an ability to roll-back and &lt;b&gt;"Apply"&lt;/b&gt; a snapshot with good configuration.&lt;/p&gt;&lt;p&gt;&lt;b&gt;"Rename"&lt;/b&gt; button allows renaming snapshot and giving it some informative name, for example "Before applying service pack".&lt;/p&gt;</value>
</data>
<data name="locCreated.Text" xml:space="preserve">
<value>Created:</value>
</data>
<data name="locQuota.Text" xml:space="preserve">
<value>Number of Snapshots:</value>
</data>
<data name="locRenameSnapshot.Text" xml:space="preserve">
<value>Rename Snapshot</value>
</data> </data>
<data name="locTitle.Text" xml:space="preserve"> <data name="locTitle.Text" xml:space="preserve">
<value>Snapshots</value> <value>Replication</value>
</data>
<data name="btnDetailInfo.Text" xml:space="preserve">
<value>Details</value>
</data>
<data name="btnUpdate.Text" xml:space="preserve">
<value>Update</value>
</data>
<data name="chbEnable.Text" xml:space="preserve">
<value>Enable replication</value>
</data>
<data name="chbVSS.Text" xml:space="preserve">
<value>Volume Shadow Copy Service (VSS) snapshot frequency (in hours):</value>
</data>
<data name="ddlFrequency15minutes.Text" xml:space="preserve">
<value>15 minutes</value>
</data>
<data name="ddlFrequency30seconds.Text" xml:space="preserve">
<value>30 seconds</value>
</data>
<data name="ddlFrequency5minutes.Text" xml:space="preserve">
<value>5 minutes</value>
</data>
<data name="locCeritficate.Text" xml:space="preserve">
<value>SSL ceritficate:</value>
</data>
<data name="locFrequency.Text" xml:space="preserve">
<value>Replication Frequency</value>
</data>
<data name="locLastSynchronized.Text" xml:space="preserve">
<value>Last synchronized at:</value>
</data>
<data name="locPrimaryServer.Text" xml:space="preserve">
<value>Primary Server:</value>
</data>
<data name="locRecoveryPoints.Text" xml:space="preserve">
<value>Additional Recovery Points:</value>
</data>
<data name="locRecoveryPointsAdditional.Text" xml:space="preserve">
<value>Coverage provided by additional recovery points (in hours):</value>
</data>
<data name="locReplicaServer.Text" xml:space="preserve">
<value>Replica Server:</value>
</data>
<data name="locVHDs.Text" xml:space="preserve">
<value>Choose Replication VHDs:</value>
</data>
<data name="radRecoveryPointsAdditional.Text" xml:space="preserve">
<value>Create additional hourly recovery points</value>
</data>
<data name="radRecoveryPointsLast.Text" xml:space="preserve">
<value>Maintain only the latest recovery point</value>
</data>
<data name="secReplication.Text" xml:space="preserve">
<value>Replication Configuration</value>
</data>
<data name="secReplicationDetails.Text" xml:space="preserve">
<value>Health</value>
</data>
<data name="valCeritficateRequire.ErrorMessage" xml:space="preserve">
<value>SSL certificate is required</value>
</data>
<data name="valRecoveryPointsAdditionalRange.ErrorMessage" xml:space="preserve">
<value>chbVSS</value>
</data>
<data name="valRecoveryPointsAdditionalRequire.ErrorMessage" xml:space="preserve">
<value>Additional recovery points cannot be empty</value>
</data>
<data name="valRecoveryPointsVSSRange.ErrorMessage" xml:space="preserve">
<value>VSS snapshot frequency range is 1-12</value>
</data>
<data name="valRecoveryPointsVSSRequire.ErrorMessage" xml:space="preserve">
<value>VSS snapshot frequency cannot be empty</value>
</data>
<data name="valVHDs.ErrorMessage" xml:space="preserve">
<value>Please select at least one VHD</value>
</data> </data>
</root> </root>

View file

@ -144,6 +144,9 @@
<data name="Tab.Snapshots" xml:space="preserve"> <data name="Tab.Snapshots" xml:space="preserve">
<value>Snapshots</value> <value>Snapshots</value>
</data> </data>
<data name="Tab.Replication" xml:space="preserve">
<value>Replication</value>
</data>
<data name="Tab.Tools" xml:space="preserve"> <data name="Tab.Tools" xml:space="preserve">
<value>Tools</value> <value>Tools</value>
</data> </data>

View file

@ -133,12 +133,15 @@ namespace WebsitePanel.Portal.VPS2012.UserControls
if ((vm.ExternalNetworkEnabled || vm.PrivateNetworkEnabled) && !createError) if ((vm.ExternalNetworkEnabled || vm.PrivateNetworkEnabled) && !createError)
tabsList.Add(CreateTab("vps_network", "Tab.Network")); tabsList.Add(CreateTab("vps_network", "Tab.Network"));
if (!createError)
tabsList.Add(CreateTab("vps_replication", "Tab.Replication"));
//tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions")); //tabsList.Add(CreateTab("vps_permissions", "Tab.Permissions"));
//tabsList.Add(CreateTab("vps_tools", "Tab.Tools")); //tabsList.Add(CreateTab("vps_tools", "Tab.Tools"));
tabsList.Add(CreateTab("vps_audit_log", "Tab.AuditLog")); tabsList.Add(CreateTab("vps_audit_log", "Tab.AuditLog"));
if (!createError) //if (!createError)
tabsList.Add(CreateTab("vps_help", "Tab.Help")); // tabsList.Add(CreateTab("vps_help", "Tab.Help"));
// find selected menu item // find selected menu item

View file

@ -4,11 +4,34 @@
<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %>
<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %>
<%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %> <%@ Register Src="UserControls/FormTitle.ascx" TagName="FormTitle" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<script type="text/javascript">
function ValidateCheckBoxList(sender, args) {
var checkBoxList = document.getElementById("vhdContainer");
var checkboxes = checkBoxList.getElementsByTagName("input");
var isValid = false;
for (var i = 0; i < checkboxes.length; i++) {
if (checkboxes[i].checked) {
isValid = true;
break;
}
}
args.IsValid = isValid;
}
</script>
<style>
.ReplicaTable td {
padding-bottom: 10px;
}
.ReplicaTable .AdditionalPoints td {
padding-bottom: 0px;
}
</style>
<div id="VpsContainer"> <div id="VpsContainer">
<div class="Module"> <div class="Module">
@ -23,83 +46,165 @@
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title"> <div class="Title">
<asp:Image ID="imgIcon" SkinID="Snapshot48" runat="server" /> <asp:Image ID="imgIcon" SkinID="Servers48" runat="server" />
<wsp:FormTitle ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Snapshots" /> <wsp:FormTitle ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Replication" />
</div> </div>
<div class="FormBody"> <div class="FormBody">
<wsp:ServerTabs id="tabs" runat="server" SelectedTab="vps_replications" /> <wsp:ServerTabs ID="tabs" runat="server" SelectedTab="vps_replication" />
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox ID="messageBox" runat="server" />
<asp:ValidationSummary ID="validatorsSummary" runat="server"
ValidationGroup="Vps" ShowMessageBox="True" ShowSummary="False" />
<table style="width:100%;"> <wsp:CollapsiblePanel ID="secReplicationDetails" runat="server" Visible="False"
<tr> TargetControlID="ReplicationDetailsPanel" meta:ResourceKey="secReplicationDetails" Text="Health">
<td valign="top"> </wsp:CollapsiblePanel>
<asp:Panel ID="ReplicationDetailsPanel" runat="server" Height="0" Style="overflow: hidden; padding: 10px; width: 750px;">
<asp:Button ID="btnDetailInfo" runat="server" CausesValidation="false" CssClass="ActionButtonRename"
meta:resourcekey="btnDetailInfo" Text="Details"></asp:Button>
</asp:Panel>
<div class="FormButtonsBarClean"> <wsp:CollapsiblePanel ID="secReplication" runat="server" Visible="True"
<asp:Button ID="btnTakeSnapshot" runat="server" meta:resourcekey="btnTakeSnapshot" TargetControlID="ReplicationPanel" meta:ResourceKey="secReplication" Text="Replication Configuration">
Text="Take Snapshot" CssClass="Button1" onclick="btnTakeSnapshot_Click" /> </wsp:CollapsiblePanel>
</div> <asp:Panel ID="ReplicationPanel" runat="server" Height="0" Style="overflow: hidden; padding: 10px; width: 750px;">
<br /> <div class="FormButtonsBarClean">
<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%;">
<tr>
<td style="width: 200px;">
<asp:Localize ID="locPrimaryServer" runat="server" meta:resourcekey="locPrimaryServer" Text="Primary Server:"></asp:Localize>
</td>
<td>
<asp:Label ID="labPrimaryServer" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locReplicaServer" runat="server" meta:resourcekey="locReplicaServer" Text="Replica Server:"></asp:Localize>
</td>
<td>
<asp:Label ID="labReplicaServer" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locLastSynchronized" runat="server" meta:resourcekey="locLastSynchronized" Text="Last synchronized at:"></asp:Localize>
</td>
<td>
<asp:Label ID="labLastSynchronized" runat="server"></asp:Label>
</td>
</tr>
<tr runat="server" ID="trVHDEditable">
<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" />
<asp:CustomValidator ID="valVHDs" ErrorMessage="Please select at least one VHD" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
ForeColor="Red" ClientValidationFunction="ValidateCheckBoxList" runat="server" />
</td>
</tr>
<tr runat="server" ID="trVHDReadOnly" Visible="False">
<td>
<asp:Localize ID="locVHDsReadOnly" runat="server" meta:resourcekey="locVHDsReadOnly" Text="Replication VHDs:"></asp:Localize>
</td>
<td>
<asp:Label ID="labVHDs" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locCeritficate" runat="server" meta:resourcekey="locCeritficate" Text="SSL ceritficate:"></asp:Localize>
</td>
<td>
<div runat="server" ID="ddlCeritficateDiv">
<asp:DropDownList runat="server" ID="ddlCeritficate" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="ddlCeritficate" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
</div>
<div runat="server" ID="txtCeritficateDiv">
<asp:TextBox runat="server" ID="txtCeritficate" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtCeritficate" ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
ErrorMessage="SSL certificate is required" ForeColor="Red" meta:resourcekey="valCeritficateRequire" Text="*" />
</div>
</td>
</tr>
<tr>
<td>
<asp:Localize ID="locFrequency" runat="server" meta:resourcekey="locFrequency" Text="Replication Frequency:"></asp:Localize>
</td>
<td>
<asp:DropDownList runat="server" ID="ddlFrequency" >
<asp:ListItem Value="30" Selected="True" meta:resourcekey="ddlFrequency30seconds">30seconds</asp:ListItem>
<asp:ListItem Value="300" meta:resourcekey="ddlFrequency5minutes">5minutes</asp:ListItem>
<asp:ListItem Value="900" meta:resourcekey="ddlFrequency15minutes">15minutes</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr class="AdditionalPoints">
<td colspan="2">
<asp:Label ID="locRecoveryPoints" runat="server" meta:resourcekey="locRecoveryPoints"
Text="Additional Recovery Points:" style="margin-bottom: 10px;"></asp:Label>
<asp:TreeView ID="SnapshotsTree" runat="server" <asp:RadioButtonList ID="radRecoveryPoints" runat="server" AutoPostBack="true">
onselectednodechanged="SnapshotsTree_SelectedNodeChanged" ShowLines="True"> <asp:ListItem Value="OnlyLast" meta:resourcekey="radRecoveryPointsLast" Selected="True">Maintain only the latest recovery point</asp:ListItem>
<SelectedNodeStyle CssClass="SelectedTreeNode" /> <asp:ListItem Value="Additional" meta:resourcekey="radRecoveryPointsAdditional">Create additional hourly recovery points</asp:ListItem>
<Nodes> </asp:RadioButtonList>
</Nodes>
<NodeStyle CssClass="TreeNode" />
</asp:TreeView>
<div id="NoSnapshotsPanel" runat="server" style="padding: 5px;"> <table runat="server" ID="tabAdditionalRecoveryPoints" class="AdditionalPoints" style="margin: 10px; width: 100%;">
<asp:Localize ID="locNoSnapshots" runat="server" meta:resourcekey="locNoSnapshots" Text="No snapshots"></asp:Localize> <tr>
</div> <td style="width: 480px;">
<asp:Localize ID="locRecoveryPointsAdditional" runat="server" meta:resourcekey="locRecoveryPointsAdditional"
Text="Coverage provided by additional recovery points (in hours):"></asp:Localize>
</td>
<td>
<asp:TextBox runat="server" ID="txtRecoveryPointsAdditional" Width="30px"></asp:TextBox>
<br /> <asp:RequiredFieldValidator runat="server" ControlToValidate="txtRecoveryPointsAdditional" Display="Dynamic" SetFocusOnError="true"
<br /> ErrorMessage="Additional recovery points cannot be empty." ForeColor="Red" ValidationGroup="Vps"
<asp:Localize ID="locQuota" runat="server" meta:resourcekey="locQuota" meta:resourcekey="valRecoveryPointsAdditionalRequire" Text="*" />
Text="Number of Snapshots:"></asp:Localize> <asp:RangeValidator runat="server" ControlToValidate="txtRecoveryPointsAdditional" MinimumValue="1" MaximumValue="24"
&nbsp;&nbsp;&nbsp; ErrorMessage="Additional recovery points range is 1-24." ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
<wsp:QuotaViewer ID="snapshotsQuota" runat="server" QuotaTypeId="2" /> meta:resourcekey="valRecoveryPointsAdditionalRange" ForeColor="Red" Type="Integer" Text="*" />
</td>
</tr>
<tr>
<td>
<asp:CheckBox runat="server" ID="chbVSS" AutoPostBack="True" meta:resourcekey="chbVSS" Text="Volume Shadow Copy Service (VSS) snapshot frequency (in hours):" />
</td>
<td>
<div runat="server" ID="VSSdiv">
<asp:TextBox runat="server" ID="txtRecoveryPointsVSS" Width="30px"></asp:TextBox>
</td> <asp:RequiredFieldValidator runat="server" ControlToValidate="txtRecoveryPointsVSS"
<td valign="top" id="SnapshotDetailsPanel" runat="server"> ErrorMessage="VSS snapshot frequency cannot be empty." ForeColor="Red" Display="Dynamic" SetFocusOnError="true"
<asp:Image ID="imgThumbnail" runat="server" Width="160" Height="120" /> meta:resourcekey="valRecoveryPointsVSSRequire" Text="*" ValidationGroup="Vps"/>
<p> <asp:RangeValidator runat="server" ControlToValidate="txtRecoveryPointsVSS" MinimumValue="1" MaximumValue="24"
<asp:Localize ID="locCreated" runat="server" meta:resourcekey="locCreated" ErrorMessage="VSS snapshot frequency range is 1-12." ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
Text="Created:"></asp:Localize> meta:resourcekey="valRecoveryPointsVSSRange" Text="*" ForeColor="Red" Type="Integer" />
<asp:Literal ID="litCreated" runat="server"></asp:Literal> </div>
</p> </td>
<ul class="ActionButtons"> </tr>
<li> </table>
<asp:LinkButton ID="btnApply" runat="server" CausesValidation="false" CssClass="ActionButtonApplySnapshot" </td>
meta:resourcekey="btnApply" Text="Apply" onclick="btnApply_Click"></asp:LinkButton> </tr>
</li> </table>
<li> <div class="FormButtonsBarClean">
<asp:LinkButton ID="btnRename" runat="server" CausesValidation="false" CssClass="ActionButtonRename" <asp:Button ID="btnUpdate" runat="server" CssClass="ActionButtonRename"
meta:resourcekey="btnRename" Text="Rename"></asp:LinkButton> meta:resourcekey="btnUpdate" Text="Update" OnClick="btnUpdate_Click" ValidationGroup="Vps"></asp:Button>
</li> </div>
<li> </asp:Panel>
<asp:LinkButton ID="btnDelete" runat="server" CausesValidation="false" CssClass="ActionButtonDeleteSnapshot" </div>
meta:resourcekey="btnDelete" Text="Delete" onclick="btnDelete_Click"></asp:LinkButton> </div>
</li>
<li>
<asp:LinkButton ID="btnDeleteSubtree" runat="server" CausesValidation="false" CssClass="ActionButtonDeleteSnapshotTree"
meta:resourcekey="btnDeleteSubtree" Text="Delete subtree"
onclick="btnDeleteSubtree_Click"></asp:LinkButton>
</li>
</ul>
</td>
</tr>
</table>
</div> </div>
</div>
</div>
</div> </div>
</div> </div>
<asp:Panel ID="RenamePanel" runat="server" CssClass="Popup" style="display:none;"> <asp:Panel ID="DetailsPanel" runat="server" CssClass="Popup" style="display:none;">
<table class="Popup-Header" cellpadding="0" cellspacing="0"> <table class="Popup-Header" cellpadding="0" cellspacing="0">
<tr> <tr>
<td class="Popup-HeaderLeft"></td> <td class="Popup-HeaderLeft"></td>
@ -132,7 +237,7 @@
<div class="FormFooter"> <div class="FormFooter">
<asp:Button ID="btnRenameSnapshot" runat="server" CssClass="Button1" <asp:Button ID="btnRenameSnapshot" runat="server" CssClass="Button1"
meta:resourcekey="btnRenameSnapshot" Text="Rename" onclick="btnRenameSnapshot_Click" meta:resourcekey="btnRenameSnapshot" Text="Rename"
ValidationGroup="RenameSnapshot" /> ValidationGroup="RenameSnapshot" />
<asp:Button ID="btnCancelRename" runat="server" CssClass="Button1" <asp:Button ID="btnCancelRename" runat="server" CssClass="Button1"
@ -141,6 +246,6 @@
</div> </div>
</asp:Panel> </asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="RenameSnapshotModal" runat="server" BehaviorID="RenameSnapshotModal" <ajaxToolkit:ModalPopupExtender ID="DetailModal" runat="server" BehaviorID="DetailModal"
TargetControlID="btnRename" PopupControlID="RenamePanel" TargetControlID="btnDetailInfo" PopupControlID="DetailsPanel"
BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelRename" /> BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelRename" />

View file

@ -28,7 +28,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Web; using System.Collections.Specialized;
using System.Linq;
using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
@ -42,221 +44,202 @@ namespace WebsitePanel.Portal.VPS2012
{ {
if (!IsPostBack) if (!IsPostBack)
{ {
BindSnapshotsTree(); Bind();
}
Toogle();
}
private void Toogle()
{
ReplicaTable.Visible = chbEnable.Checked;
switch (radRecoveryPoints.SelectedValue)
{
case "OnlyLast":
tabAdditionalRecoveryPoints.Visible = false;
break;
case "Additional":
tabAdditionalRecoveryPoints.Visible = true;
VSSdiv.Visible = chbVSS.Checked;
break;
} }
} }
private void BindSnapshotsTree() private void Bind()
{ {
VirtualMachineSnapshot[] snapshots = ES.Services.VPS2012.GetVirtualMachineSnapshots(PanelRequest.ItemID); try
// clear tree
SnapshotsTree.Nodes.Clear();
// fill tree by root nodes
AddChildNodes(SnapshotsTree.Nodes, null, snapshots);
// select first node
if (SnapshotsTree.Nodes.Count > 0)
{ {
SnapshotsTree.Nodes[0].Selected = true; const string na = "n/a";
}
// refresh var packageVm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
BindSelectedNode(); var vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(packageVm.ServiceId, packageVm.VirtualMachineId);
var serviceSettings = ConvertArrayToDictionary(ES.Services.Servers.GetServiceSettings(packageVm.ServiceId));
// quotas //var replicaMode = Enum.Parse(typeof(ReplicaMode), serviceSettings["ReplicaMode"]);
VirtualMachine vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID); var computerName = serviceSettings["ServerName"];
snapshotsQuota.QuotaUsedValue = snapshots.Length;
snapshotsQuota.QuotaValue = vm.SnapshotsNumber;
btnTakeSnapshot.Enabled = snapshots.Length < vm.SnapshotsNumber;
}
private void BindSelectedNode() var vmReplica = ES.Services.VPS2012.GetReplication(PanelRequest.ItemID);
{ var vmReplicaInfo = ES.Services.VPS2012.GetReplicationInfo(PanelRequest.ItemID);
TreeNode node = SnapshotsTree.SelectedNode;
btnApply.Enabled = // Enable checkpoint
btnRename.Enabled = chbEnable.Checked = ReplicaTable.Visible = vmReplica != null;
btnDelete.Enabled =
btnDeleteSubtree.Enabled =
SnapshotDetailsPanel.Visible = (node != null);
NoSnapshotsPanel.Visible = (SnapshotsTree.Nodes.Count == 0); // General labels
if (vmReplicaInfo != null)
if (node != null)
{
// set name
txtSnapshotName.Text = node.Text;
// load snapshot details
VirtualMachineSnapshot snapshot = ES.Services.VPS2012.GetSnapshot(PanelRequest.ItemID, node.Value);
if (snapshot != null)
litCreated.Text = snapshot.Created.ToString();
// set image
imgThumbnail.ImageUrl =
string.Format("~/DesktopModules/WebsitePanel/VPS2012/VirtualMachineSnapshotImage.ashx?ItemID={0}&SnapshotID={1}&rnd={2}",
PanelRequest.ItemID, HttpUtility.UrlEncode(node.Value), DateTime.Now.Ticks);
}
}
private void AddChildNodes(TreeNodeCollection parent, string parentId, VirtualMachineSnapshot[] snapshots)
{
foreach (VirtualMachineSnapshot snapshot in snapshots)
{
if (snapshot.ParentId == parentId)
{ {
// add node labPrimaryServer.Text = vmReplicaInfo.PrimaryServerName;
TreeNode node = new TreeNode(snapshot.Name, snapshot.Id); labReplicaServer.Text = vmReplicaInfo.ReplicaServerName;
node.Expanded = true; labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt.ToShortTimeString();
node.ImageUrl = PortalUtils.GetThemedImage("VPS/snapshot.png"); }
parent.Add(node); else
{
labPrimaryServer.Text = labReplicaServer.Text = labLastSynchronized.Text = na;
}
// check if the current // Certificates list
if (snapshot.IsCurrent) var certificates = ES.Services.VPS2012.GetCertificates(packageVm.ServiceId, computerName);
foreach (var cert in certificates)
{
ddlCeritficate.Items.Add(new ListItem(cert.Title, cert.Thumbprint));
}
if (!string.IsNullOrEmpty(computerName))
{
ddlCeritficateDiv.Visible = true;
txtCeritficateDiv.Visible = false;
}
else
{
ddlCeritficateDiv.Visible = true;
txtCeritficateDiv.Visible = false;
}
// VHDs editable
trVHDEditable.Visible = true;
trVHDReadOnly.Visible = false;
chlVHDs.Items.Clear();
chlVHDs.Items.AddRange(vm.Disks.Select(d => new ListItem(d.Path) {Selected = true}).ToArray());
if (vmReplica != null)
{
// VHDs readonly
labVHDs.Text = "";
foreach (var disk in vm.Disks)
{ {
TreeNode nowNode = new TreeNode(GetLocalizedString("Now.Text"), ""); if (string.Equals(vmReplica.VhdToReplicate, disk.Path, StringComparison.OrdinalIgnoreCase))
nowNode.ImageUrl = PortalUtils.GetThemedImage("VPS/start2.png"); labVHDs.Text += disk.Path + "<br>";
nowNode.SelectAction = TreeNodeSelectAction.None;
node.ChildNodes.Add(nowNode);
} }
trVHDEditable.Visible = false;
trVHDReadOnly.Visible = true;
// fill children // Certificates
AddChildNodes(node.ChildNodes, snapshot.Id, snapshots); ddlCeritficate.SelectedValue = txtCeritficate.Text = vmReplica.Thumbprint;
}
}
}
protected void btnTakeSnapshot_Click(object sender, EventArgs e) // Frequency
{ ddlFrequency.SelectedValue = ((int) vmReplica.ReplicaFrequency).ToString();
try
{
ResultObject res = ES.Services.VPS2012.CreateSnapshot(PanelRequest.ItemID);
if (res.IsSuccess) // Recovery points
{ if (vmReplica.AdditionalRecoveryPoints == 0)
// bind tree {
BindSnapshotsTree(); radRecoveryPoints.SelectedValue = "OnlyLast";
return; tabAdditionalRecoveryPoints.Visible = false;
} }
else else
{ {
// show error radRecoveryPoints.SelectedValue = "Additional";
messageBox.ShowMessage(res, "VPS_ERROR_TAKE_SNAPSHOT", "VPS"); tabAdditionalRecoveryPoints.Visible = true;
txtRecoveryPointsAdditional.Text = vmReplica.AdditionalRecoveryPoints.ToString();
// VSS
if (vmReplica.VSSSnapshotFrequencyHour == 0)
{
chbVSS.Checked = false;
VSSdiv.Visible = false;
}
else
{
chbVSS.Checked = true;
VSSdiv.Visible = true;
txtRecoveryPointsVSS.Text = vmReplica.VSSSnapshotFrequencyHour.ToString();
}
}
} }
secReplicationDetails.Visible = ReplicationDetailsPanel.Visible = vmReplica != null;
} }
catch (Exception ex) catch (Exception ex)
{ {
messageBox.ShowErrorMessage("VPS_ERROR_TAKE_SNAPSHOT", ex); messageBox.ShowErrorMessage("VPS_ERROR_GET_VM_REPLICATION", ex);
} }
} }
protected void btnApply_Click(object sender, EventArgs e) protected void btnUpdate_Click(object sender, EventArgs e)
{ {
if (!Page.IsValid)
return;
if (chbEnable.Checked)
SetReplication();
else
DisableReplication();
}
private void SetReplication()
{
var vmReplica = new VmReplication();
vmReplica.VhdToReplicate = chlVHDs.Items.Cast<ListItem>()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList()
.FirstOrDefault();
vmReplica.Thumbprint = ddlCeritficateDiv.Visible ? ddlCeritficate.SelectedValue : txtCeritficate.Text;
vmReplica.ReplicaFrequency = (ReplicaFrequency) Convert.ToInt32(ddlFrequency.SelectedValue);
vmReplica.AdditionalRecoveryPoints = radRecoveryPoints.SelectedValue == "OnlyLast" ? 0 : Convert.ToInt32(txtRecoveryPointsAdditional.Text);
vmReplica.VSSSnapshotFrequencyHour = chbVSS.Checked ? Convert.ToInt32(txtRecoveryPointsVSS.Text) : 0;
try try
{ {
ResultObject res = ES.Services.VPS2012.ApplySnapshot(PanelRequest.ItemID, GetSelectedSnapshot()); ResultObject res = ES.Services.VPS2012.SetVmReplication(PanelRequest.ItemID, vmReplica);
if (res.IsSuccess) if (res.IsSuccess)
{ Bind();
// bind tree
BindSnapshotsTree();
return;
}
else else
{ messageBox.ShowMessage(res, "VPS_ERROR_SET_VM_REPLICATION", "VPS");
// show error
messageBox.ShowMessage(res, "VPS_ERROR_APPLY_SNAPSHOT", "VPS");
}
} }
catch (Exception ex) catch (Exception ex)
{ {
messageBox.ShowErrorMessage("VPS_ERROR_APPLY_SNAPSHOT", ex); messageBox.ShowErrorMessage("VPS_ERROR_SET_VM_REPLICATION", ex);
} }
} }
protected void btnRenameSnapshot_Click(object sender, EventArgs e) private void DisableReplication()
{ {
try try
{ {
string newName = txtSnapshotName.Text.Trim(); ResultObject res = ES.Services.VPS2012.DisableVmReplication(PanelRequest.ItemID);
ResultObject res = ES.Services.VPS2012.RenameSnapshot(PanelRequest.ItemID, GetSelectedSnapshot(), newName);
if (res.IsSuccess) if (res.IsSuccess)
{ Bind();
// bind tree
SnapshotsTree.SelectedNode.Text = newName;
return;
}
else else
{ messageBox.ShowMessage(res, "VPS_ERROR_DISABLE_VM_REPLICATION", "VPS");
// show error
messageBox.ShowMessage(res, "VPS_ERROR_RENAME_SNAPSHOT", "VPS");
}
} }
catch (Exception ex) catch (Exception ex)
{ {
messageBox.ShowErrorMessage("VPS_ERROR_RENAME_SNAPSHOT", ex); messageBox.ShowErrorMessage("VPS_ERROR_DISABLE_VM_REPLICATION", ex);
} }
} }
protected void btnDelete_Click(object sender, EventArgs e) private StringDictionary ConvertArrayToDictionary(string[] settings)
{ {
try StringDictionary r = new StringDictionary();
foreach (string setting in settings)
{ {
ResultObject res = ES.Services.VPS2012.DeleteSnapshot(PanelRequest.ItemID, GetSelectedSnapshot()); int idx = setting.IndexOf('=');
r.Add(setting.Substring(0, idx), setting.Substring(idx + 1));
if (res.IsSuccess)
{
// bind tree
BindSnapshotsTree();
return;
}
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_DELETE_SNAPSHOT", "VPS");
}
} }
catch (Exception ex) return r;
{
messageBox.ShowErrorMessage("VPS_ERROR_DELETE_SNAPSHOT", ex);
}
}
protected void btnDeleteSubtree_Click(object sender, EventArgs e)
{
try
{
ResultObject res = ES.Services.VPS2012.DeleteSnapshotSubtree(PanelRequest.ItemID, GetSelectedSnapshot());
if (res.IsSuccess)
{
// bind tree
BindSnapshotsTree();
return;
}
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_DELETE_SNAPSHOT_SUBTREE", "VPS");
}
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("VPS_ERROR_DELETE_SNAPSHOT_SUBTREE", ex);
}
}
private string GetSelectedSnapshot()
{
return SnapshotsTree.SelectedNode.Value;
}
protected void SnapshotsTree_SelectedNodeChanged(object sender, EventArgs e)
{
BindSelectedNode();
} }
} }
} }

View file

@ -76,139 +76,355 @@ namespace WebsitePanel.Portal.VPS2012 {
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary> /// <summary>
/// btnTakeSnapshot control. /// validatorsSummary control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Button btnTakeSnapshot; protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary;
/// <summary> /// <summary>
/// SnapshotsTree control. /// secReplicationDetails control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.TreeView SnapshotsTree; protected global::WebsitePanel.Portal.CollapsiblePanel secReplicationDetails;
/// <summary> /// <summary>
/// NoSnapshotsPanel control. /// ReplicationDetailsPanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl NoSnapshotsPanel; protected global::System.Web.UI.WebControls.Panel ReplicationDetailsPanel;
/// <summary> /// <summary>
/// locNoSnapshots control. /// btnDetailInfo control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Localize locNoSnapshots; protected global::System.Web.UI.WebControls.Button btnDetailInfo;
/// <summary> /// <summary>
/// locQuota control. /// secReplication control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Localize locQuota; protected global::WebsitePanel.Portal.CollapsiblePanel secReplication;
/// <summary> /// <summary>
/// snapshotsQuota control. /// ReplicationPanel control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.QuotaViewer snapshotsQuota; protected global::System.Web.UI.WebControls.Panel ReplicationPanel;
/// <summary> /// <summary>
/// SnapshotDetailsPanel control. /// chbEnable control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableCell SnapshotDetailsPanel; protected global::System.Web.UI.WebControls.CheckBox chbEnable;
/// <summary> /// <summary>
/// imgThumbnail control. /// ReplicaTable control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Image imgThumbnail; protected global::System.Web.UI.HtmlControls.HtmlTable ReplicaTable;
/// <summary> /// <summary>
/// locCreated control. /// locPrimaryServer control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Localize locCreated; protected global::System.Web.UI.WebControls.Localize locPrimaryServer;
/// <summary> /// <summary>
/// litCreated control. /// labPrimaryServer control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Literal litCreated; protected global::System.Web.UI.WebControls.Label labPrimaryServer;
/// <summary> /// <summary>
/// btnApply control. /// locReplicaServer control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.LinkButton btnApply; protected global::System.Web.UI.WebControls.Localize locReplicaServer;
/// <summary> /// <summary>
/// btnRename control. /// labReplicaServer control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.LinkButton btnRename; protected global::System.Web.UI.WebControls.Label labReplicaServer;
/// <summary> /// <summary>
/// btnDelete control. /// locLastSynchronized control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.LinkButton btnDelete; protected global::System.Web.UI.WebControls.Localize locLastSynchronized;
/// <summary> /// <summary>
/// btnDeleteSubtree control. /// labLastSynchronized control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.LinkButton btnDeleteSubtree; protected global::System.Web.UI.WebControls.Label labLastSynchronized;
/// <summary> /// <summary>
/// RenamePanel control. /// trVHDEditable control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Panel RenamePanel; protected global::System.Web.UI.HtmlControls.HtmlTableRow trVHDEditable;
/// <summary>
/// locVHDs 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 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>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBoxList chlVHDs;
/// <summary>
/// valVHDs 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.CustomValidator valVHDs;
/// <summary>
/// trVHDReadOnly 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 trVHDReadOnly;
/// <summary>
/// locVHDsReadOnly 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 locVHDsReadOnly;
/// <summary>
/// labVHDs 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 labVHDs;
/// <summary>
/// locCeritficate 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 locCeritficate;
/// <summary>
/// ddlCeritficateDiv 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.HtmlGenericControl ddlCeritficateDiv;
/// <summary>
/// ddlCeritficate 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 ddlCeritficate;
/// <summary>
/// txtCeritficateDiv 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.HtmlGenericControl txtCeritficateDiv;
/// <summary>
/// txtCeritficate 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.TextBox txtCeritficate;
/// <summary>
/// locFrequency 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 locFrequency;
/// <summary>
/// ddlFrequency 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 ddlFrequency;
/// <summary>
/// locRecoveryPoints 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 locRecoveryPoints;
/// <summary>
/// radRecoveryPoints 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.RadioButtonList radRecoveryPoints;
/// <summary>
/// tabAdditionalRecoveryPoints 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.HtmlTable tabAdditionalRecoveryPoints;
/// <summary>
/// locRecoveryPointsAdditional 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 locRecoveryPointsAdditional;
/// <summary>
/// txtRecoveryPointsAdditional 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.TextBox txtRecoveryPointsAdditional;
/// <summary>
/// chbVSS 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.CheckBox chbVSS;
/// <summary>
/// VSSdiv 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.HtmlGenericControl VSSdiv;
/// <summary>
/// txtRecoveryPointsVSS 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.TextBox txtRecoveryPointsVSS;
/// <summary>
/// btnUpdate 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.Button btnUpdate;
/// <summary>
/// DetailsPanel 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.Panel DetailsPanel;
/// <summary> /// <summary>
/// locRenameSnapshot control. /// locRenameSnapshot control.
@ -256,12 +472,12 @@ namespace WebsitePanel.Portal.VPS2012 {
protected global::System.Web.UI.WebControls.Button btnCancelRename; protected global::System.Web.UI.WebControls.Button btnCancelRename;
/// <summary> /// <summary>
/// RenameSnapshotModal control. /// DetailModal control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::AjaxControlToolkit.ModalPopupExtender RenameSnapshotModal; protected global::AjaxControlToolkit.ModalPopupExtender DetailModal;
} }
} }

View file

@ -5126,7 +5126,9 @@
<Content Include="PhoneNumbersAddPhoneNumber.ascx" /> <Content Include="PhoneNumbersAddPhoneNumber.ascx" />
<Content Include="PhoneNumbersEditPhoneNumber.ascx" /> <Content Include="PhoneNumbersEditPhoneNumber.ascx" />
<Content Include="UserControls\App_LocalResources\UserActions.ascx.resx" /> <Content Include="UserControls\App_LocalResources\UserActions.ascx.resx" />
<Content Include="UserControls\App_LocalResources\DomainActions.ascx.resx" /> <Content Include="UserControls\App_LocalResources\DomainActions.ascx.resx">
<SubType>Designer</SubType>
</Content>
<Content Include="UserControls\App_LocalResources\MailAccountActions.ascx.resx" /> <Content Include="UserControls\App_LocalResources\MailAccountActions.ascx.resx" />
<EmbeddedResource Include="UserControls\App_LocalResources\WebsiteActions.ascx.resx" /> <EmbeddedResource Include="UserControls\App_LocalResources\WebsiteActions.ascx.resx" />
<Content Include="VPS\UserControls\App_LocalResources\Generation.ascx.resx"> <Content Include="VPS\UserControls\App_LocalResources\Generation.ascx.resx">