Beispiel #1
0
        private static async Task <List <string> > DownloadArtifactZip(RunInfo runInfo, string zipFileName, string saveAsDir = default, Action <int> reportProgressAction = default)
        {
            try
            {
                var simuApi = new PollinationSDK.Api.RunsApi();

                var url = simuApi.DownloadRunArtifact(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, zipFileName).ToString();

                var dir    = string.IsNullOrEmpty(saveAsDir) ? GenTempFolder() : saveAsDir;
                var simuID = runInfo.RunID.Substring(0, 8);
                dir = Path.Combine(dir, simuID);
                // downloaded folder
                return(await Download(url, dir, reportProgressAction));
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Download all assets (input/output) with one call
        /// </summary>
        /// <param name="runInfo"></param>
        /// <param name="saveAsDir"></param>
        /// <returns></returns>
        private static List <Task <string> > DownloadAssets(RunInfo runInfo, IEnumerable <RunAssetBase> assets, string saveAsDir, Action <string> reportProgressAction, System.Threading.CancellationToken cancelToken = default)
        {
            var tasks = new List <Task <string> >();

            if (assets == null || !assets.Any())
            {
                return(tasks);
            }
            var api       = new PollinationSDK.Api.RunsApi();
            var inputDir  = Path.Combine(saveAsDir, "inputs");
            var outputDir = Path.Combine(saveAsDir, "outputs");

            var total     = assets.Count();
            var completed = 0;

            foreach (var asset in assets)
            {
                try
                {
                    if (asset.IsPathAsset() && !asset.IsSaved())
                    {
                        var assetName    = asset.Name;
                        var isInputAsset = asset is RunInputAsset;
                        var dir          = isInputAsset ? inputDir : outputDir;
                        dir = Path.Combine(dir, assetName);

                        Action <int> individualProgress = (percent) => {
                            reportProgressAction?.Invoke($"{assetName}: {percent}%");
                        };
                        Action overAllProgress = () => {
                            completed++;
                            reportProgressAction?.Invoke($"OVERALL: {completed}/{total}");
                        };

                        var task = Task.Run(async() => {
                            var url = string.Empty;

                            if (isInputAsset)
                            {
                                url = api.DownloadRunArtifact(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, path: asset.RelativePath).ToString();
                            }
                            else
                            {
                                url = api.GetRunOutput(runInfo.Project.Owner.Name, runInfo.Project.Name, runInfo.RunID, assetName).ToString();
                            }

                            Helper.Logger.Information($"DownloadAssets: downloading {assetName} from \n  -{url}\n");
                            var t = Helper.DownloadUrlAsync(url, dir, individualProgress, overAllProgress, cancelToken);
                            await t.ConfigureAwait(false);
                            var path = t.Result;
                            Helper.Logger.Information($"DownloadAssets: saved {assetName} to {path}");
                            return(path);
                        });
                        tasks.Add(task);
                    }
                    else
                    {
                        tasks.Add(Task.Run(() => asset.LocalPath));
                        completed++;
                    }
                }
                catch (Exception e)
                {
                    //canceled by user
                    if (e is OperationCanceledException)
                    {
                        return(null);
                    }

                    throw new ArgumentException($"Failed to download asset {asset.Name}.\n -{e.Message}");
                }
            }
            return(tasks);
        }