| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| using System.Collections.Generic; |
| using System.IO; |
| using Org.Apache.REEF.Client.API; |
| using Org.Apache.REEF.Client.Avro; |
| using Org.Apache.REEF.Client.Avro.AzureBatch; |
| using Org.Apache.REEF.Client.AzureBatch.Parameters; |
| using Org.Apache.REEF.Client.Common; |
| using Org.Apache.REEF.Common.Avro; |
| using Org.Apache.REEF.Common.Files; |
| using Org.Apache.REEF.Tang.Annotations; |
| |
| namespace Org.Apache.REEF.Client.AzureBatch.Util |
| { |
| internal sealed class JobJarMaker |
| { |
| private readonly IResourceArchiveFileGenerator _resourceArchiveFileGenerator; |
| private readonly DriverFolderPreparationHelper _driverFolderPreparationHelper; |
| private readonly AvroAzureBatchJobSubmissionParameters _avroAzureBatchJobSubmissionParameters; |
| private readonly REEFFileNames _fileNames; |
| |
| [Inject] |
| private JobJarMaker( |
| IResourceArchiveFileGenerator resourceArchiveFileGenerator, |
| DriverFolderPreparationHelper driverFolderPreparationHelper, |
| REEFFileNames fileNames, |
| [Parameter(typeof(AzureBatchAccountName))] string azureBatchAccountName, |
| [Parameter(typeof(AzureBatchAccountUri))] string azureBatchAccountUri, |
| [Parameter(typeof(AzureBatchPoolId))] string azureBatchPoolId, |
| [Parameter(typeof(AzureStorageAccountName))] string azureStorageAccountName, |
| [Parameter(typeof(AzureStorageContainerName))] string azureStorageContainerName, |
| [Parameter(typeof(AzureBatchPoolDriverPortsList))] List<string> azureBatchPoolDriverPortsList, |
| [Parameter(typeof(ContainerRegistryServer))] string containerRegistryServer, |
| [Parameter(typeof(ContainerRegistryUsername))] string containerRegistryUsername, |
| [Parameter(typeof(ContainerRegistryPassword))] string containerRegistryPassword, |
| [Parameter(typeof(ContainerImageName))] string containerImageName) |
| { |
| _resourceArchiveFileGenerator = resourceArchiveFileGenerator; |
| _driverFolderPreparationHelper = driverFolderPreparationHelper; |
| _fileNames = fileNames; |
| _avroAzureBatchJobSubmissionParameters = new AvroAzureBatchJobSubmissionParameters |
| { |
| AzureBatchAccountName = azureBatchAccountName, |
| AzureBatchAccountUri = azureBatchAccountUri, |
| AzureBatchPoolId = azureBatchPoolId, |
| AzureStorageAccountName = azureStorageAccountName, |
| AzureStorageContainerName = azureStorageContainerName, |
| AzureBatchPoolDriverPortsList = azureBatchPoolDriverPortsList, |
| ContainerRegistryServer = containerRegistryServer, |
| ContainerRegistryUsername = containerRegistryUsername, |
| ContainerRegistryPassword = containerRegistryPassword, |
| ContainerImageName = containerImageName, |
| }; |
| } |
| |
| /// <summary> |
| /// Creates a JAR file for the job submission. |
| /// </summary> |
| /// <param name="jobRequest">Job request received from the client code.</param> |
| /// <param name="azureBatchjobId">Azure Batch job Id going to be launched.</param> |
| /// <returns>A string path to file.</returns> |
| public string CreateJobSubmissionJAR(JobRequest jobRequest, string azureBatchjobId) |
| { |
| _avroAzureBatchJobSubmissionParameters.sharedJobSubmissionParameters = new AvroJobSubmissionParameters |
| { |
| jobId = jobRequest.JobIdentifier, |
| //// This is dummy in Azure Batch, as it does not use jobSubmissionFolder in Azure Batch. |
| jobSubmissionFolder = Path.PathSeparator.ToString() |
| }; |
| |
| string localDriverFolderPath = CreateDriverFolder(azureBatchjobId); |
| |
| _driverFolderPreparationHelper.PrepareDriverFolder(jobRequest.AppParameters, localDriverFolderPath); |
| SerializeJobFile(localDriverFolderPath, _avroAzureBatchJobSubmissionParameters); |
| |
| return _resourceArchiveFileGenerator.CreateArchiveToUpload(localDriverFolderPath); |
| } |
| |
| private string CreateDriverFolder(string azureBatchjobId) |
| { |
| return Path.GetFullPath(Path.Combine(Path.GetTempPath(), azureBatchjobId) + Path.DirectorySeparatorChar); |
| } |
| |
| private void SerializeJobFile(string localDriverFolderPath, AvroAzureBatchJobSubmissionParameters jobParameters) |
| { |
| var serializedArgs = AvroJsonSerializer<AvroAzureBatchJobSubmissionParameters>.ToBytes(jobParameters); |
| |
| var submissionJobArgsFilePath = Path.Combine(localDriverFolderPath, |
| _fileNames.GetReefFolderName(), _fileNames.GetJobSubmissionParametersFile()); |
| |
| using (var jobArgsFileStream = new FileStream(submissionJobArgsFilePath, FileMode.CreateNew)) |
| { |
| jobArgsFileStream.Write(serializedArgs, 0, serializedArgs.Length); |
| } |
| } |
| } |
| } |