using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Amazon.Common.DotNetCli.Tools; using Amazon.Common.DotNetCli.Tools.Options; using Amazon.Lambda.Model; using ThirdParty.Json.LitJson; namespace Amazon.Lambda.Tools.Commands { /// /// List the all of the versions of a Lambda layer. /// public class ListLayerVersionsCommand : LambdaBaseCommand { public const string COMMAND_NAME = "list-layer-versions"; public const string COMMAND_DESCRIPTION = "Command to list versions for a Layer"; public const string COMMAND_ARGUMENTS = " The name of the layer"; const int TIMESTAMP_WIDTH = 20; const int LAYER_ARN_WIDTH = 30; const int LAYER_COMPATIBLE_RUNTIMES_WIDTH = 30; const int LAYER_DESCRIPTION_WIDTH = 40; public static readonly IList ListCommandOptions = BuildLineOptions(new List { LambdaDefinedCommandOptions.ARGUMENT_LAYER_NAME }); public ListLayerVersionsCommand(IToolLogger logger, string workingDirectory, string[] args) : base(logger, workingDirectory, ListCommandOptions, args) { } public string LayerName { get; set; } protected override void ParseCommandArguments(CommandOptions values) { base.ParseCommandArguments(values); if (values.Arguments.Count > 0) { this.LayerName = values.Arguments[0]; } Tuple tuple; if ((tuple = values.FindCommandOption(LambdaDefinedCommandOptions.ARGUMENT_LAYER_NAME.Switch)) != null) this.LayerName = tuple.Item2.StringValue; } protected override async Task PerformActionAsync() { var layerName = this.GetStringValueOrDefault(this.LayerName, LambdaDefinedCommandOptions.ARGUMENT_LAYER_NAME, true); this.Logger.WriteLine("Description".PadRight(LAYER_DESCRIPTION_WIDTH) + " " + "Compatible Runtimes".PadRight(LAYER_COMPATIBLE_RUNTIMES_WIDTH) + " " + "Created".PadRight(TIMESTAMP_WIDTH) + " " + "Latest Version ARN".PadRight(LAYER_ARN_WIDTH) ); this.Logger.WriteLine($"{new string('-', LAYER_DESCRIPTION_WIDTH)} {new string('-', LAYER_COMPATIBLE_RUNTIMES_WIDTH)} {new string('-', TIMESTAMP_WIDTH)} {new string('-', LAYER_ARN_WIDTH)}"); var request = new ListLayerVersionsRequest { LayerName = layerName}; ListLayerVersionsResponse response = null; do { request.Marker = response?.NextMarker; try { response = await this.LambdaClient.ListLayerVersionsAsync(request); } catch (Exception e) { throw new LambdaToolsException("Error listing versions for Lambda layer: " + e.Message, LambdaToolsException.LambdaErrorCode.LambdaListLayerVersions, e); } foreach (var layerVersion in response.LayerVersions) { this.Logger.WriteLine( LambdaUtilities.DetermineListDisplayLayerDescription(layerVersion.Description, LAYER_DESCRIPTION_WIDTH).PadRight(LAYER_DESCRIPTION_WIDTH) + " " + string.Join(", ", layerVersion.CompatibleRuntimes.ToArray()).PadRight(LAYER_COMPATIBLE_RUNTIMES_WIDTH) + " " + DateTime.Parse(layerVersion.CreatedDate).ToString("g").PadRight(TIMESTAMP_WIDTH) + " " + layerVersion.LayerVersionArn ); } } while (!string.IsNullOrEmpty(response.NextMarker)); return true; } protected override void SaveConfigFile(JsonData data) { } } }