From 3a8e9e83558efffbde5a17fd57ef4ca8c3dfd1b0 Mon Sep 17 00:00:00 2001 From: Alexander Trofimov Date: Wed, 22 Apr 2015 03:38:44 -0400 Subject: [PATCH] wsp-10329 Adding hyper-v replica to HyperV Provider. Server Part 6. --- .../IVirtualizationServer2012.cs | 2 +- .../Replication/ReplicationState.cs | 1 + .../Replication/VmReplication.cs | 2 +- .../Helpers/VirtualMachineHelper.cs | 1 + .../HyperV2012R2.cs | 59 ++++++------------- .../VirtualizationServerProxy2012.cs | 53 ++++------------- .../VirtualizationServer2012.asmx.cs | 5 +- 7 files changed, 37 insertions(+), 86 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/IVirtualizationServer2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/IVirtualizationServer2012.cs index ce81e1ac..479f1bc8 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/IVirtualizationServer2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/IVirtualizationServer2012.cs @@ -109,7 +109,7 @@ namespace WebsitePanel.Providers.Virtualization void TestReplicationServer(string vmId, string replicaServer, string localThumbprint); void StartInitialReplication(string vmId); VmReplication GetReplication(string vmId); - bool DisableVmReplication(string vmId, string replicaServer); + void DisableVmReplication(string vmId); ReplicationDetailInfo GetReplicationInfo(string vmId); void PauseReplication(string vmId); void ResumeReplication(string vmId); diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/ReplicationState.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/ReplicationState.cs index 394a7aa5..4dbd9e76 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/ReplicationState.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/ReplicationState.cs @@ -14,6 +14,7 @@ namespace WebsitePanel.Providers.Virtualization FailedOver, NotApplicable, ReadyForInitialReplication, + InitialReplicationInProgress, Replicating, Resynchronizing, ResynchronizeSuspended, diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/VmReplication.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/VmReplication.cs index 915c3a0e..2db4f114 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/VmReplication.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Virtualization/Replication/VmReplication.cs @@ -7,7 +7,7 @@ public string Thumbprint { get; set; } [Persistent] - public string VhdToReplicate { get; set; } + public string[] VhdToReplicate { get; set; } [Persistent] public ReplicaFrequency ReplicaFrequency { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs index 7cebe04b..f084bfa6 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/Helpers/VirtualMachineHelper.cs @@ -74,6 +74,7 @@ namespace WebsitePanel.Providers.Virtualization { Command cmd = new Command("Stop-VM"); + cmd.Parameters.Add("Name", vmName); if (force) cmd.Parameters.Add("Force"); if (!string.IsNullOrEmpty(server)) cmd.Parameters.Add("ComputerName", server); //if (!string.IsNullOrEmpty(reason)) cmd.Parameters.Add("Reason", reason); diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs index f177136b..493e3f29 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Virtualization.HyperV-2012R2/HyperV2012R2.cs @@ -102,7 +102,7 @@ namespace WebsitePanel.Providers.Virtualization public ReplicaMode ReplicaMode { - get { return (ReplicaMode) ProviderSettings.GetInt("ReplicaMode"); } + get { return (ReplicaMode) Enum.Parse(typeof(ReplicaMode) , ProviderSettings["ReplicaMode"]); } } protected string ReplicaServerPath { @@ -780,10 +780,10 @@ namespace WebsitePanel.Providers.Virtualization Command cmd = new Command("Get-VMSwitch"); // Not needed as the PowerShellManager adds the computer name - //if (!string.IsNullOrEmpty(computerName)) cmd.Parameters.Add("ComputerName", computerName); + if (!string.IsNullOrEmpty(computerName)) cmd.Parameters.Add("ComputerName", computerName); if (!string.IsNullOrEmpty(type)) cmd.Parameters.Add("SwitchType", type); - Collection result = PowerShell.Execute(cmd, true, true); + Collection result = PowerShell.Execute(cmd, false, true); foreach (PSObject current in result) { @@ -2037,19 +2037,18 @@ namespace WebsitePanel.Providers.Virtualization var excludes = vm.Disks .Select(d => d.Path) - .Where(p => !p.Equals(replication.VhdToReplicate, StringComparison.OrdinalIgnoreCase)) + .Where(p => replication.VhdToReplicate.All(vp => !p.Equals(vp, StringComparison.OrdinalIgnoreCase))) .ToArray(); if (excludes.Any()) cmd.Parameters.Add("ExcludedVhdPath", excludes); // recovery points + cmd.Parameters.Add("RecoveryHistory", replication.AdditionalRecoveryPoints); if (replication.AdditionalRecoveryPoints > 0) { if (replication.AdditionalRecoveryPoints > 24) throw new Exception("AdditionalRecoveryPoints can not be greater than 24"); - cmd.Parameters.Add("RecoveryHistory", replication.AdditionalRecoveryPoints); - if (replication.VSSSnapshotFrequencyHour > 0) { if (replication.VSSSnapshotFrequencyHour > 12) @@ -2059,10 +2058,7 @@ namespace WebsitePanel.Providers.Virtualization } } - PowerShell.Execute(cmd, true); - - // Initial Replication - StartInitialReplication(vmId); + PowerShell.Execute(cmd, true, true); } public void SetVmReplication(string vmId, string replicaServer, VmReplication replication) @@ -2080,21 +2076,13 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("CertificateThumbprint", replication.Thumbprint); cmd.Parameters.Add("ReplicationFrequencySec", (int)replication.ReplicaFrequency); - var excludes = vm.Disks - .Select(d => d.Path) - .Where(p => !p.Equals(replication.VhdToReplicate, StringComparison.OrdinalIgnoreCase)) - .ToArray(); - if (excludes.Any()) - cmd.Parameters.Add("ExcludedVhdPath", excludes); - // recovery points + cmd.Parameters.Add("RecoveryHistory", replication.AdditionalRecoveryPoints); if (replication.AdditionalRecoveryPoints > 0) { if (replication.AdditionalRecoveryPoints > 24) throw new Exception("AdditionalRecoveryPoints can not be greater than 24"); - cmd.Parameters.Add("RecoveryHistory", replication.AdditionalRecoveryPoints); - if (replication.VSSSnapshotFrequencyHour > 0) { if (replication.VSSSnapshotFrequencyHour > 12) @@ -2102,6 +2090,10 @@ namespace WebsitePanel.Providers.Virtualization cmd.Parameters.Add("VSSSnapshotFrequencyHour", replication.VSSSnapshotFrequencyHour); } + else + { + cmd.Parameters.Add("DisableVSSSnapshotReplication"); + } } PowerShell.Execute(cmd, true); @@ -2163,36 +2155,21 @@ namespace WebsitePanel.Providers.Virtualization excludes.Add(item.Path.ToString()); replica.VhdToReplicate = vm.Disks .Select(d => d.Path) - .FirstOrDefault(p => excludes.All(ep => !p.Equals(ep, StringComparison.OrdinalIgnoreCase))); + .Where(p => excludes.All(ep => !p.Equals(ep, StringComparison.OrdinalIgnoreCase))) + .ToArray(); } return replica; } - public bool DisableVmReplication(string vmId, string replicaServer) + public void DisableVmReplication(string vmId) { - if (ReplicaMode != ReplicaMode.ReplicationEnabled) + if (ReplicaMode == ReplicaMode.None) throw new Exception("Server does not allow replication by settings"); var vm = GetVirtualMachine(vmId); ReplicaHelper.RemoveVmReplication(PowerShell, vm.Name, ServerNameSettings); - - // move it to EnterpriseServer? - // If we have access - delete garbage from replica server - try - { - ReplicaHelper.RemoveVmReplication(PowerShell, vm.Name, replicaServer); - // Delete replica vm - VirtualMachineHelper.Stop(PowerShell, vm.Name, true, replicaServer); - VirtualMachineHelper.Delete(PowerShell, vm.Name, replicaServer); - } - catch - { - return false; - } - - return true; } @@ -2212,13 +2189,13 @@ namespace WebsitePanel.Providers.Virtualization if (result != null && result.Count > 0) { replica = new ReplicationDetailInfo(); - replica.AverageLatency = result[0].GetProperty("AverageReplicationLatency"); + replica.AverageLatency = result[0].GetProperty("AverageReplicationLatency") ?? new TimeSpan(); replica.AverageSize = result[0].GetMb("AverageReplicationSize"); replica.Errors = result[0].GetInt("ReplicationErrors"); replica.FromTime = result[0].GetProperty("MonitoringStartTime"); replica.Health = result[0].GetEnum("ReplicationHealth"); - replica.HealthDetails = result[0].GetString("ReplicationHealthDetails"); - replica.LastSynhronizedAt = result[0].GetProperty("LastReplicationTime"); + replica.HealthDetails = string.Join(". ", result[0].GetProperty("ReplicationHealthDetails")); + replica.LastSynhronizedAt = result[0].GetProperty("LastReplicationTime") ?? new DateTime(); replica.MaximumSize = result[0].GetMb("MaximumReplicationSize"); replica.Mode = result[0].GetEnum("ReplicationMode"); replica.PendingSize = result[0].GetMb("PendingReplicationSize"); diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/VirtualizationServerProxy2012.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/VirtualizationServerProxy2012.cs index d9f917c9..dfe2ea37 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/VirtualizationServerProxy2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/VirtualizationServerProxy2012.cs @@ -2749,45 +2749,40 @@ namespace WebsitePanel.Providers.Virtualization2012 { /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DisableVmReplication", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool DisableVmReplication(string vmId, string replicaServer) { - object[] results = this.Invoke("DisableVmReplication", new object[] { - vmId, - replicaServer}); - return ((bool)(results[0])); + public void DisableVmReplication(string vmId) { + this.Invoke("DisableVmReplication", new object[] { + vmId}); } /// - public System.IAsyncResult BeginDisableVmReplication(string vmId, string replicaServer, System.AsyncCallback callback, object asyncState) { + public System.IAsyncResult BeginDisableVmReplication(string vmId, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("DisableVmReplication", new object[] { - vmId, - replicaServer}, callback, asyncState); + vmId}, callback, asyncState); } /// - public bool EndDisableVmReplication(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((bool)(results[0])); + public void EndDisableVmReplication(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); } /// - public void DisableVmReplicationAsync(string vmId, string replicaServer) { - this.DisableVmReplicationAsync(vmId, replicaServer, null); + public void DisableVmReplicationAsync(string vmId) { + this.DisableVmReplicationAsync(vmId, null); } /// - public void DisableVmReplicationAsync(string vmId, string replicaServer, object userState) { + public void DisableVmReplicationAsync(string vmId, object userState) { if ((this.DisableVmReplicationOperationCompleted == null)) { this.DisableVmReplicationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDisableVmReplicationOperationCompleted); } this.InvokeAsync("DisableVmReplication", new object[] { - vmId, - replicaServer}, this.DisableVmReplicationOperationCompleted, userState); + vmId}, 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)); + this.DisableVmReplicationCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } @@ -4179,29 +4174,7 @@ namespace WebsitePanel.Providers.Virtualization2012 { /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void DisableVmReplicationCompletedEventHandler(object sender, DisableVmReplicationCompletedEventArgs e); - - /// - [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; - } - - /// - public bool Result { - get { - this.RaiseExceptionIfNecessary(); - return ((bool)(this.results[0])); - } - } - } + public delegate void DisableVmReplicationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] diff --git a/WebsitePanel/Sources/WebsitePanel.Server/VirtualizationServer2012.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/VirtualizationServer2012.asmx.cs index c2276774..fcc0f0f6 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/VirtualizationServer2012.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/VirtualizationServer2012.asmx.cs @@ -1023,14 +1023,13 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public bool DisableVmReplication(string vmId, string replicaServer) + public void DisableVmReplication(string vmId) { try { Log.WriteStart("'{0}' DisableVmReplication", ProviderSettings.ProviderName); - var result = VirtualizationProvider.DisableVmReplication(vmId, replicaServer); + VirtualizationProvider.DisableVmReplication(vmId); Log.WriteEnd("'{0}' DisableVmReplication", ProviderSettings.ProviderName); - return result; } catch (Exception ex) {