示例#1
0
        public static VirtualHardDiskInfo[] Get(PowerShellManager powerShell, string vmname)
        {
            List<VirtualHardDiskInfo> disks = new List<VirtualHardDiskInfo>();

            Collection<PSObject> result = GetPS(powerShell, vmname);

            if (result != null && result.Count > 0)
            {
                foreach (PSObject d in result)
                {
                    VirtualHardDiskInfo disk = new VirtualHardDiskInfo();

                    disk.SupportPersistentReservations = Convert.ToBoolean(d.GetProperty("SupportPersistentReservations"));
                    disk.MaximumIOPS = Convert.ToUInt64(d.GetProperty("MaximumIOPS"));
                    disk.MinimumIOPS = Convert.ToUInt64(d.GetProperty("MinimumIOPS"));
                    disk.VHDControllerType = d.GetEnum<ControllerType>("ControllerType");
                    disk.ControllerNumber = Convert.ToInt32(d.GetProperty("ControllerNumber"));
                    disk.ControllerLocation = Convert.ToInt32(d.GetProperty("ControllerLocation"));
                    disk.Path = d.GetProperty("Path").ToString();
                    disk.Name = d.GetProperty("Name").ToString();

                    GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);

                    disks.Add(disk);
                }
            }
            return disks.ToArray();
        }
 public static void Delete(PowerShellManager powerShell, VirtualHardDiskInfo[] disks, string serverNameSettings)
 {
     if (disks != null && disks.GetLength(0) > 0)
     {
         foreach (VirtualHardDiskInfo diskItem in disks)
         {
             VirtualHardDiskInfo disk = diskItem;
             do
             {
                 if (!string.IsNullOrEmpty(serverNameSettings))
                 {
                     string cmd = "Invoke-Command -ComputerName " + serverNameSettings + " -ScriptBlock { Remove-item -path " + disk.Path + " }";
                     powerShell.Execute(new Command(cmd, true), false);
                 }
                 else
                 {
                     Command cmd = new Command("Remove-item");
                     cmd.Parameters.Add("path", disk.Path);
                     powerShell.Execute(cmd, false);
                 }
                 // remove all parent disks
                 disk.Path = disk.ParentPath;
                 if (!String.IsNullOrEmpty(disk.Path))
                 {
                     GetVirtualHardDiskDetail(powerShell, disk.Path, ref disk);
                 }
             } while (!String.IsNullOrEmpty(disk.Path));
         }
     }
 }
        private static VirtualHardDiskInfo GetParentVHD(VirtualHardDiskInfo disk, PowerShellManager powerShell)
        {
            VirtualHardDiskInfo resDisk = disk.Clone();

            while (!String.IsNullOrEmpty(resDisk.ParentPath))
            {
                resDisk.Path = resDisk.ParentPath;
                GetVirtualHardDiskDetail(powerShell, resDisk.Path, ref resDisk);
            }
            return(resDisk);
        }
示例#4
0
 public static void GetVirtualHardDiskDetail(PowerShellManager powerShell, string path, ref VirtualHardDiskInfo disk)
 {
     if (!string.IsNullOrEmpty(path))
     {
         Command cmd = new Command("Get-VHD");
         cmd.Parameters.Add("Path", path);
         Collection<PSObject> result = powerShell.Execute(cmd, true);
         if (result != null && result.Count > 0)
         {
             disk.DiskFormat = result[0].GetEnum<VirtualHardDiskFormat>("VhdFormat");
             disk.DiskType = result[0].GetEnum<VirtualHardDiskType>("VhdType");
             disk.ParentPath = result[0].GetProperty<string>("ParentPath");
             disk.MaxInternalSize = Convert.ToInt64(result[0].GetProperty("Size"));
             disk.FileSize = Convert.ToInt64(result[0].GetProperty("FileSize"));
             disk.Attached = disk.InUse = Convert.ToBoolean(result[0].GetProperty("Attached"));
         }
     }
 }
        public static void Update(PowerShellManager powerShell, PowerShellManager powerShellwithJobs, VirtualMachine realVm, VirtualMachine vmSettings, string serverNameSettings)
        {
            if (realVm.Disks == null) //At this moment it isn't possible, but if somebody send vm data without vm.disks, we try to get it.
            {
                realVm.Disks = Get(powerShell, realVm.Name);
            }

            bool vhdChanged = false;

            // remove VHD check
            if (realVm.Disks.Length > 1)
            {
                for (int i = 1; i < realVm.Disks.Length; i++)
                {
                    VirtualHardDiskInfo disk = GetParentVHD(realVm.Disks[i], powerShell);
                    bool remove = true;
                    foreach (string path in vmSettings.VirtualHardDrivePath)
                    {
                        if (path != null && disk.Path != null && Path.GetFileName(path).ToLower().Equals(Path.GetFileName(disk.Path).ToLower()))
                        {
                            remove = false;
                            break;
                        }
                    }
                    if (remove)
                    {
                        Command cmd = new Command("Remove-VMHardDiskDrive");
                        cmd.Parameters.Add("VMName", realVm.Name);
                        cmd.Parameters.Add("ControllerType", realVm.Disks[i].VHDControllerType.ToString());
                        cmd.Parameters.Add("ControllerNumber", realVm.Disks[i].ControllerNumber);
                        cmd.Parameters.Add("ControllerLocation", realVm.Disks[i].ControllerLocation);
                        powerShell.Execute(cmd, true, true);
                        vhdChanged = true;
                        Delete(powerShell, realVm.Disks[i], serverNameSettings);
                    }
                }
            }

            // add VHD check
            if (vmSettings.VirtualHardDrivePath.Length > 1)
            {
                for (int i = 1; i < vmSettings.VirtualHardDrivePath.Length; i++)
                {
                    bool add = true;
                    if (String.IsNullOrEmpty(vmSettings.VirtualHardDrivePath[i]))
                    {
                        int    index = 1;
                        string msHddHyperVFolderName = "Virtual Hard Disks\\" + vmSettings.Name;
                        while (String.IsNullOrEmpty(vmSettings.VirtualHardDrivePath[i]))
                        {
                            bool addPath = true;
                            foreach (string path in vmSettings.VirtualHardDrivePath)
                            {
                                if (path != null && path.ToLower().Contains((msHddHyperVFolderName + index.ToString() + Path.GetExtension(vmSettings.OperatingSystemTemplatePath)).ToLower()))
                                {
                                    addPath = false;
                                    index++;
                                    break;
                                }
                            }
                            if (addPath)
                            {
                                vmSettings.VirtualHardDrivePath[i] = Path.Combine(vmSettings.RootFolderPath, msHddHyperVFolderName + index.ToString() + Path.GetExtension(vmSettings.OperatingSystemTemplatePath));
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int t = 0; t < realVm.Disks.Length; t++)
                        {
                            VirtualHardDiskInfo disk = GetParentVHD(realVm.Disks[t], powerShell);
                            if (disk.Path != null && Path.GetFileName(vmSettings.VirtualHardDrivePath[i]).ToLower().Equals(Path.GetFileName(disk.Path).ToLower()))
                            {
                                add = false;
                                break;
                            }
                        }
                    }
                    if (add)
                    {
                        VirtualHardDiskInfo disk = GetParentVHD(realVm.Disks[0], powerShell);
                        CreateVirtualHardDisk(powerShellwithJobs, vmSettings.VirtualHardDrivePath[i], disk.DiskType, disk.BlockSizeBytes, (ulong)vmSettings.HddSize[i], serverNameSettings);
                        Command cmd = new Command("Add-VMHardDiskDrive");
                        cmd.Parameters.Add("VMName", realVm.Name);
                        cmd.Parameters.Add("Path", vmSettings.VirtualHardDrivePath[i]);
                        cmd.Parameters.Add("ControllerType", realVm.Disks[0].VHDControllerType.ToString());
                        powerShell.Execute(cmd, true, true);
                        vhdChanged = true;
                    }
                }
            }

            // resize VHD check
            if (vhdChanged)
            {
                realVm.Disks = Get(powerShell, realVm.Name);
            }
            if (realVm.Disks != null)
            {
                for (int i = 0; i < realVm.Disks.Length; i++)
                {
                    int oldHddSize           = Convert.ToInt32(realVm.Disks[i].FileSize / Constants.Size1G);
                    int newhddSize           = 0;
                    VirtualHardDiskInfo disk = GetParentVHD(realVm.Disks[i], powerShell);
                    if (i == 0)
                    {
                        newhddSize = vmSettings.HddSize[0];
                    }
                    else
                    {
                        if (disk.Path != null)
                        {
                            for (int t = 0; t < vmSettings.VirtualHardDrivePath.Length; t++)
                            {
                                if (vmSettings.VirtualHardDrivePath[t] != null && Path.GetFileName(disk.Path).ToLower().Equals(Path.GetFileName(vmSettings.VirtualHardDrivePath[t]).ToLower()))
                                {
                                    newhddSize = vmSettings.HddSize[t];
                                }
                            }
                        }
                    }
                    if (newhddSize <= oldHddSize) //we can't reduce hdd size, so we just exit.
                    {
                        continue;
                    }

                    Command cmd = new Command("Resize-VHD");
                    cmd.Parameters.Add("SizeBytes", newhddSize * Constants.Size1G);
                    cmd.Parameters.Add("Path", realVm.Disks[i].Path);
                    powerShell.Execute(cmd, true);
                }
            }
        }