/*******************************************************************************
* Copyright 2012-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
*
* AWS Tools for Windows (TM) PowerShell (TM)
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using Amazon.PowerShell.Common;
using Amazon.Runtime;
using Amazon.EC2;
using Amazon.EC2.Model;
namespace Amazon.PowerShell.Cmdlets.EC2
{
///
/// Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the
/// images available to you.
///
///
///
/// The images available to you include public images, private images that you own, and
/// private images owned by other Amazon Web Services accounts for which you have explicit
/// launch permissions.
///
/// Recently deregistered images appear in the returned results for a short interval and
/// then return empty results. After all instances that reference a deregistered AMI are
/// terminated, specifying the ID of the image will eventually return an error indicating
/// that the AMI ID cannot be found.
///
This cmdlet automatically pages all available results to the pipeline - parameters related to iteration are only needed if you want to manually control the paginated output. To disable autopagination, use -NoAutoIteration.
///
[Cmdlet("Get", "EC2Image")]
[OutputType("Amazon.EC2.Model.Image")]
[AWSCmdlet("Calls the Amazon Elastic Compute Cloud (EC2) DescribeImages API operation.", Operation = new[] {"DescribeImages"}, SelectReturnType = typeof(Amazon.EC2.Model.DescribeImagesResponse))]
[AWSCmdletOutput("Amazon.EC2.Model.Image or Amazon.EC2.Model.DescribeImagesResponse",
"This cmdlet returns a collection of Amazon.EC2.Model.Image objects.",
"The service call response (type Amazon.EC2.Model.DescribeImagesResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack."
)]
public partial class GetEC2ImageCmdlet : AmazonEC2ClientCmdlet, IExecutor
{
#region Parameter ExecutableUser
///
///
/// Scopes the images by users with explicit launch permissions. Specify an Amazon Web
/// Services account ID, self
(the sender of the request), or all
/// (public AMIs).- If you specify an Amazon Web Services account ID that is not your own, only AMIs shared
/// with that specific Amazon Web Services account ID are returned. However, AMIs that
/// are shared with the account’s organization or organizational unit (OU) are not returned.
- If you specify
self
or your own Amazon Web Services account ID, AMIs
/// shared with your account are returned. In addition, AMIs that are shared with the
/// organization or OU of which you are member are also returned. - If you specify
all
, all public AMIs are returned.
///
///
[System.Management.Automation.Parameter(Position = 2, ValueFromPipelineByPropertyName = true)]
[Alias("ExecutableBy","ExecutableUsers")]
public System.String[] ExecutableUser { get; set; }
#endregion
#region Parameter Filter
///
///
/// The filters.architecture
- The image architecture (i386
| x86_64
/// | arm64
| x86_64_mac
| arm64_mac
).block-device-mapping.delete-on-termination
- A Boolean value that indicates
/// whether the Amazon EBS volume is deleted on instance termination.block-device-mapping.device-name
- The device name specified in the
/// block device mapping (for example, /dev/sdh
or xvdh
).block-device-mapping.snapshot-id
- The ID of the snapshot used for the
/// Amazon EBS volume.block-device-mapping.volume-size
- The volume size of the Amazon EBS
/// volume, in GiB.block-device-mapping.volume-type
- The volume type of the Amazon EBS
/// volume (io1
| io2
| gp2
| gp3
/// | sc1
| st1
| standard
).block-device-mapping.encrypted
- A Boolean that indicates whether the
/// Amazon EBS volume is encrypted.creation-date
- The time when the image was created, in the ISO 8601
/// format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example, 2021-09-29T11:04:43.305Z
.
/// You can use a wildcard (*
), for example, 2021-09-29T*
, which
/// matches an entire day.description
- The description of the image (provided during image creation).ena-support
- A Boolean that indicates whether enhanced networking with
/// ENA is enabled.hypervisor
- The hypervisor type (ovm
| xen
).image-id
- The ID of the image.image-type
- The image type (machine
| kernel
/// | ramdisk
).is-public
- A Boolean that indicates whether the image is public.kernel-id
- The kernel ID.manifest-location
- The location of the image manifest.name
- The name of the AMI (provided during image creation).owner-alias
- The owner alias (amazon
| aws-marketplace
).
/// The valid aliases are defined in an Amazon-maintained list. This is not the Amazon
/// Web Services account alias that can be set using the IAM console. We recommend that
/// you use the Owner request parameter instead of this filter.owner-id
- The Amazon Web Services account ID of the owner. We recommend
/// that you use the Owner request parameter instead of this filter.platform
- The platform. The only supported value is windows
.product-code
- The product code.product-code.type
- The type of the product code (marketplace
).ramdisk-id
- The RAM disk ID.root-device-name
- The device name of the root device volume (for example,
/// /dev/sda1
).root-device-type
- The type of the root device volume (ebs
/// | instance-store
).state
- The state of the image (available
| pending
/// | failed
).state-reason-code
- The reason code for the state change.state-reason-message
- The message for the state change.sriov-net-support
- A value of simple
indicates that enhanced
/// networking with the Intel 82599 VF interface is enabled.tag
:<key> - The key/value combination of a tag assigned to the
/// resource. Use the tag key in the filter name and the tag value as the filter value.
/// For example, to find all resources that have a tag with the key Owner
/// and the value TeamA
, specify tag:Owner
for the filter name
/// and TeamA
for the filter value.tag-key
- The key of a tag assigned to the resource. Use this filter
/// to find all resources assigned a tag with a specific key, regardless of the tag value.virtualization-type
- The virtualization type (paravirtual
/// | hvm
).
///
///
[System.Management.Automation.Parameter(Position = 3, ValueFromPipelineByPropertyName = true)]
[Alias("Filters")]
public Amazon.EC2.Model.Filter[] Filter { get; set; }
#endregion
#region Parameter ImageId
///
///
/// The image IDs.Default: Describes all images available to you.
///
///
[System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
[Alias("ImageIds")]
public System.String[] ImageId { get; set; }
#endregion
#region Parameter IncludeDeprecated
///
///
/// Specifies whether to include deprecated AMIs.Default: No deprecated AMIs are included in the response.If you are the AMI owner, all deprecated AMIs appear in the response regardless of
/// what you specify for this parameter.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.Boolean? IncludeDeprecated { get; set; }
#endregion
#region Parameter Owner
///
///
/// Scopes the results to images with the specified owners. You can specify a combination
/// of Amazon Web Services account IDs, self
, amazon
, and aws-marketplace
.
/// If you omit this parameter, the results include all images for which you have launch
/// permissions, regardless of ownership.
///
///
[System.Management.Automation.Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]
[Alias("Owners")]
public System.String[] Owner { get; set; }
#endregion
#region Parameter MaxResult
///
///
/// The maximum number of items to return for this request. To get the next page of items,
/// make another request with the token returned in the output. For more information,
/// see Pagination.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
[Alias("MaxResults")]
public System.Int32? MaxResult { get; set; }
#endregion
#region Parameter NextToken
///
///
/// The token returned from a previous paginated request. Pagination continues from the
/// end of the items returned by the previous request.
///
///
///
Note: This parameter is only used if you are manually controlling output pagination of the service API call.
///
In order to manually control output pagination, use '-NextToken $null' for the first call and '-NextToken $AWSHistory.LastServiceResponse.NextToken' for subsequent calls.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public System.String NextToken { get; set; }
#endregion
#region Parameter Select
///
/// Use the -Select parameter to control the cmdlet output. The default value is 'Images'.
/// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.EC2.Model.DescribeImagesResponse).
/// Specifying the name of a property of type Amazon.EC2.Model.DescribeImagesResponse will result in that property being returned.
/// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public string Select { get; set; } = "Images";
#endregion
#region Parameter PassThru
///
/// Changes the cmdlet behavior to return the value passed to the ImageId parameter.
/// The -PassThru parameter is deprecated, use -Select '^ImageId' instead. This parameter will be removed in a future version.
///
[System.Obsolete("The -PassThru parameter is deprecated, use -Select '^ImageId' instead. This parameter will be removed in a future version.")]
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter PassThru { get; set; }
#endregion
#region Parameter NoAutoIteration
///
/// By default the cmdlet will auto-iterate and retrieve all results to the pipeline by performing multiple
/// service calls. If set, the cmdlet will retrieve only the next 'page' of results using the value of NextToken
/// as the start point.
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
public SwitchParameter NoAutoIteration { get; set; }
#endregion
protected override void ProcessRecord()
{
this._AWSSignerType = "v4";
base.ProcessRecord();
var context = new CmdletContext();
// allow for manipulation of parameters prior to loading into context
PreExecutionContextLoad(context);
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (ParameterWasBound(nameof(this.Select)))
{
context.Select = CreateSelectDelegate(Select) ??
throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select));
if (this.PassThru.IsPresent)
{
throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select));
}
}
else if (this.PassThru.IsPresent)
{
context.Select = (response, cmdlet) => this.ImageId;
}
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
if (this.ExecutableUser != null)
{
context.ExecutableUser = new List(this.ExecutableUser);
}
if (this.Filter != null)
{
context.Filter = new List(this.Filter);
}
if (this.ImageId != null)
{
context.ImageId = new List(this.ImageId);
}
context.IncludeDeprecated = this.IncludeDeprecated;
context.MaxResult = this.MaxResult;
context.NextToken = this.NextToken;
if (this.Owner != null)
{
context.Owner = new List(this.Owner);
}
// allow further manipulation of loaded context prior to processing
PostExecutionContextLoad(context);
var output = Execute(context) as CmdletOutput;
ProcessOutput(output);
}
#region IExecutor Members
public object Execute(ExecutorContext context)
{
var cmdletContext = context as CmdletContext;
#pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
var useParameterSelect = this.Select.StartsWith("^") || this.PassThru.IsPresent;
#pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
// create request and set iteration invariants
var request = new Amazon.EC2.Model.DescribeImagesRequest();
if (cmdletContext.ExecutableUser != null)
{
request.ExecutableUsers = cmdletContext.ExecutableUser;
}
if (cmdletContext.Filter != null)
{
request.Filters = cmdletContext.Filter;
}
if (cmdletContext.ImageId != null)
{
request.ImageIds = cmdletContext.ImageId;
}
if (cmdletContext.IncludeDeprecated != null)
{
request.IncludeDeprecated = cmdletContext.IncludeDeprecated.Value;
}
if (cmdletContext.MaxResult != null)
{
request.MaxResults = cmdletContext.MaxResult.Value;
}
if (cmdletContext.Owner != null)
{
request.Owners = cmdletContext.Owner;
}
// Initialize loop variant and commence piping
var _nextToken = cmdletContext.NextToken;
var _userControllingPaging = this.NoAutoIteration.IsPresent || ParameterWasBound(nameof(this.NextToken));
var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
do
{
request.NextToken = _nextToken;
CmdletOutput output;
try
{
var response = CallAWSServiceOperation(client, request);
object pipelineOutput = null;
if (!useParameterSelect)
{
pipelineOutput = cmdletContext.Select(response, this);
}
output = new CmdletOutput
{
PipelineOutput = pipelineOutput,
ServiceResponse = response
};
_nextToken = response.NextToken;
}
catch (Exception e)
{
output = new CmdletOutput { ErrorResponse = e };
}
ProcessOutput(output);
} while (!_userControllingPaging && AutoIterationHelpers.HasValue(_nextToken));
if (useParameterSelect)
{
WriteObject(cmdletContext.Select(null, this));
}
return null;
}
public ExecutorContext CreateContext()
{
return new CmdletContext();
}
#endregion
#region AWS Service Operation Call
private Amazon.EC2.Model.DescribeImagesResponse CallAWSServiceOperation(IAmazonEC2 client, Amazon.EC2.Model.DescribeImagesRequest request)
{
Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "Amazon Elastic Compute Cloud (EC2)", "DescribeImages");
try
{
#if DESKTOP
return client.DescribeImages(request);
#elif CORECLR
return client.DescribeImagesAsync(request).GetAwaiter().GetResult();
#else
#error "Unknown build edition"
#endif
}
catch (AmazonServiceException exc)
{
var webException = exc.InnerException as System.Net.WebException;
if (webException != null)
{
throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException);
}
throw;
}
}
#endregion
internal partial class CmdletContext : ExecutorContext
{
public List ExecutableUser { get; set; }
public List Filter { get; set; }
public List ImageId { get; set; }
public System.Boolean? IncludeDeprecated { get; set; }
public System.Int32? MaxResult { get; set; }
public System.String NextToken { get; set; }
public List Owner { get; set; }
public System.Func Select { get; set; } =
(response, cmdlet) => response.Images;
}
}
}