/// <summary>Set the initial property of the activity entity</summary>
 /// <param name="scaleSetVm">The vm</param>
 /// <param name="scheduleRule">Event activity entity.</param>
 /// /// <param name="enableRollback">Event activity entity.</param>
 private static void SetInitialEventActivity(IVirtualMachineScaleSetVM scaleSetVm, ScheduledRules scheduleRule, bool enableRollback)
 {
     if (enableRollback)
     {
         scheduleRule.RollbackInitialState       = scaleSetVm.PowerState.Value;
         scheduleRule.RollbackExecutionStartTime = DateTime.UtcNow;
     }
     else
     {
         scheduleRule.InitialState       = scaleSetVm.PowerState.Value;
         scheduleRule.ExecutionStartTime = DateTime.UtcNow;
     }
 }
        /// <summary>Convert the Virtual machine to virtual machine crawler response entity.</summary>
        /// <param name="scaleSetVirtualMachines">The virtual machine.</param>
        /// <param name="resourceGroup">The resource group name.</param>
        /// <param name="virtualMachineScaleSetId">Scale set name of the vm.</param>
        /// <param name="partitionKey">The partition key for the virtaul machine entity.</param>
        /// <param name="availabilityZone">The availability zone value for the virtual machine scale set vm instance</param>
        /// <param name="vmGroup">Virtual machine group name.</param>
        /// <returns></returns>
        public static VirtualMachineCrawlerResponse ConvertToVirtualMachineEntity(IVirtualMachineScaleSetVM scaleSetVirtualMachines, string resourceGroup,
                                                                                  string virtualMachineScaleSetId, string partitionKey, int?availabilityZone,
                                                                                  string vmGroup = "")
        {
            var virtualMachineCrawlerResponseEntity = new VirtualMachineCrawlerResponse(partitionKey, scaleSetVirtualMachines.Id.Replace(Delimeters.ForwardSlash, Delimeters.Exclamatory))
            {
                RegionName               = scaleSetVirtualMachines.RegionName,
                ResourceGroupName        = resourceGroup,
                ResourceName             = scaleSetVirtualMachines.Name,
                ResourceType             = scaleSetVirtualMachines.Type,
                VirtualMachineScaleSetId = virtualMachineScaleSetId,
                AvailabilityZone         = availabilityZone != 0 ? availabilityZone : 0,
                VirtualMachineGroup      = string.IsNullOrWhiteSpace(vmGroup) ? VirtualMachineGroup.VirtualMachines.ToString() : vmGroup,
                State = scaleSetVirtualMachines.PowerState?.Value
            };

            return(virtualMachineCrawlerResponseEntity);
        }
        /// <summary>Perform the Chaos Operation</summary>
        /// <param name="actionType">Action type</param>
        /// <param name="scaleSetVm">Virtual Machine instance</param>
        /// <param name="scheduleRule">Event activity entity</param>
        /// <param name="enableRollback">Event activity entity</param>
        /// <returns></returns>
        private static async Task PerformChaos(string action, IVirtualMachineScaleSetVM scaleSetVm, ScheduledRules scheduleRule, bool enableRollback)
        {
            ActionType actionType;

            if (!Enum.TryParse(action, out actionType))
            {
                return;
            }

            switch (actionType)
            {
            case ActionType.Start:
                await scaleSetVm.StartAsync();

                break;

            case ActionType.PowerOff:
            case ActionType.Stop:
                await scaleSetVm.PowerOffAsync();

                break;

            case ActionType.Restart:
                await scaleSetVm.RestartAsync();

                break;
            }
            if (enableRollback)
            {
                scheduleRule.RollbackExecutionStatus = Status.Executing.ToString();
            }
            else
            {
                scheduleRule.ExecutionStatus = Status.Executing.ToString();
            }
        }
Пример #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 { }
                }
            }
        }