Skip to content

Commit 6cf9ecd

Browse files
committed
wait_for_default_service_account for Namespace
Handle waiter code within an afterCreate hook and enable all "dualstack" tests except generateName for documented reason.
1 parent e40cc9e commit 6cf9ecd

File tree

11 files changed

+140
-14
lines changed

11 files changed

+140
-14
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.21.5
44

55
require (
66
github.com/Masterminds/semver v1.5.0
7+
github.com/cenkalti/backoff/v4 v4.2.1
78
github.com/getkin/kin-openapi v0.111.0
89
github.com/google/go-cmp v0.6.0
910
github.com/hashicorp/go-hclog v1.6.3

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ
3434
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
3535
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
3636
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
37+
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
38+
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
3739
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
3840
github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
3941
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
@@ -175,10 +177,6 @@ github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVW
175177
github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg=
176178
github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec=
177179
github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A=
178-
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.0 h1:cPPZitB7w5qYPbSad0IkhDaXZc7LpDhsgm4g8Kj2cOY=
179-
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.0/go.mod h1:AOwjDhbkWel/4J4fnLB59l52cGmV13FjkqKxaNVJjok=
180-
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.1-0.20241022191930-51e5c0aa016a h1:NjEx7QP4I2xXV0hNYft98cTJtz5bOrR/ig3bbqPzPsI=
181-
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.1-0.20241022191930-51e5c0aa016a/go.mod h1:AfADi0tmCqyqPiz4Yyprr//qe+Kwz5HdxWaERDcDCl4=
182180
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.1-0.20241022192615-7f55d8b45646 h1:hMR+nw3FRKeRVhBrLf9WjAK8TWPjmTIsxdA8Qlgi6uk=
183181
github.com/hashicorp/terraform-plugin-codegen-kubernetes v0.1.1-0.20241022192615-7f55d8b45646/go.mod h1:AfADi0tmCqyqPiz4Yyprr//qe+Kwz5HdxWaERDcDCl4=
184182
github.com/hashicorp/terraform-plugin-docs v0.16.0 h1:UmxFr3AScl6Wged84jndJIfFccGyBZn52KtMNsS12dI=
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package helper
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform-plugin-framework/types"
7+
)
8+
9+
func DynamicToBool(d types.Dynamic) bool {
10+
// treat null or unknown as unset/falsy
11+
if d.IsUnknown() || d.IsNull() {
12+
return false
13+
}
14+
switch value := d.UnderlyingValue().(type) {
15+
case types.Bool:
16+
return value.ValueBool()
17+
case types.String:
18+
// Terraform performs some conversions on assignment we should honor
19+
// https://developer.hashicorp.com/terraform/language/expressions/types#type-conversion
20+
switch value.ValueString() {
21+
case "true":
22+
return true
23+
case "false":
24+
return false
25+
default:
26+
panic(fmt.Errorf("%v is not a bool", value.ValueString()))
27+
}
28+
default:
29+
panic(fmt.Errorf("%v is not a bool", value))
30+
}
31+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package client
2+
3+
import (
4+
"k8s.io/apimachinery/pkg/runtime/schema"
5+
"k8s.io/client-go/dynamic"
6+
"k8s.io/client-go/restmapper"
7+
)
8+
9+
func ResourceInterface(clientGetter KubernetesClientGetter, kind, apiVersion, namespace string) (dynamic.ResourceInterface, error) {
10+
client, err := clientGetter.DynamicClient()
11+
if err != nil {
12+
return nil, err
13+
}
14+
discoveryClient, err := clientGetter.DiscoveryClient()
15+
if err != nil {
16+
return nil, err
17+
}
18+
agr, err := restmapper.GetAPIGroupResources(discoveryClient)
19+
if err != nil {
20+
return nil, err
21+
}
22+
gv, err := schema.ParseGroupVersion(apiVersion)
23+
if err != nil {
24+
return nil, err
25+
}
26+
restMapper := restmapper.NewDiscoveryRESTMapper(agr)
27+
mapping, err := restMapper.RESTMapping(gv.WithKind(kind).GroupKind(), gv.Version)
28+
if err != nil {
29+
return nil, err
30+
}
31+
32+
if namespace == "" {
33+
return client.Resource(mapping.Resource), nil
34+
}
35+
return client.Resource(mapping.Resource).Namespace(namespace), nil
36+
}

internal/framework/provider/corev1/generate_namespace.hcl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ resource "kubernetes_namespace_v1_gen" {
2121

2222
autocrud_options {
2323
wait_for_deletion = true
24+
hooks {
25+
after {
26+
create = true
27+
}
28+
}
2429
}
2530
}
2631

@@ -38,6 +43,10 @@ resource "kubernetes_namespace_v1_gen" {
3843
"spec"
3944
]
4045

46+
custom_attributes = [
47+
"wait_for_default_service_account"
48+
]
49+
4150
required_attributes = [
4251
"metadata"
4352
]

internal/framework/provider/corev1/namespace_crud_gen.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ func (r *Namespace) Create(ctx context.Context, req resource.CreateRequest, resp
4040
return
4141
}
4242

43+
r.AfterCreate(ctx, req, resp, &dataModel)
44+
4345
diags := resp.State.Set(ctx, &dataModel)
4446
resp.Diagnostics.Append(diags...)
4547
if resp.Diagnostics.HasError() {

internal/framework/provider/corev1/namespace_hooks.go

Lines changed: 42 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/framework/provider/corev1/namespace_model_gen.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import (
88
type NamespaceModel struct {
99
Timeouts timeouts.Value `tfsdk:"timeouts"`
1010

11-
ID types.String `tfsdk:"id" manifest:""`
12-
Metadata struct {
11+
ID types.String `tfsdk:"id" manifest:""`
12+
WaitForDefaultServiceAccount types.Dynamic `tfsdk:"wait_for_default_service_account" manifest:""`
13+
Metadata struct {
1314
Annotations map[string]types.String `tfsdk:"annotations" manifest:"annotations"`
1415
GenerateName types.String `tfsdk:"generate_name" manifest:"generateName"`
1516
Generation types.Int64 `tfsdk:"generation" manifest:"generation"`

internal/framework/provider/corev1/namespace_schema_gen.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func (r *Namespace) Schema(ctx context.Context, req resource.SchemaRequest, resp
2323
Optional: true,
2424
Computed: true,
2525
},
26+
"wait_for_default_service_account": schema.DynamicAttribute{
27+
MarkdownDescription: ``,
28+
Optional: true,
29+
},
2630
"metadata": schema.SingleNestedAttribute{
2731
MarkdownDescription: `Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata`,
2832
Required: true,

internal/framework/provider/resources_list_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)