public async Task TestSubmitNewApplication() { var ctx = new TestContext(); var urlProvider = ctx.UrlProviderFake; var restReqExecutor = ctx.RestRequestExecutorFake; var anyUri = Enumerable.Repeat(new Uri("anyscheme://anypath"), 1); const string applicationId = "AnyApplicationId"; const string anyApplicationType = "REEFTest"; const string anyApplicationName = "AnyAPP"; urlProvider.GetUrlAsync().Returns(Task.FromResult(anyUri)); var anySubmitApplication = new SubmitApplication { ApplicationId = applicationId, AmResource = new Resouce { MemoryMB = 500, VCores = 1 }, ApplicationType = anyApplicationType, ApplicationName = anyApplicationName, KeepContainersAcrossApplicationAttempts = false, MaxAppAttempts = 1, Priority = 1, UnmanagedAM = false, AmContainerSpec = new AmContainerSpec { Commands = new Commands { Command = @"DONTCARE" }, LocalResources = new LocalResources { Entries = new List<YARN.RestClient.DataModel.KeyValuePair<string, LocalResourcesValue>> { new YARN.RestClient.DataModel.KeyValuePair<string, LocalResourcesValue> { Key = "APPLICATIONWILLFAILBUTWEDONTCAREHERE", Value = new LocalResourcesValue { Resource = "Foo", Type = ResourceType.FILE, Visibility = Visibility.APPLICATION } } } } } }; const string expectedJson = @"{" + @"""application-id"":""AnyApplicationId""," + @"""application-name"":""AnyAPP""," + @"""queue"":null,""priority"":1," + @"""am-container-spec"":" + @"{" + @"""local-resources"":" + @"{" + @"""entry"":" + @"[" + @"{" + @"""key"":""APPLICATIONWILLFAILBUTWEDONTCAREHERE""," + @"""value"":" + @"{" + @"""resource"":""Foo""," + @"""type"":""FILE""," + @"""visibility"":""APPLICATION""," + @"""size"":0," + @"""timestamp"":0" + @"}" + @"}" + @"]" + @"}," + @"""environment"":null," + @"""commands"":" + @"{" + @"""command"":""DONTCARE""" + @"}," + @"""service-data"":null," + @"""credentials"":null," + @"""application-acls"":null}," + @"""unmanaged-AM"":false," + @"""max-app-attempts"":1," + @"""resource"":" + @"{" + @"""memory"":500," + @"""vCores"":1" + @"},""application-type"":""REEFTest""," + @"""keep-containers-across-application-attempts"":false," + @"""application-tags"":null" + @"}"; var thisApplication = new Application { AllocatedMB = 100, AmHostHttpAddress = "http://anyhttpaddress", AmContainerLogs = "SomeLogs", ApplicationType = "AnyYarnApplicationType", State = State.FINISHED, Name = "AnyApplicationName", RunningContainers = 0 }; var response = new RestResponse<VoidResult> { StatusCode = HttpStatusCode.Accepted }; restReqExecutor.ExecuteAsync( Arg.Is<RestRequest>( req => req.Resource == "ws/v1/cluster/apps" && req.Method == Method.POST && req.Content.Headers.ContentType.MediaType == "application/json" && IsExpectedJson(req, expectedJson)), anyUri.First(), CancellationToken.None).Returns(Task.FromResult(response)); restReqExecutor.ExecuteAsync<Application>( Arg.Is<RestRequest>( req => req.Resource == "ws/v1/cluster/apps/" + applicationId && req.RootElement == "app" && req.Method == Method.GET), anyUri.First(), CancellationToken.None).Returns(Task.FromResult(thisApplication)); var yarnClient = ctx.GetClient(); Application actualApplication = await yarnClient.SubmitApplicationAsync(anySubmitApplication); Assert.Equal(thisApplication, actualApplication); var unused = urlProvider.Received(2).GetUrlAsync(); }
public async Task TestGetApplication() { var ctx = new TestContext(); var urlProvider = ctx.UrlProviderFake; var restReqExecutor = ctx.RestRequestExecutorFake; var anyUri = Enumerable.Repeat(new Uri("anyscheme://anypath"), 1); const string applicationId = "AnyApplicationId"; urlProvider.GetUrlAsync().Returns(Task.FromResult(anyUri)); var anyApplication = new Application { AllocatedMB = 100, AmHostHttpAddress = "http://anyhttpaddress", AmContainerLogs = "SomeLogs", ApplicationType = "AnyYarnApplicationType", State = State.FINISHED, Name = "AnyApplicationName", RunningContainers = 0 }; restReqExecutor.ExecuteAsync<Application>( Arg.Is<RestRequest>( req => req.Resource == "ws/v1/cluster/apps/" + applicationId && req.RootElement == "app" && req.Method == Method.GET), anyUri.First(), CancellationToken.None).Returns(Task.FromResult(anyApplication)); var yarnClient = ctx.GetClient(); Application actualApplication = await yarnClient.GetApplicationAsync(applicationId); Assert.Equal(anyApplication, actualApplication); var unused = urlProvider.Received(1).GetUrlAsync(); }
public async Task TestSubmitNewApplication() { var ctx = new TestContext(); var urlProvider = ctx.UrlProviderFake; var restReqExecutor = ctx.RestRequestExecutorFake; Uri anyUri = new Uri("anyscheme://anypath"); const string applicationId = "AnyApplicationId"; const string anyApplicationType = "REEFTest"; const string anyApplicationName = "AnyAPP"; urlProvider.GetUrlAsync().Returns(Task.FromResult(anyUri)); var anySubmitApplication = new SubmitApplication { ApplicationId = applicationId, AmResource = new Resouce { MemoryMB = 500, VCores = 1 }, ApplicationType = anyApplicationType, ApplicationName = anyApplicationName, KeepContainersAcrossApplicationAttempts = false, MaxAppAttempts = 1, Priority = 1, UnmanagedAM = false, AmContainerSpec = new AmContainerSpec { Commands = new Commands { Command = @"DONTCARE" }, LocalResources = new LocalResources { Entry = new List<KeyValuePair<string, LocalResourcesValue>> { new KeyValuePair<string, LocalResourcesValue>( "APPLICATIONWILLFAILBUTWEDONTCAREHERE", new LocalResourcesValue { Resource = "Foo", Type = ResourceType.FILE, Visibility = Visibility.APPLICATION }) } } } }; const string expectedJson = @"{" + @"""application-id"":""AnyApplicationId""," + @"""application-name"":""AnyAPP""," + @"""Queue"":null,""Priority"":1," + @"""am-container-spec"":" + @"{" + @"""local-resources"":" + @"{" + @"""Entry"":" + @"[" + @"{" + @"""Key"":""APPLICATIONWILLFAILBUTWEDONTCAREHERE""," + @"""Value"":" + @"{" + @"""Resource"":""Foo""," + @"""Type"":1," + @"""Visibility"":2," + @"""Size"":0," + @"""Timestamp"":0" + @"}" + @"}" + @"]" + @"}," + @"""Environment"":null," + @"""Commands"":" + @"{" + @"""Command"":""DONTCARE""" + @"}," + @"""service-data"":null," + @"""Credentials"":null," + @"""application-acls"":null}," + @"""unmanaged-am"":false," + @"""max-app-attempts"":1," + @"""resource"":" + @"{" + @"""memory"":500," + @"""VCores"":1" + @"},""application-type"":""REEFTest""," + @"""keep-containers-across-application-attempts"":false," + @"""application-tags"":null" + @"}"; var thisApplication = new Application { AllocatedMB = 100, AmHostHttpAddress = "http://anyhttpaddress", AmContainerLogs = "SomeLogs", ApplicationType = "AnyYarnApplicationType", State = State.FINISHED, Name = "AnyApplicationName", RunningContainers = 0 }; var response = Substitute.For<IRestResponse>(); response.Headers.Returns(new List<Parameter> { new Parameter { Name = "Location", Value = "http://somelocation" } }); response.StatusCode.Returns(HttpStatusCode.Accepted); restReqExecutor.ExecuteAsync( Arg.Is<IRestRequest>( req => req.Resource == "ws/v1/cluster/apps" && req.Method == Method.POST && req.JsonSerializer is RestJsonSerializer && req.Parameters.First().Name == "application/json" && B(req, expectedJson)), anyUri, CancellationToken.None).Returns(Task.FromResult(response)); restReqExecutor.ExecuteAsync<Application>( Arg.Is<IRestRequest>( req => req.Resource == "ws/v1/cluster/apps/" + applicationId && req.RootElement == "app" && req.Method == Method.GET), anyUri, CancellationToken.None).Returns(Task.FromResult(thisApplication)); var yarnClient = ctx.GetClient(); Application actualApplication = await yarnClient.SubmitApplicationAsync(anySubmitApplication); Assert.AreEqual(thisApplication, actualApplication); var unused = urlProvider.Received(2).GetUrlAsync(); }