Skip to content

Commit 535535f

Browse files
authored
Resource identity support in SDKv2 Resources (#2751)
This commit adds ResourceIdentity support to the following SDKv2 resources: * kubernetes_secret_v1 * kubernetes_namespace_v1 * kubernetes_service_account_v1 * kubernetes_service_v1 * kubernetes_pod_v1 * kubernetes_deployment_v1 * kubernetes_stateful_set_v1 * kubernetes_daemon_set_v1 * kubernetes_job_v1 * kubernetes_cron_job_v1 * kubernetes_horizontal_pod_autoscaler_v2 * kubernetes_ingress_v1 * kubernetes_ingress_class_v1 * kubernetes_network_policy_v1 * kubernetes_mutating_webhook_configuration_v1 * kubernetes_validating_webhook_configuration_v1 * kubernetes_cluster_role_v1 * kubernetes_cluster_role_binding_v1 * kubernetes_role_binding_v1 * kubernetes_role_v1
1 parent db9abdf commit 535535f

File tree

44 files changed

+1253
-112
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1253
-112
lines changed

.changelog/2751.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
Add support for ResourceIdentity to SDKv2 resources
3+
```

.github/workflows/checkers-and-linters.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
go-version-file: 'go.mod'
2222
# Secrets are not available on pull requests.
2323
- name: Login to Docker Hub
24-
if: github.ref == 'refs/heads/main'
24+
if: ${{ github.event_name != 'pull_request' }}
2525
uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0
2626
with:
2727
username: ${{ secrets.RO_DOCKERHUB_USER }}

kubernetes/resource_kubernetes_cluster_role_binding_v1.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func resourceKubernetesClusterRoleBindingV1() *schema.Resource {
2323
UpdateContext: resourceKubernetesClusterRoleBindingV1Update,
2424
DeleteContext: resourceKubernetesClusterRoleBindingV1Delete,
2525
Importer: &schema.ResourceImporter{
26-
StateContext: schema.ImportStatePassthroughContext,
26+
StateContext: resourceIdentityImportNonNamespaced,
2727
},
28-
28+
Identity: resourceIdentitySchemaNonNamespaced(),
2929
Schema: map[string]*schema.Schema{
3030
"metadata": metadataSchemaRBAC("clusterRoleBinding", true, false),
3131
"role_ref": {
@@ -65,7 +65,6 @@ func resourceKubernetesClusterRoleBindingV1Create(ctx context.Context, d *schema
6565
}
6666
log.Printf("[INFO] Creating new ClusterRoleBinding: %#v", binding)
6767
binding, err = conn.RbacV1().ClusterRoleBindings().Create(ctx, binding, metav1.CreateOptions{})
68-
6968
if err != nil {
7069
return diag.FromErr(err)
7170
}
@@ -117,6 +116,11 @@ func resourceKubernetesClusterRoleBindingV1Read(ctx context.Context, d *schema.R
117116
return diag.FromErr(err)
118117
}
119118

119+
err = setResourceIdentityNonNamespaced(d, "rbac.authorization.k8s.io/v1", "ClusterRoleBinding", name)
120+
if err != nil {
121+
return diag.FromErr(err)
122+
}
123+
120124
return nil
121125
}
122126

kubernetes/resource_kubernetes_cluster_role_binding_v1_test.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414
"github.com/hashicorp/terraform-plugin-testing/terraform"
1515
rbacv1 "k8s.io/api/rbac/v1"
1616
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
18+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
19+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
20+
"github.com/hashicorp/terraform-plugin-testing/tfversion"
1721
)
1822

1923
func TestAccKubernetesClusterRoleBindingV1_basic(t *testing.T) {
@@ -123,6 +127,39 @@ func TestAccKubernetesClusterRoleBindingV1_basic(t *testing.T) {
123127
})
124128
}
125129

130+
func TestAccKubernetesClusterRoleBindingV1_identity(t *testing.T) {
131+
resourceName := "kubernetes_cluster_role_binding_v1.test"
132+
name := fmt.Sprintf("tf-acc-test:%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
133+
134+
resource.ParallelTest(t, resource.TestCase{
135+
PreCheck: func() { testAccPreCheck(t) },
136+
ProviderFactories: testAccProviderFactories,
137+
CheckDestroy: testAccCheckKubernetesClusterRoleBindingV1Destroy,
138+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
139+
tfversion.SkipBelow(tfversion.Version1_12_0),
140+
},
141+
Steps: []resource.TestStep{
142+
{
143+
Config: testAccKubernetesClusterRoleBindingV1Config_basic(name),
144+
ConfigStateChecks: []statecheck.StateCheck{
145+
statecheck.ExpectIdentity(
146+
resourceName, map[string]knownvalue.Check{
147+
"name": knownvalue.StringExact(name),
148+
"api_version": knownvalue.StringExact("rbac.authorization.k8s.io/v1"),
149+
"kind": knownvalue.StringExact("ClusterRoleBinding"),
150+
},
151+
),
152+
},
153+
},
154+
{
155+
ResourceName: resourceName,
156+
ImportState: true,
157+
ImportStateKind: resource.ImportBlockWithResourceIdentity,
158+
},
159+
},
160+
})
161+
}
162+
126163
func TestAccKubernetesClusterRoleBindingV1_generatedName(t *testing.T) {
127164
var conf rbacv1.ClusterRoleBinding
128165
prefix := "tf-acc-test-gen:"
@@ -313,7 +350,6 @@ func TestAccKubernetesClusterRoleBindingV1_UpdatePatchOperationsOrderWithRemoval
313350

314351
func testAccCheckKubernetesClusterRoleBindingV1Destroy(s *terraform.State) error {
315352
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
316-
317353
if err != nil {
318354
return err
319355
}

kubernetes/resource_kubernetes_cluster_role_v1.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func resourceKubernetesClusterRoleV1() *schema.Resource {
2323
UpdateContext: resourceKubernetesClusterRoleV1Update,
2424
DeleteContext: resourceKubernetesClusterRoleV1Delete,
2525
Importer: &schema.ResourceImporter{
26-
StateContext: schema.ImportStatePassthroughContext,
26+
StateContext: resourceIdentityImportNonNamespaced,
2727
},
28-
28+
Identity: resourceIdentitySchemaNonNamespaced(),
2929
Schema: map[string]*schema.Schema{
3030
"metadata": metadataSchemaRBAC("clusterRole", true, false),
3131
"rule": {
@@ -159,6 +159,10 @@ func resourceKubernetesClusterRoleV1Read(ctx context.Context, d *schema.Resource
159159
return diag.FromErr(err)
160160
}
161161
}
162+
err = setResourceIdentityNonNamespaced(d, "rbac.authorization.k8s.io/v1", "ClusterRole", name)
163+
if err != nil {
164+
return diag.FromErr(err)
165+
}
162166
return nil
163167
}
164168

kubernetes/resource_kubernetes_cluster_role_v1_test.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414
"github.com/hashicorp/terraform-plugin-testing/terraform"
1515
rbacv1 "k8s.io/api/rbac/v1"
1616
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
18+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
19+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
20+
"github.com/hashicorp/terraform-plugin-testing/tfversion"
1721
)
1822

1923
func TestAccKubernetesClusterRoleV1_basic(t *testing.T) {
@@ -68,6 +72,39 @@ func TestAccKubernetesClusterRoleV1_basic(t *testing.T) {
6872
})
6973
}
7074

75+
func TestAccKubernetesClusterRoleV1_identity(t *testing.T) {
76+
resourceName := "kubernetes_cluster_role_v1.test"
77+
name := acctest.RandomWithPrefix("tf-acc-test")
78+
79+
resource.ParallelTest(t, resource.TestCase{
80+
PreCheck: func() { testAccPreCheck(t) },
81+
ProviderFactories: testAccProviderFactories,
82+
CheckDestroy: testAccCheckKubernetesClusterRoleV1Destroy,
83+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
84+
tfversion.SkipBelow(tfversion.Version1_12_0),
85+
},
86+
Steps: []resource.TestStep{
87+
{
88+
Config: testAccKubernetesClusterRoleConfigV1_basic(name),
89+
ConfigStateChecks: []statecheck.StateCheck{
90+
statecheck.ExpectIdentity(
91+
resourceName, map[string]knownvalue.Check{
92+
"name": knownvalue.StringExact(name),
93+
"api_version": knownvalue.StringExact("rbac.authorization.k8s.io/v1"),
94+
"kind": knownvalue.StringExact("ClusterRole"),
95+
},
96+
),
97+
},
98+
},
99+
{
100+
ResourceName: resourceName,
101+
ImportState: true,
102+
ImportStateKind: resource.ImportBlockWithResourceIdentity,
103+
},
104+
},
105+
})
106+
}
107+
71108
func TestAccKubernetesClusterRoleV1_generatedName(t *testing.T) {
72109
var conf rbacv1.ClusterRole
73110
prefix := "tf-acc-test-gen:"
@@ -287,7 +324,6 @@ func TestAccKubernetesClusterRoleV1_aggregationRuleRuleAggregation(t *testing.T)
287324

288325
func testAccCheckKubernetesClusterRoleV1Destroy(s *terraform.State) error {
289326
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
290-
291327
if err != nil {
292328
return err
293329
}

kubernetes/resource_kubernetes_config_map_v1.go

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package kubernetes
55

66
import (
77
"context"
8-
"fmt"
98
"log"
109

1110
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -26,29 +25,7 @@ func resourceKubernetesConfigMapV1() *schema.Resource {
2625
UpdateContext: resourceKubernetesConfigMapV1Update,
2726
DeleteContext: resourceKubernetesConfigMapV1Delete,
2827
Importer: &schema.ResourceImporter{
29-
StateContext: func(ctx context.Context, rd *schema.ResourceData, i interface{}) ([]*schema.ResourceData, error) {
30-
if rd.Id() != "" {
31-
return []*schema.ResourceData{rd}, nil
32-
}
33-
34-
rid, err := rd.Identity()
35-
if err != nil {
36-
return nil, err
37-
}
38-
39-
namespace, ok := rid.Get("namespace").(string)
40-
if !ok {
41-
return nil, fmt.Errorf("could not get namespace from resource identity")
42-
}
43-
name, ok := rid.Get("name").(string)
44-
if !ok {
45-
return nil, fmt.Errorf("could not get name from resource identity")
46-
}
47-
48-
rd.SetId(fmt.Sprintf("%s/%s", namespace, name))
49-
50-
return []*schema.ResourceData{rd}, nil
51-
},
28+
StateContext: resourceIdentityImportNamespaced,
5229
},
5330
CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, meta interface{}) error {
5431
if diff.Id() == "" {
@@ -73,29 +50,7 @@ func resourceKubernetesConfigMapV1() *schema.Resource {
7350

7451
return nil
7552
},
76-
Identity: &schema.ResourceIdentity{
77-
Version: 1,
78-
SchemaFunc: func() map[string]*schema.Schema {
79-
return map[string]*schema.Schema{
80-
"namespace": {
81-
Type: schema.TypeString,
82-
OptionalForImport: true,
83-
},
84-
"name": {
85-
Type: schema.TypeString,
86-
RequiredForImport: true,
87-
},
88-
"api_version": {
89-
Type: schema.TypeString,
90-
RequiredForImport: true,
91-
},
92-
"kind": {
93-
Type: schema.TypeString,
94-
RequiredForImport: true,
95-
},
96-
}
97-
},
98-
},
53+
Identity: resourceIdentitySchemaNamespaced(),
9954
Schema: map[string]*schema.Schema{
10055
"metadata": namespacedMetadataSchema("config map", true),
10156
"binary_data": {

kubernetes/resource_kubernetes_cron_job_v1.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ func resourceKubernetesCronJobV1() *schema.Resource {
2727
UpdateContext: resourceKubernetesCronJobV1Update,
2828
DeleteContext: resourceKubernetesCronJobV1Delete,
2929
Importer: &schema.ResourceImporter{
30-
StateContext: schema.ImportStatePassthroughContext,
30+
StateContext: resourceIdentityImportNamespaced,
3131
},
32+
Identity: resourceIdentitySchemaNamespaced(),
3233
Timeouts: &schema.ResourceTimeout{
3334
Delete: schema.DefaultTimeout(1 * time.Minute),
3435
},
@@ -160,6 +161,10 @@ func resourceKubernetesCronJobV1Read(ctx context.Context, d *schema.ResourceData
160161
return diag.FromErr(err)
161162
}
162163

164+
err = setResourceIdentityNamespaced(d, "batch/v1", "CronJob", namespace, name)
165+
if err != nil {
166+
return diag.FromErr(err)
167+
}
163168
return nil
164169
}
165170

kubernetes/resource_kubernetes_cron_job_v1_test.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414

1515
batchv1 "k8s.io/api/batch/v1"
1616
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
18+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
19+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
20+
"github.com/hashicorp/terraform-plugin-testing/tfversion"
1721
)
1822

1923
func TestAccKubernetesCronJobV1_basic(t *testing.T) {
@@ -126,6 +130,43 @@ func TestAccKubernetesCronJobV1_extra(t *testing.T) {
126130
})
127131
}
128132

133+
func TestAccKubernetesCronJobV1_identity(t *testing.T) {
134+
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
135+
imageName := busyboxImage
136+
resourceName := "kubernetes_cron_job_v1.test"
137+
138+
resource.ParallelTest(t, resource.TestCase{
139+
PreCheck: func() {
140+
testAccPreCheck(t)
141+
},
142+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
143+
tfversion.SkipBelow(tfversion.Version1_12_0),
144+
},
145+
ProviderFactories: testAccProviderFactories,
146+
CheckDestroy: testAccCheckKubernetesCronJobV1Destroy,
147+
Steps: []resource.TestStep{
148+
{
149+
Config: testAccKubernetesCronJobV1Config_basic(name, imageName),
150+
ConfigStateChecks: []statecheck.StateCheck{
151+
statecheck.ExpectIdentity(
152+
resourceName, map[string]knownvalue.Check{
153+
"namespace": knownvalue.StringExact("default"),
154+
"name": knownvalue.StringExact(name),
155+
"api_version": knownvalue.StringExact("batch/v1"),
156+
"kind": knownvalue.StringExact("CronJob"),
157+
},
158+
),
159+
},
160+
},
161+
{
162+
ResourceName: resourceName,
163+
ImportState: true,
164+
ImportStateKind: resource.ImportBlockWithResourceIdentity,
165+
},
166+
},
167+
})
168+
}
169+
129170
func TestAccKubernetesCronJobV1_minimalWithTemplateNamespace(t *testing.T) {
130171
var conf1, conf2 batchv1.CronJob
131172

@@ -273,7 +314,6 @@ func TestAccKubernetesCronJobV1_minimalWithBackoffLimitPerIndex(t *testing.T) {
273314

274315
func testAccCheckKubernetesCronJobV1Destroy(s *terraform.State) error {
275316
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
276-
277317
if err != nil {
278318
return err
279319
}

kubernetes/resource_kubernetes_daemon_set_v1.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ func resourceKubernetesDaemonSetV1() *schema.Resource {
3030
UpdateContext: resourceKubernetesDaemonSetV1Update,
3131
DeleteContext: resourceKubernetesDaemonSetV1Delete,
3232
Importer: &schema.ResourceImporter{
33-
StateContext: schema.ImportStatePassthroughContext,
33+
StateContext: resourceIdentityImportNamespaced,
3434
},
35+
Identity: resourceIdentitySchemaNamespaced(),
3536
StateUpgraders: []schema.StateUpgrader{
3637
{
3738
Version: 0,
@@ -277,6 +278,10 @@ func resourceKubernetesDaemonSetV1Read(ctx context.Context, d *schema.ResourceDa
277278
return diag.FromErr(err)
278279
}
279280

281+
err = setResourceIdentityNamespaced(d, "apps/v1", "DaemonSet", namespace, name)
282+
if err != nil {
283+
return diag.FromErr(err)
284+
}
280285
return nil
281286
}
282287

0 commit comments

Comments
 (0)