using System.CommandLine; using System.CommandLine.Parsing; using ScadaLink.Commons.Messages.Management; namespace ScadaLink.CLI.Commands; public static class DeployCommands { public static Command Build(Option contactPointsOption, Option formatOption, Option usernameOption, Option passwordOption) { var command = new Command("deploy") { Description = "Deployment operations" }; command.Add(BuildInstance(contactPointsOption, formatOption, usernameOption, passwordOption)); command.Add(BuildArtifacts(contactPointsOption, formatOption, usernameOption, passwordOption)); command.Add(BuildStatus(contactPointsOption, formatOption, usernameOption, passwordOption)); return command; } private static Command BuildInstance(Option contactPointsOption, Option formatOption, Option usernameOption, Option passwordOption) { var idOption = new Option("--id") { Description = "Instance ID", Required = true }; var cmd = new Command("instance") { Description = "Deploy a single instance" }; cmd.Add(idOption); cmd.SetAction(async (ParseResult result) => { var id = result.GetValue(idOption); return await CommandHelpers.ExecuteCommandAsync( result, contactPointsOption, formatOption, usernameOption, passwordOption, new MgmtDeployInstanceCommand(id)); }); return cmd; } private static Command BuildArtifacts(Option contactPointsOption, Option formatOption, Option usernameOption, Option passwordOption) { var siteIdOption = new Option("--site-id") { Description = "Target site ID (all sites if omitted)" }; var cmd = new Command("artifacts") { Description = "Deploy artifacts to site(s)" }; cmd.Add(siteIdOption); cmd.SetAction(async (ParseResult result) => { var siteId = result.GetValue(siteIdOption); return await CommandHelpers.ExecuteCommandAsync( result, contactPointsOption, formatOption, usernameOption, passwordOption, new MgmtDeployArtifactsCommand(siteId)); }); return cmd; } private static Command BuildStatus(Option contactPointsOption, Option formatOption, Option usernameOption, Option passwordOption) { var instanceIdOption = new Option("--instance-id") { Description = "Filter by instance ID" }; var statusOption = new Option("--status") { Description = "Filter by status" }; var pageOption = new Option("--page") { Description = "Page number" }; pageOption.DefaultValueFactory = _ => 1; var pageSizeOption = new Option("--page-size") { Description = "Page size" }; pageSizeOption.DefaultValueFactory = _ => 50; var cmd = new Command("status") { Description = "Query deployment status" }; cmd.Add(instanceIdOption); cmd.Add(statusOption); cmd.Add(pageOption); cmd.Add(pageSizeOption); cmd.SetAction(async (ParseResult result) => { var instanceId = result.GetValue(instanceIdOption); var status = result.GetValue(statusOption); var page = result.GetValue(pageOption); var pageSize = result.GetValue(pageSizeOption); return await CommandHelpers.ExecuteCommandAsync( result, contactPointsOption, formatOption, usernameOption, passwordOption, new QueryDeploymentsCommand(instanceId, status, page, pageSize)); }); return cmd; } }