public async void OnGenerateApsimXFiles(object sender, EventArgs e) { try { await explorerPresenter.GenerateApsimXFiles(explorerPresenter.CurrentNode as IModel); } catch (Exception err) { explorerPresenter.MainPresenter.ShowError(err); } }
public void OnGenerateApsimXFiles(object sender, EventArgs e) { try { explorerPresenter.GenerateApsimXFiles(Apsim.Get(explorerPresenter.ApsimXFile, explorerPresenter.CurrentNodePath) as IModel); } catch (Exception err) { explorerPresenter.MainPresenter.ShowError(err); } }
public void OnGenerateApsimXFiles(object sender, EventArgs e) { explorerPresenter.GenerateApsimXFiles(Apsim.Get(explorerPresenter.ApsimXFile, explorerPresenter.CurrentNodePath) as IModel);; }
/// <summary> /// Handles the bulk of the work for submitting the job to the cloud. /// Zips up ApsimX (if necessary), uploads tools and ApsimX, /// </summary> /// <param name="e">Event arg, containing the job parameters</param> private void SubmitJob_DoWork(object o, DoWorkEventArgs e) { JobParameters jp = (JobParameters)e.Argument; jp.JobId = Guid.NewGuid(); jp.CoresPerProcess = 1; jp.JobManagerShouldSubmitTasks = true; jp.AutoScale = true; jp.PoolMaxTasksPerVM = 16; string tmpZip = ""; SetAzureMetaData("job-" + jp.JobId, "Owner", Environment.UserName.ToLower()); // if jp.ApplicationPackagePath is a directory it will need to be zipped up if (Directory.Exists(jp.ApplicationPackagePath)) { view.Status = "Zipping APSIM"; tmpZip = Path.Combine(Path.GetTempPath(), "Apsim-tmp-X-" + Environment.UserName.ToLower() + ".zip"); if (File.Exists(tmpZip)) { File.Delete(tmpZip); } if (CreateApsimXZip(jp.ApplicationPackagePath, tmpZip) > 0) { view.Status = "Cancelled"; return; } jp.ApplicationPackagePath = tmpZip; jp.ApplicationPackageVersion = Path.GetFileName(tmpZip).Substring(Path.GetFileName(tmpZip).IndexOf('-') + 1); } // add current job to the list of jobs // TODO : do we actually need/use the APSIMJob class? APSIMJob job = new APSIMJob(jp.JobDisplayName, "", jp.ApplicationPackagePath, jp.ApplicationPackageVersion, jp.Recipient, batchAuth, storageAuth, PoolSettings.FromConfiguration()); job.PoolInfo.MaxTasksPerVM = jp.PoolMaxTasksPerVM; job.PoolInfo.VMCount = jp.PoolVMCount; // upload tools such as 7zip, AzCopy, CMail, etc. view.Status = "Checking tools"; string executableDirectory = GetExecutableDirectory(); string toolsDir = Path.Combine(executableDirectory, "tools"); if (!Directory.Exists(toolsDir)) { ShowErrorMessage("Tools Directory not found: " + toolsDir); } foreach (string filePath in Directory.EnumerateFiles(toolsDir)) { UploadFileIfNeeded("tools", filePath); } if (jp.Recipient.Length > 0) { try { // Store a config file into the job directory that has the e-mail config string tmpConfig = Path.Combine(Path.GetTempPath(), settingsFileName); using (StreamWriter file = new StreamWriter(tmpConfig)) { file.WriteLine("EmailRecipient=" + jp.Recipient); file.WriteLine("EmailSender=" + AzureSettings.Default["EmailSender"]); file.WriteLine("EmailPW=" + AzureSettings.Default["EmailPW"]); } UploadFileIfNeeded("job-" + jp.JobId, tmpConfig); File.Delete(tmpConfig); } catch (Exception err) { ShowError(new Exception("Error writing to settings file; you may not receive an email upon job completion: ", err)); } } // upload job manager UploadFileIfNeeded("jobmanager", Path.Combine(executableDirectory, "azure-apsim.exe")); // upload apsim view.Status = "Uploading APSIM Next Generation"; UploadFileIfNeeded("apsim", jp.ApplicationPackagePath); // generate model files view.Status = "Generating model files"; if (!Directory.Exists(jp.ModelPath)) { Directory.CreateDirectory(jp.ModelPath); } try { // copy weather files to models directory to be zipped up foreach (Models.Weather child in Apsim.ChildrenRecursively(model).OfType <Models.Weather>()) { if (Path.GetDirectoryName(child.FullFileName) != Path.GetDirectoryName(presenter.ApsimXFile.FileName)) { presenter.MainPresenter.ShowError("Weather file must be in the same directory as .apsimx file: " + child.FullFileName); view.Status = "Cancelled"; return; } string sourceFile = child.FullFileName; string destFile = Path.Combine(jp.ModelPath, child.FileName); if (!File.Exists(destFile)) { File.Copy(sourceFile, destFile); } ; } // Generate .apsimx files, and if any errors are encountered, abort the job submission process. if (!presenter.GenerateApsimXFiles(model, jp.ModelPath)) { view.Status = "Cancelled"; return; } } catch (Exception err) { presenter.MainPresenter.ShowError(err); return; } tmpZip = ""; // zip up models directory if (Directory.Exists(jp.ModelPath)) // this test may be unnecessary { tmpZip = GetTempFileName("Model-", ".zip", true); ZipFile.CreateFromDirectory(jp.ModelPath, tmpZip, CompressionLevel.Fastest, false); jp.ModelPath = tmpZip; } // upload models view.Status = "Uploading models"; job.ModelZipFileSas = uploader.UploadFile(jp.ModelPath, jp.JobId.ToString(), Path.GetFileName(jp.ModelPath)); // clean up temporary model files if (File.Exists(tmpZip)) { File.Delete(tmpZip); } if (!jp.SaveModelFiles) { if (Directory.Exists(jp.ModelPath)) { Directory.Delete(jp.ModelPath); } } view.Status = "Submitting Job"; // submit job try { CloudJob cloudJob = batchCli.JobOperations.CreateJob(jp.JobId.ToString(), GetPoolInfo(job.PoolInfo)); cloudJob.DisplayName = job.DisplayName; cloudJob.JobPreparationTask = job.ToJobPreparationTask(jp.JobId, Microsoft.Azure.Storage.Blob.BlobAccountExtensions.CreateCloudBlobClient(storageAccount)); cloudJob.JobReleaseTask = job.ToJobReleaseTask(jp.JobId, Microsoft.Azure.Storage.Blob.BlobAccountExtensions.CreateCloudBlobClient(storageAccount)); cloudJob.JobManagerTask = job.ToJobManagerTask(jp.JobId, Microsoft.Azure.Storage.Blob.BlobAccountExtensions.CreateCloudBlobClient(storageAccount), jp.JobManagerShouldSubmitTasks, jp.AutoScale); cloudJob.Commit(); } catch (Exception err) { ShowError(err); } view.Status = "Job Successfully submitted"; if (jp.AutoDownload) { AzureResultsDownloader dl = new AzureResultsDownloader(jp.JobId, jp.JobDisplayName, jp.OutputDir, null, true, jp.Summarise, true, true, true); dl.DownloadResults(true); } }