コード例 #1
0
        public void Bug1665834TaskStateMonitor()
        {
            void test()
            {
                using BatchClient batchCli = TestUtilities.OpenBatchClient(TestUtilities.GetCredentialsFromEnvironment());
                string jobId = "Bug1665834Job-" + TestUtilities.GetMyName();

                try
                {
                    CloudJob unboundJob = batchCli.JobOperations.CreateJob(jobId, new PoolInformation());
                    unboundJob.PoolInformation.PoolId = poolFixture.PoolId;
                    unboundJob.Commit();

                    CloudJob boundJob = batchCli.JobOperations.GetJob(jobId);

                    // add some noise tasks
                    for (int j = 0; j < 5; j++)
                    {
                        CloudTask unboundTaskQuick = new CloudTask((10 + j).ToString(), "cmd /c hostname");

                        boundJob.AddTask(unboundTaskQuick);
                    }

                    Thread.Sleep(5000);

                    // wait for fast tasks to complete
                    {
                        bool repeat = true;

                        while (repeat)
                        {
                            CloudPool boundPool = batchCli.PoolOperations.GetPool(poolFixture.PoolId);

                            repeat = false;

                            foreach (CloudTask curTask in boundJob.ListTasks())
                            {
                                if (curTask.State != TaskState.Completed)
                                {
                                    repeat = true;

                                    testOutputHelper.WriteLine("Manual Wait Task Id: " + curTask.Id + ", state = " + curTask.State);
                                    testOutputHelper.WriteLine("   poolstate: " + boundPool.State + ", currentdedicated: " + boundPool.CurrentDedicatedComputeNodes);
                                    testOutputHelper.WriteLine("      compute nodes:");

                                    foreach (ComputeNode curComputeNode in boundPool.ListComputeNodes())
                                    {
                                        testOutputHelper.WriteLine("           computeNode.Id: " + curComputeNode.Id + ", state: " + curComputeNode.State);
                                    }
                                }
                            }
                        }
                    }

                    // add some longer running tasks

                    testOutputHelper.WriteLine("Adding longer running tasks");

                    for (int i = 0; i < 15; i++)
                    {
                        CloudTask unboundTask = new CloudTask(i.ToString() + "_a234567890a234567890a234567890a234567890a234567890a234567890", "cmd /c ping 127.0.0.1 -n 4");

                        boundJob.AddTask(unboundTask);
                    }

                    Utilities        utilities = batchCli.Utilities;
                    TaskStateMonitor tsm       = utilities.CreateTaskStateMonitor();

                    IPagedEnumerable <CloudTask> taskList = boundJob.ListTasks();

                    // try to set really low delay
                    ODATAMonitorControl odmc = new ODATAMonitorControl {
                        DelayBetweenDataFetch = new TimeSpan(0)
                    };

                    // confirm the floor is enforced
                    Assert.Equal(500, odmc.DelayBetweenDataFetch.Milliseconds);

                    testOutputHelper.WriteLine("Calling TaskStateMonitor.WaitAll().  This will take a while.");

                    TimeSpan timeToWait = TimeSpan.FromMinutes(5);
                    Task     whenAll    = tsm.WhenAll(taskList, TaskState.Completed, timeToWait, controlParams: odmc);

                    //This could throw, if it does the test will fail, which is what we want
                    whenAll.Wait();

                    foreach (CloudTask curTask in boundJob.ListTasks())
                    {
                        Assert.Equal(TaskState.Completed, curTask.State);
                    }
                }
                finally
                {
                    // cleanup
                    TestUtilities.DeleteJobIfExistsAsync(batchCli, jobId).Wait();
                }
            }

            SynchronizationContextHelper.RunTest(test, TestTimeout);
        }
コード例 #2
0
        public void LongRunning_Bug1965363Wat7OSVersionFeaturesQuickJobWithAutoPool()
        {
            void test()
            {
                using BatchClient batchCli = TestUtilities.OpenBatchClient(TestUtilities.GetCredentialsFromEnvironment());
                string jobId = "Bug1965363Job-" + TestUtilities.GetMyName();

                try
                {
                    PoolInformation poolInfo = new PoolInformation()
                    {
                        AutoPoolSpecification = new AutoPoolSpecification()
                        {
                            PoolLifetimeOption = PoolLifetimeOption.Job,
                            PoolSpecification  = new PoolSpecification()
                            {
                                CloudServiceConfiguration   = new CloudServiceConfiguration(PoolFixture.OSFamily),
                                VirtualMachineSize          = PoolFixture.VMSize,
                                TargetDedicatedComputeNodes = 1
                            }
                        }
                    };

                    CloudJob unboundJob = batchCli.JobOperations.CreateJob(jobId, poolInfo);

                    testOutputHelper.WriteLine("Commiting quickjob");
                    unboundJob.Commit();

                    CloudTask task     = new CloudTask("Bug1965363Wat7OSVersionFeaturesQuickJobWithAutoPoolTask", "cmd /c echo Bug1965363");
                    CloudJob  boundJob = batchCli.JobOperations.GetJob(jobId);
                    boundJob.AddTask(task);

                    testOutputHelper.WriteLine("Getting pool name: {0}", boundJob.ExecutionInformation.PoolId);

                    CloudPool           boundPool = batchCli.PoolOperations.GetPool(boundJob.ExecutionInformation.PoolId);
                    TaskStateMonitor    tsm       = batchCli.Utilities.CreateTaskStateMonitor();
                    ODATAMonitorControl odControl = new ODATAMonitorControl();

                    // we know that the autopool compute nodes will take a long time to become scheduleable so we slow down polling/spam
                    odControl.DelayBetweenDataFetch = TimeSpan.FromSeconds(5);

                    testOutputHelper.WriteLine("Invoking TaskStateMonitor");

                    tsm.WaitAll(
                        boundJob.ListTasks(),
                        TaskState.Completed,
                        TimeSpan.FromMinutes(15),
                        odControl,
                        new[] {
                        // spam/logging interceptor
                        new Protocol.RequestInterceptor((x) =>
                        {
                            testOutputHelper.WriteLine("Issuing request type: " + x.GetType().ToString());

                            // print out the compute node states... we are actually waiting on the compute nodes
                            List <ComputeNode> allComputeNodes = boundPool.ListComputeNodes().ToList();
                            testOutputHelper.WriteLine("    #comnpute nodes: " + allComputeNodes.Count);

                            allComputeNodes.ForEach((icn) => { testOutputHelper.WriteLine("  computeNode.id: " + icn.Id + ", state: " + icn.State); });
                            testOutputHelper.WriteLine("");
                        })
                    });

                    // confirm the task ran by inspecting the stdOut
                    string stdOut = boundJob.ListTasks().ToList()[0].GetNodeFile(Constants.StandardOutFileName).ReadAsString();

                    Assert.Contains("Bug1965363", stdOut);
                }
                finally
                {
                    TestUtilities.DeleteJobIfExistsAsync(batchCli, jobId).Wait();
                }
            }

            SynchronizationContextHelper.RunTest(test, LongTestTimeout);
        }
コード例 #3
0
ファイル: UtilitiesUnitTests.cs プロジェクト: QITIE/ADLSTool
        public async Task TaskStateMonitorCancellation()
        {
            TimeSpan     timeout    = TimeSpan.FromSeconds(.5);
            const string dummyJobId = "Dummy";

            using (BatchClient batchCli = BatchClient.Open(ClientUnitTestCommon.CreateDummySharedKeyCredential()))
            {
                List <string> taskIds = new List <string>()
                {
                    "task1",
                    "task2"
                };

                //Set up a request interceptor to handle all list task requests
                batchCli.CustomBehaviors.Add(new Protocol.RequestInterceptor(req =>
                {
                    var typedRequest =
                        (Protocol.BatchRequest <
                             Protocol.Models.TaskListOptions,
                             AzureOperationResponse <IPage <Protocol.Models.CloudTask>, Protocol.Models.TaskListHeaders> >)req;

                    typedRequest.ServiceRequestFunc = token =>
                    {
                        List <Protocol.Models.CloudTask> protoTaskList = new List <Protocol.Models.CloudTask>();
                        foreach (string taskId in taskIds)
                        {
                            protoTaskList.Add(new Protocol.Models.CloudTask(taskId, "dummy"));
                        }

                        var response = new AzureOperationResponse <IPage <Protocol.Models.CloudTask>, Protocol.Models.TaskListHeaders>()
                        {
                            Body = new FakePage <Protocol.Models.CloudTask>(protoTaskList)
                        };

                        return(Task.FromResult(response));
                    };
                }));

                //Create some tasks which are "bound"
                IEnumerable <Protocol.Models.CloudTask> protocolTasks = taskIds.Select(CreateProtocolCloudTask);
                IEnumerable <CloudTask> taskList = protocolTasks.Select(protoTask => CreateBoundCloudTask(batchCli, dummyJobId, protoTask));

                TaskStateMonitor taskStateMonitor = batchCli.Utilities.CreateTaskStateMonitor();

                DateTime startTime = DateTime.UtcNow;

                //Set up the cancellation token
                using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(timeout))
                {
                    //ODataMonitor Controls specify wait between calls as 0
                    ODATAMonitorControl controls = new ODATAMonitorControl()
                    {
                        DelayBetweenDataFetch = TimeSpan.FromSeconds(0)
                    };

                    await Assert.ThrowsAsync <OperationCanceledException>(async() => await taskStateMonitor.WhenAll(
                                                                              taskList,
                                                                              TaskState.Running,
                                                                              controlParams: controls,
                                                                              cancellationToken: cancellationTokenSource.Token));

                    DateTime endTime  = DateTime.UtcNow;
                    TimeSpan duration = endTime.Subtract(startTime);

                    Assert.True(Math.Abs(duration.TotalSeconds - duration.TotalSeconds) < TimeToleranceInSeconds,
                                string.Format("Expected timeout: {0}, Observed timeout: {1}", timeout, duration));
                }
            }
        }