Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aws_eks_addon with custom configuration_values #28295

Merged
merged 10 commits into from
Dec 15, 2022
7 changes: 7 additions & 0 deletions .changelog/28295.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:enhancement
resource/aws_eks_addon: Add `configuration_values` argument
```

```release-note:enhancement
data-source/aws_eks_addon: Add `configuration_values` attribute
```
16 changes: 15 additions & 1 deletion internal/service/eks/addon.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ func ResourceAddon() *schema.Resource {
ForceNew: true,
ValidateFunc: validClusterName,
},
"configuration_values": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -120,6 +125,10 @@ func resourceAddonCreate(ctx context.Context, d *schema.ResourceData, meta inter
input.ServiceAccountRoleArn = aws.String(v.(string))
}

if v, ok := d.GetOk("configuration_values"); ok {
input.ConfigurationValues = aws.String(v.(string))
}

if len(tags) > 0 {
input.Tags = Tags(tags.IgnoreAWS())
}
Expand Down Expand Up @@ -198,6 +207,7 @@ func resourceAddonRead(ctx context.Context, d *schema.ResourceData, meta interfa
d.Set("addon_version", addon.AddonVersion)
d.Set("arn", addon.AddonArn)
d.Set("cluster_name", addon.ClusterName)
d.Set("configuration_values", addon.ConfigurationValues)
d.Set("created_at", aws.TimeValue(addon.CreatedAt).Format(time.RFC3339))
d.Set("modified_at", aws.TimeValue(addon.ModifiedAt).Format(time.RFC3339))
d.Set("service_account_role_arn", addon.ServiceAccountRoleArn)
Expand Down Expand Up @@ -225,7 +235,7 @@ func resourceAddonUpdate(ctx context.Context, d *schema.ResourceData, meta inter
return diag.FromErr(err)
}

if d.HasChanges("addon_version", "service_account_role_arn") {
if d.HasChanges("addon_version", "service_account_role_arn", "configuration_values") {
input := &eks.UpdateAddonInput{
AddonName: aws.String(addonName),
ClientRequestToken: aws.String(resource.UniqueId()),
Expand All @@ -236,6 +246,10 @@ func resourceAddonUpdate(ctx context.Context, d *schema.ResourceData, meta inter
input.AddonVersion = aws.String(d.Get("addon_version").(string))
}

if d.HasChange("configuration_values") {
input.ConfigurationValues = aws.String(d.Get("configuration_values").(string))
}

if v, ok := d.GetOk("resolve_conflicts"); ok {
input.ResolveConflicts = aws.String(v.(string))
}
Expand Down
5 changes: 5 additions & 0 deletions internal/service/eks/addon_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ func DataSourceAddon() *schema.Resource {
Required: true,
ValidateFunc: validClusterName,
},
"configuration_values": {
vara-bonthu marked this conversation as resolved.
Show resolved Hide resolved
Type: schema.TypeString,
Computed: true,
},
"created_at": {
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -69,6 +73,7 @@ func dataSourceAddonRead(ctx context.Context, d *schema.ResourceData, meta inter
d.SetId(id)
d.Set("addon_version", addon.AddonVersion)
d.Set("arn", addon.AddonArn)
d.Set("configuration_values", addon.ConfigurationValues)
vara-bonthu marked this conversation as resolved.
Show resolved Hide resolved
d.Set("created_at", aws.TimeValue(addon.CreatedAt).Format(time.RFC3339))
d.Set("modified_at", aws.TimeValue(addon.ModifiedAt).Format(time.RFC3339))
d.Set("service_account_role_arn", addon.ServiceAccountRoleArn)
Expand Down
63 changes: 55 additions & 8 deletions internal/service/eks/addon_data_source_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package eks_test

import (
"context"
"fmt"
"regexp"
"testing"

"github.com/aws/aws-sdk-go/service/eks"
Expand All @@ -13,12 +11,10 @@ import (
)

func TestAccEKSAddonDataSource_basic(t *testing.T) {
var addon eks.Addon
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
dataSourceResourceName := "data.aws_eks_addon.test"
resourceName := "aws_eks_addon.test"
addonName := "vpc-cni"
ctx := context.Background()

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t); testAccPreCheckAddon(t) },
Expand All @@ -29,13 +25,42 @@ func TestAccEKSAddonDataSource_basic(t *testing.T) {
{
Config: testAccAddonDataSourceConfig_basic(rName, addonName),
Check: resource.ComposeTestCheckFunc(
testAccCheckAddonExists(ctx, dataSourceResourceName, &addon),
acctest.MatchResourceAttrRegionalARN(dataSourceResourceName, "arn", "eks", regexp.MustCompile(fmt.Sprintf("addon/%s/%s/.+$", rName, addonName))),
resource.TestCheckResourceAttrPair(resourceName, "arn", dataSourceResourceName, "arn"),
resource.TestCheckResourceAttrPair(resourceName, "addon_version", dataSourceResourceName, "addon_version"),
resource.TestCheckResourceAttrPair(resourceName, "arn", dataSourceResourceName, "arn"),
resource.TestCheckResourceAttrPair(resourceName, "configuration_values", dataSourceResourceName, "configuration_values"),
resource.TestCheckResourceAttrPair(resourceName, "created_at", dataSourceResourceName, "created_at"),
resource.TestCheckResourceAttrPair(resourceName, "modified_at", dataSourceResourceName, "modified_at"),
resource.TestCheckResourceAttrPair(resourceName, "service_account_role_arn", dataSourceResourceName, "service_account_role_arn"),
resource.TestCheckResourceAttrPair(resourceName, "tags.%", dataSourceResourceName, "tags.%"),
),
},
},
})
}

func TestAccEKSAddonDataSource_configurationValues(t *testing.T) {
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
dataSourceResourceName := "data.aws_eks_addon.test"
resourceName := "aws_eks_addon.test"
addonName := "vpc-cni"
addonVersion := "v1.10.4-eksbuild.1"
configurationValues := "{\"env\": {\"WARM_ENI_TARGET\":\"2\",\"ENABLE_POD_ENI\":\"true\"},\"resources\": {\"limits\":{\"cpu\":\"100m\",\"memory\":\"100Mi\"},\"requests\":{\"cpu\":\"100m\",\"memory\":\"100Mi\"}}}"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t); testAccPreCheckAddon(t) },
ErrorCheck: acctest.ErrorCheck(t, eks.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckAddonDestroy,
Steps: []resource.TestStep{
{
Config: testAccAddonDataSourceConfig_configurationValues(rName, addonName, addonVersion, configurationValues, eks.ResolveConflictsOverwrite),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair(resourceName, "addon_version", dataSourceResourceName, "addon_version"),
resource.TestCheckResourceAttrPair(resourceName, "arn", dataSourceResourceName, "arn"),
resource.TestCheckResourceAttrPair(resourceName, "configuration_values", dataSourceResourceName, "configuration_values"),
resource.TestCheckResourceAttrPair(resourceName, "created_at", dataSourceResourceName, "created_at"),
resource.TestCheckResourceAttrPair(resourceName, "modified_at", dataSourceResourceName, "modified_at"),
resource.TestCheckResourceAttrPair(resourceName, "service_account_role_arn", dataSourceResourceName, "service_account_role_arn"),
resource.TestCheckResourceAttrPair(resourceName, "tags.%", dataSourceResourceName, "tags.%"),
),
},
Expand All @@ -44,7 +69,7 @@ func TestAccEKSAddonDataSource_basic(t *testing.T) {
}

func testAccAddonDataSourceConfig_basic(rName, addonName string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
addon_name = %[2]q
cluster_name = aws_eks_cluster.test.name
Expand All @@ -61,3 +86,25 @@ data "aws_eks_addon" "test" {
}
`, rName, addonName))
}

func testAccAddonDataSourceConfig_configurationValues(rName, addonName, addonVersion, configurationValues, resolveConflicts string) string {
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
addon_version = %[3]q
configuration_values = %[4]q
resolve_conflicts = %[5]q
}

data "aws_eks_addon" "test" {
addon_name = %[2]q
cluster_name = aws_eks_cluster.test.name

depends_on = [
aws_eks_addon.test,
aws_eks_cluster.test,
]
}
`, rName, addonName, addonVersion, configurationValues, resolveConflicts))
}
84 changes: 75 additions & 9 deletions internal/service/eks/addon_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@ func TestAccEKSAddon_basic(t *testing.T) {
Steps: []resource.TestStep{
{
Config: testAccAddonConfig_basic(rName, addonName),
Check: resource.ComposeTestCheckFunc(
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckAddonExists(ctx, addonResourceName, &addon),
resource.TestCheckResourceAttr(addonResourceName, "addon_name", addonName),
resource.TestCheckResourceAttrSet(addonResourceName, "addon_version"),
acctest.MatchResourceAttrRegionalARN(addonResourceName, "arn", "eks", regexp.MustCompile(fmt.Sprintf("addon/%s/%s/.+$", rName, addonName))),
resource.TestCheckResourceAttrPair(addonResourceName, "cluster_name", clusterResourceName, "name"),
resource.TestCheckResourceAttr(addonResourceName, "configuration_values", ""),
resource.TestCheckNoResourceAttr(addonResourceName, "preserve"),
resource.TestCheckResourceAttr(addonResourceName, "tags.%", "0"),
),
Expand Down Expand Up @@ -246,6 +247,59 @@ func TestAccEKSAddon_serviceAccountRoleARN(t *testing.T) {
})
}

func TestAccEKSAddon_configurationValues(t *testing.T) {
vara-bonthu marked this conversation as resolved.
Show resolved Hide resolved
var addon eks.Addon
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
resourceName := "aws_eks_addon.test"
configurationValues := "{\"env\": {\"WARM_ENI_TARGET\":\"2\",\"ENABLE_POD_ENI\":\"true\"},\"resources\": {\"limits\":{\"cpu\":\"100m\",\"memory\":\"100Mi\"},\"requests\":{\"cpu\":\"100m\",\"memory\":\"100Mi\"}}}"
updateConfigurationValues := "{\"env\": {\"WARM_ENI_TARGET\":\"2\",\"ENABLE_POD_ENI\":\"true\"},\"resources\": {\"limits\":{\"cpu\":\"200m\",\"memory\":\"150Mi\"},\"requests\":{\"cpu\":\"200m\",\"memory\":\"150Mi\"}}}"
emptyConfigurationValues := "{}"
invalidConfigurationValues := "{\"env\": {\"INVALID_FIELD\":\"2\"}}"
addonName := "vpc-cni"
addonVersion := "v1.10.4-eksbuild.1"
ctx := context.Background()

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t); testAccPreCheckAddon(t) },
ErrorCheck: acctest.ErrorCheck(t, eks.EndpointsID),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckAddonDestroy,
Steps: []resource.TestStep{
vara-bonthu marked this conversation as resolved.
Show resolved Hide resolved
{
Config: testAccAddonConfig_configurationValues(rName, addonName, addonVersion, configurationValues, eks.ResolveConflictsOverwrite),
Check: resource.ComposeTestCheckFunc(
testAccCheckAddonExists(ctx, resourceName, &addon),
resource.TestCheckResourceAttr(resourceName, "configuration_values", configurationValues),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"resolve_conflicts"},
},
{
Config: testAccAddonConfig_configurationValues(rName, addonName, addonVersion, updateConfigurationValues, eks.ResolveConflictsOverwrite),
Check: resource.ComposeTestCheckFunc(
testAccCheckAddonExists(ctx, resourceName, &addon),
resource.TestCheckResourceAttr(resourceName, "configuration_values", updateConfigurationValues),
),
},
{
Config: testAccAddonConfig_configurationValues(rName, addonName, addonVersion, emptyConfigurationValues, eks.ResolveConflictsOverwrite),
Check: resource.ComposeTestCheckFunc(
testAccCheckAddonExists(ctx, resourceName, &addon),
resource.TestCheckResourceAttr(resourceName, "configuration_values", emptyConfigurationValues),
),
},
{
Config: testAccAddonConfig_configurationValues(rName, addonName, addonVersion, invalidConfigurationValues, eks.ResolveConflictsOverwrite),
ExpectError: regexp.MustCompile(`InvalidParameterException: ConfigurationValue provided in request is not supported`),
},
},
})
}

func TestAccEKSAddon_tags(t *testing.T) {
var addon1, addon2, addon3 eks.Addon
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
Expand Down Expand Up @@ -754,7 +808,7 @@ func testAccCheckAddonUpdateTags(addon *eks.Addon, oldTags, newTags map[string]s
}
}

func testAccAddonBaseConfig(rName string) string {
func testAccAddonConfig_base(rName string) string {
return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(`
data "aws_partition" "current" {}

Expand Down Expand Up @@ -818,7 +872,7 @@ resource "aws_eks_cluster" "test" {
}

func testAccAddonConfig_basic(rName, addonName string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -827,7 +881,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_version(rName, addonName, addonVersion string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -838,7 +892,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_preserve(rName, addonName string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -848,7 +902,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_resolveConflicts(rName, addonName, resolveConflicts string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -858,7 +912,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_serviceAccountRoleARN(rName, addonName string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_iam_role" "test-service-role" {
name = "test-service-role"
assume_role_policy = <<EOF
Expand Down Expand Up @@ -887,7 +941,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_tags1(rName, addonName, tagKey1, tagValue1 string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -900,7 +954,7 @@ resource "aws_eks_addon" "test" {
}

func testAccAddonConfig_tags2(rName, addonName, tagKey1, tagValue1, tagKey2, tagValue2 string) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
Expand All @@ -912,3 +966,15 @@ resource "aws_eks_addon" "test" {
}
`, rName, addonName, tagKey1, tagValue1, tagKey2, tagValue2))
}

func testAccAddonConfig_configurationValues(rName, addonName, addonVersion, configurationValues, resolveConflicts string) string {
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
resource "aws_eks_addon" "test" {
cluster_name = aws_eks_cluster.test.name
addon_name = %[2]q
addon_version = %[3]q
configuration_values = %[4]q
resolve_conflicts = %[5]q
}
`, rName, addonName, addonVersion, configurationValues, resolveConflicts))
}
2 changes: 1 addition & 1 deletion internal/service/eks/addon_version_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func TestAccEKSAddonVersionDataSource_basic(t *testing.T) {
}

func testAccAddonVersionDataSourceConfig_basic(rName, addonName string, mostRecent bool) string {
return acctest.ConfigCompose(testAccAddonBaseConfig(rName), fmt.Sprintf(`
return acctest.ConfigCompose(testAccAddonConfig_base(rName), fmt.Sprintf(`
data "aws_eks_addon_version" "test" {
addon_name = %[2]q
kubernetes_version = aws_eks_cluster.test.version
Expand Down
1 change: 1 addition & 0 deletions website/docs/d/eks_addon.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ In addition to all arguments above, the following attributes are exported:

* `arn` - ARN of the EKS add-on.
* `addon_version` - Version of EKS add-on.
* `configuration_values` - Configuration values for the addon with a single JSON string.
* `service_account_role_arn` - ARN of IAM role used for EKS add-on. If value is empty -
then add-on uses the IAM role assigned to the EKS Cluster node.
* `id` - EKS Cluster name and EKS add-on name separated by a colon (`:`).
Expand Down
Loading