wsp-10329 Adding hyper-v replica to HyperV Provider. WebPortal Part 2.
This commit is contained in:
parent
b5d2bf04a2
commit
e8495ac0c6
14 changed files with 1472 additions and 391 deletions
|
@ -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";
|
||||||
|
|
|
@ -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]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 == "")
|
||||||
{
|
{
|
||||||
|
|
|
@ -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><p>To take a <b>snapshot</b> is much like to take a picture of current VPS state: its configuration, memory and hard disk.</p><p>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 <b>"Apply"</b> a snapshot with good configuration.</p><p><b>"Rename"</b> button allows renaming snapshot and giving it some informative name, for example "Before applying service pack".</p></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>
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
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" />
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue