diff --git a/internal/gorson/io/io.go b/internal/gorson/io/io.go index 33d1c99..164586e 100644 --- a/internal/gorson/io/io.go +++ b/internal/gorson/io/io.go @@ -212,38 +212,64 @@ func find(slice []*string, val *string) (int, bool) { } // deleteFromParameterStore deletes parameters at a given path from parameter store -func deleteFromParameterStore(parameters []string, path util.ParameterStorePath, client ssmiface.SSMAPI) ([]string, error) { +func deleteFromParameterStore(parameters []string, path util.ParameterStorePath, client ssmiface.SSMAPI) (deletedParams []string, err error) { + deletedParams = []string{} + fullPathParameters := make([]*string, len(parameters)) for idx, parameter := range parameters { fullPathParameter := fmt.Sprintf("%s%s", path.String(), parameter) fullPathParameters[idx] = &fullPathParameter } - deleteParametersInput := ssm.DeleteParametersInput{ - Names: fullPathParameters, + var chunkSize int + var chunkedParameters [][]*string + + for { + if len(fullPathParameters) == 0 { + break + } + + if len(fullPathParameters) < 10 { + chunkSize = len(fullPathParameters) + } else { + chunkSize = 10 + } + + chunkedParameters = append(chunkedParameters, fullPathParameters[0:chunkSize]) + fullPathParameters = fullPathParameters[chunkSize:] } - output, err := client.DeleteParameters(&deleteParametersInput) + for _, params := range chunkedParameters { + deleteParametersInput := ssm.DeleteParametersInput{ + Names: params, + } + + output, err := client.DeleteParameters(&deleteParametersInput) - if len(output.DeletedParameters) != len(parameters) { - fmt.Println("Some parameters failed to delete:") - for _, parameter := range fullPathParameters { - idx, found := find(output.DeletedParameters, parameter) - if !found { - fmt.Println(*output.DeletedParameters[idx]) + if err != nil { + fmt.Println(err) + } + + if len(output.DeletedParameters) != len(params) { + fmt.Println("Some parameters failed to delete:") + for _, parameter := range params { + _, found := find(output.DeletedParameters, parameter) + if !found { + fmt.Println(parameter) + } } } - } - if len(output.InvalidParameters) != 0 { - fmt.Println("Some parameters failed to delete due to being invalid:") - for _, invalidParameter := range output.InvalidParameters { - fmt.Println(*invalidParameter) + + if len(output.InvalidParameters) != 0 { + fmt.Println("Some parameters failed to delete due to being invalid:") + for _, invalidParameter := range output.InvalidParameters { + fmt.Println(*invalidParameter) + } } - } - deletedParams := []string{} - for _, deletedParam := range output.DeletedParameters { - deletedParams = append(deletedParams, *deletedParam) + for _, deletedParam := range output.DeletedParameters { + deletedParams = append(deletedParams, *deletedParam) + } } return deletedParams, err diff --git a/internal/gorson/io/io_test.go b/internal/gorson/io/io_test.go index 035ba37..7efb93e 100644 --- a/internal/gorson/io/io_test.go +++ b/internal/gorson/io/io_test.go @@ -381,6 +381,244 @@ func TestDeleteDeltaFromParameterStore(t *testing.T) { "/path/paramTwo", }, }, + // Twenty things to delete + { + FileParams: map[string]string{}, + GetParamsRetVal: mockedGetParametersByPathReturnPair{ + Resp: ssm.GetParametersByPathOutput{ + Parameters: []*ssm.Parameter{ + { + Name: aws.String("paramOne"), + Value: aws.String("valueOne"), + }, + { + Name: aws.String("paramTwo"), + Value: aws.String("valueTwo"), + }, + { + Name: aws.String("paramThree"), + Value: aws.String("valueThree"), + }, + { + Name: aws.String("paramFour"), + Value: aws.String("valueFour"), + }, + { + Name: aws.String("paramFive"), + Value: aws.String("valueFive"), + }, + { + Name: aws.String("paramSix"), + Value: aws.String("valueSix"), + }, + { + Name: aws.String("paramSeven"), + Value: aws.String("valueSeven"), + }, + { + Name: aws.String("paramEight"), + Value: aws.String("valueEight"), + }, + { + Name: aws.String("paramNine"), + Value: aws.String("valueNine"), + }, + { + Name: aws.String("paramTen"), + Value: aws.String("valueTen"), + }, + { + Name: aws.String("paramEleven"), + Value: aws.String("valueEleven"), + }, + { + Name: aws.String("paramTwelve"), + Value: aws.String("valueTwelve"), + }, + { + Name: aws.String("paramThirteen"), + Value: aws.String("valueThirteen"), + }, + { + Name: aws.String("paramFourteen"), + Value: aws.String("valueFourteen"), + }, + { + Name: aws.String("paramFifteen"), + Value: aws.String("valueFifteen"), + }, + { + Name: aws.String("paramSixteen"), + Value: aws.String("valueSixteen"), + }, + { + Name: aws.String("paramSeventeen"), + Value: aws.String("valueSeventeen"), + }, + { + Name: aws.String("paramEighteen"), + Value: aws.String("valueEighteen"), + }, + { + Name: aws.String("paramNineteen"), + Value: aws.String("valueNineteen"), + }, + { + Name: aws.String("paramTwenty"), + Value: aws.String("valueTwenty"), + }, + }, + }, + Err: nil, + }, + DeleteSuccessful: true, + Expected: []string{ + "/path/paramOne", + "/path/paramTwo", + "/path/paramThree", + "/path/paramFour", + "/path/paramFive", + "/path/paramSix", + "/path/paramSeven", + "/path/paramEight", + "/path/paramNine", + "/path/paramTen", + "/path/paramEleven", + "/path/paramTwelve", + "/path/paramThirteen", + "/path/paramFourteen", + "/path/paramFifteen", + "/path/paramSixteen", + "/path/paramSeventeen", + "/path/paramEighteen", + "/path/paramNineteen", + "/path/paramTwenty", + }, + }, + // Twenty-two things to delete + { + FileParams: map[string]string{}, + GetParamsRetVal: mockedGetParametersByPathReturnPair{ + Resp: ssm.GetParametersByPathOutput{ + Parameters: []*ssm.Parameter{ + { + Name: aws.String("paramOne"), + Value: aws.String("valueOne"), + }, + { + Name: aws.String("paramTwo"), + Value: aws.String("valueTwo"), + }, + { + Name: aws.String("paramThree"), + Value: aws.String("valueThree"), + }, + { + Name: aws.String("paramFour"), + Value: aws.String("valueFour"), + }, + { + Name: aws.String("paramFive"), + Value: aws.String("valueFive"), + }, + { + Name: aws.String("paramSix"), + Value: aws.String("valueSix"), + }, + { + Name: aws.String("paramSeven"), + Value: aws.String("valueSeven"), + }, + { + Name: aws.String("paramEight"), + Value: aws.String("valueEight"), + }, + { + Name: aws.String("paramNine"), + Value: aws.String("valueNine"), + }, + { + Name: aws.String("paramTen"), + Value: aws.String("valueTen"), + }, + { + Name: aws.String("paramEleven"), + Value: aws.String("valueEleven"), + }, + { + Name: aws.String("paramTwelve"), + Value: aws.String("valueTwelve"), + }, + { + Name: aws.String("paramThirteen"), + Value: aws.String("valueThirteen"), + }, + { + Name: aws.String("paramFourteen"), + Value: aws.String("valueFourteen"), + }, + { + Name: aws.String("paramFifteen"), + Value: aws.String("valueFifteen"), + }, + { + Name: aws.String("paramSixteen"), + Value: aws.String("valueSixteen"), + }, + { + Name: aws.String("paramSeventeen"), + Value: aws.String("valueSeventeen"), + }, + { + Name: aws.String("paramEighteen"), + Value: aws.String("valueEighteen"), + }, + { + Name: aws.String("paramNineteen"), + Value: aws.String("valueNineteen"), + }, + { + Name: aws.String("paramTwenty"), + Value: aws.String("valueTwenty"), + }, + { + Name: aws.String("paramTwentyOne"), + Value: aws.String("valueTwentyOne"), + }, + { + Name: aws.String("paramTwentyTwo"), + Value: aws.String("valueTwentyTwo"), + }, + }, + }, + Err: nil, + }, + DeleteSuccessful: true, + Expected: []string{ + "/path/paramOne", + "/path/paramTwo", + "/path/paramThree", + "/path/paramFour", + "/path/paramFive", + "/path/paramSix", + "/path/paramSeven", + "/path/paramEight", + "/path/paramNine", + "/path/paramTen", + "/path/paramEleven", + "/path/paramTwelve", + "/path/paramThirteen", + "/path/paramFourteen", + "/path/paramFifteen", + "/path/paramSixteen", + "/path/paramSeventeen", + "/path/paramEighteen", + "/path/paramNineteen", + "/path/paramTwenty", + "/path/paramTwentyOne", + "/path/paramTwentyTwo", + }, + }, } path := util.NewParameterStorePath("/path/")