예제 #1
0
        public async Task Flash(IDisk disk, string imagePath, IOperationProgress progressObserver = null)
        {
            Log.Information("Flashing GPT image...");

            ISubject <string> outputSubject         = new Subject <string>();
            IDisposable       stdOutputSubscription = null;
            bool isValidating = false;

            if (progressObserver != null)
            {
                stdOutputSubscription = outputSubject
                                        .Do(s =>
                {
                    if (!isValidating && CultureInfo.CurrentCulture.CompareInfo.IndexOf(s, "validating", 0, CompareOptions.IgnoreCase) != -1)
                    {
                        progressObserver?.Percentage.OnNext(double.NaN);
                        Log.Information("Validating flashed image...");
                        isValidating = true;
                    }
                })
                                        .Select(GetPercentage)
                                        .Where(d => !double.IsNaN(d))
                                        .Subscribe(progressObserver.Percentage);
            }

            var args = $@"-d \\.\PHYSICALDRIVE{disk.Number} ""{imagePath}"" --yes --no-unmount";

            Log.Verbose("We are about to run Etcher: {ExecName} {Parameters}", EtcherPath, args);
            var processResults = await ProcessMixin.RunProcess(EtcherPath, args, outputObserver : outputSubject);

            if (processResults.ExitCode != 0)
            {
                Log.Error("Cannot flash the image with Etcher. Execution results: {Results}", processResults);
                throw new FlashException($"Cannot flash the image: {imagePath} to {disk}");
            }

            progressObserver?.Percentage.OnNext(double.NaN);

            stdOutputSubscription?.Dispose();

            await disk.Refresh();

            await EnsureDiskHasNewGuid(disk);

            Log.Information("GPT image flashed");
        }
        public async Task Clean(IPhone toClean)
        {
            Log.Information("Performing cleanup of possible existing deployments");

            disk = await toClean.GetDeviceDisk();

            using (var context = await GptContextFactory.Create(disk.Number, FileAccess.ReadWrite))
            {
                RemoveWellKnownPartitions(context);

                // This code is not there because it's considered unsafe. It's here just in case it's useful for a rare case.
                // RemovePartitionsAfterData(context);
            }

            Log.Information("Cleanup done");

            await disk.Refresh();
        }
        private async Task CreatePartitions()
        {
            Log.Verbose("Creating partitions");

            using (var t = await GptContextFactory.Create(disk.Number, FileAccess.ReadWrite))
            {
                t.Add(new EntryBuilder(PartitionName.System, systemSize, PartitionType.Esp)
                      .NoAutoMount()
                      .Build());

                t.Add(new EntryBuilder(PartitionName.Reserved, reservedSize, PartitionType.Reserved)
                      .NoAutoMount()
                      .Build());

                var windowsSize = t.AvailableSize;
                t.Add(new EntryBuilder(PartitionName.Windows, windowsSize, PartitionType.Basic)
                      .NoAutoMount()
                      .Build());
            }

            await disk.Refresh();
        }
예제 #4
0
        public void CanCreateUpdateFromPIRWithManagedDisk()
        {
            using (var context = FluentMockContext.Start(GetType().FullName))
            {
                var vmssName        = SdkContext.RandomResourceName("vmss", 10);
                var resourceManager = TestHelper.CreateRollupClient();
                var computeManager  = TestHelper.CreateComputeManager();
                var networkManager  = TestHelper.CreateNetworkManager();
                var rgName          = TestUtilities.GenerateName("rgfluentchash-");
                try
                {
                    var resourceGroup = resourceManager.ResourceGroups
                                        .Define(rgName)
                                        .WithRegion(Location)
                                        .Create();

                    var network = networkManager
                                  .Networks
                                  .Define(SdkContext.RandomResourceName("vmssvnet", 15))
                                  .WithRegion(Location)
                                  .WithExistingResourceGroup(resourceGroup)
                                  .WithAddressSpace("10.0.0.0/28")
                                  .WithSubnet("subnet1", "10.0.0.0/28")
                                  .Create();

                    var publicLoadBalancer = ScaleSet.CreateHttpLoadBalancers(resourceManager, resourceGroup, "1", Location);
                    var vmScaleSet         = computeManager.VirtualMachineScaleSets
                                             .Define(vmssName)
                                             .WithRegion(Location)
                                             .WithExistingResourceGroup(resourceGroup)
                                             .WithSku(VirtualMachineScaleSetSkuTypes.StandardD5v2)
                                             .WithExistingPrimaryNetworkSubnet(network, "subnet1")
                                             .WithExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer)
                                             .WithoutPrimaryInternalLoadBalancer()
                                             .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
                                             .WithRootUsername("jvuser")
                                             .WithRootPassword(TestUtilities.GenerateName("Pa5$"))
                                             .WithNewDataDisk(100)
                                             .WithNewDataDisk(100, 1, CachingTypes.ReadWrite)
                                             .WithNewDataDisk(100, 2, CachingTypes.ReadOnly)
                                             .Create();

                    var virtualMachineScaleSetVMs = vmScaleSet.VirtualMachines;
                    var virtualMachines           = virtualMachineScaleSetVMs.List();
                    Assert.Equal(virtualMachines.Count(), vmScaleSet.Capacity);
                    foreach (var vm in virtualMachines)
                    {
                        Assert.True(vm.IsOSBasedOnPlatformImage);
                        Assert.False(vm.IsOSBasedOnCustomImage);
                        Assert.False(vm.IsOSBasedOnStoredImage);
                        Assert.True(vm.IsManagedDiskEnabled);
                        Assert.NotNull(vm.UnmanagedDataDisks);
                        Assert.Empty(vm.UnmanagedDataDisks);
                        Assert.NotNull(vm.DataDisks);
                        Assert.Equal(3, vm.DataDisks.Count);
                    }
                    vmScaleSet.Update()
                    .WithoutDataDisk(0)
                    .WithNewDataDisk(50)
                    .Apply();

                    virtualMachineScaleSetVMs = vmScaleSet.VirtualMachines;
                    virtualMachines           = virtualMachineScaleSetVMs.List();
                    Assert.Equal(virtualMachines.Count(), vmScaleSet.Capacity);
                    foreach (var vm in virtualMachines)
                    {
                        Assert.NotNull(vm.DataDisks);
                        Assert.Equal(3, vm.DataDisks.Count);
                    }

                    // test attach/detach data disk to single instance
                    string diskName = SdkContext.RandomResourceName("disk", 10);
                    IDisk  disk0    = computeManager.Disks
                                      .Define(diskName)
                                      .WithRegion(Location)
                                      .WithExistingResourceGroup(rgName)
                                      .WithData()
                                      .WithSizeInGB(32)
                                      .Create();

                    var vmEnumerator = virtualMachines.GetEnumerator();
                    vmEnumerator.MoveNext();
                    IVirtualMachineScaleSetVM vm0 = vmEnumerator.Current;
                    vmEnumerator.MoveNext();
                    IVirtualMachineScaleSetVM vm1 = vmEnumerator.Current;
                    int existDiskLun = 2;
                    int newDiskLun   = 10;
                    // cannot detach non-exist disk
                    Assert.Throws <InvalidOperationException>(
                        () => vm0.Update().WithoutDataDisk(newDiskLun)
                        );
                    // cannot detach disk from VMSS model
                    Assert.Throws <InvalidOperationException>(
                        () => vm0.Update().WithoutDataDisk(existDiskLun)
                        );
                    // cannot attach disk with same lun
                    Assert.Throws <InvalidOperationException>(
                        () => vm0.Update().WithExistingDataDisk(disk0, existDiskLun, CachingTypes.None)
                        );
                    // cannot attach disk with same lun
                    Assert.Throws <InvalidOperationException>(
                        () => vm0.Update().WithExistingDataDisk(disk0, newDiskLun, CachingTypes.None).WithExistingDataDisk(disk0, newDiskLun, CachingTypes.None)
                        );

                    // attach disk
                    int vmssModelDiskCount = vm0.DataDisks.Count;
                    vm0.Update()
                    .WithExistingDataDisk(disk0, newDiskLun, CachingTypes.ReadWrite)
                    .Apply();
                    Assert.Equal(vmssModelDiskCount + 1, vm0.DataDisks.Count);

                    // cannot attach disk that already attached
                    disk0.Refresh();
                    Assert.Throws <InvalidOperationException>(
                        () => vm1.Update()
                        .WithExistingDataDisk(disk0, newDiskLun, CachingTypes.None)
                        .Apply()
                        );

                    // detach disk
                    vm0.Update()
                    .WithoutDataDisk(newDiskLun)
                    .Apply();
                    Assert.Equal(vmssModelDiskCount, vm0.DataDisks.Count);
                }
                finally
                {
                    try
                    {
                        resourceManager.ResourceGroups.DeleteByName(rgName);
                    }
                    catch { }
                }
            }
        }