public static async Task <OpulenceConfig?> ReadConfigAsync(OutputContext output, string directoryPath) { if (output is null) { throw new ArgumentNullException(nameof(output)); } if (directoryPath is null) { throw new ArgumentNullException(nameof(directoryPath)); } output.WriteDebugLine($"searching for opulence.json above '{directoryPath}'"); var configFilePath = DirectorySearch.AscendingSearch(directoryPath, "opulence.json"); if (configFilePath == null) { output.WriteDebugLine("no configuration found"); return(null); } output.WriteDebugLine($"configuration found at '{configFilePath}'"); using var stream = File.OpenRead(configFilePath); return(await JsonSerializer.DeserializeAsync <OpulenceConfig>(stream)); }
private static async Task ExecuteAsync(OutputContext output, DirectoryInfo directory) { var opulenceFilePath = DirectorySearch.AscendingSearch(directory.FullName, "opulence.json"); if (opulenceFilePath != null) { output.WriteInfoLine($"found 'opulence.json' at '{Path.GetDirectoryName(opulenceFilePath)}'"); return; } output.WriteInfoLine("locating nearest sln file"); var solutionFilePath = DirectorySearch.AscendingWildcardSearch(directory.FullName, "*.sln").FirstOrDefault()?.FullName; if (opulenceFilePath == null && solutionFilePath != null && Confirm(output, $"use '{Path.GetDirectoryName(solutionFilePath)}' as root?")) { opulenceFilePath = Path.Combine(Path.GetDirectoryName(solutionFilePath) !, "opulence.json"); } if (opulenceFilePath == null && Confirm(output, "use project directory as root?")) { opulenceFilePath = Path.Combine(directory.FullName, "opulence.json"); } if (opulenceFilePath == null) { throw new CommandException("cannot determine root directory"); } var config = new OpulenceConfig() { Container = new ContainerConfig() { Registry = new RegistryConfig(), } }; while (true) { output.WriteAlways("entry the container registry hostname (ex: example.azurecr.io): "); var line = Console.ReadLine(); output.WriteAlwaysLine(string.Empty); if (!string.IsNullOrEmpty(line)) { config.Container.Registry.Hostname = line.Trim(); break; } } using var stream = File.OpenWrite(opulenceFilePath); await JsonSerializer.SerializeAsync(stream, config, new JsonSerializerOptions() { WriteIndented = true, }); output.WriteInfo($"initialized opulence config at '{opulenceFilePath}'"); }
public static async Task <ApplicationWrapper?> RunCustomizationScriptAsync(OutputContext output, FileInfo projectFile) { if (output is null) { throw new ArgumentNullException(nameof(output)); } using (var step = output.BeginStep("Applying Application Customizations...")) { var scriptFilePath = DirectorySearch.AscendingSearch(projectFile.DirectoryName, "Opulence.csx"); output.WriteDebugLine($"Looking for customization script above '{projectFile}'."); if (!File.Exists(scriptFilePath)) { output.WriteDebugLine($"No customization script found."); step.MarkComplete("Skipping..."); return(null); } output.WriteInfoLine($"Configuring application using '{Path.GetFileName(scriptFilePath)}'."); var code = File.ReadAllText(scriptFilePath); var script = CSharpScript.Create <object>( code, options: ScriptOptions.Default.WithImports(new [] { "System", "System.Collections.Generic", }), globalsType: typeof(PipelineHolder), assemblyLoader: null); script = script.ContinueWith <object>(@"return await Pipeline.ExecuteAsync(__Pipeline);", options: ScriptOptions.Default); output.WriteDebugLine($"Compiling {Path.GetFileName(scriptFilePath)}'."); script.Compile(); var diagnostics = script.Compile(); if (diagnostics.Length > 0) { var builder = new StringBuilder(); output.WriteDebugLine($"Script '{scriptFilePath}' had compilation errors."); builder.AppendLine($"Script '{scriptFilePath}' had compilation errors."); foreach (var diagnostic in diagnostics) { output.WriteDebugLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic)); builder.AppendLine(CSharpDiagnosticFormatter.Instance.Format(diagnostic)); } throw new CommandException(builder.ToString()); } output.WriteDebugLine($"Done compiling {Path.GetFileName(scriptFilePath)}'."); var pipeline = new CustomizationPipeline( output, rootDirectory: Path.GetDirectoryName(scriptFilePath) !, name: Names.NormalizeToDns(Path.GetFileNameWithoutExtension(projectFile.Name)), solution: null, projectFile); var holder = new PipelineHolder(pipeline); output.WriteDebugLine($"Running {Path.GetFileName(scriptFilePath)}'."); object obj; try { var result = await script.RunAsync(holder); obj = result.ReturnValue; } catch (Exception ex) { throw new CommandException($"Failed executing {Path.GetFileName(scriptFilePath)}'.", ex); } step.MarkComplete(); return(new ApplicationWrapper(obj, Path.GetDirectoryName(scriptFilePath) !)); } }
private static async Task ExecuteAsync(OutputContext output, DirectoryInfo directory) { output.WriteBanner(); string?solutionFilePath = null; string?opulenceFilePath = null; using (var step = output.BeginStep("Looking For Existing Config...")) { opulenceFilePath = DirectorySearch.AscendingSearch(directory.FullName, "Opulence.csx"); if (opulenceFilePath != null) { output.WriteInfoLine($"Found 'Opulence.csx' at '{opulenceFilePath}'"); step.MarkComplete(); return; } else { output.WriteInfoLine("Not Found"); step.MarkComplete(); } } using (var step = output.BeginStep("Looking For .sln File...")) { solutionFilePath = DirectorySearch.AscendingWildcardSearch(directory.FullName, "*.sln").FirstOrDefault()?.FullName; if (opulenceFilePath == null && solutionFilePath != null && output.Confirm($"Use '{Path.GetDirectoryName(solutionFilePath)}' as Root?")) { opulenceFilePath = Path.Combine(Path.GetDirectoryName(solutionFilePath) !, "Opulence.csx"); step.MarkComplete(); } else { output.WriteInfoLine("Not Found."); step.MarkComplete(); } } if (opulenceFilePath == null && Path.GetFullPath(directory.FullName) != Path.GetFullPath(Environment.CurrentDirectory)) { // User specified a directory other than the current one using (var step = output.BeginStep("Trying Project Directory...")) { if (output.Confirm("Use Project Directory as Root?")) { opulenceFilePath = Path.Combine(directory.FullName, "Opulence.csx"); } step.MarkComplete(); } } if (opulenceFilePath == null) { using (var step = output.BeginStep("Trying Current Directory...")) { if (output.Confirm("Use Current Directory as Root?")) { opulenceFilePath = Path.Combine(directory.FullName, "Opulence.csx"); } step.MarkComplete(); } } if (opulenceFilePath == null) { throw new CommandException("Cannot Determine Root Directory."); } using (var step = output.BeginStep("Writing Opulence.csx ...")) { var hostname = output.Prompt("Enter the Container Registry (ex: 'example.azurecr.io' for Azure or 'example' for dockerhub)"); var services = new List <(string, string)>(); if (solutionFilePath != null && output.Confirm($"Use solution file '{solutionFilePath}' to initialize services?")) { services.AddRange(ReadServicesFromSolution(solutionFilePath)); services.Sort((a, b) => a.Item1.CompareTo(b.Item1)); } using var stream = File.OpenWrite(opulenceFilePath); using var writer = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true); await WriteOpulenceConfigAsync(writer, hostname, services); output.WriteInfoLine($"Initialized Opulence Config at '{opulenceFilePath}'."); step.MarkComplete(); } }