private void VerifyDataDiskConfiguration(DataDiskConfigurationList dataDiskConfigs, VMImageContext vmImageInfo)
 {
     try
     {
         for (int i = 0; i < dataDiskConfigs.Count; i++)
         {
             Assert.AreEqual(dataDiskConfigs[i].HostCaching.ToString(), vmImageInfo.DataDiskConfigurations[i].HostCaching, "Data disk HostCaching iproperty is not matching.");
             //Verify LogicalDiskSizeInGB,
             Assert.AreEqual(dataDiskConfigs[i].LogicalDiskSizeInGB, vmImageInfo.DataDiskConfigurations[i].LogicalDiskSizeInGB);
             //Verify  LUN
             Assert.AreEqual(dataDiskConfigs[i].Lun, vmImageInfo.DataDiskConfigurations[i].Lun);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
         throw ex;
     }
 }
 public void VerifyVMImage(string vmImageName, OS ImageFamily, string imageLabel, string osState, HostCaching hostCaching, DataDiskConfigurationList diskConfigs)
 {
     var vmImages = vmPowershellCmdlets.GetAzureVMImageReturningVMImages(vmImageName);
     Assert.IsTrue(vmImages.Count >= 1);
     var vmImageInfo = vmImages[0];
     Utilities.PrintContext(vmImageInfo);
     Utilities.PrintContext(vmImageInfo.OSDiskConfiguration);
     foreach (var disk in vmImageInfo.DataDiskConfigurations)
     {
         Utilities.PrintContext(disk);
     }
     //Verify ImageName
     Assert.IsTrue(vmImageName.Equals(vmImageInfo.ImageName));
     Assert.IsTrue(vmImageInfo.Label.Equals(imageLabel));
     //Verify Category
     Assert.IsTrue("User".Equals(vmImageInfo.Category, StringComparison.CurrentCultureIgnoreCase));
     //Verify LogicalDiskSizeInGB, HostCaching
     Assert.AreEqual(hostCaching.ToString(), vmImageInfo.OSDiskConfiguration.HostCaching, "Property HostCaching is not matching.");
     //Verify the no of the data disks 
     Assert.AreEqual(diskConfigs.Count, vmImageInfo.DataDiskConfigurations.Count);
     //Verify Data disks.
     VerifyDataDiskConfiguration(diskConfigs, vmImageInfo);
     //Verify OSstate
     Assert.AreEqual(osState, vmImageInfo.OSDiskConfiguration.OSState, "OsState is not matching.");
     //Verify OS
     Assert.AreEqual(ImageFamily.ToString(), vmImageInfo.OSDiskConfiguration.OS, "Os Family is not matching.");
 }
        private void UpdateVMImageOsAndDataDiskAnderifyChanges( DataDiskConfigurationList diskConfig, out string disk1Name,out string disk2Name)
        {
            //Update Azure VM image disk 1 hostcaching to read write
            cahcing = GetAlternateHostCachingForOsDisk(cahcing.ToString());
            Utilities.PrintHeader(string.Format("Update Azure VM image data disk 1 hostcaching to ReadWrite, data disk 2 hostcaching to ReadOnly and OS disk host cahching to {0}. ", cahcing.ToString()));
            var vmImageContext = vmPowershellCmdlets.GetAzureVMImageReturningVMImages(vmImageName);
            Utilities.PrintCompleteContext(vmImageContext);
            var vmImageInfo = vmImageContext[0];
            disk1Name = vmImageInfo.DataDiskConfigurations[0].Name;
            disk2Name = vmImageInfo.DataDiskConfigurations[1].Name;
            var disk1HostCaching = HostCaching.ReadWrite;
            var disk2HostCaching = HostCaching.ReadOnly;
            // get disk 1 configuration from vm image 
            var diskConfigSet = vmPowershellCmdlets.GetAzureVMImageDiskConfigSet(vmImageInfo);
            // set disk1 host caching to read write 
            diskConfigSet = vmPowershellCmdlets.SetAzureVMImageDataDiskConfig(diskConfigSet, disk1Name, 0, disk1HostCaching.ToString());
            //set disk 2 host caching to None
            diskConfigSet = vmPowershellCmdlets.SetAzureVMImageDataDiskConfig(diskConfigSet, disk2Name, 1, disk2HostCaching.ToString());
            // set os disk host caching to a differnt value.
            diskConfigSet = vmPowershellCmdlets.SetAzureVMImageOSDiskConfig(diskConfigSet, cahcing.ToString());
            //update Azure VM image.
            vmPowershellCmdlets.UpdateAzureVMImage(vmImageName, vmImageName, diskConfigSet);
            Utilities.PrintFooter(string.Format("Update Azure VM image data disk 1 hostcaching to ReadWrite, data disk 2 hostcaching to ReadOnly and OS disk host cahching to {0}. ", cahcing.ToString()));

            // Verify that the vm image disk 1 host caching is "ReadWrite".
            Utilities.PrintHeader("Verify the vm image.");
            diskConfig[0].HostCaching = disk1HostCaching.ToString();
            diskConfig[1].HostCaching = disk2HostCaching.ToString();
            VerifyVMImage(vmImageName, OS.Windows, vmImageName, "Specialized", cahcing, diskConfig);
            Utilities.PrintFooter("Verify the vm image.");
        }
        private void UpdateVmImageUsingDiskConfigSetAndVerifyChanges(DataDiskConfigurationList diskConfig, string disk1Name, string disk2Name)
        {
            cahcing = GetAlternateHostCachingForOsDisk(cahcing.ToString());
            Utilities.PrintHeader("Update Azure VM image data disk 1 hostcaching to ReadOnly, data disk 2 hostcaching to None and OS disk host cahching to" + cahcing.ToString());
            var diskConfigSet = vmPowershellCmdlets.NewAzureVMImageDiskConfigSet();
            diskConfigSet.OSDiskConfiguration = new OSDiskConfiguration() { HostCaching = cahcing.ToString() };
            diskConfigSet.DataDiskConfigurations = new DataDiskConfigurationList();
            diskConfigSet.DataDiskConfigurations.Add(new DataDiskConfiguration()
            {
                Name = disk1Name,
                HostCaching = HostCaching.ReadOnly.ToString(),
                Lun = 0
            });
            diskConfigSet.DataDiskConfigurations.Add(new DataDiskConfiguration()
            {
                Name = disk2Name,
                HostCaching = HostCaching.None.ToString(),
                Lun = 1
            });
            //update Azure VM image.
            vmPowershellCmdlets.UpdateAzureVMImage(vmImageName, vmImageName, diskConfigSet);
            Utilities.PrintFooter(string.Format("Update Azure VM image data disk 1 hostcaching to ReadWrite, data disk 2 hostcaching to ReadOnly and OS disk host cahching to {0}. ", cahcing.ToString()));

            // Verify that the vm image disk 1 host caching is "ReadWrite".
            Utilities.PrintHeader("Verify that the vm image.");
            diskConfig[0].HostCaching = diskConfigSet.DataDiskConfigurations[0].HostCaching.ToString();
            diskConfig[1].HostCaching = diskConfigSet.DataDiskConfigurations[1].HostCaching.ToString();
            VerifyVMImage(vmImageName, OS.Windows, vmImageName, "Specialized", cahcing, diskConfig);
            Utilities.PrintFooter("Verify that the vm image.");
        }
        public void UpdateVMImageDataDiskAndOsDiskTest()
        {
            StartTest(MethodBase.GetCurrentMethod().Name, DateTime.Now);
            try
            {
                //Create a new vmImage with 2 data disks
                string vmName = Utilities.GetUniqueShortName(vmNamePrefix);
                string disk1 = "Disk1";
                string disk2 = "Disk2";
                HostCaching disk1HostCaching = HostCaching.ReadOnly;
                HostCaching disk2HostCaching = HostCaching.None;

                //Creating VM with 2 data disks.;
                Utilities.ExecuteAndLog(() =>
                    {
                        PersistentVM vm = Utilities.CreateIaaSVMObject(vmName, InstanceSize.Small, imageName, true, username, password);
                        //Attach disk 1 with hostcaching 'Readonly'
                        AddAzureDataDiskConfig azureDataDiskConfigInfo1 = new AddAzureDataDiskConfig(DiskCreateOption.CreateNew, diskSize1, disk1, 0, disk1HostCaching.ToString());
                        azureDataDiskConfigInfo1.Vm = vm;
                        vm = vmPowershellCmdlets.AddAzureDataDisk(azureDataDiskConfigInfo1);
                        //Attach disk 2 with hostcaching 'None'
                        AddAzureDataDiskConfig azureDataDiskConfigInfo2 = new AddAzureDataDiskConfig(DiskCreateOption.CreateNew, diskSize1, disk2, 1, disk2HostCaching.ToString());
                        azureDataDiskConfigInfo2.Vm = vm;
                        vm = vmPowershellCmdlets.AddAzureDataDisk(azureDataDiskConfigInfo2);
                        //deploy the VM
                        vmPowershellCmdlets.NewAzureVM(serviceName, new[] { vm }, locationName);
                    },"Creating VM with 2 data disks.");

                //Save image of the VM as a Specialized vm image.
                vmImageName = vmName + "Image";
                Utilities.ExecuteAndLog(() => 
                {
                    Utilities.PrintHeader("Save specialized vm image of the deployed vm.");
                    vmPowershellCmdlets.StopAzureVM(vmPowershellCmdlets.GetAzureVM(vmName, serviceName).VM, serviceName,force:true);
                    vmPowershellCmdlets.SaveAzureVMImage(serviceName, vmName, vmImageName, "Specialized", vmImageName);
                },"Save specialized vm image of the deployed vm.");

                //Verify the saved vm Image
                DataDiskConfigurationList diskConfig = new DataDiskConfigurationList();
                Utilities.ExecuteAndLog(() => 
                {
                    diskConfig.Add(new DataDiskConfiguration() { Lun = 0, LogicalDiskSizeInGB = diskSize1, HostCaching = disk1HostCaching.ToString() });
                    diskConfig.Add(new DataDiskConfiguration() { Lun = 1, LogicalDiskSizeInGB = diskSize1, HostCaching = disk2HostCaching.ToString() });
                    VerifyVMImage(vmImageName, OS.Windows, vmImageName, "Specialized", cahcing, diskConfig);
                },"Fetch the saved vm image info and verify the vm image info.");


                UpdateAzureVMImageDetails(vmImageName);

                string disk1Name,disk2Name;
                UpdateVMImageOsAndDataDiskAnderifyChanges(diskConfig, out disk1Name, out disk2Name);

                //Update VMImage using DiskConfig set prepared manually.
                UpdateVmImageUsingDiskConfigSetAndVerifyChanges(diskConfig, disk1Name, disk2Name);
                pass = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw ex;
            }

        }
        public void CaptureSpecializedVMAndDeploy()
        {
            StartTest(MethodBase.GetCurrentMethod().Name, testStartTime);
            string serviceName1 = Utilities.GetUniqueShortName(serviceNamePrefix);
            try
            {
                //      a.	Deploy a new IaaS VM
                string vmName = Utilities.GetUniqueShortName(vmNamePrefix);
                Console.WriteLine("--------------------------------Deploying a new IaaS VM :{0}--------------------------------", vmName);
                var vm = CreateIaaSVMObjectWithDisk(vmName, InstanceSize.Small, imageName, true, username, password);
                vmPowershellCmdlets.NewAzureVM(serviceName, new[] { vm }, locationName);
                Console.WriteLine("--------------------------------Deploying a new IaaS VM :{0} completed.---------------------", vmName);
                //b.	Stop the VM
                Console.WriteLine("--------------------------------Stopping vm :{0}--------------------------------", vmName);
                vmPowershellCmdlets.StopAzureVM(vmName, serviceName, force: true);
                Console.WriteLine("--------------------------------Stopped vm :{0}--------------------------------", vmName);
                //c.	Save the VM image
                Console.WriteLine("--------------------------------Save the VM image--------------------------------");
                vmImageName = vmName + "Image";
                vmPowershellCmdlets.SaveAzureVMImage(serviceName, vmName, vmImageName, CONSTANT_SPECIALIZED, vmImageName);
                Console.WriteLine("--------------------------------Saved VM image with name {0}----------------------");
                //d.	Verify the VM image by Get-AzureVMImage
                Console.WriteLine("--------------------------------Verify the VM image--------------------------------");
                DataDiskConfigurationList diskConfig = new DataDiskConfigurationList();
                diskConfig.Add(new DataDiskConfiguration() { Lun = lunSlot1, LogicalDiskSizeInGB = diskSize1, HostCaching = cahcing.ToString() });
                VerifyVMImage(vmImageName, OS.Windows, vmImageName, CONSTANT_SPECIALIZED, cahcing, diskConfig);
                Console.WriteLine("--------------------------------Verified that the VM image is saved successfully--------------------------------");
                //e.	Deploy a new IaaS VM with the save VM image
                Console.WriteLine("--------------------------------Deploy a new IaaS VM with the saved VM image {0}--------------------------------", vmImageName);
                string vmName1 = Utilities.GetUniqueShortName(vmNamePrefix);
                vm = Utilities.CreateIaaSVMObject(vmName1, InstanceSize.Small, vmImageName);
                vmPowershellCmdlets.NewAzureVM(serviceName1, new[] { vm }, locationName);
                Console.WriteLine("--------------------------------Deployed a IaaS VM {0} with the saved VM image {1}--------------------------------", vmName1, vmImageName);
                //f.	Verify the VM by Get-AzureVM
                Console.WriteLine("--------------------------------Verify the VM by Get-AzureVM--------------------------------", vmName1, vmImageName);
                var vmRoleContext = vmPowershellCmdlets.GetAzureVM(vmName1, serviceName1);
                Utilities.PrintContext(vmRoleContext);
                VerifyVM(vmRoleContext.VM, OS.Windows, HostCaching.ReadWrite, diskSize1, 1);
                Console.WriteLine("--------------------------------Verified the VM {0} successfully--------------------------------", vmName1);
                //g.	Add another IaaS VM with the save VM image to the existing service
                string vmName2 = Utilities.GetUniqueShortName(vmNamePrefix);
                Console.WriteLine("--------------------------------Deploy a new IaaS VM with the saved VM image {0}--------------------------------", vmImageName);
                vmPowershellCmdlets.NewAzureQuickVM(OS.Windows, vmName2, serviceName1, vmImageName);
                Console.WriteLine("--------------------------------Deployed a IaaS VM {0} with the saved VM image {1}--------------------------------", vmName2, vmImageName);
                //h.	Verify the VM by Get-AzureVM
                Console.WriteLine("--------------------------------Verify the VM by Get-AzureVM--------------------------------", vmName2, vmImageName);
                vmRoleContext = vmPowershellCmdlets.GetAzureVM(vmName2, serviceName1);
                VerifyVM(vmRoleContext.VM, OS.Windows, HostCaching.ReadWrite, diskSize1, 1);
                Utilities.PrintContext(vmRoleContext);
                Console.WriteLine("--------------------------------Verified the VM {0} successfully--------------------------------", vmName2);

                pass = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw;
            }
            finally
            {
                CleanupService(serviceName1);
                //	Delete the VM image
                Console.WriteLine("------------------------------Delete the VM image---------------------------------");
                DeleteVMImageIfExists(vmImageName);
                Console.WriteLine("------------------------------Deleted the VM image---------------------------------");
            }
        }