/// <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);
 }
Esempio n. 2
0
        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;
            }
        }