in pkg/providers/amifamily/ami.go [85:156]
func (p *DefaultProvider) DescribeImageQueries(ctx context.Context, nodeClass *v1.EC2NodeClass) ([]DescribeImageQuery, error) {
// Aliases are mutually exclusive, both on the term level and field level within a term.
// This is enforced by a CEL validation, we will treat this as an invariant.
if alias := nodeClass.Alias(); alias != nil {
kubernetesVersion := p.versionProvider.Get(ctx)
query, err := GetAMIFamily(alias.Family, nil).DescribeImageQuery(ctx, p.ssmProvider, kubernetesVersion, alias.Version)
if err != nil {
return []DescribeImageQuery{}, err
}
return []DescribeImageQuery{query}, nil
}
idFilter := ec2types.Filter{Name: aws.String("image-id")}
queries := []DescribeImageQuery{}
for _, term := range nodeClass.Spec.AMISelectorTerms {
switch {
case term.ID != "":
idFilter.Values = append(idFilter.Values, term.ID)
case term.SSMParameter != "":
imageID, err := p.ssmProvider.Get(ctx, ssm.Parameter{
Name: term.SSMParameter,
Type: ssm.CustomParameterType,
})
if err != nil {
if !errors.IsNotFound(err) {
return []DescribeImageQuery{}, fmt.Errorf("resolving ssm parameter, %w", err)
}
log.FromContext(ctx).WithValues("ssmParameter", term.SSMParameter).V(1).Error(err, "parameter not found")
continue
}
if !strings.HasPrefix(imageID, "ami-") {
log.FromContext(ctx).WithValues("ssmParameter", term.SSMParameter, "id", imageID).V(1).Error(nil, "parameter value is an invalid AMI ID")
continue
}
idFilter.Values = append(idFilter.Values, imageID)
default:
query := DescribeImageQuery{
Owners: lo.Ternary(term.Owner != "", []string{term.Owner}, []string{}),
}
if term.Name != "" {
// Default owners to self,amazon to ensure Karpenter only discovers cross-account AMIs if the user specifically allows it.
// Removing this default would cause Karpenter to discover publicly shared AMIs passing the name filter.
query = DescribeImageQuery{
Owners: lo.Ternary(term.Owner != "", []string{term.Owner}, []string{"self", "amazon"}),
}
query.Filters = append(query.Filters, ec2types.Filter{
Name: aws.String("name"),
Values: []string{term.Name},
})
}
for k, v := range term.Tags {
if v == "*" {
query.Filters = append(query.Filters, ec2types.Filter{
Name: aws.String("tag-key"),
Values: []string{k},
})
} else {
query.Filters = append(query.Filters, ec2types.Filter{
Name: aws.String(fmt.Sprintf("tag:%s", k)),
Values: []string{v},
})
}
}
queries = append(queries, query)
}
}
if len(idFilter.Values) > 0 {
queries = append(queries, DescribeImageQuery{Filters: []ec2types.Filter{idFilter}})
}
return queries, nil
}