Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
c6c9103
Expose GKE desired_emulated_version update trigger in Cluster resource
ChinemeremChigbo May 29, 2026
66cd7bb
Fix desired_emulated_version tests
ChinemeremChigbo Jun 3, 2026
331c4e0
docs: add desired_emulated_version to google_container_cluster docs
ChinemeremChigbo Jun 3, 2026
2adca07
Fix ImportStateVerify for desired_emulated_version
ChinemeremChigbo Jun 5, 2026
37e6b4c
Add version guards to documentation
ChinemeremChigbo Jun 23, 2026
4a399da
Revert local go.mod replace directive
ChinemeremChigbo Jun 23, 2026
7fad566
Address PR feedback: fix autopilot tests, add safety guards, and poli…
ChinemeremChigbo Jun 23, 2026
37f2145
Update mmv1/third_party/terraform/website/docs/r/container_cluster.ht…
ChinemeremChigbo Jun 24, 2026
1b46bb5
Update mmv1/third_party/terraform/website/docs/r/container_cluster.ht…
ChinemeremChigbo Jun 24, 2026
7f67f73
Trigger CI
ChinemeremChigbo Jul 9, 2026
30bfb20
feat: implement rollback_safe_upgrade block for Two-Step Upgrades
ChinemeremChigbo Jul 10, 2026
c84c6c6
feat: add rollback_safe_upgrade to GKE cluster and fix meta.yaml
ChinemeremChigbo Jul 10, 2026
ac6e3d7
Fix protobuf duration format and graduate fields to GA
ChinemeremChigbo Jul 14, 2026
1209a62
fix: resolve empty rollback_safe_upgrade block bug and stabilize VCR …
ChinemeremChigbo Jul 15, 2026
f660fb5
test: Add missing ImportStateVerifyIgnore for rollback_safe_upgrade
ChinemeremChigbo Jul 16, 2026
dc7f99b
fix: Correct CAI export mapping and VCR test sorting logic
ChinemeremChigbo Jul 16, 2026
e5faabf
Finalize declarative completion for rollback-safe upgrades
ChinemeremChigbo Jul 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1229,6 +1229,33 @@ func ResourceContainerCluster() *schema.Resource {
ValidateFunc: validation.StringInSlice([]string{"logging.googleapis.com", "logging.googleapis.com/kubernetes", "none"}, false),
Description: `The logging service that the cluster should write logs to. Available options include logging.googleapis.com(Legacy Stackdriver), logging.googleapis.com/kubernetes(Stackdriver Kubernetes Engine Logging), and none. Defaults to logging.googleapis.com/kubernetes.`,
},
"rollback_safe_upgrade": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Description: `Configuration for rollback-safe (two-step) upgrades.`,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"control_plane_soak_duration": {
Type: schema.TypeString,
Optional: true,
Description: `A user-defined period that the cluster remains in the rollbackable state. A duration in seconds with up to nine fractional digits, ending with 's'. Example: "604800s" for 7 days. Minimum is 6 hours, maximum is 7 days. If omitted, the two-step upgrade is skipped and a standard one-step upgrade is performed.`,
},
},
},
},
"desired_emulated_version": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringMatch(regexp.MustCompile(`^[0-9]+\.[0-9]+$`), "desired_emulated_version must be in major.minor format"),
Description: "The desired emulated version for the cluster. Used to complete a rollback-safe upgrade after a soak period. Must be in major.minor format (e.g., \"1.31\"). To complete the upgrade declaratively, set this field to the target minor version. Removing this field from your configuration will not trigger completion.",
},

"emulated_version": {
Type: schema.TypeString,
Computed: true,
Description: `The current emulated Kubernetes version running on the GKE cluster control plane.`,
},

"maintenance_policy": {
Type: schema.TypeList,
Expand Down Expand Up @@ -3721,6 +3748,9 @@ func resourceContainerClusterRead(d *schema.ResourceData, meta interface{}) erro
if err := d.Set("master_version", cluster.CurrentMasterVersion); err != nil {
return fmt.Errorf("Error setting master_version: %s", err)
}
if err := d.Set("emulated_version", cluster.CurrentEmulatedVersion); err != nil {
return fmt.Errorf("Error setting emulated_version: %s", err)
}
if err := d.Set("node_version", cluster.CurrentNodeVersion); err != nil {
return fmt.Errorf("Error setting node_version: %s", err)
}
Expand Down Expand Up @@ -4692,6 +4722,24 @@ func resourceContainerClusterUpdate(d *schema.ResourceData, meta interface{}) er
log.Printf("[INFO] GKE cluster %s legacy ABAC has been updated to %v", d.Id(), enabled)
}

if d.HasChange("desired_emulated_version") {
emulatedVersion := d.Get("desired_emulated_version").(string)
if emulatedVersion != "" {
req := &container.UpdateClusterRequest{
Update: &container.ClusterUpdate{
DesiredEmulatedVersion: emulatedVersion,
},
}

updateF := updateFunc(req, "updating GKE master emulated version")
// Call update serially.
if err := transport_tpg.LockedCall(lockKey, updateF); err != nil {
return err
}
log.Printf("[INFO] GKE cluster %s: master emulated version has been updated to %s", d.Id(), emulatedVersion)
}
}

if d.HasChange("monitoring_service") || d.HasChange("logging_service") {
logging := d.Get("logging_service").(string)
monitoring := d.Get("monitoring_service").(string)
Expand Down Expand Up @@ -4895,6 +4943,17 @@ func resourceContainerClusterUpdate(d *schema.ResourceData, meta interface{}) er
},
}

if r, ok := d.GetOk("rollback_safe_upgrade"); ok {
rls := r.([]interface{})
if len(rls) > 0 && rls[0] != nil {
req.Update.DesiredRollbackSafeUpgrade = &container.RollbackSafeUpgrade{}
rl := rls[0].(map[string]interface{})
if soakDuration, ok := rl["control_plane_soak_duration"].(string); ok && soakDuration != "" {
req.Update.DesiredRollbackSafeUpgrade.ControlPlaneSoakDuration = soakDuration
}
}
}

updateF := updateFunc(req, "updating GKE master version")
// Call update serially.
if err := transport_tpg.LockedCall(lockKey, updateF); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ fields:
- field: 'deletion_protection'
provider_only: true
- api_field: 'description'
- field: 'desired_emulated_version'
provider_only: true
- field: 'dns_config.additive_vpc_scope_dns_domain'
api_field: 'networkConfig.dnsConfig.additiveVpcScopeDnsDomain'
- field: 'dns_config.cluster_dns'
Expand All @@ -153,6 +155,8 @@ fields:
api_field: 'networkConfig.dnsConfig.clusterDnsScope'
- field: 'effective_labels'
provider_only: true
- field: 'emulated_version'
api_field: 'currentEmulatedVersion'
- field: 'enable_autopilot'
api_field: 'autopilot.enabled'
- field: 'enable_cilium_clusterwide_network_policy'
Expand Down Expand Up @@ -904,6 +908,8 @@ fields:
- api_field: 'resourceUsageExportConfig.enableNetworkEgressMetering'
- field: 'resource_usage_export_config.enable_resource_consumption_metering'
api_field: 'resourceUsageExportConfig.consumptionMeteringConfig.enabled'
- field: 'rollback_safe_upgrade.control_plane_soak_duration'
provider_only: true
- api_field: 'secretManagerConfig.enabled'
- api_field: 'secretManagerConfig.rotationConfig.enabled'
- api_field: 'secretManagerConfig.rotationConfig.rotationInterval'
Expand Down
Loading