Skip to content

Commit

Permalink
update: get ssm-parameter lists params in account, new --path option (
Browse files Browse the repository at this point in the history
  • Loading branch information
aaroniscode authored Jun 23, 2024
1 parent ab97e27 commit af680a9
Show file tree
Hide file tree
Showing 8 changed files with 179 additions and 37 deletions.
2 changes: 1 addition & 1 deletion pkg/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/aws/smithy-go"
)

const maxPages = 10
const maxPages = 30

// Return cleaner error message for service API errors
func FormatError(err error) error {
Expand Down
18 changes: 18 additions & 0 deletions pkg/aws/ssm.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,24 @@ func (c *SSMClient) DescribeInstanceInformation(instanceId string) ([]types.Inst
return instances, nil
}

func (c *SSMClient) DescribeParameters() ([]types.ParameterMetadata, error) {
parameters := []types.ParameterMetadata{}
pageNum := 0

paginator := ssm.NewDescribeParametersPaginator(c.Client, &ssm.DescribeParametersInput{})

for paginator.HasMorePages() && pageNum < maxPages {
out, err := paginator.NextPage(context.Background())
if err != nil {
return nil, err
}
parameters = append(parameters, out.Parameters...)
pageNum++
}

return parameters, nil
}

func (c *SSMClient) DescribeSessions(id, state string) ([]types.Session, error) {
filters := []types.SessionFilter{}
sessions := []types.Session{}
Expand Down
21 changes: 21 additions & 0 deletions pkg/printer/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,24 @@ func (p *TablePrinter) Print(writer io.Writer) {
table.AppendBulk(p.data)
table.Render()
}

func (p *TablePrinter) TruncateBeginning(text string, max int) string {
if len(text) > max {
return "..." + text[len(text)-max+3:]
}
return text
}

func (p *TablePrinter) TruncateMiddle(text string, max int) string {
if len(text) > max {
return text[:max/2-1] + "..." + text[len(text)-max/2+1:]
}
return text
}

func (p *TablePrinter) TruncateMiddleWithEllipsisLocation(text string, ellipisLocation, max int) string {
if len(text) > max {
return text[:ellipisLocation-1] + "..." + text[len(text)-max+ellipisLocation+2:]
}
return text
}
65 changes: 37 additions & 28 deletions pkg/resource/ssm/parameter/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package parameter

import (
"errors"
"fmt"
"os"
"sort"

Expand All @@ -26,18 +27,43 @@ func (g *Getter) Init() {
}
}

func (g *Getter) Get(pathOrName string, output printer.Output, _ resource.Options) error {
params, err := g.GetByPathOrName(pathOrName)
if err != nil {
return err
func (g *Getter) Get(name string, output printer.Output, o resource.Options) error {
options, ok := o.(*Options)
if !ok {
return fmt.Errorf("internal error, unable to cast options to parameter.Options")
}

// Show recently updated Parameters at the end of the list
sort.Slice(params, func(i, j int) bool {
return params[i].LastModifiedDate.Before(awssdk.ToTime(params[j].LastModifiedDate))
})
switch {
case options.Path != "":
params, err := g.GetByPath(options.Path)
if err != nil {
return err
}
// Show recently updated Parameters at the end of the list
sort.Slice(params, func(i, j int) bool {
return params[i].LastModifiedDate.Before(awssdk.ToTime(params[j].LastModifiedDate))
})
return output.Print(os.Stdout, NewPrinter(params))

case name != "":
param, err := g.GetByName(name)
var rnfe *types.ParameterNotFound
if err != nil {
if errors.As(err, &rnfe) {
return fmt.Errorf("ssm-parameter name %q not found", name)
}
return err
}
return output.Print(os.Stdout, NewPrinter([]types.Parameter{*param}))

default:
params, err := g.ssmClient.DescribeParameters()
if err != nil {
return err
}
return output.Print(os.Stdout, NewMetadataPrinter(params))
}

return output.Print(os.Stdout, NewPrinter(params))
}

func (g *Getter) GetByName(name string) (*types.Parameter, error) {
Expand All @@ -48,27 +74,10 @@ func (g *Getter) GetByName(name string) (*types.Parameter, error) {
return param, nil
}

func (g *Getter) GetByPathOrName(pathOrName string) ([]types.Parameter, error) {
func (g *Getter) GetByPath(pathOrName string) ([]types.Parameter, error) {
params, err := g.ssmClient.GetParametersByPath(pathOrName)
if err != nil {
return nil, err
}

if len(params) > 0 {
return params, nil
}

param, err := g.ssmClient.GetParameter(pathOrName)

// Return all errors except NotFound
var rnfe *types.ParameterNotFound
if err != nil && !errors.As(err, &rnfe) {
return nil, err
}

if param != nil {
return []types.Parameter{*param}, nil
}

return nil, nil
return params, nil
}
49 changes: 49 additions & 0 deletions pkg/resource/ssm/parameter/metadata_printer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package parameter

import (
"io"
"strconv"
"time"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ssm/types"
"github.com/awslabs/eksdemo/pkg/printer"
"github.com/hako/durafmt"
)

type MetadataPrinter struct {
params []types.ParameterMetadata
}

func NewMetadataPrinter(params []types.ParameterMetadata) *MetadataPrinter {
return &MetadataPrinter{params}
}

func (p *MetadataPrinter) PrintTable(writer io.Writer) error {
table := printer.NewTablePrinter()
table.SetHeader([]string{"Age", "Name", "Tier", "Type", "Ver"})

for _, param := range p.params {
age := durafmt.ParseShort(time.Since(aws.ToTime(param.LastModifiedDate)))

table.AppendRow([]string{
age.String(),
table.TruncateMiddleWithEllipsisLocation(aws.ToString(param.Name), 20, 80),
string(param.Tier),
aws.ToString(param.DataType),
strconv.Itoa(int(param.Version)),
})
}

table.Print(writer)

return nil
}

func (p *MetadataPrinter) PrintJSON(writer io.Writer) error {
return printer.EncodeJSON(writer, p.params)
}

func (p *MetadataPrinter) PrintYAML(writer io.Writer) error {
return printer.EncodeYAML(writer, p.params)
}
40 changes: 40 additions & 0 deletions pkg/resource/ssm/parameter/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package parameter

import (
"github.com/awslabs/eksdemo/pkg/cmd"
"github.com/awslabs/eksdemo/pkg/resource"
"github.com/spf13/cobra"
)

type Options struct {
resource.CommonOptions

// Get
Path string
}

func newOptions() (options *Options, getFlags cmd.Flags) {
options = &Options{
CommonOptions: resource.CommonOptions{
ClusterFlagDisabled: true,
},
}

getFlags = cmd.Flags{
&cmd.StringFlag{
CommandFlag: cmd.CommandFlag{
Name: "path",
Description: "get parameters by path, instead of name",
Validate: func(_ *cobra.Command, args []string) error {
if options.Path != "" && len(args) > 0 {
return &cmd.ArgumentAndFlagCantBeUsedTogetherError{Arg: "PARAMETER_NAME", Flag: "path"}
}
return nil
},
},
Option: &options.Path,
},
}

return
}
11 changes: 7 additions & 4 deletions pkg/resource/ssm/parameter/printer.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,17 @@ func NewPrinter(params []types.Parameter) *Printer {
func (p *Printer) PrintTable(writer io.Writer) error {
table := printer.NewTablePrinter()
table.SetHeader([]string{"Age", "Name", "Value"})
table.SetColumnAlignment([]int{
printer.ALIGN_LEFT, printer.ALIGN_LEFT, printer.ALIGN_LEFT,
})

for _, p := range p.params {
age := durafmt.ParseShort(time.Since(aws.ToTime(p.LastModifiedDate)))
for _, param := range p.params {
age := durafmt.ParseShort(time.Since(aws.ToTime(param.LastModifiedDate)))

table.AppendRow([]string{
age.String(),
aws.ToString(p.Name),
aws.ToString(p.Value),
table.TruncateMiddleWithEllipsisLocation(aws.ToString(param.Name), 20, 80),
table.TruncateMiddle(aws.ToString(param.Value), 25),
})
}

Expand Down
10 changes: 6 additions & 4 deletions pkg/resource/ssm/parameter/ssm_parameter.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,20 @@ import (
)

func NewResource() *resource.Resource {
options, getFlags := newOptions()

return &resource.Resource{
Command: cmd.Command{
Name: "ssm-parameter",
Description: "SSM Parameter",
Aliases: []string{"ssm-parameters", "ssm-params", "ssm-param", "params", "param"},
Args: []string{"PATH_OR_NAME"},
Args: []string{"PARAMETER_NAME"},
},

GetFlags: getFlags,

Getter: &Getter{},

Options: &resource.CommonOptions{
ClusterFlagDisabled: true,
},
Options: options,
}
}

0 comments on commit af680a9

Please sign in to comment.