/// <summary> /// Converts the <see cref="sourceValue" /> parameter to the <see cref="destinationType" /> parameter using <see cref="formatProvider" /// /> and <see cref="ignoreCase" /> /// </summary> /// <param name="sourceValue">the value to convert into an instance of <see cref="PlacementSpec" />.</param> /// <returns> /// an instance of <see cref="PlacementSpec" />, or <c>null</c> if there is no suitable conversion. /// </returns> public static object ConvertFrom(dynamic sourceValue) { if (null == sourceValue) { return(null); } try { PlacementSpec.FromJsonString(typeof(string) == sourceValue.GetType() ? sourceValue : sourceValue.ToJsonString()); } catch { // Unable to use JSON pattern } try { return(new PlacementSpec { EntitySpecList = sourceValue.EntitySpecList, ProbableClusterReference = ClusterReferenceTypeConverter.ConvertFrom(sourceValue.ProbableClusterReference), TenantUuid = sourceValue.TenantUuid, }); } catch { } return(null); }
private VirtualMachineRelocateSpec GetRelocationSpec(MigrationVMDetail vmDetail) { Logger.Info("{0}: Setting up RelocationSpec", vmDetail.SourceVirtualMachine.Name); try { PlacementSpec placementSpec = new PlacementSpec(); placementSpec.Vm = vmDetail.SourceVirtualMachine.MoRef; placementSpec.Priority = VirtualMachineMovePriority.highPriority; placementSpec.PlacementType = "relocate"; placementSpec.RelocateSpec = new VirtualMachineRelocateSpec(); if (vmDetail.MigrateCompute) { if (vmDetail.DestinationIsComputeCluster) { //placementSpec.Hosts = vmDetail.DestinationClusterComputeResource.Host; vmDetail.DestinationHostSystem = (HostSystem)GetViewByRef <HostSystem>(vmDetail.DestinationClusterComputeResource.RecommendHostsForVm(vmDetail.SourceVirtualMachine.MoRef, vmDetail.DestinationClusterComputeResource.ResourcePool).FirstOrDefault().Host); placementSpec.RelocateSpec.Host = vmDetail.DestinationHostSystem.MoRef; placementSpec.RelocateSpec.Pool = vmDetail.DestinationClusterComputeResource.ResourcePool; Logger.Trace("{0}: Recomended Host {1}", vmDetail.SourceVirtualMachine.Name, placementSpec.RelocateSpec.Host.ToString()); } else { placementSpec.RelocateSpec.Host = vmDetail.DestinationHostSystem.MoRef; placementSpec.RelocateSpec.Pool = vmDetail.DestinationClusterComputeResource.ResourcePool; } var networkDeviceConfigSpecs = UpdateVMNetworkDevices(vmDetail.SourceVirtualMachine, placementSpec.RelocateSpec.Host); foreach (var ndc in networkDeviceConfigSpecs) { Logger.Info("{0}: Network Device Config: {1}", vmDetail.SourceVirtualMachine.Name, ndc.Device.Backing); } placementSpec.RelocateSpec.DeviceChange = networkDeviceConfigSpecs.ToArray(); Logger.Trace("{value0}: placmentSpec: {@value1}", vmDetail.SourceVirtualMachine.Name, placementSpec); } if (vmDetail.MigrateStorage) { if (vmDetail.DestinationStoragePod != null) { StoragePlacementSpec storagePlacementSpec = new StoragePlacementSpec { Vm = vmDetail.SourceVirtualMachine.MoRef, Type = "relocate", Priority = VirtualMachineMovePriority.highPriority, PodSelectionSpec = new StorageDrsPodSelectionSpec { StoragePod = vmDetail.DestinationStoragePod.MoRef } }; var storageRM = new StorageResourceManager(vClient, vClient.ServiceContent.StorageResourceManager); var storageResult = storageRM.RecommendDatastores(storagePlacementSpec); Logger.Trace("{value0}: storageResult: {@value1}", vmDetail.SourceVirtualMachine.Name, storageResult); Logger.Trace("{0}: StoragePlacementResult: Setting placementSpec.RelocateSpec.Datastore to {@value1}", vmDetail.SourceVirtualMachine.Name, ((StoragePlacementAction)storageResult.Recommendations.FirstOrDefault().Action.FirstOrDefault()).Destination); placementSpec.RelocateSpec.Datastore = ((StoragePlacementAction)storageResult.Recommendations.FirstOrDefault().Action.FirstOrDefault()).Destination; //Logger.Trace("{0}: Setting placementSpec.StoragePods to {1}", vmDetail.SourceVirtualMachine.Name, vmDetail.DestinationStoragePod.MoRef); //placementSpec.StoragePods = new[] { vmDetail.DestinationStoragePod.MoRef }; } else { Logger.Trace("{0}: Setting placementSpec.RelocateSpec.Datastore to {1}", vmDetail.SourceVirtualMachine.Name, vmDetail.DestinationDatastore.MoRef); placementSpec.RelocateSpec.Datastore = vmDetail.DestinationDatastore.MoRef; } } //PlacementResult placementResult = vmDetail.DestinationClusterComputeResource.PlaceVm(placementSpec); //if (placementResult.DrsFault == null) //{ // var recommendedRelocSpec = (VirtualMachineRelocateSpec)((PlacementAction)placementResult.Recommendations[0].Action[0]).RelocateSpec; // Logger.Info("{value0}: recommendedRelocSpec: {@value1}", vmDetail.SourceVirtualMachine.Name, recommendedRelocSpec); // placementSpec.RelocateSpec.Host = recommendedRelocSpec.Host; // Logger.Info("{0}: Recomended Host {1}", vmDetail.SourceVirtualMachine.Name, recommendedRelocSpec.Host.ToString()); // placementSpec.RelocateSpec.Datastore = recommendedRelocSpec.Datastore; // Logger.Info("{0}: Recomended Datastore {1}", vmDetail.SourceVirtualMachine.Name, recommendedRelocSpec.Datastore.ToString()); // Logger.Trace("{value0}: Final RelocationSpec: {@value1}", vmDetail.SourceVirtualMachine.Name, placementSpec.RelocateSpec); // return placementSpec.RelocateSpec; //} //else //{ // Logger.Error("{0}: DRS FAULT: {1}", vmDetail.SourceVirtualMachine.Name, placementResult.DrsFault.Reason); // foreach (var faultsByVm in placementResult.DrsFault.FaultsByVm) // foreach (var fault in faultsByVm.Fault) // Logger.Error("{0}: FaultsByVm: {1}", vmDetail.SourceVirtualMachine.Name, fault.LocalizedMessage); return(placementSpec.RelocateSpec); //} } catch (Exception e) { Logger.Error("EXCEPTION: {0}", vmDetail.SourceVirtualMachine.Name); Logger.Error("EXCEPTION: {0}", e.Message); Logger.Error("EXCEPTION: {0}", e.StackTrace); throw; } }