diff --git a/pkg/runtime/util.go b/pkg/runtime/util.go index 81faca5..425ab18 100644 --- a/pkg/runtime/util.go +++ b/pkg/runtime/util.go @@ -209,11 +209,18 @@ func NeedAdoption(res acktypes.AWSResource) bool { func ExtractAdoptionFields(res acktypes.AWSResource) (map[string]string, error) { fields := getAdoptionFields(res) + if fields == "" { + return nil, fmt.Errorf( + "services.k8s.aws/adoption-fields annotation is required when " + + "adoption-policy is set to 'adopt'; please provide the resource " + + "identifier fields as a JSON object (e.g. '{\"name\": \"my-resource\"}')", + ) + } extractedFields := &map[string]string{} err := json.Unmarshal([]byte(fields), extractedFields) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to parse services.k8s.aws/adoption-fields annotation as JSON: %w", err) } return *extractedFields, nil diff --git a/pkg/runtime/util_test.go b/pkg/runtime/util_test.go index 52e7875..4a8e8cd 100644 --- a/pkg/runtime/util_test.go +++ b/pkg/runtime/util_test.go @@ -14,6 +14,7 @@ package runtime import ( + "strings" "testing" "github.com/stretchr/testify/require" @@ -118,3 +119,33 @@ func TestExtractAdoptionFields(t *testing.T) { require.NoError(err) require.Equal(expected, actual) } + +func TestExtractAdoptionFields_EmptyFields(t *testing.T) { + require := require.New(t) + + // No adoption-fields annotation at all + res := &mocks.AWSResource{} + res.On("MetaObject").Return(&metav1.ObjectMeta{ + Annotations: map[string]string{}, + }) + + _, err := ExtractAdoptionFields(res) + require.Error(err) + require.True(strings.Contains(err.Error(), "services.k8s.aws/adoption-fields annotation is required")) + require.True(strings.Contains(err.Error(), "adoption-policy is set to 'adopt'")) +} + +func TestExtractAdoptionFields_InvalidJSON(t *testing.T) { + require := require.New(t) + + res := &mocks.AWSResource{} + res.On("MetaObject").Return(&metav1.ObjectMeta{ + Annotations: map[string]string{ + ackv1alpha1.AnnotationAdoptionFields: `not valid json`, + }, + }) + + _, err := ExtractAdoptionFields(res) + require.Error(err) + require.True(strings.Contains(err.Error(), "failed to parse services.k8s.aws/adoption-fields annotation as JSON")) +}