Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ var (
func main() {

log.SetOutput(os.Stderr)
log.SetPrefix("NOTE: ")
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))

shortUsage := "A tool to filter EC2 Instance Types based on various resource criteria"
longUsage := binName + ` is a CLI tool to filter EC2 instance types based on resource criteria.
Expand Down Expand Up @@ -232,7 +234,7 @@ Full docs can be found at github.com/aws/amazon-` + binName
outputFlag := cli.StringMe(flags[output])
outputFn := getOutputFn(outputFlag, selector.InstanceTypesOutputFn(resultsOutputFn))

instanceTypes, err := instanceSelector.FilterWithOutput(filters, outputFn)
instanceTypes, itemsTruncated, err := instanceSelector.FilterWithOutput(filters, outputFn)
if err != nil {
fmt.Printf("An error occurred when filtering instance types: %v", err)
os.Exit(1)
Expand All @@ -245,6 +247,10 @@ Full docs can be found at github.com/aws/amazon-` + binName
for _, instanceType := range instanceTypes {
fmt.Println(instanceType)
}

if itemsTruncated > 0 {
log.Printf("%d entries were truncated, increase --%s to see more", itemsTruncated, maxResults)
}
}

func getOutputFn(outputFlag *string, currentFn selector.InstanceTypesOutputFn) selector.InstanceTypesOutputFn {
Expand Down
19 changes: 10 additions & 9 deletions pkg/selector/selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ func New(sess *session.Session) *Selector {
// matching the criteria within Filters and returns a simple list of instance type strings
func (itf Selector) Filter(filters Filters) ([]string, error) {
outputFn := InstanceTypesOutputFn(outputs.SimpleInstanceTypeOutput)
return itf.FilterWithOutput(filters, outputFn)
output, _, err := itf.FilterWithOutput(filters, outputFn)
return output, err
}

// FilterVerbose accepts a Filters struct which is used to select the available instance types
Expand All @@ -91,31 +92,31 @@ func (itf Selector) FilterVerbose(filters Filters) ([]*ec2.InstanceTypeInfo, err
if err != nil {
return nil, err
}
instanceTypeInfoSlice = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice)
instanceTypeInfoSlice, _ = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice)
return instanceTypeInfoSlice, nil
}

// FilterWithOutput accepts a Filters struct which is used to select the available instance types
// matching the criteria within Filters and returns a list of strings based on the custom outputFn
func (itf Selector) FilterWithOutput(filters Filters, outputFn InstanceTypesOutput) ([]string, error) {
func (itf Selector) FilterWithOutput(filters Filters, outputFn InstanceTypesOutput) ([]string, int, error) {
instanceTypeInfoSlice, err := itf.rawFilter(filters)
if err != nil {
return nil, err
return nil, 0, err
}
instanceTypeInfoSlice = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice)
instanceTypeInfoSlice, numOfItemsTruncated := itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice)
output := outputFn.Output(instanceTypeInfoSlice)
return output, nil
return output, numOfItemsTruncated, nil
}

func (itf Selector) truncateResults(maxResults *int, instanceTypeInfoSlice []*ec2.InstanceTypeInfo) []*ec2.InstanceTypeInfo {
func (itf Selector) truncateResults(maxResults *int, instanceTypeInfoSlice []*ec2.InstanceTypeInfo) ([]*ec2.InstanceTypeInfo, int) {
if maxResults == nil {
return instanceTypeInfoSlice
return instanceTypeInfoSlice, 0
}
upperIndex := *maxResults
if *maxResults > len(instanceTypeInfoSlice) {
upperIndex = len(instanceTypeInfoSlice)
}
return instanceTypeInfoSlice[0:upperIndex]
return instanceTypeInfoSlice[0:upperIndex], len(instanceTypeInfoSlice) - upperIndex
}

// AggregateFilterTransform takes higher level filters which are used to affect multiple raw filters in an opinionated way.
Expand Down