/// <summary> /// Setup! /// </summary> protected override void BeginProcessing() { // Setup for verbosity if we need it. _listener = new PSListener(this); Trace.Listeners.Add(_listener); base.BeginProcessing(); }
/// <summary> /// Do the lookup! /// </summary> protected override void ProcessRecord() { // Setup for verbosity if we need it. var listener = new PSListener(this); Trace.Listeners.Add(listener); try { PandaTask t = null; bool needdatasets = OutputContainerNames.IsPresent || InputContainerNames.IsPresent; if (ParameterSetName == "TaskID") { t = TaskID.FindPandaJobWithTaskName(needdatasets); } if (ParameterSetName == "TaskObject") { t = PandaTaskObject.ID.FindPandaJobWithTaskName(needdatasets); } if (ParameterSetName == "TaskName") { t = TaskName.FindPandaJobWithTaskName(needdatasets); } if (ParameterSetName == "DatasetGRIDJob") { // Get the job and resulting dataset name. var job = JobParser.FindJob(JobName, JobVersion); var ds = job.ResultingDataSetName(DatasetName.Trim(), JobIteration); // Now, look up the job itself. t = (ds + "/").FindPandaJobWithTaskName(); } // We really can't deal with a bad task below. The returned objects are sufficiently complex. if (t == null) { throw new ArgumentException("Unable to find the task in panda: was it ever submitted?"); } // Dump the info to the output pipeline as requested. if (JobStatus.IsPresent) { WriteObject(t.status); } if (InputContainerNames.IsPresent) { WriteObject(t.DataSetNamesIN()); } if (OutputContainerNames.IsPresent) { WriteObject(t.DataSetNamesOUT()); } } finally { Trace.Listeners.Remove(listener); } }
/// <summary> /// Process a single dataset and fetch the info about it. /// </summary> protected override void ProcessRecord() { var trimmedDSName = DatasetName.Trim(); if (_resultsCache.Value[trimmedDSName] is PSGRIDDatasetInfo cHit) { WriteObject(cHit); } else { // Setup for verbosity if we need it. var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Where are we going to be doing query on - we need a machine. var sm = JobParser.GetSubmissionMachine(); // Get the remove environment configured if it needs to be if (_connection == null) { _connection = new SSHConnection(sm.MachineName, sm.UserName); _connection .Apply(() => DisplayStatus("Setting up ATLAS")) .setupATLAS() .Apply(() => DisplayStatus("Setting up Rucio")) .setupRucio(_gridCredentials.Username) .Apply(() => DisplayStatus("Acquiring GRID credentials")) .VomsProxyInit("atlas", failNow: () => Stopping); } // Great - get the info on this dataset. var fileInfo = _connection .Apply(() => DisplayStatus($"Checking for info on {trimmedDSName}.")) .FileInfoFromGRID(trimmedDSName, failNow: () => Stopping); // Next, build the resulting thingy. var r = new PSGRIDDatasetInfo() { DatasetName = trimmedDSName, nFiles = fileInfo.Count, TotalSizeMB = (int)fileInfo.Sum(fi => fi.size), FileInfo = fileInfo.ToArray() }; _resultsCache.Value[trimmedDSName] = r; using (var pp = listener.PauseListening()) { WriteObject(r); } } finally { Trace.Listeners.Remove(listener); } } }
/// <summary> /// Fetch a particular dataset. /// </summary> protected override void ProcessRecord() { var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Get the dataset name that we are to process. Depending on parameters, it can come // from one of two places. var dataset = ParameterSetName == "job" ? GetJobDatasetName() : DatasetName.Trim(); // Find all the members of this dataset. var allFilesToCopy = DataSetManager.ListOfFilesInDataSetAsync(dataset, m => DisplayStatus($"Listing Files in {dataset}", m), failNow: () => Stopping).Result; if (nFiles != 0) { allFilesToCopy = allFilesToCopy .OrderBy(u => u.AbsolutePath) .Take(nFiles) .ToArray(); } // If we have a location, we want to do a copy. If we don't have a location, then we just // want to get the files somewhere local. var loc = Location.AsIPlace().Result; //WriteError(new ErrorRecord(err, "NoSuchLocation", ErrorCategory.InvalidArgument, null)); var resultUris = loc == null ? DataSetManager.MakeFilesLocalAsync(allFilesToCopy, m => DisplayStatus($"Downloading {dataset}", m), failNow : () => Stopping, timeout : Timeout).Result : DataSetManager.CopyFilesToAsync(loc, allFilesToCopy, m => DisplayStatus($"Downloading {dataset}", m), failNow: () => Stopping, timeout: Timeout).Result; // Dump all the returned files out to whatever is next in the pipeline. if (PassThru.IsPresent) { using (var pl = listener.PauseListening()) { foreach (var ds in resultUris) { WriteObject(ds); } } } } finally { ClearStatus(); Trace.Listeners.Remove(listener); } }
/// <summary> /// Setup a few things for running. Much of what we need /// is only lazy initalized. /// </summary> protected override void BeginProcessing() { // Setup for verbosity if we need it. var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Get the grid credentials _gridCredentials = new CredentialSet("GRID").Load().FirstOrDefault(); if (_gridCredentials == null) { throw new ArgumentException("Please create a generic windows credential with the target 'GRID' with the username as the rucio grid username and the password to be used with voms proxy init"); } } finally { Trace.Listeners.Remove(listener); } }
/// <summary> /// Get the list and write it out as objects. /// </summary> protected override void ProcessRecord() { var listener = new PSListener(this); Trace.Listeners.Add(listener); try { var list = DataSetManager.ValidLocations; foreach (var l in list) { using (var pl = listener.PauseListening()) { WriteObject(l); } } } finally { Trace.Listeners.Remove(listener); } }
/// <summary> /// Fetch a particular dataset. /// </summary> protected override void ProcessRecord() { var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Get the actual dataset name. var dataset = DatasetName; if (ParameterSetName == "job") { // Get the job, see if it is finished, and then get the output dataset. var job = JobParser.FindJob(JobName, JobVersion); if (job == null) { throw new ArgumentException($"Job {JobName} v{JobVersion} is not known to the system!"); } // Get the resulting job name for this guy. var pandaJobName = job.ResultingDataSetName(JobSourceDatasetName) + "/"; // Now, to get the output dataset, we need to fetch the job. var pandaTask = pandaJobName.FindPandaJobWithTaskName(true); if (pandaTask == null) { throw new ArgumentException($"No panda task found with name '{pandaJobName}' for job '{JobName}' v{JobVersion}."); } var containers = pandaTask.DataSetNamesOUT(); if (containers.Length > 1) { throw new ArgumentException($"There are more than one output container for the panda task {pandaTask.jeditaskid} - can't decide. Need code upgrade!! Thanks for the fish!"); } dataset = containers.First(); } // Find all the members of this dataset. var allFilesToCopy = DataSetManager.ListOfFilesInDataSetAsync(dataset, m => DisplayStatus($"Listing Files in {dataset}", m), failNow: () => Stopping) .Result; if (nFiles != 0) { allFilesToCopy = allFilesToCopy .OrderBy(u => u.AbsolutePath) .Take(nFiles) .ToArray(); } // Next, see what the test is. It is only exists right now. if (!Exists) { throw new ArgumentException("Test-GRIDDataset just use the -Exists flag."); } // Query the location to see if we have a decent copy there. var loc = Location.AsIPlace().Result; var hasFiles = Task.WhenAll(allFilesToCopy .Select(f => loc.HasFileAsync(f, m => DisplayStatus($"Checking Files {dataset}", m), failNow: () => Stopping))) .Result .All(f => f); // Dump all the returned files out to whatever is next in the pipeline. using (var pl = listener.PauseListening()) { WriteObject(hasFiles); } } finally { Trace.Listeners.Remove(listener); } }
/// <summary> /// Fetch a particular dataset. /// </summary> protected override void ProcessRecord() { var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Get the actual dataset name. var dataset = DatasetName.Trim(); if (ParameterSetName == "job") { // Get the job, see if it is finished, and then get the output dataset. var job = JobParser.FindJob(JobName, JobVersion); if (job == null) { throw new ArgumentException($"Job {JobName} v{JobVersion} is not known to the system!"); } // Get the resulting job name for this guy. var pandaJobName = job.ResultingDataSetName(JobSourceDatasetName, JobIteration) + "/"; // Now, to get the output dataset, we need to fetch the job. var pandaTask = pandaJobName.FindPandaJobWithTaskName(true); if (pandaTask == null) { throw new ArgumentException($"No panda task found with name '{pandaJobName}' for job '{JobName}' v{JobVersion}."); } var containers = pandaTask.DataSetNamesOUT(); if (containers.Length > 1) { throw new ArgumentException($"There are more than one output container for the panda task {pandaTask.jeditaskid} - can't decide. Need code upgrade!! Thanks for the fish!"); } dataset = containers.First(); } // Find all the members of this dataset. var allFilesToCopy = DataSetManager.ListOfFilesInDataSetAsync(dataset, m => DisplayStatus($"Listing Files in {dataset}", m), failNow: () => Stopping) .Result; if (nFiles != 0) { allFilesToCopy = allFilesToCopy .OrderBy(u => u.AbsolutePath) .Take(nFiles) .ToArray(); } // Turn the source and destination locations into actual locations. var locSource = SourceLocation.AsIPlace().Result; var locDest = DestinationLocation.AsIPlace().Result; // Do the actual copy. This will fail if one of the files can't be found at the source. var resultUris = DataSetManager .CopyFilesAsync(locSource, locDest, allFilesToCopy, mbox => DisplayStatus($"Downloading {dataset}", mbox), failNow: () => Stopping, timeout: Timeout) .Result; // Dump all the returned files out to whatever is next in the pipeline. if (PassThru.IsPresent) { using (var pl = listener.PauseListening()) { foreach (var ds in resultUris) { WriteObject(ds); } } } } finally { Trace.Listeners.Remove(listener); } }
/// <summary> /// Load up the job requested. Fail, obviously, if we can't. /// </summary> protected override void ProcessRecord() { // Setup for verbosity if we need it. var listener = new PSListener(this); Trace.Listeners.Add(listener); try { // Get the job var job = JobParser.FindJob(JobName, JobVersion); // Get the expected resulting dataset name. Since this will be a personal // dataset, we need to get the GRID info. var originalDatasetName = DatasetName.Trim(); string resultDatasetName = job.ResultingDataSetName(originalDatasetName, _gridCredentials, JobIteration); // See if there is already a job defined that will produce this var pandaJob = (resultDatasetName + "/").FindPandaJobWithTaskName(useCacheIfPossible: !DoNotUsePandaTaskCache.IsPresent); if (pandaJob == null) { // Where are we going to be doing the submission on? var sm = JobParser.GetSubmissionMachine(); // Get the remove environment configured if it needs to be var firstJob = false; if (_connection == null) { firstJob = true; _connection = new SSHConnection(sm.MachineName, sm.UserName); _connection .Apply(() => DisplayStatus("Setting up ATLAS")) .setupATLAS(dumpOnly: WhatIf.IsPresent) .Apply(() => DisplayStatus("Setting up Rucio")) .setupRucio(_gridCredentials.Username, dumpOnly: WhatIf.IsPresent) .Apply(() => DisplayStatus("Acquiring GRID credentials")) .VomsProxyInit("atlas", failNow: () => Stopping, dumpOnly: WhatIf.IsPresent); } // Check to see if the original dataset exists. We will use the location known as Local for doing the // setup, I suppose. var files = _connection .Apply(() => DisplayStatus("Checking dataset exists on the GRID")) .FilelistFromGRID(originalDatasetName, failNow: () => Stopping, dumpOnly: WhatIf.IsPresent); if (files.Length == 0 && !WhatIf.IsPresent) { throw new ArgumentException($"Dataset '{originalDatasetName}' has zero files - won't submit a job against it!"); } // Submit the job _connection .SubmitJobAsync(job, originalDatasetName, resultDatasetName, DisplayStatus, failNow: () => Stopping, sameJobAsLastTime: !firstJob, dumpOnly: WhatIf.IsPresent) .WaitAndUnwrapException(); // Try to find the job again if requested. The submission can take a very long time to show up in // big panda, so skip unless requested. if (WaitForPandaRegistration) { var pandJobResult = Policy .Handle <InvalidOperationException>() .WaitAndRetryForever(nthRetry => TimeSpan.FromMinutes(1), (e, ts) => { WriteWarning($"Failed to find the submitted panda job on bigpanda: {e.Message}. Will wait one minute and try again."); }) .ExecuteAndCapture(() => FindPandaJobForDS(resultDatasetName)); if (pandJobResult.Outcome != OutcomeType.Successful) { throw pandJobResult.FinalException; } pandaJob = pandJobResult.Result; } } // Return a helper obj that contains the info about this job that can be used by other commands. if (pandaJob != null) { var r = new AtlasPandaTaskID() { ID = pandaJob.jeditaskid, Name = pandaJob.taskname }; using (var pp = listener.PauseListening()) { WriteObject(r); } } } finally { Trace.Listeners.Remove(listener); } }