Skip to content

Commit 747b3d0

Browse files
Promote fleet observability feature in GKE Hub to GA (#8268) (#15105)
Signed-off-by: Modular Magician <[email protected]>
1 parent 6f4cbaf commit 747b3d0

File tree

4 files changed

+344
-4
lines changed

4 files changed

+344
-4
lines changed

.changelog/8268.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
gkehub: promoted the `google_gke_hub_feature` resource's `fleetobservability` block to GA.
3+
```

google/resource_gke_hub_feature_test.go

+125
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,131 @@ import (
1616
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
1717
)
1818

19+
func TestAccGKEHubFeature_gkehubFeatureFleetObservability(t *testing.T) {
20+
// VCR fails to handle batched project services
21+
acctest.SkipIfVcr(t)
22+
t.Parallel()
23+
24+
context := map[string]interface{}{
25+
"random_suffix": acctest.RandString(t, 10),
26+
"org_id": envvar.GetTestOrgFromEnv(t),
27+
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
28+
}
29+
30+
acctest.VcrTest(t, resource.TestCase{
31+
PreCheck: func() { acctest.AccTestPreCheck(t) },
32+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
33+
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
34+
ExternalProviders: map[string]resource.ExternalProvider{
35+
"time": {},
36+
},
37+
Steps: []resource.TestStep{
38+
{
39+
Config: testAccGKEHubFeature_gkehubFeatureFleetObservability(context),
40+
},
41+
{
42+
ResourceName: "google_gke_hub_feature.feature",
43+
ImportState: true,
44+
ImportStateVerify: true,
45+
},
46+
{
47+
Config: testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate1(context),
48+
},
49+
{
50+
ResourceName: "google_gke_hub_feature.feature",
51+
ImportState: true,
52+
ImportStateVerify: true,
53+
},
54+
{
55+
Config: testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate2(context),
56+
},
57+
{
58+
ResourceName: "google_gke_hub_feature.feature",
59+
ImportState: true,
60+
ImportStateVerify: true,
61+
},
62+
},
63+
})
64+
}
65+
66+
func testAccGKEHubFeature_gkehubFeatureFleetObservability(context map[string]interface{}) string {
67+
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
68+
resource "time_sleep" "wait_for_gkehub_enablement" {
69+
create_duration = "150s"
70+
depends_on = [google_project_service.gkehub]
71+
}
72+
73+
resource "google_gke_hub_feature" "feature" {
74+
name = "fleetobservability"
75+
location = "global"
76+
project = google_project.project.project_id
77+
spec {
78+
fleetobservability {
79+
logging_config {
80+
default_config {
81+
mode = "MOVE"
82+
}
83+
fleet_scope_logs_config {
84+
mode = "COPY"
85+
}
86+
}
87+
}
88+
}
89+
depends_on = [time_sleep.wait_for_gkehub_enablement]
90+
}
91+
`, context)
92+
}
93+
94+
func testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate1(context map[string]interface{}) string {
95+
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
96+
resource "time_sleep" "wait_for_gkehub_enablement" {
97+
create_duration = "150s"
98+
depends_on = [google_project_service.gkehub]
99+
}
100+
101+
resource "google_gke_hub_feature" "feature" {
102+
name = "fleetobservability"
103+
location = "global"
104+
project = google_project.project.project_id
105+
spec {
106+
fleetobservability {
107+
logging_config {
108+
default_config {
109+
mode = "MOVE"
110+
}
111+
}
112+
}
113+
}
114+
depends_on = [time_sleep.wait_for_gkehub_enablement]
115+
}
116+
`, context)
117+
}
118+
119+
func testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate2(context map[string]interface{}) string {
120+
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
121+
resource "time_sleep" "wait_for_gkehub_enablement" {
122+
create_duration = "150s"
123+
depends_on = [google_project_service.gkehub]
124+
}
125+
126+
resource "google_gke_hub_feature" "feature" {
127+
name = "fleetobservability"
128+
location = "global"
129+
project = google_project.project.project_id
130+
spec {
131+
fleetobservability {
132+
logging_config {
133+
fleet_scope_logs_config {
134+
mode = "COPY"
135+
}
136+
}
137+
}
138+
}
139+
depends_on = [time_sleep.wait_for_gkehub_enablement]
140+
}
141+
`, context)
142+
}
143+
19144
func TestAccGKEHubFeature_gkehubFeatureMciUpdate(t *testing.T) {
20145
// VCR fails to handle batched project services
21146
acctest.SkipIfVcr(t)

google/services/gkehub2/resource_gke_hub_feature.go

+215
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
3030
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
31+
"github.com/hashicorp/terraform-provider-google/google/verify"
3132
)
3233

3334
func ResourceGKEHub2Feature() *schema.Resource {
@@ -74,6 +75,58 @@ func ResourceGKEHub2Feature() *schema.Resource {
7475
MaxItems: 1,
7576
Elem: &schema.Resource{
7677
Schema: map[string]*schema.Schema{
78+
"fleetobservability": {
79+
Type: schema.TypeList,
80+
Optional: true,
81+
Description: `Fleet Observability feature spec.`,
82+
MaxItems: 1,
83+
Elem: &schema.Resource{
84+
Schema: map[string]*schema.Schema{
85+
"logging_config": {
86+
Type: schema.TypeList,
87+
Optional: true,
88+
Description: `Specified if fleet logging feature is enabled for the entire fleet. If UNSPECIFIED, fleet logging feature is disabled for the entire fleet.`,
89+
MaxItems: 1,
90+
Elem: &schema.Resource{
91+
Schema: map[string]*schema.Schema{
92+
"default_config": {
93+
Type: schema.TypeList,
94+
Optional: true,
95+
Description: `Specified if applying the default routing config to logs not specified in other configs.`,
96+
MaxItems: 1,
97+
Elem: &schema.Resource{
98+
Schema: map[string]*schema.Schema{
99+
"mode": {
100+
Type: schema.TypeString,
101+
Optional: true,
102+
ValidateFunc: verify.ValidateEnum([]string{"MODE_UNSPECIFIED", "COPY", "MOVE", ""}),
103+
Description: `Specified if fleet logging feature is enabled. Possible values: ["MODE_UNSPECIFIED", "COPY", "MOVE"]`,
104+
},
105+
},
106+
},
107+
},
108+
"fleet_scope_logs_config": {
109+
Type: schema.TypeList,
110+
Optional: true,
111+
Description: `Specified if applying the routing config to all logs for all fleet scopes.`,
112+
MaxItems: 1,
113+
Elem: &schema.Resource{
114+
Schema: map[string]*schema.Schema{
115+
"mode": {
116+
Type: schema.TypeString,
117+
Optional: true,
118+
ValidateFunc: verify.ValidateEnum([]string{"MODE_UNSPECIFIED", "COPY", "MOVE", ""}),
119+
Description: `Specified if fleet logging feature is enabled. Possible values: ["MODE_UNSPECIFIED", "COPY", "MOVE"]`,
120+
},
121+
},
122+
},
123+
},
124+
},
125+
},
126+
},
127+
},
128+
},
129+
},
77130
"multiclusteringress": {
78131
Type: schema.TypeList,
79132
Optional: true,
@@ -521,6 +574,8 @@ func flattenGKEHub2FeatureSpec(v interface{}, d *schema.ResourceData, config *tr
521574
transformed := make(map[string]interface{})
522575
transformed["multiclusteringress"] =
523576
flattenGKEHub2FeatureSpecMulticlusteringress(original["multiclusteringress"], d, config)
577+
transformed["fleetobservability"] =
578+
flattenGKEHub2FeatureSpecFleetobservability(original["fleetobservability"], d, config)
524579
return []interface{}{transformed}
525580
}
526581
func flattenGKEHub2FeatureSpecMulticlusteringress(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -540,6 +595,68 @@ func flattenGKEHub2FeatureSpecMulticlusteringressConfigMembership(v interface{},
540595
return v
541596
}
542597

598+
func flattenGKEHub2FeatureSpecFleetobservability(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
599+
if v == nil {
600+
return nil
601+
}
602+
original := v.(map[string]interface{})
603+
if len(original) == 0 {
604+
return nil
605+
}
606+
transformed := make(map[string]interface{})
607+
transformed["logging_config"] =
608+
flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfig(original["loggingConfig"], d, config)
609+
return []interface{}{transformed}
610+
}
611+
func flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
612+
if v == nil {
613+
return nil
614+
}
615+
original := v.(map[string]interface{})
616+
if len(original) == 0 {
617+
return nil
618+
}
619+
transformed := make(map[string]interface{})
620+
transformed["default_config"] =
621+
flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfig(original["defaultConfig"], d, config)
622+
transformed["fleet_scope_logs_config"] =
623+
flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfig(original["fleetScopeLogsConfig"], d, config)
624+
return []interface{}{transformed}
625+
}
626+
func flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
627+
if v == nil {
628+
return nil
629+
}
630+
original := v.(map[string]interface{})
631+
if len(original) == 0 {
632+
return nil
633+
}
634+
transformed := make(map[string]interface{})
635+
transformed["mode"] =
636+
flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfigMode(original["mode"], d, config)
637+
return []interface{}{transformed}
638+
}
639+
func flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfigMode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
640+
return v
641+
}
642+
643+
func flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
644+
if v == nil {
645+
return nil
646+
}
647+
original := v.(map[string]interface{})
648+
if len(original) == 0 {
649+
return nil
650+
}
651+
transformed := make(map[string]interface{})
652+
transformed["mode"] =
653+
flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfigMode(original["mode"], d, config)
654+
return []interface{}{transformed}
655+
}
656+
func flattenGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfigMode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
657+
return v
658+
}
659+
543660
func flattenGKEHub2FeatureState(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
544661
if v == nil {
545662
return nil
@@ -621,6 +738,13 @@ func expandGKEHub2FeatureSpec(v interface{}, d tpgresource.TerraformResourceData
621738
transformed["multiclusteringress"] = transformedMulticlusteringress
622739
}
623740

741+
transformedFleetobservability, err := expandGKEHub2FeatureSpecFleetobservability(original["fleetobservability"], d, config)
742+
if err != nil {
743+
return nil, err
744+
} else if val := reflect.ValueOf(transformedFleetobservability); val.IsValid() && !tpgresource.IsEmptyValue(val) {
745+
transformed["fleetobservability"] = transformedFleetobservability
746+
}
747+
624748
return transformed, nil
625749
}
626750

@@ -646,3 +770,94 @@ func expandGKEHub2FeatureSpecMulticlusteringress(v interface{}, d tpgresource.Te
646770
func expandGKEHub2FeatureSpecMulticlusteringressConfigMembership(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
647771
return v, nil
648772
}
773+
774+
func expandGKEHub2FeatureSpecFleetobservability(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
775+
l := v.([]interface{})
776+
if len(l) == 0 || l[0] == nil {
777+
return nil, nil
778+
}
779+
raw := l[0]
780+
original := raw.(map[string]interface{})
781+
transformed := make(map[string]interface{})
782+
783+
transformedLoggingConfig, err := expandGKEHub2FeatureSpecFleetobservabilityLoggingConfig(original["logging_config"], d, config)
784+
if err != nil {
785+
return nil, err
786+
} else if val := reflect.ValueOf(transformedLoggingConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
787+
transformed["loggingConfig"] = transformedLoggingConfig
788+
}
789+
790+
return transformed, nil
791+
}
792+
793+
func expandGKEHub2FeatureSpecFleetobservabilityLoggingConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
794+
l := v.([]interface{})
795+
if len(l) == 0 || l[0] == nil {
796+
return nil, nil
797+
}
798+
raw := l[0]
799+
original := raw.(map[string]interface{})
800+
transformed := make(map[string]interface{})
801+
802+
transformedDefaultConfig, err := expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfig(original["default_config"], d, config)
803+
if err != nil {
804+
return nil, err
805+
} else if val := reflect.ValueOf(transformedDefaultConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
806+
transformed["defaultConfig"] = transformedDefaultConfig
807+
}
808+
809+
transformedFleetScopeLogsConfig, err := expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfig(original["fleet_scope_logs_config"], d, config)
810+
if err != nil {
811+
return nil, err
812+
} else if val := reflect.ValueOf(transformedFleetScopeLogsConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
813+
transformed["fleetScopeLogsConfig"] = transformedFleetScopeLogsConfig
814+
}
815+
816+
return transformed, nil
817+
}
818+
819+
func expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
820+
l := v.([]interface{})
821+
if len(l) == 0 || l[0] == nil {
822+
return nil, nil
823+
}
824+
raw := l[0]
825+
original := raw.(map[string]interface{})
826+
transformed := make(map[string]interface{})
827+
828+
transformedMode, err := expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfigMode(original["mode"], d, config)
829+
if err != nil {
830+
return nil, err
831+
} else if val := reflect.ValueOf(transformedMode); val.IsValid() && !tpgresource.IsEmptyValue(val) {
832+
transformed["mode"] = transformedMode
833+
}
834+
835+
return transformed, nil
836+
}
837+
838+
func expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigDefaultConfigMode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
839+
return v, nil
840+
}
841+
842+
func expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
843+
l := v.([]interface{})
844+
if len(l) == 0 || l[0] == nil {
845+
return nil, nil
846+
}
847+
raw := l[0]
848+
original := raw.(map[string]interface{})
849+
transformed := make(map[string]interface{})
850+
851+
transformedMode, err := expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfigMode(original["mode"], d, config)
852+
if err != nil {
853+
return nil, err
854+
} else if val := reflect.ValueOf(transformedMode); val.IsValid() && !tpgresource.IsEmptyValue(val) {
855+
transformed["mode"] = transformedMode
856+
}
857+
858+
return transformed, nil
859+
}
860+
861+
func expandGKEHub2FeatureSpecFleetobservabilityLoggingConfigFleetScopeLogsConfigMode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
862+
return v, nil
863+
}

0 commit comments

Comments
 (0)