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";
// Replication
public const string SET_REPLICA_SERVER_ERROR = "SET_REPLICA_SERVER_ERROR";
public const string SET_NO_REPLICA_SERVER_ERROR = "SET_NO_REPLICA_SERVER_ERROR";
public const string SET_SET_REPLICATION_ERROR = "SET_SET_REPLICATION_ERROR";
public const string SET_REPLICA_SERVER_ERROR = "VPS_SET_REPLICA_SERVER_ERROR";
public const string UNSET_REPLICA_SERVER_ERROR = "VPS_UNSET_REPLICA_SERVER_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";

View file

@ -148,7 +148,21 @@ namespace WebsitePanel.EnterpriseServer {
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/>
public esVirtualizationServer2012() {
@ -327,7 +341,28 @@ namespace WebsitePanel.EnterpriseServer {
public event SetReplicaServerCompletedEventHandler SetReplicaServerCompleted;
/// <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/>
[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/>
[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)]
public bool IsReplicaServer(int serviceId, string remoteServer) {
object[] results = this.Invoke("IsReplicaServer", new object[] {
[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 ResultObject UnsetReplicaServer(int serviceId, string remoteServer) {
object[] results = this.Invoke("UnsetReplicaServer", new object[] {
serviceId,
remoteServer});
return ((bool)(results[0]));
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginIsReplicaServer(int serviceId, string remoteServer, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("IsReplicaServer", new object[] {
public System.IAsyncResult BeginUnsetReplicaServer(int serviceId, string remoteServer, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("UnsetReplicaServer", new object[] {
serviceId,
remoteServer}, callback, asyncState);
}
/// <remarks/>
public bool EndIsReplicaServer(System.IAsyncResult asyncResult) {
public ResultObject EndUnsetReplicaServer(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((bool)(results[0]));
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void IsReplicaServerAsync(int serviceId, string remoteServer) {
this.IsReplicaServerAsync(serviceId, remoteServer, null);
public void UnsetReplicaServerAsync(int serviceId, string remoteServer) {
this.UnsetReplicaServerAsync(serviceId, remoteServer, null);
}
/// <remarks/>
public void IsReplicaServerAsync(int serviceId, string remoteServer, object userState) {
if ((this.IsReplicaServerOperationCompleted == null)) {
this.IsReplicaServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnIsReplicaServerOperationCompleted);
public void UnsetReplicaServerAsync(int serviceId, string remoteServer, object userState) {
if ((this.UnsetReplicaServerOperationCompleted == null)) {
this.UnsetReplicaServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUnsetReplicaServerOperationCompleted);
}
this.InvokeAsync("IsReplicaServer", new object[] {
this.InvokeAsync("UnsetReplicaServer", new object[] {
serviceId,
remoteServer}, this.IsReplicaServerOperationCompleted, userState);
remoteServer}, this.UnsetReplicaServerOperationCompleted, userState);
}
private void OnIsReplicaServerOperationCompleted(object arg) {
if ((this.IsReplicaServerCompleted != null)) {
private void OnUnsetReplicaServerOperationCompleted(object arg) {
if ((this.UnsetReplicaServerCompleted != null)) {
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/>
[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/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class IsReplicaServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
public partial class UnsetReplicaServerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
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) {
this.results = results;
}
/// <remarks/>
public bool Result {
public ResultObject Result {
get {
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 IsReplicaServer Part
public static CertificateInfo[] GetCertificates(int serviceId, string remoteServer)
{
VirtualizationServer2012 vs = GetVirtualizationProxy(serviceId);
@ -3745,11 +3747,29 @@ namespace WebsitePanel.EnterpriseServer
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);
return vs.IsReplicaServer(remoteServer);
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);
return vs.GetReplicaServer(remoteServer);
}
#endregion
public static VmReplication GetReplication(int itemId)
{
@ -3758,7 +3778,14 @@ namespace WebsitePanel.EnterpriseServer
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();
try
@ -3766,35 +3793,156 @@ namespace WebsitePanel.EnterpriseServer
VirtualMachine vm = GetVirtualMachineByItemId(itemId);
VirtualizationServer2012 vs = GetVirtualizationProxy(vm.ServiceId);
// Get replica server name
StringDictionary vsSesstings = ServerController.GetServiceSettings(vm.ServiceId);
string replicaServiceId = vsSesstings["ReplicaServerId"];
if (string.IsNullOrEmpty(replicaServiceId))
{
result.ErrorCodes.Add(VirtualizationErrorCodes.SET_NO_REPLICA_SERVER_ERROR);
// Get replica server
var replicaServerInfo = GetReplicaInfoForService(vm.ServiceId, ref result);
if (result.ErrorCodes.Count > 0)
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;
}
catch (Exception ex)
{
result.AddError(VirtualizationErrorCodes.SET_SET_REPLICATION_ERROR, ex);
result.AddError(VirtualizationErrorCodes.SET_REPLICATION_ERROR, ex);
}
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
}
}

View file

@ -488,9 +488,51 @@ namespace WebsitePanel.EnterpriseServer
}
[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);
}

View file

@ -4073,6 +4073,38 @@
<data name="Error.VPS_ERROR_TAKE_SNAPSHOT" xml:space="preserve">
<value>Cannot take virtual machine snapshot</value>
</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">
<value>Job execution failed with the following code: {1}</value>
</data>

View file

@ -157,8 +157,8 @@
<td colspan="2">
<asp:RadioButtonList ID="ReplicationModeList" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="radioServer_SelectedIndexChanged">
<asp:ListItem Value="Disable" meta:resourcekey="ReplicationModeDisabled" Selected="True">No Hyper-v Replication</asp:ListItem>
<asp:ListItem Value="Enable" meta:resourcekey="ReplicationModeEnabled">Enable Hyper-V Replication</asp:ListItem>
<asp:ListItem Value="None" meta:resourcekey="ReplicationModeDisabled" Selected="True">No 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:RadioButtonList>
</td>

View file

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

View file

@ -112,63 +112,93 @@
<value>2.0</value>
</resheader>
<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 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>
<data name="btnApply.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>
<data name="btnDetailInfo.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Gathering detailed information...', 'DetailModal');</value>
</data>
<data name="btnDelete.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>
</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 name="btnUpdate.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating VM replication...');</value>
</data>
<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>
</root>

View file

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

View file

@ -133,12 +133,15 @@ namespace WebsitePanel.Portal.VPS2012.UserControls
if ((vm.ExternalNetworkEnabled || vm.PrivateNetworkEnabled) && !createError)
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_tools", "Tab.Tools"));
tabsList.Add(CreateTab("vps_audit_log", "Tab.AuditLog"));
if (!createError)
tabsList.Add(CreateTab("vps_help", "Tab.Help"));
//if (!createError)
// tabsList.Add(CreateTab("vps_help", "Tab.Help"));
// find selected menu item

View file

@ -4,11 +4,34 @@
<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %>
<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" 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/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %>
<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 class="Module">
@ -23,74 +46,156 @@
<div class="Content">
<div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="Snapshot48" runat="server" />
<wsp:FormTitle ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Snapshots" />
<asp:Image ID="imgIcon" SkinID="Servers48" runat="server" />
<wsp:FormTitle ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Replication" />
</div>
<div class="FormBody">
<wsp:ServerTabs id="tabs" runat="server" SelectedTab="vps_replications" />
<wsp:SimpleMessageBox id="messageBox" runat="server" />
<wsp:ServerTabs ID="tabs" runat="server" SelectedTab="vps_replication" />
<wsp:SimpleMessageBox ID="messageBox" runat="server" />
<asp:ValidationSummary ID="validatorsSummary" runat="server"
ValidationGroup="Vps" ShowMessageBox="True" ShowSummary="False" />
<table style="width:100%;">
<tr>
<td valign="top">
<wsp:CollapsiblePanel ID="secReplicationDetails" runat="server" Visible="False"
TargetControlID="ReplicationDetailsPanel" meta:ResourceKey="secReplicationDetails" Text="Health">
</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>
<wsp:CollapsiblePanel ID="secReplication" runat="server" Visible="True"
TargetControlID="ReplicationPanel" meta:ResourceKey="secReplication" Text="Replication Configuration">
</wsp:CollapsiblePanel>
<asp:Panel ID="ReplicationPanel" runat="server" Height="0" Style="overflow: hidden; padding: 10px; width: 750px;">
<div class="FormButtonsBarClean">
<asp:Button ID="btnTakeSnapshot" runat="server" meta:resourcekey="btnTakeSnapshot"
Text="Take Snapshot" CssClass="Button1" onclick="btnTakeSnapshot_Click" />
<asp:CheckBox ID="chbEnable" runat="server" meta:resourcekey="chbEnable" Text="Enable replication" AutoPostBack="True" />
</div>
<br />
<asp:TreeView ID="SnapshotsTree" runat="server"
onselectednodechanged="SnapshotsTree_SelectedNodeChanged" ShowLines="True">
<SelectedNodeStyle CssClass="SelectedTreeNode" />
<Nodes>
</Nodes>
<NodeStyle CssClass="TreeNode" />
</asp:TreeView>
<div id="NoSnapshotsPanel" runat="server" style="padding: 5px;">
<asp:Localize ID="locNoSnapshots" runat="server" meta:resourcekey="locNoSnapshots" Text="No snapshots"></asp:Localize>
</div>
<br />
<br />
<asp:Localize ID="locQuota" runat="server" meta:resourcekey="locQuota"
Text="Number of Snapshots:"></asp:Localize>
&nbsp;&nbsp;&nbsp;
<wsp:QuotaViewer ID="snapshotsQuota" runat="server" QuotaTypeId="2" />
<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 valign="top" id="SnapshotDetailsPanel" runat="server">
<asp:Image ID="imgThumbnail" runat="server" Width="160" Height="120" />
<p>
<asp:Localize ID="locCreated" runat="server" meta:resourcekey="locCreated"
Text="Created:"></asp:Localize>
<asp:Literal ID="litCreated" runat="server"></asp:Literal>
</p>
<ul class="ActionButtons">
<li>
<asp:LinkButton ID="btnApply" runat="server" CausesValidation="false" CssClass="ActionButtonApplySnapshot"
meta:resourcekey="btnApply" Text="Apply" onclick="btnApply_Click"></asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="btnRename" runat="server" CausesValidation="false" CssClass="ActionButtonRename"
meta:resourcekey="btnRename" Text="Rename"></asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="btnDelete" runat="server" CausesValidation="false" CssClass="ActionButtonDeleteSnapshot"
meta:resourcekey="btnDelete" Text="Delete" onclick="btnDelete_Click"></asp:LinkButton>
</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>
<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:RadioButtonList ID="radRecoveryPoints" runat="server" AutoPostBack="true">
<asp:ListItem Value="OnlyLast" meta:resourcekey="radRecoveryPointsLast" Selected="True">Maintain only the latest recovery point</asp:ListItem>
<asp:ListItem Value="Additional" meta:resourcekey="radRecoveryPointsAdditional">Create additional hourly recovery points</asp:ListItem>
</asp:RadioButtonList>
<table runat="server" ID="tabAdditionalRecoveryPoints" class="AdditionalPoints" style="margin: 10px; width: 100%;">
<tr>
<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>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtRecoveryPointsAdditional" Display="Dynamic" SetFocusOnError="true"
ErrorMessage="Additional recovery points cannot be empty." ForeColor="Red" ValidationGroup="Vps"
meta:resourcekey="valRecoveryPointsAdditionalRequire" Text="*" />
<asp:RangeValidator runat="server" ControlToValidate="txtRecoveryPointsAdditional" MinimumValue="1" MaximumValue="24"
ErrorMessage="Additional recovery points range is 1-24." ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
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>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtRecoveryPointsVSS"
ErrorMessage="VSS snapshot frequency cannot be empty." ForeColor="Red" Display="Dynamic" SetFocusOnError="true"
meta:resourcekey="valRecoveryPointsVSSRequire" Text="*" ValidationGroup="Vps"/>
<asp:RangeValidator runat="server" ControlToValidate="txtRecoveryPointsVSS" MinimumValue="1" MaximumValue="24"
ErrorMessage="VSS snapshot frequency range is 1-12." ValidationGroup="Vps" Display="Dynamic" SetFocusOnError="true"
meta:resourcekey="valRecoveryPointsVSSRange" Text="*" ForeColor="Red" Type="Integer" />
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<div class="FormButtonsBarClean">
<asp:Button ID="btnUpdate" runat="server" CssClass="ActionButtonRename"
meta:resourcekey="btnUpdate" Text="Update" OnClick="btnUpdate_Click" ValidationGroup="Vps"></asp:Button>
</div>
</asp:Panel>
</div>
</div>
@ -99,7 +204,7 @@
</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">
<tr>
<td class="Popup-HeaderLeft"></td>
@ -132,7 +237,7 @@
<div class="FormFooter">
<asp:Button ID="btnRenameSnapshot" runat="server" CssClass="Button1"
meta:resourcekey="btnRenameSnapshot" Text="Rename" onclick="btnRenameSnapshot_Click"
meta:resourcekey="btnRenameSnapshot" Text="Rename"
ValidationGroup="RenameSnapshot" />
<asp:Button ID="btnCancelRename" runat="server" CssClass="Button1"
@ -141,6 +246,6 @@
</div>
</asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="RenameSnapshotModal" runat="server" BehaviorID="RenameSnapshotModal"
TargetControlID="btnRename" PopupControlID="RenamePanel"
<ajaxToolkit:ModalPopupExtender ID="DetailModal" runat="server" BehaviorID="DetailModal"
TargetControlID="btnDetailInfo" PopupControlID="DetailsPanel"
BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelRename" />

View file

@ -28,7 +28,9 @@
using System;
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.WebControls;
using WebsitePanel.Providers.Common;
@ -42,221 +44,202 @@ namespace WebsitePanel.Portal.VPS2012
{
if (!IsPostBack)
{
BindSnapshotsTree();
}
Bind();
}
private void BindSnapshotsTree()
Toogle();
}
private void Toogle()
{
VirtualMachineSnapshot[] snapshots = ES.Services.VPS2012.GetVirtualMachineSnapshots(PanelRequest.ItemID);
ReplicaTable.Visible = chbEnable.Checked;
// clear tree
SnapshotsTree.Nodes.Clear();
// fill tree by root nodes
AddChildNodes(SnapshotsTree.Nodes, null, snapshots);
// select first node
if (SnapshotsTree.Nodes.Count > 0)
switch (radRecoveryPoints.SelectedValue)
{
SnapshotsTree.Nodes[0].Selected = true;
}
// refresh
BindSelectedNode();
// quotas
VirtualMachine vm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
snapshotsQuota.QuotaUsedValue = snapshots.Length;
snapshotsQuota.QuotaValue = vm.SnapshotsNumber;
btnTakeSnapshot.Enabled = snapshots.Length < vm.SnapshotsNumber;
}
private void BindSelectedNode()
{
TreeNode node = SnapshotsTree.SelectedNode;
btnApply.Enabled =
btnRename.Enabled =
btnDelete.Enabled =
btnDeleteSubtree.Enabled =
SnapshotDetailsPanel.Visible = (node != null);
NoSnapshotsPanel.Visible = (SnapshotsTree.Nodes.Count == 0);
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);
case "OnlyLast":
tabAdditionalRecoveryPoints.Visible = false;
break;
case "Additional":
tabAdditionalRecoveryPoints.Visible = true;
VSSdiv.Visible = chbVSS.Checked;
break;
}
}
private void AddChildNodes(TreeNodeCollection parent, string parentId, VirtualMachineSnapshot[] snapshots)
{
foreach (VirtualMachineSnapshot snapshot in snapshots)
{
if (snapshot.ParentId == parentId)
{
// add node
TreeNode node = new TreeNode(snapshot.Name, snapshot.Id);
node.Expanded = true;
node.ImageUrl = PortalUtils.GetThemedImage("VPS/snapshot.png");
parent.Add(node);
// check if the current
if (snapshot.IsCurrent)
{
TreeNode nowNode = new TreeNode(GetLocalizedString("Now.Text"), "");
nowNode.ImageUrl = PortalUtils.GetThemedImage("VPS/start2.png");
nowNode.SelectAction = TreeNodeSelectAction.None;
node.ChildNodes.Add(nowNode);
}
// fill children
AddChildNodes(node.ChildNodes, snapshot.Id, snapshots);
}
}
}
protected void btnTakeSnapshot_Click(object sender, EventArgs e)
private void Bind()
{
try
{
ResultObject res = ES.Services.VPS2012.CreateSnapshot(PanelRequest.ItemID);
const string na = "n/a";
if (res.IsSuccess)
var packageVm = ES.Services.VPS2012.GetVirtualMachineItem(PanelRequest.ItemID);
var vm = ES.Services.VPS2012.GetVirtualMachineExtendedInfo(packageVm.ServiceId, packageVm.VirtualMachineId);
var serviceSettings = ConvertArrayToDictionary(ES.Services.Servers.GetServiceSettings(packageVm.ServiceId));
//var replicaMode = Enum.Parse(typeof(ReplicaMode), serviceSettings["ReplicaMode"]);
var computerName = serviceSettings["ServerName"];
var vmReplica = ES.Services.VPS2012.GetReplication(PanelRequest.ItemID);
var vmReplicaInfo = ES.Services.VPS2012.GetReplicationInfo(PanelRequest.ItemID);
// Enable checkpoint
chbEnable.Checked = ReplicaTable.Visible = vmReplica != null;
// General labels
if (vmReplicaInfo != null)
{
// bind tree
BindSnapshotsTree();
return;
labPrimaryServer.Text = vmReplicaInfo.PrimaryServerName;
labReplicaServer.Text = vmReplicaInfo.ReplicaServerName;
labLastSynchronized.Text = vmReplicaInfo.LastSynhronizedAt.ToShortTimeString();
}
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_TAKE_SNAPSHOT", "VPS");
labPrimaryServer.Text = labReplicaServer.Text = labLastSynchronized.Text = na;
}
}
catch (Exception ex)
// Certificates list
var certificates = ES.Services.VPS2012.GetCertificates(packageVm.ServiceId, computerName);
foreach (var cert in certificates)
{
messageBox.ShowErrorMessage("VPS_ERROR_TAKE_SNAPSHOT", ex);
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)
{
if (string.Equals(vmReplica.VhdToReplicate, disk.Path, StringComparison.OrdinalIgnoreCase))
labVHDs.Text += disk.Path + "<br>";
}
trVHDEditable.Visible = false;
trVHDReadOnly.Visible = true;
// Certificates
ddlCeritficate.SelectedValue = txtCeritficate.Text = vmReplica.Thumbprint;
// Frequency
ddlFrequency.SelectedValue = ((int) vmReplica.ReplicaFrequency).ToString();
// Recovery points
if (vmReplica.AdditionalRecoveryPoints == 0)
{
radRecoveryPoints.SelectedValue = "OnlyLast";
tabAdditionalRecoveryPoints.Visible = false;
}
else
{
radRecoveryPoints.SelectedValue = "Additional";
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();
}
}
}
protected void btnApply_Click(object sender, EventArgs e)
secReplicationDetails.Visible = ReplicationDetailsPanel.Visible = vmReplica != null;
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("VPS_ERROR_GET_VM_REPLICATION", ex);
}
}
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
{
ResultObject res = ES.Services.VPS2012.SetVmReplication(PanelRequest.ItemID, vmReplica);
if (res.IsSuccess)
Bind();
else
messageBox.ShowMessage(res, "VPS_ERROR_SET_VM_REPLICATION", "VPS");
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("VPS_ERROR_SET_VM_REPLICATION", ex);
}
}
private void DisableReplication()
{
try
{
ResultObject res = ES.Services.VPS2012.ApplySnapshot(PanelRequest.ItemID, GetSelectedSnapshot());
ResultObject res = ES.Services.VPS2012.DisableVmReplication(PanelRequest.ItemID);
if (res.IsSuccess)
{
// bind tree
BindSnapshotsTree();
return;
}
Bind();
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_APPLY_SNAPSHOT", "VPS");
}
messageBox.ShowMessage(res, "VPS_ERROR_DISABLE_VM_REPLICATION", "VPS");
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("VPS_ERROR_APPLY_SNAPSHOT", ex);
messageBox.ShowErrorMessage("VPS_ERROR_DISABLE_VM_REPLICATION", ex);
}
}
protected void btnRenameSnapshot_Click(object sender, EventArgs e)
private StringDictionary ConvertArrayToDictionary(string[] settings)
{
try
StringDictionary r = new StringDictionary();
foreach (string setting in settings)
{
string newName = txtSnapshotName.Text.Trim();
ResultObject res = ES.Services.VPS2012.RenameSnapshot(PanelRequest.ItemID, GetSelectedSnapshot(), newName);
if (res.IsSuccess)
{
// bind tree
SnapshotsTree.SelectedNode.Text = newName;
return;
int idx = setting.IndexOf('=');
r.Add(setting.Substring(0, idx), setting.Substring(idx + 1));
}
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_RENAME_SNAPSHOT", "VPS");
}
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("VPS_ERROR_RENAME_SNAPSHOT", ex);
}
}
protected void btnDelete_Click(object sender, EventArgs e)
{
try
{
ResultObject res = ES.Services.VPS2012.DeleteSnapshot(PanelRequest.ItemID, GetSelectedSnapshot());
if (res.IsSuccess)
{
// bind tree
BindSnapshotsTree();
return;
}
else
{
// show error
messageBox.ShowMessage(res, "VPS_ERROR_DELETE_SNAPSHOT", "VPS");
}
}
catch (Exception ex)
{
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();
return r;
}
}
}

View file

@ -76,139 +76,355 @@ namespace WebsitePanel.Portal.VPS2012 {
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary>
/// btnTakeSnapshot control.
/// validatorsSummary 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 btnTakeSnapshot;
protected global::System.Web.UI.WebControls.ValidationSummary validatorsSummary;
/// <summary>
/// SnapshotsTree control.
/// secReplicationDetails 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.TreeView SnapshotsTree;
protected global::WebsitePanel.Portal.CollapsiblePanel secReplicationDetails;
/// <summary>
/// NoSnapshotsPanel control.
/// ReplicationDetailsPanel 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 NoSnapshotsPanel;
protected global::System.Web.UI.WebControls.Panel ReplicationDetailsPanel;
/// <summary>
/// locNoSnapshots control.
/// btnDetailInfo 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 locNoSnapshots;
protected global::System.Web.UI.WebControls.Button btnDetailInfo;
/// <summary>
/// locQuota control.
/// secReplication 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 locQuota;
protected global::WebsitePanel.Portal.CollapsiblePanel secReplication;
/// <summary>
/// snapshotsQuota control.
/// ReplicationPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.QuotaViewer snapshotsQuota;
protected global::System.Web.UI.WebControls.Panel ReplicationPanel;
/// <summary>
/// SnapshotDetailsPanel control.
/// chbEnable 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 SnapshotDetailsPanel;
protected global::System.Web.UI.WebControls.CheckBox chbEnable;
/// <summary>
/// imgThumbnail control.
/// ReplicaTable 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.Image imgThumbnail;
protected global::System.Web.UI.HtmlControls.HtmlTable ReplicaTable;
/// <summary>
/// locCreated control.
/// locPrimaryServer 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 locCreated;
protected global::System.Web.UI.WebControls.Localize locPrimaryServer;
/// <summary>
/// litCreated control.
/// labPrimaryServer 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.Literal litCreated;
protected global::System.Web.UI.WebControls.Label labPrimaryServer;
/// <summary>
/// btnApply control.
/// locReplicaServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.LinkButton btnApply;
protected global::System.Web.UI.WebControls.Localize locReplicaServer;
/// <summary>
/// btnRename control.
/// labReplicaServer 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.LinkButton btnRename;
protected global::System.Web.UI.WebControls.Label labReplicaServer;
/// <summary>
/// btnDelete control.
/// locLastSynchronized 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.LinkButton btnDelete;
protected global::System.Web.UI.WebControls.Localize locLastSynchronized;
/// <summary>
/// btnDeleteSubtree control.
/// labLastSynchronized 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.LinkButton btnDeleteSubtree;
protected global::System.Web.UI.WebControls.Label labLastSynchronized;
/// <summary>
/// RenamePanel control.
/// trVHDEditable 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 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>
/// locRenameSnapshot control.
@ -256,12 +472,12 @@ namespace WebsitePanel.Portal.VPS2012 {
protected global::System.Web.UI.WebControls.Button btnCancelRename;
/// <summary>
/// RenameSnapshotModal control.
/// DetailModal control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::AjaxControlToolkit.ModalPopupExtender RenameSnapshotModal;
protected global::AjaxControlToolkit.ModalPopupExtender DetailModal;
}
}

View file

@ -5126,7 +5126,9 @@
<Content Include="PhoneNumbersAddPhoneNumber.ascx" />
<Content Include="PhoneNumbersEditPhoneNumber.ascx" />
<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" />
<EmbeddedResource Include="UserControls\App_LocalResources\WebsiteActions.ascx.resx" />
<Content Include="VPS\UserControls\App_LocalResources\Generation.ascx.resx">