static int Run <TOption>(TOption option, string[] args, Func <TaskCtx <TOption>, Task <ExitCode> > task) where TOption : CommonOption { var cfg = Setup.LoadCfg().Result; if (option.Parallel.HasValue) { cfg.App.DefaultParallel = cfg.App.ParallelChannels = option.Parallel.Value; } using var log = Setup.CreateLogger(cfg.App); var envLog = log.ForContext("Env", cfg.Root.Env); try { if (option.LaunchContainer) { YtContainerRunner.Start(envLog, cfg, args.Where(a => a != "-z").ToArray()).Wait(); return((int)ExitCode.Success); } return((int)task(new TaskCtx <TOption> { Cfg = cfg, Log = envLog, Option = option, OriginalArgs = args }).Result); } catch (Exception ex) { var flatEx = ex switch { AggregateException a => a.Flatten(), _ => ex }; envLog.Error(flatEx, "Unhandled error: {Error}", flatEx.Message); return((int)ExitCode.UnknownError); } }
static async Task <string> YtCli(IMSLogger funcLogger, string[] args) { var s = await Init(funcLogger); s.Log.Information("Function Update started"); IContainerGroup g; try { g = await YtContainerRunner.Start(s.Log, s.Cfg, args); } catch (Exception ex) { s.Log.Error("Error starting container to update data {Error}", ex.Message, ex); throw; } var started = DateTime.Now; g.Refresh(); var log = await g.GetLogContentAsync(g.Name); s.Log.Information("Started container '{ProvisionState}' '{State}': {LogContent}", g.ProvisioningState, g.State, log); return($"Started container, last in state '{g.State}'"); }
static int Collect(CollectOption c, string[] args) { var cfg = Setup.LoadCfg().Result; UpdateCfgFromOptions(cfg, c); using (var log = Setup.CreateCliLogger(cfg.App)) { if (c.LaunchContainer) { YtContainerRunner.Start(log, cfg, new[] { "collect" }.Concat(args.Where(a => a != "-z")).ToArray()).Wait(); } else { var ytCollect = new YtCollect(cfg.YtStore(log), cfg.DataStore(cfg.App.Storage.AnalysisPath), cfg.App, log); ytCollect.SaveChannelRelationData().Wait(); } } return((int)ExitCode.Success); }