fix: answer ModifyInstanceAttribute with no or several attributes with InvalidParameterCombination

This commit is contained in:
Julian Sommer
2026-10-06 11:05:43 +10:00
parent a69ed27dc4
commit c395722344
2 changed files with 29 additions and 11 deletions
@@ -16,7 +16,8 @@ import (
)
// ValidateModifyInstanceAttributeInput validates the input constraints for ModifyInstanceAttribute.
// AWS rejects calls with multiple attributes set in a single request.
// AWS answers InvalidParameterCombination when no attribute, or more than one,
// is set in a single request.
func ValidateModifyInstanceAttributeInput(input *ec2.ModifyInstanceAttributeInput) error {
if input == nil {
return errors.New(awserrors.ErrorInvalidParameterValue)
@@ -41,8 +42,11 @@ func ValidateModifyInstanceAttributeInput(input *ec2.ModifyInstanceAttributeInpu
if input.DisableApiTermination != nil {
count++
}
if count != 1 {
return errors.New(awserrors.ErrorInvalidParameterValue)
switch {
case count == 0:
return awserrors.Errorf(awserrors.ErrorInvalidParameterCombination, "No attributes specified.")
case count > 1:
return awserrors.Errorf(awserrors.ErrorInvalidParameterCombination, "The request must contain a single attribute")
}
if input.InstanceType != nil && (input.InstanceType.Value == nil || *input.InstanceType.Value == "") {
@@ -48,13 +48,20 @@ func TestValidateModifyInstanceAttributeInput_BadPrefix(t *testing.T) {
assert.Equal(t, awserrors.ErrorInvalidInstanceIDMalformed, err.Error())
}
func assertSingleAttributeError(t *testing.T, err error, wantMessage string) {
t.Helper()
code, message, ok := awserrors.ResolveErrorDetail(err)
require.True(t, ok)
assert.Equal(t, awserrors.ErrorInvalidParameterCombination, code)
assert.Equal(t, wantMessage, message)
}
func TestValidateModifyInstanceAttributeInput_NoAttributeSet(t *testing.T) {
t.Parallel()
err := ValidateModifyInstanceAttributeInput(&ec2.ModifyInstanceAttributeInput{
InstanceId: aws.String("i-abc123"),
})
require.Error(t, err)
assert.Equal(t, awserrors.ErrorInvalidParameterValue, err.Error())
assertSingleAttributeError(t, err, "No attributes specified.")
}
func TestValidateModifyInstanceAttributeInput_MultipleAttributes(t *testing.T) {
@@ -64,8 +71,7 @@ func TestValidateModifyInstanceAttributeInput_MultipleAttributes(t *testing.T) {
InstanceType: &ec2.AttributeValue{Value: aws.String("t3.micro")},
UserData: &ec2.BlobAttributeValue{Value: []byte("data")},
})
require.Error(t, err)
assert.Equal(t, awserrors.ErrorInvalidParameterValue, err.Error())
assertSingleAttributeError(t, err, "The request must contain a single attribute")
}
func TestValidateModifyInstanceAttributeInput_EmptyInstanceType(t *testing.T) {
@@ -122,8 +128,7 @@ func TestValidateModifyInstanceAttributeInput_DisableApiTerminationWithOther(t *
DisableApiTermination: &ec2.AttributeBooleanValue{Value: aws.Bool(true)},
InstanceType: &ec2.AttributeValue{Value: aws.String("t3.micro")},
})
require.Error(t, err)
assert.Equal(t, awserrors.ErrorInvalidParameterValue, err.Error())
assertSingleAttributeError(t, err, "The request must contain a single attribute")
}
func TestValidateModifyInstanceAttributeInput_ValidSourceDestCheck(t *testing.T) {
@@ -142,8 +147,17 @@ func TestValidateModifyInstanceAttributeInput_SourceDestCheckWithOtherAttribute(
SourceDestCheck: &ec2.AttributeBooleanValue{Value: aws.Bool(false)},
InstanceType: &ec2.AttributeValue{Value: aws.String("t3.micro")},
})
require.Error(t, err)
assert.Equal(t, awserrors.ErrorInvalidParameterValue, err.Error())
assertSingleAttributeError(t, err, "The request must contain a single attribute")
}
func TestValidateModifyInstanceAttributeInput_SourceDestCheckWithDisableApiTermination(t *testing.T) {
t.Parallel()
err := ValidateModifyInstanceAttributeInput(&ec2.ModifyInstanceAttributeInput{
InstanceId: aws.String("i-abc123"),
SourceDestCheck: &ec2.AttributeBooleanValue{Value: aws.Bool(false)},
DisableApiTermination: &ec2.AttributeBooleanValue{Value: aws.Bool(true)},
})
assertSingleAttributeError(t, err, "The request must contain a single attribute")
}
// --- Gateway function tests ---